Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / chrome / renderer / chrome_content_renderer_client.cc
index 044a9af..9eb68b5 100644 (file)
@@ -7,6 +7,7 @@
 #include "base/command_line.h"
 #include "base/debug/crash_logging.h"
 #include "base/logging.h"
+#include "base/metrics/field_trial.h"
 #include "base/metrics/histogram.h"
 #include "base/metrics/user_metrics_action.h"
 #include "base/path_service.h"
@@ -17,6 +18,7 @@
 #include "chrome/common/chrome_content_client.h"
 #include "chrome/common/chrome_paths.h"
 #include "chrome/common/chrome_switches.h"
+#include "chrome/common/chrome_version_info.h"
 #include "chrome/common/content_settings_pattern.h"
 #include "chrome/common/crash_keys.h"
 #include "chrome/common/extensions/chrome_extensions_client.h"
@@ -26,6 +28,9 @@
 #include "chrome/common/pepper_permission_util.h"
 #include "chrome/common/render_messages.h"
 #include "chrome/common/url_constants.h"
+#include "chrome/grit/generated_resources.h"
+#include "chrome/grit/locale_settings.h"
+#include "chrome/grit/renderer_resources.h"
 #include "chrome/renderer/benchmarking_extension.h"
 #include "chrome/renderer/chrome_render_frame_observer.h"
 #include "chrome/renderer/chrome_render_process_observer.h"
@@ -51,6 +56,7 @@
 #include "chrome/renderer/playback_extension.h"
 #include "chrome/renderer/plugins/chrome_plugin_placeholder.h"
 #include "chrome/renderer/plugins/plugin_uma.h"
+#include "chrome/renderer/prefetch_helper.h"
 #include "chrome/renderer/prerender/prerender_dispatcher.h"
 #include "chrome/renderer/prerender/prerender_helper.h"
 #include "chrome/renderer/prerender/prerender_media_load_deferrer.h"
@@ -67,6 +73,7 @@
 #include "components/autofill/content/renderer/autofill_agent.h"
 #include "components/autofill/content/renderer/password_autofill_agent.h"
 #include "components/autofill/content/renderer/password_generation_agent.h"
+#include "components/dom_distiller/core/url_constants.h"
 #include "components/nacl/renderer/ppb_nacl_private_impl.h"
 #include "components/plugins/renderer/mobile_youtube_plugin.h"
 #include "components/signin/core/common/profile_management_switches.h"
@@ -84,9 +91,6 @@
 #include "extensions/renderer/dispatcher.h"
 #include "extensions/renderer/extension_helper.h"
 #include "extensions/renderer/script_context.h"
-#include "grit/generated_resources.h"
-#include "grit/locale_settings.h"
-#include "grit/renderer_resources.h"
 #include "ipc/ipc_sync_channel.h"
 #include "net/base/net_errors.h"
 #include "ppapi/c/private/ppb_nacl_private.h"
 #include "ui/base/webui/jstemplate_builder.h"
 #include "widevine_cdm_version.h"  // In SHARED_INTERMEDIATE_DIR.
 
-#if defined(ENABLE_WEBRTC)
-#include "chrome/renderer/media/webrtc_logging_message_filter.h"
+#if !defined(DISABLE_NACL)
+#include "components/nacl/renderer/nacl_helper.h"
+#endif
+
+#if defined(ENABLE_EXTENSIONS)
+#include "chrome/renderer/extensions/chrome_extensions_render_frame_observer.h"
 #endif
 
 #if defined(ENABLE_SPELLCHECK)
 #include "chrome/renderer/spellchecker/spellcheck_provider.h"
 #endif
 
+#if defined(ENABLE_WEBRTC)
+#include "chrome/renderer/media/webrtc_logging_message_filter.h"
+#endif
+
 #if defined(OS_WIN)
 #include "chrome_elf/blacklist/blacklist.h"
-#endif  // OS_WIN
+#endif
 
 using autofill::AutofillAgent;
 using autofill::PasswordAutofillAgent;
