Set extension-related webkit preferences in a common location.

Before we were ending up with different preferences set in
different locations.

I'm not sure if this approach is right from the content-team's
point of view.

BUG=
TEST=

Review URL: http://codereview.chromium.org/8403024

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@107882 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index 9be88fca..032bfce1 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -891,10 +891,8 @@
   return !browser_command_line.HasSwitch(switches::kChromeFrame);
 }
 
-WebPreferences ChromeContentBrowserClient::GetWebkitPrefs(
-    content::BrowserContext* browser_context, bool is_web_ui) {
-  return RenderViewHostDelegateHelper::GetWebkitPrefs(browser_context,
-                                                      is_web_ui);
+WebPreferences ChromeContentBrowserClient::GetWebkitPrefs(RenderViewHost* rvh) {
+  return RenderViewHostDelegateHelper::GetWebkitPrefs(rvh);
 }
 
 void ChromeContentBrowserClient::UpdateInspectorSetting(
diff --git a/chrome/browser/chrome_content_browser_client.h b/chrome/browser/chrome_content_browser_client.h
index bb8d55a..4d4e0ec6 100644
--- a/chrome/browser/chrome_content_browser_client.h
+++ b/chrome/browser/chrome_content_browser_client.h
@@ -113,9 +113,7 @@
   virtual speech_input::SpeechInputManager* GetSpeechInputManager() OVERRIDE;
   virtual AccessTokenStore* CreateAccessTokenStore() OVERRIDE;
   virtual bool IsFastShutdownPossible() OVERRIDE;
-  virtual WebPreferences GetWebkitPrefs(
-      content::BrowserContext* browser_context,
-      bool is_web_ui) OVERRIDE;
+  virtual WebPreferences GetWebkitPrefs(RenderViewHost* rvh) OVERRIDE;
   virtual void UpdateInspectorSetting(RenderViewHost* rvh,
                                       const std::string& key,
                                       const std::string& value) OVERRIDE;
diff --git a/chrome/browser/extensions/extension_host.cc b/chrome/browser/extensions/extension_host.cc
index 85fb48ae..717816c8 100644
--- a/chrome/browser/extensions/extension_host.cc
+++ b/chrome/browser/extensions/extension_host.cc
@@ -526,24 +526,8 @@
 }
 
 WebPreferences ExtensionHost::GetWebkitPrefs() {
-  Profile* profile = Profile::FromBrowserContext(
-      render_view_host()->process()->browser_context());
   WebPreferences webkit_prefs =
-      RenderViewHostDelegateHelper::GetWebkitPrefs(profile,
-                                                   false);  // is_web_ui
-  // Extensions are trusted so we override any user preferences for disabling
-  // javascript or images.
-  webkit_prefs.loads_images_automatically = true;
-  webkit_prefs.javascript_enabled = true;
-
-  // Enable privileged WebGL extensions.
-  webkit_prefs.privileged_webgl_extensions_enabled = true;
-
-  if (extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_POPUP ||
-      extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_DIALOG ||
-      extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_BACKGROUND_PAGE ||
-      extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_INFOBAR)
-    webkit_prefs.allow_scripts_to_close_windows = true;
+      RenderViewHostDelegateHelper::GetWebkitPrefs(render_view_host());
 
   // Disable anything that requires the GPU process for background pages.
   // See http://crbug.com/64512 and http://crbug.com/64841.
diff --git a/chrome/browser/extensions/extension_webkit_preferences.cc b/chrome/browser/extensions/extension_webkit_preferences.cc
new file mode 100644
index 0000000..4be4be7f
--- /dev/null
+++ b/chrome/browser/extensions/extension_webkit_preferences.cc
@@ -0,0 +1,27 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "webkit/glue/webpreferences.h"
+
+#include "chrome/common/extensions/extension.h"
+
+namespace extension_webkit_preferences {
+
+void SetPreferences(WebPreferences* webkit_prefs, const Extension* extension) {
+  if (extension && !extension->is_hosted_app()) {
+    // Extensions are trusted so we override any user preferences for disabling
+    // javascript or images.
+    webkit_prefs->loads_images_automatically = true;
+    webkit_prefs->javascript_enabled = true;
+
+    // Tabs aren't typically allowed to close windows. But extensions shouldn't
+    // be subject to that.
+    webkit_prefs->allow_scripts_to_close_windows = true;
+
+    // Enable privileged WebGL extensions.
+    webkit_prefs->privileged_webgl_extensions_enabled = true;
+  }
+}
+
+}  // extension_webkit_preferences
diff --git a/chrome/browser/extensions/extension_webkit_preferences.h b/chrome/browser/extensions/extension_webkit_preferences.h
new file mode 100644
index 0000000..508e8a8
--- /dev/null
+++ b/chrome/browser/extensions/extension_webkit_preferences.h
@@ -0,0 +1,17 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_EXTENSIONS_EXTENSION_WEBKIT_PREFERENCES_H_
+#define CHROME_BROWSER_EXTENSIONS_EXTENSION_WEBKIT_PREFERENCES_H_
+
+class Extension;
+struct WebPreferences;
+
+namespace extension_webkit_preferences {
+
+void SetPreferences(WebPreferences* preferences, const Extension* extension);
+
+}  // namespace extension_webkit_preferences
+
+#endif  // CHROME_BROWSER_EXTENSIONS_EXTENSION_WEBKIT_PREFERENCES_H_
diff --git a/chrome/browser/notifications/balloon_host.cc b/chrome/browser/notifications/balloon_host.cc
index 897c29c9..ca63c90c 100644
--- a/chrome/browser/notifications/balloon_host.cc
+++ b/chrome/browser/notifications/balloon_host.cc
@@ -66,8 +66,7 @@
 
 WebPreferences BalloonHost::GetWebkitPrefs() {
   WebPreferences web_prefs =
-      RenderViewHostDelegateHelper::GetWebkitPrefs(balloon_->profile(),
-                                                   enable_web_ui_);
+      RenderViewHostDelegateHelper::GetWebkitPrefs(render_view_host_);
   web_prefs.allow_scripts_to_close_windows = true;
   return web_prefs;
 }
diff --git a/chrome/browser/tab_contents/background_contents.cc b/chrome/browser/tab_contents/background_contents.cc
index 6b3187a..33af53f 100644
--- a/chrome/browser/tab_contents/background_contents.cc
+++ b/chrome/browser/tab_contents/background_contents.cc
@@ -185,12 +185,9 @@
 }
 
 WebPreferences BackgroundContents::GetWebkitPrefs() {
-  // TODO(rafaelw): Consider enabling the webkit_prefs.dom_paste_enabled for
-  // apps.
-  Profile* profile = Profile::FromBrowserContext(
-      render_view_host_->process()->browser_context());
-  WebPreferences prefs = RenderViewHostDelegateHelper::GetWebkitPrefs(profile,
-                                                                      false);
+  WebPreferences prefs =
+      RenderViewHostDelegateHelper::GetWebkitPrefs(render_view_host_);
+
   // Disable all kinds of acceleration for background pages.
   // See http://crbug.com/96005 and http://crbug.com/96006
   prefs.force_compositing_mode = false;
diff --git a/chrome/browser/tab_contents/render_view_host_delegate_helper.cc b/chrome/browser/tab_contents/render_view_host_delegate_helper.cc
index 9533c76..6b2fa7126 100644
--- a/chrome/browser/tab_contents/render_view_host_delegate_helper.cc
+++ b/chrome/browser/tab_contents/render_view_host_delegate_helper.cc
@@ -13,7 +13,9 @@
 #include "chrome/browser/background/background_contents_service_factory.h"
 #include "chrome/browser/chrome_content_browser_client.h"
 #include "chrome/browser/character_encoding.h"
+#include "chrome/browser/extensions/extension_process_manager.h"
 #include "chrome/browser/extensions/extension_service.h"
+#include "chrome/browser/extensions/extension_webkit_preferences.h"
 #include "chrome/browser/prefs/pref_service.h"
 #include "chrome/browser/prefs/scoped_user_pref_update.h"
 #include "chrome/browser/prerender/prerender_manager.h"
@@ -23,6 +25,7 @@
 #include "chrome/browser/user_style_sheet_watcher.h"
 #include "chrome/common/chrome_switches.h"
 #include "chrome/common/pref_names.h"
+#include "content/browser/child_process_security_policy.h"
 #include "content/browser/gpu/gpu_data_manager.h"
 #include "content/browser/gpu/gpu_process_host.h"
 #include "content/browser/renderer_host/render_view_host.h"
@@ -326,8 +329,9 @@
 
 // static
 WebPreferences RenderViewHostDelegateHelper::GetWebkitPrefs(
-    content::BrowserContext* browser_context, bool is_web_ui) {
-  Profile* profile = Profile::FromBrowserContext(browser_context);
+    RenderViewHost* rvh) {
+  Profile* profile = Profile::FromBrowserContext(
+      rvh->process()->browser_context());
   PrefService* prefs = profile->GetPrefs();
   WebPreferences web_prefs;
 
@@ -525,13 +529,23 @@
   }
   DCHECK(!web_prefs.default_encoding.empty());
 
-  if (is_web_ui) {
+  if (ChildProcessSecurityPolicy::GetInstance()->HasWebUIBindings(
+          rvh->process()->id())) {
     web_prefs.loads_images_automatically = true;
     web_prefs.javascript_enabled = true;
   }
 
   web_prefs.is_online = !net::NetworkChangeNotifier::IsOffline();
 
+  ExtensionProcessManager* extension_process_manager =
+      profile->GetExtensionProcessManager();
+  if (extension_process_manager) {
+    const Extension* extension =
+        extension_process_manager->GetExtensionForSiteInstance(
+            rvh->site_instance()->id());
+    extension_webkit_preferences::SetPreferences(&web_prefs, extension);
+  }
+
   return web_prefs;
 }
 
diff --git a/chrome/browser/tab_contents/render_view_host_delegate_helper.h b/chrome/browser/tab_contents/render_view_host_delegate_helper.h
index 6b178d4e..0ebc16a7 100644
--- a/chrome/browser/tab_contents/render_view_host_delegate_helper.h
+++ b/chrome/browser/tab_contents/render_view_host_delegate_helper.h
@@ -125,8 +125,7 @@
 // RenderViewHostDelegate methods.
 class RenderViewHostDelegateHelper {
  public:
-  static WebPreferences GetWebkitPrefs(content::BrowserContext* browser_context,
-                                       bool is_web_ui);
+  static WebPreferences GetWebkitPrefs(RenderViewHost* rvh);
 
   static void UpdateInspectorSetting(content::BrowserContext* browser_context,
                                      const std::string& key,
diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi
index ec8ed64..403699d 100644
--- a/chrome/chrome_browser.gypi
+++ b/chrome/chrome_browser.gypi
@@ -1197,6 +1197,8 @@
         'browser/extensions/extension_web_socket_proxy_private_api.h',
         'browser/extensions/extension_web_ui.cc',
         'browser/extensions/extension_web_ui.h',
+        'browser/extensions/extension_webkit_preferences.cc',
+        'browser/extensions/extension_webkit_preferences.h',
         'browser/extensions/extension_webnavigation_api.cc',
         'browser/extensions/extension_webnavigation_api.h',
         'browser/extensions/extension_webnavigation_api_constants.cc',