runtime_features.cc revision a02191e04bc25c4935f804f2c080ae28663d096d
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()) {
264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    WebRuntimeFeatures::enableMediaSource(false);
274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    WebRuntimeFeatures::enablePrefixedEncryptedMedia(false);
28a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
29effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // WebAudio is enabled by default on ARM and X86 and only when the
30a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // MediaCodec API is available.
31a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  WebRuntimeFeatures::enableWebAudio(
32a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      media::MediaCodecBridge::IsAvailable() &&
33effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      ((android_getCpuFamily() == ANDROID_CPU_FAMILY_ARM) ||
34effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch       (android_getCpuFamily() == ANDROID_CPU_FAMILY_X86)));
357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Android does not support the Gamepad API.
367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  WebRuntimeFeatures::enableGamepad(false);
377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Android does not have support for PagePopup
387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  WebRuntimeFeatures::enablePagePopup(false);
3958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Android does not yet support the Web Notification API. crbug.com/115320
4058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  WebRuntimeFeatures::enableNotifications(false);
411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Android does not yet support SharedWorker. crbug.com/154571
421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  WebRuntimeFeatures::enableSharedWorker(false);
43a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Android does not yet support NavigatorContentUtils.
44a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  WebRuntimeFeatures::enableNavigatorContentUtils(false);
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  WebRuntimeFeatures::enableTouchIconLoading(true);
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  WebRuntimeFeatures::enableOrientationEvent(true);
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#else
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  WebRuntimeFeatures::enableNavigatorContentUtils(true);
49a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#endif  // defined(OS_ANDROID)
507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void SetRuntimeFeaturesDefaultsAndUpdateFromArgs(
537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const CommandLine& command_line) {
547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (command_line.HasSwitch(switches::kEnableExperimentalWebPlatformFeatures))
557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WebRuntimeFeatures::enableExperimentalFeatures(true);
567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SetRuntimeFeatureDefaultsForPlatform();
587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (command_line.HasSwitch(switches::kDisableDatabases))
607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WebRuntimeFeatures::enableDatabase(false);
617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (command_line.HasSwitch(switches::kDisableApplicationCache))
637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WebRuntimeFeatures::enableApplicationCache(false);
647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (command_line.HasSwitch(switches::kDisableDesktopNotifications))
667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WebRuntimeFeatures::enableNotifications(false);
677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
68a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (command_line.HasSwitch(switches::kDisableNavigatorContentUtils))
69a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    WebRuntimeFeatures::enableNavigatorContentUtils(false);
70a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (command_line.HasSwitch(switches::kDisableLocalStorage))
727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WebRuntimeFeatures::enableLocalStorage(false);
737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (command_line.HasSwitch(switches::kDisableSessionStorage))
757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WebRuntimeFeatures::enableSessionStorage(false);
767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
77a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (command_line.HasSwitch(switches::kDisableMediaSource))
784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    WebRuntimeFeatures::enableMediaSource(false);
794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (command_line.HasSwitch(switches::kDisableSharedWorkers))
811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    WebRuntimeFeatures::enableSharedWorker(false);
821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(OS_ANDROID)
847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (command_line.HasSwitch(switches::kDisableWebRTC)) {
857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WebRuntimeFeatures::enableMediaStream(false);
867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WebRuntimeFeatures::enablePeerConnection(false);
877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
89d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (!command_line.HasSwitch(switches::kEnableSpeechRecognition))
907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WebRuntimeFeatures::enableScriptedSpeech(false);
917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif
927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (command_line.HasSwitch(switches::kEnableServiceWorker))
944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    WebRuntimeFeatures::enableServiceWorker(true);
954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
96a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(OS_ANDROID)
97effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // WebAudio is enabled by default on ARM and X86, if the MediaCodec
98effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // API is available.
99a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  WebRuntimeFeatures::enableWebAudio(
100a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      !command_line.HasSwitch(switches::kDisableWebAudio) &&
101a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      media::MediaCodecBridge::IsAvailable());
102a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#else
1037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (command_line.HasSwitch(switches::kDisableWebAudio))
1047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WebRuntimeFeatures::enableWebAudio(false);
105a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif
1067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (command_line.HasSwitch(switches::kEnableEncryptedMedia))
1087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WebRuntimeFeatures::enableEncryptedMedia(true);
1097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (command_line.HasSwitch(switches::kDisablePrefixedEncryptedMedia))
1114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    WebRuntimeFeatures::enablePrefixedEncryptedMedia(false);
1127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (command_line.HasSwitch(switches::kEnableWebAnimationsSVG))
114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    WebRuntimeFeatures::enableWebAnimationsSVG(true);
1157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (command_line.HasSwitch(switches::kEnableWebMIDI))
1177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WebRuntimeFeatures::enableWebMIDI(true);
1187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (command_line.HasSwitch(switches::kDisableSpeechInput))
1207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WebRuntimeFeatures::enableSpeechInput(false);
1217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (command_line.HasSwitch(switches::kDisableFileSystem))
1237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WebRuntimeFeatures::enableFileSystem(false);
1247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (command_line.HasSwitch(switches::kEnableExperimentalCanvasFeatures))
1267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WebRuntimeFeatures::enableExperimentalCanvasFeatures(true);
1277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (command_line.HasSwitch(switches::kEnableSpeechSynthesis))
1297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WebRuntimeFeatures::enableSpeechSynthesis(true);
1307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (command_line.HasSwitch(switches::kEnableWebGLDraftExtensions))
1327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WebRuntimeFeatures::enableWebGLDraftExtensions(true);
133ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (command_line.HasSwitch(switches::kEnableOverlayFullscreenVideo))
1354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    WebRuntimeFeatures::enableOverlayFullscreenVideo(true);
1364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
13723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  if (ui::IsOverlayScrollbarEnabled())
138c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    WebRuntimeFeatures::enableOverlayScrollbars(true);
139424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
140effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (command_line.HasSwitch(switches::kEnableFastTextAutosizing)
141effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      && !command_line.HasSwitch(switches::kDisableFastTextAutosizing))
1424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    WebRuntimeFeatures::enableFastTextAutosizing(true);
1430f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (command_line.HasSwitch(switches::kDisableRepaintAfterLayout))
1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    WebRuntimeFeatures::enableRepaintAfterLayout(false);
1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1470f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  if (command_line.HasSwitch(switches::kEnableRepaintAfterLayout))
1480f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    WebRuntimeFeatures::enableRepaintAfterLayout(true);
1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (command_line.HasSwitch(switches::kEnableTargetedStyleRecalc))
1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    WebRuntimeFeatures::enableTargetedStyleRecalc(true);
152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (command_line.HasSwitch(switches::kEnableBleedingEdgeRenderingFastPaths))
154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    WebRuntimeFeatures::enableBleedingEdgeFastPaths(true);
1557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}  // namespace content
158