summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjamescook@chromium.org <jamescook@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-02-03 19:32:25 +0000
committerjamescook@chromium.org <jamescook@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-02-03 19:32:25 +0000
commit71470b9f6ffa0c2432ecae186565569768c414a8 (patch)
tree57c1965dfdbd3e48cbbbaa1bdcba3e75bac0e1b1
parent019bfaf280063fc5f0cbeb2936d4d26cf2b1e7d7 (diff)
downloadchromium_src-71470b9f6ffa0c2432ecae186565569768c414a8.zip
chromium_src-71470b9f6ffa0c2432ecae186565569768c414a8.tar.gz
chromium_src-71470b9f6ffa0c2432ecae186565569768c414a8.tar.bz2
app_shell: Add ShellContentRendererClient
This is a step toward getting app_shell to initialize a renderer with extension support. * Add apps/shell/renderer so we can separate out the render process code * Do a little bit of cleanup in the Permissions system, which is the next thing to tackle. BUG=335632 TEST=none Review URL: https://codereview.chromium.org/149163002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@248548 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--apps/apps.gypi2
-rw-r--r--apps/shell/DEPS1
-rw-r--r--apps/shell/renderer/DEPS12
-rw-r--r--apps/shell/renderer/shell_content_renderer_client.cc74
-rw-r--r--apps/shell/renderer/shell_content_renderer_client.h54
-rw-r--r--apps/shell/shell_browser_main_parts.cc19
-rw-r--r--apps/shell/shell_extensions_client.cc34
-rw-r--r--apps/shell/shell_main_delegate.cc43
-rw-r--r--apps/shell/shell_main_delegate.h9
-rw-r--r--extensions/common/extensions_client.cc2
-rw-r--r--extensions/common/permissions/api_permission.h3
-rw-r--r--extensions/common/permissions/permission_set.cc1
-rw-r--r--extensions/common/permissions/permissions_info.cc1
13 files changed, 207 insertions, 48 deletions
diff --git a/apps/apps.gypi b/apps/apps.gypi
index bcb458c..393b9fe 100644
--- a/apps/apps.gypi
+++ b/apps/apps.gypi
@@ -124,6 +124,8 @@
'..',
],
'sources': [
+ 'shell/renderer/shell_content_renderer_client.cc',
+ 'shell/renderer/shell_content_renderer_client.h',
'shell/shell_app_sorting.cc',
'shell/shell_app_sorting.h',
'shell/shell_browser_context.cc',
diff --git a/apps/shell/DEPS b/apps/shell/DEPS
index 4a90c8f..8d6b630 100644
--- a/apps/shell/DEPS
+++ b/apps/shell/DEPS
@@ -11,6 +11,7 @@ include_rules = [
"+chrome/common/chrome_paths.h",
"+chrome/common/extensions/extension_file_util.h",
"+chrome/common/extensions/features/base_feature_provider.h",
+ "+chrome/common/extensions/permissions/chrome_api_permissions.h",
# Pieces of content_shell reused in app_shell.
"+content/shell/browser/shell_browser_context.h",
diff --git a/apps/shell/renderer/DEPS b/apps/shell/renderer/DEPS
new file mode 100644
index 0000000..b201ed5
--- /dev/null
+++ b/apps/shell/renderer/DEPS
@@ -0,0 +1,12 @@
+include_rules = [
+ # Only allow includes the renderer can use.
+ "-content/public/browser",
+ "+content/public/common",
+ "+content/public/renderer",
+ "+content/public/test",
+
+ # TODO(jamescook): Remove these. http://crbug.com/305404
+ # Chrome pieces for bring-up.
+ "+chrome/renderer/extensions/dispatcher.h",
+ "+chrome/renderer/extensions/extension_helper.h",
+]
diff --git a/apps/shell/renderer/shell_content_renderer_client.cc b/apps/shell/renderer/shell_content_renderer_client.cc
new file mode 100644
index 0000000..025a104c
--- /dev/null
+++ b/apps/shell/renderer/shell_content_renderer_client.cc
@@ -0,0 +1,74 @@
+// Copyright 2014 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 "apps/shell/renderer/shell_content_renderer_client.h"
+
+#include "apps/shell/shell_extensions_client.h"
+#include "chrome/renderer/extensions/dispatcher.h"
+#include "chrome/renderer/extensions/extension_helper.h"
+#include "content/public/renderer/render_thread.h"
+#include "extensions/common/extensions_client.h"
+
+using blink::WebFrame;
+using blink::WebString;
+using content::RenderThread;
+
+namespace apps {
+
+ShellContentRendererClient::ShellContentRendererClient() {}
+
+ShellContentRendererClient::~ShellContentRendererClient() {}
+
+void ShellContentRendererClient::RenderThreadStarted() {
+ RenderThread* thread = RenderThread::Get();
+
+ extension_dispatcher_.reset(new extensions::Dispatcher());
+ thread->AddObserver(extension_dispatcher_.get());
+
+ // TODO(jamescook): Init WebSecurityPolicy for chrome-extension: schemes.
+ // See ChromeContentRendererClient for details.
+
+ extensions_client_.reset(new ShellExtensionsClient);
+ extensions::ExtensionsClient::Set(extensions_client_.get());
+}
+
+void ShellContentRendererClient::RenderFrameCreated(
+ content::RenderFrame* render_frame) {
+ // TODO(jamescook): Create ExtensionFrameHelper? This might be needed for
+ // Pepper plugins like Flash.
+}
+
+void ShellContentRendererClient::RenderViewCreated(
+ content::RenderView* render_view) {
+ new extensions::ExtensionHelper(render_view, extension_dispatcher_.get());
+}
+
+bool ShellContentRendererClient::WillSendRequest(
+ blink::WebFrame* frame,
+ content::PageTransition transition_type,
+ const GURL& url,
+ const GURL& first_party_for_cookies,
+ GURL* new_url) {
+ // TODO(jamescook): Cause an error for bad extension scheme requests?
+ return false;
+}
+
+void ShellContentRendererClient::DidCreateScriptContext(
+ WebFrame* frame, v8::Handle<v8::Context> context, int extension_group,
+ int world_id) {
+ extension_dispatcher_->DidCreateScriptContext(
+ frame, context, extension_group, world_id);
+}
+
+void ShellContentRendererClient::WillReleaseScriptContext(
+ WebFrame* frame, v8::Handle<v8::Context> context, int world_id) {
+ extension_dispatcher_->WillReleaseScriptContext(frame, context, world_id);
+}
+
+bool ShellContentRendererClient::ShouldEnableSiteIsolationPolicy() const {
+ // Extension renderers don't need site isolation.
+ return false;
+}
+
+} // namespace apps
diff --git a/apps/shell/renderer/shell_content_renderer_client.h b/apps/shell/renderer/shell_content_renderer_client.h
new file mode 100644
index 0000000..12f9538
--- /dev/null
+++ b/apps/shell/renderer/shell_content_renderer_client.h
@@ -0,0 +1,54 @@
+// Copyright 2014 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 APPS_SHELL_RENDERER_SHELL_CONTENT_RENDERER_CLIENT_H_
+#define APPS_SHELL_RENDERER_SHELL_CONTENT_RENDERER_CLIENT_H_
+
+#include "base/compiler_specific.h"
+#include "base/macros.h"
+#include "base/memory/scoped_ptr.h"
+#include "content/public/renderer/content_renderer_client.h"
+
+namespace extensions {
+class Dispatcher;
+}
+
+namespace apps {
+
+class ShellExtensionsClient;
+
+// Renderer initialization and runtime support for app_shell.
+class ShellContentRendererClient : public content::ContentRendererClient {
+ public:
+ ShellContentRendererClient();
+ virtual ~ShellContentRendererClient();
+
+ // content::ContentRendererClient implementation:
+ virtual void RenderThreadStarted() OVERRIDE;
+ virtual void RenderFrameCreated(content::RenderFrame* render_frame) OVERRIDE;
+ virtual void RenderViewCreated(content::RenderView* render_view) OVERRIDE;
+ virtual bool WillSendRequest(blink::WebFrame* frame,
+ content::PageTransition transition_type,
+ const GURL& url,
+ const GURL& first_party_for_cookies,
+ GURL* new_url) OVERRIDE;
+ virtual void DidCreateScriptContext(blink::WebFrame* frame,
+ v8::Handle<v8::Context> context,
+ int extension_group,
+ int world_id) OVERRIDE;
+ virtual void WillReleaseScriptContext(blink::WebFrame* frame,
+ v8::Handle<v8::Context> context,
+ int world_id) OVERRIDE;
+ virtual bool ShouldEnableSiteIsolationPolicy() const OVERRIDE;
+
+ private:
+ scoped_ptr<ShellExtensionsClient> extensions_client_;
+ scoped_ptr<extensions::Dispatcher> extension_dispatcher_;
+
+ DISALLOW_COPY_AND_ASSIGN(ShellContentRendererClient);
+};
+
+} // namespace apps
+
+#endif // APPS_SHELL_RENDERER_SHELL_CONTENT_RENDERER_CLIENT_H_
diff --git a/apps/shell/shell_browser_main_parts.cc b/apps/shell/shell_browser_main_parts.cc
index 3750dd5..27d4a76 100644
--- a/apps/shell/shell_browser_main_parts.cc
+++ b/apps/shell/shell_browser_main_parts.cc
@@ -12,14 +12,11 @@
#include "base/command_line.h"
#include "base/file_util.h"
#include "base/files/file_path.h"
-#include "base/path_service.h"
#include "base/run_loop.h"
-#include "chrome/common/chrome_paths.h"
#include "components/browser_context_keyed_service/browser_context_dependency_manager.h"
#include "content/public/common/result_codes.h"
#include "extensions/browser/extension_system.h"
#include "extensions/browser/renderer_startup_helper.h"
-#include "extensions/common/extension_paths.h"
#include "ui/aura/env.h"
#include "ui/aura/root_window.h"
#include "ui/aura/test/test_screen.h"
@@ -28,10 +25,6 @@
#include "ui/gfx/screen.h"
#include "ui/wm/test/wm_test_helper.h"
-#if defined(OS_CHROMEOS)
-#include "chromeos/chromeos_paths.h"
-#endif
-
using content::BrowserContext;
using extensions::Extension;
using extensions::ExtensionSystem;
@@ -75,18 +68,6 @@ int ShellBrowserMainParts::PreCreateThreads() {
void ShellBrowserMainParts::PreMainMessageLoopRun() {
// NOTE: Much of this is culled from chrome/test/base/chrome_test_suite.cc
- // Set up all the paths to load files.
- chrome::RegisterPathProvider();
-#if defined(OS_CHROMEOS)
- chromeos::RegisterPathProvider();
-#endif
- extensions::RegisterPathProvider();
-
- // The extensions system needs manifest data from the Chrome PAK file.
- base::FilePath resources_pack_path;
- PathService::Get(chrome::FILE_RESOURCES_PACK, &resources_pack_path);
- ResourceBundle::GetSharedInstance().AddDataPackFromPath(
- resources_pack_path, ui::SCALE_FACTOR_NONE);
// TODO(jamescook): Initialize chromeos::UserManager.
diff --git a/apps/shell/shell_extensions_client.cc b/apps/shell/shell_extensions_client.cc
index aa8073d..ffd63b4 100644
--- a/apps/shell/shell_extensions_client.cc
+++ b/apps/shell/shell_extensions_client.cc
@@ -6,6 +6,7 @@
#include "base/logging.h"
#include "chrome/common/extensions/features/base_feature_provider.h"
+#include "chrome/common/extensions/permissions/chrome_api_permissions.h"
#include "extensions/common/common_manifest_handlers.h"
#include "extensions/common/manifest_handler.h"
#include "extensions/common/permissions/permission_message_provider.h"
@@ -25,25 +26,6 @@ namespace apps {
namespace {
-// TODO(jamescook): Refactor ChromeAPIPermissions to share some of the
-// permissions registration for app_shell. For now, allow no permissions.
-class ShellPermissionsProvider : public extensions::PermissionsProvider {
- public:
- ShellPermissionsProvider() {}
- virtual ~ShellPermissionsProvider() {}
-
- virtual std::vector<APIPermissionInfo*> GetAllPermissions() const OVERRIDE {
- return std::vector<APIPermissionInfo*>();
- }
-
- virtual std::vector<AliasInfo> GetAllAliases() const OVERRIDE {
- return std::vector<AliasInfo>();
- }
-
- private:
- DISALLOW_COPY_AND_ASSIGN(ShellPermissionsProvider);
-};
-
// TODO(jamescook): Refactor ChromePermissionsMessageProvider so we can share
// code.
class ShellPermissionMessageProvider
@@ -101,8 +83,18 @@ void ShellExtensionsClient::Initialize() {
const extensions::PermissionsProvider&
ShellExtensionsClient::GetPermissionsProvider() const {
- NOTIMPLEMENTED();
- static ShellPermissionsProvider provider;
+ // TODO(jamescook): app_shell needs a way to use a subset of the Chrome
+ // extension Features and Permissions. In particular, the lists of Features
+ // (including API features, manifest features and permission features) are
+ // listed in JSON files from c/c/e/api that are included into Chrome's
+ // resources.pak (_api_features.json and _permission_features.json). The
+ // PermissionsProvider must match the set of permissions used by the features
+ // in those files. We either need to make app_shell (and hence the extensions
+ // module) know about all possible permissions, or create a mechanism whereby
+ // we can build our own JSON files with only a subset of the data. For now,
+ // just provide all permissions Chrome knows about. Fixing this issue is
+ // http://crbug.com/339301
+ static extensions::ChromeAPIPermissions provider;
return provider;
}
diff --git a/apps/shell/shell_main_delegate.cc b/apps/shell/shell_main_delegate.cc
index 2406ca9..23c91fa 100644
--- a/apps/shell/shell_main_delegate.cc
+++ b/apps/shell/shell_main_delegate.cc
@@ -4,15 +4,23 @@
#include "apps/shell/shell_main_delegate.h"
+#include "apps/shell/renderer/shell_content_renderer_client.h"
#include "apps/shell/shell_content_browser_client.h"
#include "apps/shell/shell_content_client.h"
#include "base/command_line.h"
#include "base/files/file_path.h"
#include "base/logging.h"
#include "base/path_service.h"
+#include "chrome/common/chrome_paths.h"
#include "content/public/browser/browser_main_runner.h"
+#include "content/public/common/content_switches.h"
+#include "extensions/common/extension_paths.h"
#include "ui/base/resource/resource_bundle.h"
+#if defined(OS_CHROMEOS)
+#include "chromeos/chromeos_paths.h"
+#endif
+
namespace {
void InitLogging() {
@@ -41,11 +49,21 @@ bool ShellMainDelegate::BasicStartupComplete(int* exit_code) {
InitLogging();
content_client_.reset(new ShellContentClient);
SetContentClient(content_client_.get());
+
+ chrome::RegisterPathProvider();
+#if defined(OS_CHROMEOS)
+ chromeos::RegisterPathProvider();
+#endif
+ extensions::RegisterPathProvider();
return false;
}
void ShellMainDelegate::PreSandboxStartup() {
- InitializeResourceBundle();
+ std::string process_type =
+ CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
+ switches::kProcessType);
+ if (ProcessNeedsResourceBundle(process_type))
+ InitializeResourceBundle();
}
content::ContentBrowserClient* ShellMainDelegate::CreateContentBrowserClient() {
@@ -55,13 +73,30 @@ content::ContentBrowserClient* ShellMainDelegate::CreateContentBrowserClient() {
content::ContentRendererClient*
ShellMainDelegate::CreateContentRendererClient() {
- // TODO(jamescook): Create a ShellContentRendererClient with the extensions
- // initialization pieces of ChromeContentRendererClient.
- return content::ContentMainDelegate::CreateContentRendererClient();
+ renderer_client_.reset(new ShellContentRendererClient);
+ return renderer_client_.get();
+}
+
+// static
+bool ShellMainDelegate::ProcessNeedsResourceBundle(
+ const std::string& process_type) {
+ // The browser process has no process type flag, but needs resources.
+ // On Linux the zygote process opens the resources for the renderers.
+ return process_type.empty() ||
+ process_type == switches::kZygoteProcess ||
+ process_type == switches::kRendererProcess ||
+ process_type == switches::kUtilityProcess;
}
void ShellMainDelegate::InitializeResourceBundle() {
ui::ResourceBundle::InitSharedInstanceWithLocale("en-US", NULL);
+
+ // The extensions system needs manifest data from the Chrome PAK file.
+ // TODO(jamescook): app_shell needs its own manifest data file.
+ base::FilePath resources_pack_path;
+ PathService::Get(chrome::FILE_RESOURCES_PACK, &resources_pack_path);
+ ResourceBundle::GetSharedInstance().AddDataPackFromPath(
+ resources_pack_path, ui::SCALE_FACTOR_NONE);
}
} // namespace apps
diff --git a/apps/shell/shell_main_delegate.h b/apps/shell/shell_main_delegate.h
index 19f0333..14f5658 100644
--- a/apps/shell/shell_main_delegate.h
+++ b/apps/shell/shell_main_delegate.h
@@ -13,6 +13,7 @@ namespace apps {
class ShellContentBrowserClient;
class ShellContentClient;
+class ShellContentRendererClient;
class ShellMainDelegate : public content::ContentMainDelegate {
public:
@@ -26,11 +27,17 @@ class ShellMainDelegate : public content::ContentMainDelegate {
virtual content::ContentRendererClient* CreateContentRendererClient()
OVERRIDE;
+ private:
+ // |process_type| is zygote, renderer, utility, etc. Returns true if the
+ // process needs data from resources.pak.
+ static bool ProcessNeedsResourceBundle(const std::string& process_type);
+
+ // Initializes the resource bundle and resources.pak.
static void InitializeResourceBundle();
- private:
scoped_ptr<ShellContentClient> content_client_;
scoped_ptr<ShellContentBrowserClient> browser_client_;
+ scoped_ptr<ShellContentRendererClient> renderer_client_;
DISALLOW_COPY_AND_ASSIGN(ShellMainDelegate);
};
diff --git a/extensions/common/extensions_client.cc b/extensions/common/extensions_client.cc
index ccca164..89795b8 100644
--- a/extensions/common/extensions_client.cc
+++ b/extensions/common/extensions_client.cc
@@ -3,6 +3,7 @@
// found in the LICENSE file.
#include "base/basictypes.h"
+#include "base/logging.h"
#include "extensions/common/extensions_client.h"
namespace extensions {
@@ -14,6 +15,7 @@ ExtensionsClient* g_client = NULL;
} // namespace
ExtensionsClient* ExtensionsClient::Get() {
+ DCHECK(g_client);
return g_client;
}
diff --git a/extensions/common/permissions/api_permission.h b/extensions/common/permissions/api_permission.h
index f50dada..6427e57 100644
--- a/extensions/common/permissions/api_permission.h
+++ b/extensions/common/permissions/api_permission.h
@@ -311,8 +311,7 @@ class APIPermissionInfo {
}
private:
- // Instances should only be constructed from within a
- // PermissionsInfo::Delegate.
+ // Instances should only be constructed from within a PermissionsProvider.
friend class ChromeAPIPermissions;
// Implementations of APIPermission will want to get the permission message,
// but this class's implementation should be hidden from everyone else.
diff --git a/extensions/common/permissions/permission_set.cc b/extensions/common/permissions/permission_set.cc
index 8ec1cbe..fd32d4e 100644
--- a/extensions/common/permissions/permission_set.cc
+++ b/extensions/common/permissions/permission_set.cc
@@ -180,6 +180,7 @@ bool PermissionSet::HasAPIPermission(
bool PermissionSet::HasAPIPermission(const std::string& permission_name) const {
const APIPermissionInfo* permission =
PermissionsInfo::GetInstance()->GetByName(permission_name);
+ // Ensure our PermissionsProvider is aware of this permission.
CHECK(permission) << permission_name;
return (permission && apis_.count(permission->id()));
}
diff --git a/extensions/common/permissions/permissions_info.cc b/extensions/common/permissions/permissions_info.cc
index bac3d9c1..e4684aa 100644
--- a/extensions/common/permissions/permissions_info.cc
+++ b/extensions/common/permissions/permissions_info.cc
@@ -64,7 +64,6 @@ bool PermissionsInfo::HasChildPermissions(const std::string& name) const {
PermissionsInfo::PermissionsInfo()
: hosted_app_permission_count_(0),
permission_count_(0) {
- DCHECK(ExtensionsClient::Get());
InitializeWithProvider(ExtensionsClient::Get()->GetPermissionsProvider());
}