runtime_features.cc revision effb81e5f8246d0db0270817048dc992db66e9fb
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>
158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "media/base/android/media_codec_bridge.h"
167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif
177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebRuntimeFeatures;
197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)namespace content {
217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)static void SetRuntimeFeatureDefaultsForPlatform() {
237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(OS_ANDROID)
248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // MSE/EME implementation needs Android MediaCodec API.
258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  if (!media::MediaCodecBridge::IsAvailable()) {
26a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    WebRuntimeFeatures::enableWebKitMediaSource(false);
274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    WebRuntimeFeatures::enableMediaSource(false);
284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    WebRuntimeFeatures::enablePrefixedEncryptedMedia(false);
29a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
30effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // WebAudio is enabled by default on ARM and X86 and only when the
31a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // MediaCodec API is available.
32a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  WebRuntimeFeatures::enableWebAudio(
33a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      media::MediaCodecBridge::IsAvailable() &&
34effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      ((android_getCpuFamily() == ANDROID_CPU_FAMILY_ARM) ||
35effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch       (android_getCpuFamily() == ANDROID_CPU_FAMILY_X86)));
367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Android does not support the Gamepad API.
377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  WebRuntimeFeatures::enableGamepad(false);
387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Android does not have support for PagePopup
397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  WebRuntimeFeatures::enablePagePopup(false);
4058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Android does not yet support the Web Notification API. crbug.com/115320
4158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  WebRuntimeFeatures::enableNotifications(false);
421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Android does not yet support SharedWorker. crbug.com/154571
431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  WebRuntimeFeatures::enableSharedWorker(false);
44a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Android does not yet support NavigatorContentUtils.
45a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  WebRuntimeFeatures::enableNavigatorContentUtils(false);
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  WebRuntimeFeatures::enableTouchIconLoading(true);
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  WebRuntimeFeatures::enableOrientationEvent(true);
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#else
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  WebRuntimeFeatures::enableNavigatorContentUtils(true);
50a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#endif  // defined(OS_ANDROID)
517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void SetRuntimeFeaturesDefaultsAndUpdateFromArgs(
547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const CommandLine& command_line) {
557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (command_line.HasSwitch(switches::kEnableExperimentalWebPlatformFeatures))
567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WebRuntimeFeatures::enableExperimentalFeatures(true);
577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SetRuntimeFeatureDefaultsForPlatform();
597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (command_line.HasSwitch(switches::kDisableDatabases))
617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WebRuntimeFeatures::enableDatabase(false);
627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (command_line.HasSwitch(switches::kDisableApplicationCache))
647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WebRuntimeFeatures::enableApplicationCache(false);
657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (command_line.HasSwitch(switches::kDisableDesktopNotifications))
677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WebRuntimeFeatures::enableNotifications(false);
687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
69a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (command_line.HasSwitch(switches::kDisableNavigatorContentUtils))
70a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    WebRuntimeFeatures::enableNavigatorContentUtils(false);
71a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (command_line.HasSwitch(switches::kDisableLocalStorage))
737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WebRuntimeFeatures::enableLocalStorage(false);
747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (command_line.HasSwitch(switches::kDisableSessionStorage))
767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WebRuntimeFeatures::enableSessionStorage(false);
777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (command_line.HasSwitch(switches::kDisableWebKitMediaSource))
797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WebRuntimeFeatures::enableWebKitMediaSource(false);
807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (command_line.HasSwitch(switches::kDisableUnprefixedMediaSource))
824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    WebRuntimeFeatures::enableMediaSource(false);
834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (command_line.HasSwitch(switches::kDisableSharedWorkers))
851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    WebRuntimeFeatures::enableSharedWorker(false);
861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(OS_ANDROID)
887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (command_line.HasSwitch(switches::kDisableWebRTC)) {
897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WebRuntimeFeatures::enableMediaStream(false);
907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WebRuntimeFeatures::enablePeerConnection(false);
917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
93d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (!command_line.HasSwitch(switches::kEnableSpeechRecognition))
947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WebRuntimeFeatures::enableScriptedSpeech(false);
957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif
967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (command_line.HasSwitch(switches::kEnableServiceWorker))
984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    WebRuntimeFeatures::enableServiceWorker(true);
994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
100a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(OS_ANDROID)
101effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // WebAudio is enabled by default on ARM and X86, if the MediaCodec
102effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // API is available.
103a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  WebRuntimeFeatures::enableWebAudio(
104a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      !command_line.HasSwitch(switches::kDisableWebAudio) &&
105a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      media::MediaCodecBridge::IsAvailable());
106a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#else
1077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (command_line.HasSwitch(switches::kDisableWebAudio))
1087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WebRuntimeFeatures::enableWebAudio(false);
109a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif
1107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (command_line.HasSwitch(switches::kEnableEncryptedMedia))
1127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WebRuntimeFeatures::enableEncryptedMedia(true);
1137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (command_line.HasSwitch(switches::kDisablePrefixedEncryptedMedia))
1154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    WebRuntimeFeatures::enablePrefixedEncryptedMedia(false);
1167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (command_line.HasSwitch(switches::kEnableWebAnimationsSVG))
118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    WebRuntimeFeatures::enableWebAnimationsSVG(true);
1197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (command_line.HasSwitch(switches::kEnableWebMIDI))
1217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WebRuntimeFeatures::enableWebMIDI(true);
1227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (command_line.HasSwitch(switches::kDisableSpeechInput))
1247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WebRuntimeFeatures::enableSpeechInput(false);
1257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (command_line.HasSwitch(switches::kDisableFileSystem))
1277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WebRuntimeFeatures::enableFileSystem(false);
1287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (command_line.HasSwitch(switches::kEnableExperimentalCanvasFeatures))
1307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WebRuntimeFeatures::enableExperimentalCanvasFeatures(true);
1317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (command_line.HasSwitch(switches::kEnableSpeechSynthesis))
1337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WebRuntimeFeatures::enableSpeechSynthesis(true);
1347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (command_line.HasSwitch(switches::kEnableWebGLDraftExtensions))
1367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WebRuntimeFeatures::enableWebGLDraftExtensions(true);
137ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
138ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  if (command_line.HasSwitch(switches::kEnableHTMLImports))
139ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    WebRuntimeFeatures::enableHTMLImports(true);
140c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
1414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (command_line.HasSwitch(switches::kEnableOverlayFullscreenVideo))
1424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    WebRuntimeFeatures::enableOverlayFullscreenVideo(true);
1434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
14423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  if (ui::IsOverlayScrollbarEnabled())
145c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    WebRuntimeFeatures::enableOverlayScrollbars(true);
146424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
147effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (command_line.HasSwitch(switches::kEnableFastTextAutosizing)
148effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      && !command_line.HasSwitch(switches::kDisableFastTextAutosizing))
1494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    WebRuntimeFeatures::enableFastTextAutosizing(true);
1500f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (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);
1627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}  // namespace content
165