diff options
author | ericzeng@chromium.org <ericzeng@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-08-13 09:38:31 +0000 |
---|---|---|
committer | ericzeng@chromium.org <ericzeng@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-08-13 09:39:40 +0000 |
commit | 70527de53e8988eec24190e9911bbe3b1c8c85cc (patch) | |
tree | 3501c039840295d6c83ca11725852c12f37f90d9 /chrome/renderer | |
parent | 3da74d14e73e63f723d0d030783140d6ffd8e782 (diff) | |
download | chromium_src-70527de53e8988eec24190e9911bbe3b1c8c85cc.zip chromium_src-70527de53e8988eec24190e9911bbe3b1c8c85cc.tar.gz chromium_src-70527de53e8988eec24190e9911bbe3b1c8c85cc.tar.bz2 |
Implement support for <extensionoptions> embedding in WebUI
Modify permissions and checks in GuestView, WebUI, and
extensions to allow <extensionoptions> to be used within WebUI.
In the GuestView infrastructure, allow guest views in WebUI to
be created without extension ids. In extensions, allow extension
options-related APIs to be used in WebUI contexts. In WebUI,
relax the CSP to allow internal browser plugins.
BUG=386842
Review URL: https://codereview.chromium.org/453613002
Cr-Commit-Position: refs/heads/master@{#289233}
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@289233 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/renderer')
-rw-r--r-- | chrome/renderer/chrome_content_renderer_client.cc | 29 | ||||
-rw-r--r-- | chrome/renderer/extensions/chrome_extensions_dispatcher_delegate.cc | 8 |
2 files changed, 19 insertions, 18 deletions
diff --git a/chrome/renderer/chrome_content_renderer_client.cc b/chrome/renderer/chrome_content_renderer_client.cc index a5094ce..9eb68b5 100644 --- a/chrome/renderer/chrome_content_renderer_client.cc +++ b/chrome/renderer/chrome_content_renderer_client.cc @@ -245,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() { @@ -520,20 +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::kAppView, - extensions::APIPermission::kEmbeddedExtensionOptions, - extensions::APIPermission::kWebView, - }; - for (size_t i = 0; i < arraysize(perms); ++i) { - if (extension->permissions_data()->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; diff --git a/chrome/renderer/extensions/chrome_extensions_dispatcher_delegate.cc b/chrome/renderer/extensions/chrome_extensions_dispatcher_delegate.cc index 960b675..47600fb 100644 --- a/chrome/renderer/extensions/chrome_extensions_dispatcher_delegate.cc +++ b/chrome/renderer/extensions/chrome_extensions_dispatcher_delegate.cc @@ -289,6 +289,7 @@ void ChromeExtensionsDispatcherDelegate::RequireAdditionalModules( // The API will be automatically set up when first used. if (context_type == extensions::Feature::BLESSED_EXTENSION_CONTEXT || context_type == extensions::Feature::UNBLESSED_EXTENSION_CONTEXT) { + // TODO(fsamuel): Use context->GetAvailability("webViewInternal"). if (extension->permissions_data()->HasAPIPermission( extensions::APIPermission::kWebView)) { module_system->Require("webView"); @@ -313,6 +314,7 @@ void ChromeExtensionsDispatcherDelegate::RequireAdditionalModules( } if (context_type == extensions::Feature::BLESSED_EXTENSION_CONTEXT) { + // TODO(fsamuel): Use context->GetAvailability("appViewInternal"). if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kEnableAppView) && extension->permissions_data()->HasAPIPermission( extensions::APIPermission::kAppView)) { @@ -322,10 +324,8 @@ void ChromeExtensionsDispatcherDelegate::RequireAdditionalModules( } } - if (context_type == extensions::Feature::BLESSED_EXTENSION_CONTEXT && - extensions::FeatureSwitch::embedded_extension_options()->IsEnabled() && - extension->permissions_data()->HasAPIPermission( - extensions::APIPermission::kEmbeddedExtensionOptions)) { + if (extensions::FeatureSwitch::embedded_extension_options()->IsEnabled() && + context->GetAvailability("extensionOptionsInternal").is_available()) { module_system->Require("extensionOptions"); } } |