runtime_features.cc revision f8ee788a64d60abd8f2d742a5fdedde054ecd910
17d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
27d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
37d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// found in the LICENSE file.
47d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
57d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/child/runtime_features.h"
67d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
77d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/command_line.h"
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/common/content_switches_internal.h"
97d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/public/common/content_switches.h"
107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebRuntimeFeatures.h"
1123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "ui/native_theme/native_theme_switches.h"
127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(OS_ANDROID)
147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <cpu-features.h>
1546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/android/build_info.h"
168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "media/base/android/media_codec_bridge.h"
177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif
187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebRuntimeFeatures;
207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)namespace content {
227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)static void SetRuntimeFeatureDefaultsForPlatform() {
247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(OS_ANDROID)
258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // MSE/EME implementation needs Android MediaCodec API.
268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  if (!media::MediaCodecBridge::IsAvailable()) {
274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    WebRuntimeFeatures::enableMediaSource(false);
284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    WebRuntimeFeatures::enablePrefixedEncryptedMedia(false);
290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    WebRuntimeFeatures::enableEncryptedMedia(false);
30a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
31effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // WebAudio is enabled by default on ARM and X86 and only when the
32a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // MediaCodec API is available.
33a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  WebRuntimeFeatures::enableWebAudio(
34a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      media::MediaCodecBridge::IsAvailable() &&
35effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      ((android_getCpuFamily() == ANDROID_CPU_FAMILY_ARM) ||
36effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch       (android_getCpuFamily() == ANDROID_CPU_FAMILY_X86)));
3746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
3846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Android supports gamepad API for JellyBean and beyond
3946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  WebRuntimeFeatures::enableGamepad(
4046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      base::android::BuildInfo::GetInstance()->sdk_int() >= 16);
417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Android does not have support for PagePopup
427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  WebRuntimeFeatures::enablePagePopup(false);
4358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Android does not yet support the Web Notification API. crbug.com/115320
4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  WebRuntimeFeatures::enableNotifications(false);
451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Android does not yet support SharedWorker. crbug.com/154571
461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  WebRuntimeFeatures::enableSharedWorker(false);
47a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Android does not yet support NavigatorContentUtils.
48a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  WebRuntimeFeatures::enableNavigatorContentUtils(false);
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  WebRuntimeFeatures::enableTouchIconLoading(true);
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  WebRuntimeFeatures::enableOrientationEvent(true);
51f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  WebRuntimeFeatures::enableFastMobileScrolling(true);
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#else
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  WebRuntimeFeatures::enableNavigatorContentUtils(true);
54a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#endif  // defined(OS_ANDROID)
557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void SetRuntimeFeaturesDefaultsAndUpdateFromArgs(
587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const CommandLine& command_line) {
597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (command_line.HasSwitch(switches::kEnableExperimentalWebPlatformFeatures))
607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WebRuntimeFeatures::enableExperimentalFeatures(true);
617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SetRuntimeFeatureDefaultsForPlatform();
637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (command_line.HasSwitch(switches::kDisableDatabases))
657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WebRuntimeFeatures::enableDatabase(false);
667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (command_line.HasSwitch(switches::kDisableApplicationCache))
687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WebRuntimeFeatures::enableApplicationCache(false);
697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (command_line.HasSwitch(switches::kDisableDesktopNotifications))
717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WebRuntimeFeatures::enableNotifications(false);
727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
73a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (command_line.HasSwitch(switches::kDisableNavigatorContentUtils))
74a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    WebRuntimeFeatures::enableNavigatorContentUtils(false);
75a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (command_line.HasSwitch(switches::kDisableLocalStorage))
777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WebRuntimeFeatures::enableLocalStorage(false);
787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (command_line.HasSwitch(switches::kDisableSessionStorage))
807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WebRuntimeFeatures::enableSessionStorage(false);
817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
82a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (command_line.HasSwitch(switches::kDisableMediaSource))
834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    WebRuntimeFeatures::enableMediaSource(false);
844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (command_line.HasSwitch(switches::kDisableSharedWorkers))
861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    WebRuntimeFeatures::enableSharedWorker(false);
871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(OS_ANDROID)
897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (command_line.HasSwitch(switches::kDisableWebRTC)) {
907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WebRuntimeFeatures::enableMediaStream(false);
917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WebRuntimeFeatures::enablePeerConnection(false);
927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
94d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (!command_line.HasSwitch(switches::kEnableSpeechRecognition))
957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WebRuntimeFeatures::enableScriptedSpeech(false);
967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif
977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (command_line.HasSwitch(switches::kEnableServiceWorker))
994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    WebRuntimeFeatures::enableServiceWorker(true);
1004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
101a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(OS_ANDROID)
102effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // WebAudio is enabled by default on ARM and X86, if the MediaCodec
103effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // API is available.
104a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  WebRuntimeFeatures::enableWebAudio(
105a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      !command_line.HasSwitch(switches::kDisableWebAudio) &&
106a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      media::MediaCodecBridge::IsAvailable());
107a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#else
1087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (command_line.HasSwitch(switches::kDisableWebAudio))
1097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WebRuntimeFeatures::enableWebAudio(false);
110a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif
1117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (command_line.HasSwitch(switches::kEnableEncryptedMedia))
1137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WebRuntimeFeatures::enableEncryptedMedia(true);
1147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (command_line.HasSwitch(switches::kDisablePrefixedEncryptedMedia))
1164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    WebRuntimeFeatures::enablePrefixedEncryptedMedia(false);
1177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (command_line.HasSwitch(switches::kEnableWebAnimationsSVG))
119f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    WebRuntimeFeatures::enableWebAnimationsSVG(true);
1207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (command_line.HasSwitch(switches::kEnableWebMIDI))
1227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WebRuntimeFeatures::enableWebMIDI(true);
1237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (command_line.HasSwitch(switches::kDisableFileSystem))
1257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WebRuntimeFeatures::enableFileSystem(false);
1267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (command_line.HasSwitch(switches::kEnableExperimentalCanvasFeatures))
1287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WebRuntimeFeatures::enableExperimentalCanvasFeatures(true);
1297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (command_line.HasSwitch(switches::kEnableSpeechSynthesis))
1317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WebRuntimeFeatures::enableSpeechSynthesis(true);
1327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (command_line.HasSwitch(switches::kEnableWebGLDraftExtensions))
1347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WebRuntimeFeatures::enableWebGLDraftExtensions(true);
135ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (command_line.HasSwitch(switches::kEnableWebGLImageChromium))
137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    WebRuntimeFeatures::enableWebGLImageChromium(true);
138cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (command_line.HasSwitch(switches::kEnableOverlayFullscreenVideo))
1404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    WebRuntimeFeatures::enableOverlayFullscreenVideo(true);
1414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
14223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  if (ui::IsOverlayScrollbarEnabled())
143c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    WebRuntimeFeatures::enableOverlayScrollbars(true);
144424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
145cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (command_line.HasSwitch(switches::kEnableFastTextAutosizing))
1464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    WebRuntimeFeatures::enableFastTextAutosizing(true);
1470f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
148cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (command_line.HasSwitch(switches::kDisableFastTextAutosizing))
149cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    WebRuntimeFeatures::enableFastTextAutosizing(false);
150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (command_line.HasSwitch(switches::kDisableRepaintAfterLayout))
1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    WebRuntimeFeatures::enableRepaintAfterLayout(false);
1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1540f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  if (command_line.HasSwitch(switches::kEnableRepaintAfterLayout))
1550f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    WebRuntimeFeatures::enableRepaintAfterLayout(true);
1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (command_line.HasSwitch(switches::kEnableTargetedStyleRecalc))
1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    WebRuntimeFeatures::enableTargetedStyleRecalc(true);
159a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
160a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (command_line.HasSwitch(switches::kEnableBleedingEdgeRenderingFastPaths))
161a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    WebRuntimeFeatures::enableBleedingEdgeFastPaths(true);
162010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
163010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (command_line.HasSwitch(switches::kEnablePreciseMemoryInfo))
164010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    WebRuntimeFeatures::enablePreciseMemoryInfo(true);
165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (command_line.HasSwitch(switches::kEnableLayerSquashing))
167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    WebRuntimeFeatures::enableLayerSquashing(true);
1687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}  // namespace content
171