Skip to content

Commit

Permalink
Create ExtensionsRendererClient.
Browse files Browse the repository at this point in the history
ExtensionsRendererClient defines an interface for clients
who wish to embed the extensions system into their renderer
processes.

This initial CL introduces two simple client methods to abstract
away Chrome dependencies within UserScriptSlave.

BUG=359836
R=yoz@chromium.org
TBR=jochen@chromium.org for ChromeContentRendererClient

Review URL: https://codereview.chromium.org/237833002

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@264097 0039d316-1c4b-4281-b951-d872f2087c98
  • Loading branch information
rockot@chromium.org committed Apr 16, 2014
1 parent 98cb9ff commit 60961f7
Show file tree
Hide file tree
Showing 13 changed files with 189 additions and 3 deletions.
2 changes: 2 additions & 0 deletions apps/shell/app_shell.gyp
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,8 @@
'common/shell_extensions_client.h',
'renderer/shell_content_renderer_client.cc',
'renderer/shell_content_renderer_client.h',
'renderer/shell_extensions_renderer_client.cc',
'renderer/shell_extensions_renderer_client.h',
],
},
{
Expand Down
4 changes: 4 additions & 0 deletions apps/shell/renderer/shell_content_renderer_client.cc
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include "apps/shell/renderer/shell_content_renderer_client.h"

#include "apps/shell/common/shell_extensions_client.h"
#include "apps/shell/renderer/shell_extensions_renderer_client.h"
#include "chrome/renderer/extensions/dispatcher.h"
#include "chrome/renderer/extensions/extension_helper.h"
#include "content/public/renderer/render_frame.h"
Expand Down Expand Up @@ -71,6 +72,9 @@ void ShellContentRendererClient::RenderThreadStarted() {

extensions_client_.reset(new ShellExtensionsClient);
extensions::ExtensionsClient::Set(extensions_client_.get());

extensions_renderer_client_.reset(new ShellExtensionsRendererClient);
extensions::ExtensionsRendererClient::Set(extensions_renderer_client_.get());
}

void ShellContentRendererClient::RenderFrameCreated(
Expand Down
2 changes: 2 additions & 0 deletions apps/shell/renderer/shell_content_renderer_client.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ class Dispatcher;
namespace apps {

class ShellExtensionsClient;
class ShellExtensionsRendererClient;

// Renderer initialization and runtime support for app_shell.
class ShellContentRendererClient : public content::ContentRendererClient {
Expand All @@ -41,6 +42,7 @@ class ShellContentRendererClient : public content::ContentRendererClient {

private:
scoped_ptr<ShellExtensionsClient> extensions_client_;
scoped_ptr<ShellExtensionsRendererClient> extensions_renderer_client_;
scoped_ptr<extensions::Dispatcher> extension_dispatcher_;

DISALLOW_COPY_AND_ASSIGN(ShellContentRendererClient);
Expand Down
25 changes: 25 additions & 0 deletions apps/shell/renderer/shell_extensions_renderer_client.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
// 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_extensions_renderer_client.h"

namespace apps {

ShellExtensionsRendererClient::ShellExtensionsRendererClient() {}

ShellExtensionsRendererClient::~ShellExtensionsRendererClient() {}

bool ShellExtensionsRendererClient::IsIncognitoProcess() const {
// app_shell doesn't support off-the-record contexts.
return false;
}

int ShellExtensionsRendererClient::GetLowestIsolatedWorldId() const {
// app_shell doesn't need to reserve world IDs for anything other than
// extensions, so we always return 1. Note that 0 is reserved for the global
// world.
return 1;
}

} // namespace apps
29 changes: 29 additions & 0 deletions apps/shell/renderer/shell_extensions_renderer_client.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
// 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_EXTENSIONS_RENDERER_CLIENT_H_
#define APPS_SHELL_RENDERER_SHELL_EXTENSIONS_RENDERER_CLIENT_H_

#include "base/macros.h"
#include "extensions/renderer/extensions_renderer_client.h"

namespace apps {

class ShellExtensionsRendererClient
: public extensions::ExtensionsRendererClient {
public:
ShellExtensionsRendererClient();
virtual ~ShellExtensionsRendererClient();

// extensions::ExtensionsRendererClient implementation.
virtual bool IsIncognitoProcess() const OVERRIDE;
virtual int GetLowestIsolatedWorldId() const OVERRIDE;

private:
DISALLOW_COPY_AND_ASSIGN(ShellExtensionsRendererClient);
};

} // namespace apps

#endif // APPS_SHELL_RENDERER_SHELL_EXTENSIONS_RENDERER_CLIENT_H_
2 changes: 2 additions & 0 deletions chrome/chrome_renderer.gypi
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,8 @@
'renderer/extensions/blob_native_handler.h',
'renderer/extensions/cast_streaming_native_handler.cc',
'renderer/extensions/cast_streaming_native_handler.h',
'renderer/extensions/chrome_extensions_renderer_client.cc',
'renderer/extensions/chrome_extensions_renderer_client.h',
'renderer/extensions/chrome_v8_context.cc',
'renderer/extensions/chrome_v8_context.h',
'renderer/extensions/chrome_v8_context_set.cc',
Expand Down
3 changes: 3 additions & 0 deletions chrome/renderer/chrome_content_renderer_client.cc
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
#include "chrome/renderer/chrome_render_process_observer.h"
#include "chrome/renderer/chrome_render_view_observer.h"
#include "chrome/renderer/content_settings_observer.h"
#include "chrome/renderer/extensions/chrome_extensions_renderer_client.h"
#include "chrome/renderer/extensions/chrome_v8_context.h"
#include "chrome/renderer/extensions/chrome_v8_extension.h"
#include "chrome/renderer/extensions/dispatcher.h"
Expand Down Expand Up @@ -361,6 +362,8 @@ void ChromeContentRendererClient::RenderThreadStarted() {

extensions::ExtensionsClient::Set(
extensions::ChromeExtensionsClient::GetInstance());
extensions::ExtensionsRendererClient::Set(
ChromeExtensionsRendererClient::GetInstance());

#if defined(OS_WIN)
// Report if the renderer process has been patched by chrome_elf.
Expand Down
28 changes: 28 additions & 0 deletions chrome/renderer/extensions/chrome_extensions_renderer_client.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
// 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 "chrome/renderer/extensions/chrome_extensions_renderer_client.h"

#include "base/lazy_instance.h"
#include "chrome/renderer/chrome_render_process_observer.h"
#include "chrome/renderer/isolated_world_ids.h"

ChromeExtensionsRendererClient::ChromeExtensionsRendererClient() {}

ChromeExtensionsRendererClient::~ChromeExtensionsRendererClient() {}

// static
ChromeExtensionsRendererClient* ChromeExtensionsRendererClient::GetInstance() {
static base::LazyInstance<ChromeExtensionsRendererClient> client =
LAZY_INSTANCE_INITIALIZER;
return client.Pointer();
}

bool ChromeExtensionsRendererClient::IsIncognitoProcess() const {
return ChromeRenderProcessObserver::is_incognito_process();
}

int ChromeExtensionsRendererClient::GetLowestIsolatedWorldId() const {
return chrome::ISOLATED_WORLD_ID_EXTENSIONS;
}
28 changes: 28 additions & 0 deletions chrome/renderer/extensions/chrome_extensions_renderer_client.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
// 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 CHROME_RENDERER_EXTENSIONS_CHROME_EXTENSIONS_RENDERER_CLIENT_H_
#define CHROME_RENDERER_EXTENSIONS_CHROME_EXTENSIONS_RENDERER_CLIENT_H_

#include "base/macros.h"
#include "extensions/renderer/extensions_renderer_client.h"

class ChromeExtensionsRendererClient
: public extensions::ExtensionsRendererClient {
public:
ChromeExtensionsRendererClient();
virtual ~ChromeExtensionsRendererClient();

// Get the LazyInstance for ChromeExtensionsRendererClient.
static ChromeExtensionsRendererClient* GetInstance();

// extensions::ExtensionsRendererClient implementation.
virtual bool IsIncognitoProcess() const OVERRIDE;
virtual int GetLowestIsolatedWorldId() const OVERRIDE;

private:
DISALLOW_COPY_AND_ASSIGN(ChromeExtensionsRendererClient);
};

#endif // CHROME_RENDERER_EXTENSIONS_CHROME_EXTENSIONS_RENDERER_CLIENT_H_
7 changes: 4 additions & 3 deletions chrome/renderer/extensions/user_script_slave.cc
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
#include "base/strings/stringprintf.h"
#include "base/timer/elapsed_timer.h"
#include "chrome/common/url_constants.h"
#include "chrome/renderer/chrome_render_process_observer.h"
#include "chrome/renderer/extensions/dom_activity_logger.h"
#include "chrome/renderer/extensions/extension_groups.h"
#include "chrome/renderer/isolated_world_ids.h"
Expand All @@ -25,6 +24,7 @@
#include "extensions/common/extension_set.h"
#include "extensions/common/manifest_handlers/csp_info.h"
#include "extensions/common/permissions/permissions_data.h"
#include "extensions/renderer/extensions_renderer_client.h"
#include "extensions/renderer/script_context.h"
#include "grit/renderer_resources.h"
#include "third_party/WebKit/public/platform/WebURLRequest.h"
Expand Down Expand Up @@ -54,7 +54,8 @@ static const char kUserScriptTail[] = "\n})(window);";

int UserScriptSlave::GetIsolatedWorldIdForExtension(const Extension* extension,
WebFrame* frame) {
static int g_next_isolated_world_id = chrome::ISOLATED_WORLD_ID_EXTENSIONS;
static int g_next_isolated_world_id =
ExtensionsRendererClient::Get()->GetLowestIsolatedWorldId();

IsolatedWorldMap::iterator iter = isolated_world_ids_.find(extension->id());
if (iter != isolated_world_ids_.end()) {
Expand Down Expand Up @@ -119,7 +120,7 @@ bool UserScriptSlave::UpdateScripts(base::SharedMemoryHandle shared_memory) {
scripts_.clear();

bool only_inject_incognito =
ChromeRenderProcessObserver::is_incognito_process();
ExtensionsRendererClient::Get()->IsIncognitoProcess();

// Create the shared memory object (read only).
shared_memory_.reset(new base::SharedMemory(shared_memory, true));
Expand Down
2 changes: 2 additions & 0 deletions extensions/extensions.gyp
Original file line number Diff line number Diff line change
Expand Up @@ -419,6 +419,8 @@
'renderer/console.h',
'renderer/event_bindings.cc',
'renderer/event_bindings.h',
'renderer/extensions_renderer_client.cc',
'renderer/extensions_renderer_client.h',
'renderer/module_system.cc',
'renderer/module_system.h',
'renderer/native_handler.cc',
Expand Down
23 changes: 23 additions & 0 deletions extensions/renderer/extensions_renderer_client.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
// 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 "extensions/renderer/extensions_renderer_client.h"

#include "base/basictypes.h"

namespace extensions {

namespace {

ExtensionsRendererClient* g_client = NULL;

} // namespace

ExtensionsRendererClient* ExtensionsRendererClient::Get() { return g_client; }

void ExtensionsRendererClient::Set(ExtensionsRendererClient* client) {
g_client = client;
}

} // namespace extensions
37 changes: 37 additions & 0 deletions extensions/renderer/extensions_renderer_client.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
// 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 EXTENSIONS_RENDERER_EXTENSIONS_RENDERER_CLIENT_H_
#define EXTENSIONS_RENDERER_EXTENSIONS_RENDERER_CLIENT_H_

namespace extensions {

// Interface to allow the extensions module to make render-process-specific
// queries of the embedder. Should be Set() once in the render process.
//
// NOTE: Methods that do not require knowledge of renderer concepts should be
// added in ExtensionsClient (extensions/common/extensions_client.h) even if
// they are only used in the renderer process.
class ExtensionsRendererClient {
public:
virtual ~ExtensionsRendererClient() {}

// Returns true if the current render process was launched incognito.
virtual bool IsIncognitoProcess() const = 0;

// Returns the lowest isolated world ID available to extensions.
// Must be greater than 0. See blink::WebFrame::executeScriptInIsolatedWorld
// (third_party/WebKit/public/web/WebFrame.h) for additional context.
virtual int GetLowestIsolatedWorldId() const = 0;

// Returns the single instance of |this|.
static ExtensionsRendererClient* Get();

// Initialize the single instance.
static void Set(ExtensionsRendererClient* client);
};

} // namespace extensions

#endif // EXTENSIONS_RENDERER_EXTENSIONS_RENDERER_CLIENT_H_

0 comments on commit 60961f7

Please sign in to comment.