@@ -150,11 +162,20 @@ using blink::WebVector;
 
 namespace {
 
-const char kWebViewTagName[] = "WEBVIEW";
-const char kAdViewTagName[] = "ADVIEW";
-
 ChromeContentRendererClient* g_current_client;
 
+#if defined(ENABLE_PLUGINS)
+const char* const kPredefinedAllowedCompositorOrigins[] = {
+  "6EAED1924DB611B6EEF2A664BD077BE7EAD33B8F",  // see crbug.com/383937
+  "4EB74897CB187C7633357C2FE832E0AD6A44883A"   // see crbug.com/383937
+};
+
+const char* const kPredefinedAllowedVideoDecodeOrigins[] = {
+  "6EAED1924DB611B6EEF2A664BD077BE7EAD33B8F",  // see crbug.com/383937
+  "4EB74897CB187C7633357C2FE832E0AD6A44883A"   // see crbug.com/383937
+};
+#endif
+
 static void AppendParams(const std::vector<base::string16>& additional_names,
                          const std::vector<base::string16>& additional_values,
                          WebVector<WebString>* existing_names,
@@ -224,6 +245,14 @@ bool ShouldUseJavaScriptSettingForPlugin(const WebPluginInfo& plugin) {
   return false;
 }
 
+void IsGuestViewApiAvailableToScriptContext(
+    bool* api_is_available,
+    extensions::ScriptContext* context) {
+  if (context->GetAvailability("guestViewInternal").is_available()) {
+    *api_is_available = true;
+  }
+}
+
 }  // namespace
 
 ChromeContentRendererClient::ChromeContentRendererClient() {
@@ -233,6 +262,13 @@ ChromeContentRendererClient::ChromeContentRendererClient() {
       extensions::ChromeExtensionsClient::GetInstance());
   extensions::ExtensionsRendererClient::Set(
       ChromeExtensionsRendererClient::GetInstance());
+#if defined(ENABLE_PLUGINS)
+  for (size_t i = 0; i < arraysize(kPredefinedAllowedCompositorOrigins); ++i)
+    allowed_compositor_origins_.insert(kPredefinedAllowedCompositorOrigins[i]);
+  for (size_t i = 0; i < arraysize(kPredefinedAllowedVideoDecodeOrigins); ++i)
+    allowed_video_decode_origins_.insert(
+        kPredefinedAllowedVideoDecodeOrigins[i]);
+#endif
 }
 
 ChromeContentRendererClient::~ChromeContentRendererClient() {
@@ -303,14 +339,13 @@ void ChromeContentRendererClient::RenderThreadStarted() {
     thread->RegisterExtension(extensions_v8::SearchBoxExtension::Get());
 
   if (command_line->HasSwitch(switches::kPlaybackMode) ||
-      command_line->HasSwitch(switches::kRecordMode) ||
-      command_line->HasSwitch(switches::kNoJsRandomness)) {
+      command_line->HasSwitch(switches::kRecordMode)) {
     thread->RegisterExtension(extensions_v8::PlaybackExtension::Get());
   }
 
   // TODO(guohui): needs to forward the new-profile-management switch to
   // renderer processes.
-  if (switches::IsNewProfileManagement())
+  if (switches::IsEnableAccountConsistency())
     thread->RegisterExtension(extensions_v8::PrincipalsExtension::Get());
 
   // chrome:, chrome-search:, chrome-devtools:, and chrome-distiller: pages
@@ -329,7 +364,8 @@ void ChromeContentRendererClient::RenderThreadStarted() {
   WebString dev_tools_scheme(ASCIIToUTF16(content::kChromeDevToolsScheme));
   WebSecurityPolicy::registerURLSchemeAsDisplayIsolated(dev_tools_scheme);
 
-  WebString dom_distiller_scheme(ASCIIToUTF16(chrome::kDomDistillerScheme));
+  WebString dom_distiller_scheme(
+      ASCIIToUTF16(dom_distiller::kDomDistillerScheme));
   // TODO(nyquist): Add test to ensure this happens when the flag is set.
   WebSecurityPolicy::registerURLSchemeAsDisplayIsolated(dom_distiller_scheme);
 
@@ -391,6 +427,9 @@ void ChromeContentRendererClient::RenderFrameCreated(
         chrome_observer_->content_setting_rules());
   }
 
+#if defined(ENABLE_EXTENSIONS)
+  new extensions::ChromeExtensionsRenderFrameObserver(render_frame);
+#endif
   new extensions::ExtensionFrameHelper(render_frame,
                                        extension_dispatcher_.get());
 
@@ -398,6 +437,10 @@ void ChromeContentRendererClient::RenderFrameCreated(
   new PepperHelper(render_frame);
 #endif
 
+#if !defined(DISABLE_NACL)
+  new nacl::NaClHelper(render_frame);
+#endif
+
   // TODO(jam): when the frame tree moves into content and parent() works at
   // RenderFrame construction, simplify this by just checking parent().
   if (render_frame->GetRenderView()->GetMainRenderFrame() != render_frame) {
@@ -412,7 +455,9 @@ void ChromeContentRendererClient::RenderFrameCreated(
   if (render_frame->GetRenderView()->GetMainRenderFrame() == render_frame) {
     // Only attach NetErrorHelper to the main frame, since only the main frame
     // should get error pages.
+    // PrefetchHelper is also needed only for main frames.
     new NetErrorHelper(render_frame);
+    new prefetch::PrefetchHelper(render_frame);
   }
 }
 
@@ -420,6 +465,7 @@ void ChromeContentRendererClient::RenderViewCreated(
     content::RenderView* render_view) {
   new extensions::ExtensionHelper(render_view, extension_dispatcher_.get());
   new extensions::ChromeExtensionHelper(render_view);
+  extension_dispatcher_->OnRenderViewCreated(render_view);
   new PageLoadHistograms(render_view);
 #if defined(ENABLE_PRINTING)
   new printing::PrintWebViewHelper(render_view);
@@ -482,19 +528,13 @@ bool ChromeContentRendererClient::OverrideCreatePlugin(
     WebPlugin** plugin) {
   std::string orig_mime_type = params.mimeType.utf8();
   if (orig_mime_type == content::kBrowserPluginMimeType) {
-    WebDocument document = frame->document();
-    const Extension* extension =
-        GetExtensionByOrigin(document.securityOrigin());
-    if (extension) {
-      const extensions::APIPermission::ID perms[] = {
-        extensions::APIPermission::kWebView,
-        extensions::APIPermission::kAdView
-      };
-      for (size_t i = 0; i < arraysize(perms); ++i) {
-        if (extension->HasAPIPermission(perms[i]))
-          return false;
-      }
-    }
+    bool guest_view_api_available = false;
+    extension_dispatcher_->script_context_set().ForEach(
+        render_frame->GetRenderView(),
+        base::Bind(&IsGuestViewApiAvailableToScriptContext,
+                   &guest_view_api_available));
+    if (guest_view_api_available)
+      return false;
   }
 
   ChromeViewHostMsg_GetPluginInfo_Output output;
@@ -649,9 +689,7 @@ WebPlugin* ChromeContentRendererClient::CreatePlugin(
                 CommandLine::ForCurrentProcess()->HasSwitch(
                     switches::kEnableNaCl);
           } else if (is_pnacl_mime_type) {
-            is_nacl_unrestricted =
-                !CommandLine::ForCurrentProcess()->HasSwitch(
-                    switches::kDisablePnacl);
+            is_nacl_unrestricted = true;
           }
           GURL manifest_url;
           GURL app_url;
@@ -797,10 +835,19 @@ WebPlugin* ChromeContentRendererClient::CreatePlugin(
             IDR_BLOCKED_PLUGIN_HTML,
             l10n_util::GetStringFUTF16(IDS_PLUGIN_NOT_AUTHORIZED, group_name));
         placeholder->set_allow_loading(true);
-        render_frame->Send(new ChromeViewHostMsg_BlockedUnauthorizedPlugin(
-            render_frame->GetRoutingID(),
-            group_name,
-            identifier));
+        // Check to see if old infobar should be displayed.
+        std::string trial_group =
+            base::FieldTrialList::FindFullName("UnauthorizedPluginInfoBar");
+        if (plugin.type != content::WebPluginInfo::PLUGIN_TYPE_NPAPI ||
+            trial_group == "Enabled") {
+          render_frame->Send(new ChromeViewHostMsg_BlockedUnauthorizedPlugin(
+              render_frame->GetRoutingID(),
+              group_name,
+              identifier));
+        } else {
+          // Send IPC for showing blocked plugins page action.
+          observer->DidBlockContentType(content_type);
+        }
         break;
       }
       case ChromeViewHostMsg_GetPluginInfo_Status::kClickToPlay: {
@@ -1080,6 +1127,7 @@ bool ChromeContentRendererClient::AllowPopup() {
     case extensions::Feature::UNSPECIFIED_CONTEXT:
     case extensions::Feature::WEB_PAGE_CONTEXT:
     case extensions::Feature::UNBLESSED_EXTENSION_CONTEXT:
+    case extensions::Feature::WEBUI_CONTEXT:
       return false;
     case extensions::Feature::BLESSED_EXTENSION_CONTEXT:
     case extensions::Feature::CONTENT_SCRIPT_CONTEXT:
@@ -1320,29 +1368,10 @@ void ChromeContentRendererClient::SetSpellcheck(SpellCheck* spellcheck) {
 }
 #endif
 
-bool ChromeContentRendererClient::IsAdblockInstalled() {
-  return g_current_client->extension_dispatcher_->extensions()->Contains(
-      "gighmmpiobklfepjocnamgkkbiglidom");
-}
-
-bool ChromeContentRendererClient::IsAdblockPlusInstalled() {
-  return g_current_client->extension_dispatcher_->extensions()->Contains(
-      "cfhdojbkjhnklbpkdaibdccddilifddb");
-}
-
-bool ChromeContentRendererClient::IsAdblockWithWebRequestInstalled() {
-  return g_current_client->extension_dispatcher_delegate_
-      ->IsAdblockWithWebRequestInstalled();
-}
-
-bool ChromeContentRendererClient::IsAdblockPlusWithWebRequestInstalled() {
-  return g_current_client->extension_dispatcher_delegate_
-      ->IsAdblockPlusWithWebRequestInstalled();
-}
-
-bool ChromeContentRendererClient::IsOtherExtensionWithWebRequestInstalled() {
+// static
+bool ChromeContentRendererClient::WasWebRequestUsedBySomeExtensions() {
   return g_current_client->extension_dispatcher_delegate_
-      ->IsOtherExtensionWithWebRequestInstalled();
+      ->WasWebRequestUsedBySomeExtensions();
 }
 
 const void* ChromeContentRendererClient::CreatePPAPIInterface(
@@ -1380,28 +1409,6 @@ ChromeContentRendererClient::OverrideSpeechSynthesizer(
   return new TtsDispatcher(client);
 }
 
-bool ChromeContentRendererClient::AllowBrowserPlugin(
-    blink::WebPluginContainer* container) {
-  // If this |BrowserPlugin| <object> in the |container| is not inside a
-  // <webview>/<adview> shadowHost, we disable instantiating this plugin. This
-  // is to discourage and prevent developers from accidentally attaching
-  // <object> directly in apps.
-  //
-  // Note that this check below does *not* ensure any security, it is still
-  // possible to bypass this check.
-  // TODO(lazyboy): http://crbug.com/178663, Ensure we properly disallow
-  // instantiating BrowserPlugin outside of the <webview>/<adview> shim.
-  if (container->element().isNull())
-    return false;
-
-  if (container->element().shadowHost().isNull())
-    return false;
-
-  WebString tag_name = container->element().shadowHost().tagName();
-  return tag_name.equals(WebString::fromUTF8(kWebViewTagName)) ||
-    tag_name.equals(WebString::fromUTF8(kAdViewTagName));
-}
-
 bool ChromeContentRendererClient::AllowPepperMediaStreamAPI(
     const GURL& url) {
 #if !defined(OS_ANDROID)
@@ -1451,3 +1458,54 @@ ChromeContentRendererClient::CreateWorkerPermissionClientProxy(
     blink::WebFrame* frame) {
   return new WorkerPermissionClientProxy(render_frame, frame);
 }
+
+bool ChromeContentRendererClient::IsPluginAllowedToUseDevChannelAPIs() {
+#if defined(ENABLE_PLUGINS)
+  // Allow access for tests.
+  if (CommandLine::ForCurrentProcess()->HasSwitch(
+          switches::kEnablePepperTesting)) {
+    return true;
+  }
+
+  chrome::VersionInfo::Channel channel = chrome::VersionInfo::GetChannel();
+  // Allow dev channel APIs to be used on "Canary", "Dev", and "Unknown"
+  // releases of Chrome. Permitting "Unknown" allows these APIs to be used on
+  // Chromium builds as well.
+  return channel <= chrome::VersionInfo::CHANNEL_DEV;
+#else
+  return false;
+#endif
+}
+
+bool ChromeContentRendererClient::IsPluginAllowedToUseCompositorAPI(
+    const GURL& url) {
+#if defined(ENABLE_PLUGINS)
+  if (CommandLine::ForCurrentProcess()->HasSwitch(
+          switches::kEnablePepperTesting))
+    return true;
+  if (IsExtensionOrSharedModuleWhitelisted(url, allowed_compositor_origins_))
+    return true;
+
+  chrome::VersionInfo::Channel channel = chrome::VersionInfo::GetChannel();
+  return channel <= chrome::VersionInfo::CHANNEL_DEV;
+#else
+  return false;
+#endif
+}
+
+bool ChromeContentRendererClient::IsPluginAllowedToUseVideoDecodeAPI(
+    const GURL& url) {
+#if defined(ENABLE_PLUGINS)
+  if (CommandLine::ForCurrentProcess()->HasSwitch(
+          switches::kEnablePepperTesting))
+    return true;
+
+  if (IsExtensionOrSharedModuleWhitelisted(url, allowed_video_decode_origins_))
+    return true;
+
+  chrome::VersionInfo::Channel channel = chrome::VersionInfo::GetChannel();
+  return channel <= chrome::VersionInfo::CHANNEL_DEV;
+#else
+  return false;
+#endif
+}