1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "apps/shell/renderer/shell_content_renderer_client.h"
7 #include "apps/shell/common/shell_extensions_client.h"
8 #include "apps/shell/renderer/shell_extensions_renderer_client.h"
9 #include "chrome/renderer/extensions/dispatcher.h"
10 #include "chrome/renderer/extensions/extension_helper.h"
11 #include "content/public/renderer/render_frame.h"
12 #include "content/public/renderer/render_frame_observer.h"
13 #include "content/public/renderer/render_frame_observer_tracker.h"
14 #include "content/public/renderer/render_thread.h"
15 #include "extensions/common/extensions_client.h"
17 using blink::WebFrame
;
18 using blink::WebString
;
19 using content::RenderThread
;
25 // TODO: promote ExtensionFrameHelper to a common place and share with this.
26 class ShellFrameHelper
27 : public content::RenderFrameObserver
,
28 public content::RenderFrameObserverTracker
<ShellFrameHelper
> {
30 ShellFrameHelper(content::RenderFrame
* render_frame
,
31 extensions::Dispatcher
* extension_dispatcher
);
32 virtual ~ShellFrameHelper();
34 // RenderFrameObserver implementation.
35 virtual void WillReleaseScriptContext(v8::Handle
<v8::Context
>,
36 int world_id
) OVERRIDE
;
39 extensions::Dispatcher
* extension_dispatcher_
;
41 DISALLOW_COPY_AND_ASSIGN(ShellFrameHelper
);
44 ShellFrameHelper::ShellFrameHelper(content::RenderFrame
* render_frame
,
45 extensions::Dispatcher
* extension_dispatcher
)
46 : content::RenderFrameObserver(render_frame
),
47 content::RenderFrameObserverTracker
<ShellFrameHelper
>(render_frame
),
48 extension_dispatcher_(extension_dispatcher
) {}
50 ShellFrameHelper::~ShellFrameHelper() {}
52 void ShellFrameHelper::WillReleaseScriptContext(v8::Handle
<v8::Context
> context
,
54 extension_dispatcher_
->WillReleaseScriptContext(
55 render_frame()->GetWebFrame(), context
, world_id
);
60 ShellContentRendererClient::ShellContentRendererClient() {}
62 ShellContentRendererClient::~ShellContentRendererClient() {}
64 void ShellContentRendererClient::RenderThreadStarted() {
65 RenderThread
* thread
= RenderThread::Get();
67 extension_dispatcher_
.reset(new extensions::Dispatcher());
68 thread
->AddObserver(extension_dispatcher_
.get());
70 // TODO(jamescook): Init WebSecurityPolicy for chrome-extension: schemes.
71 // See ChromeContentRendererClient for details.
73 extensions_client_
.reset(new ShellExtensionsClient
);
74 extensions::ExtensionsClient::Set(extensions_client_
.get());
76 extensions_renderer_client_
.reset(new ShellExtensionsRendererClient
);
77 extensions::ExtensionsRendererClient::Set(extensions_renderer_client_
.get());
80 void ShellContentRendererClient::RenderFrameCreated(
81 content::RenderFrame
* render_frame
) {
82 // ShellFrameHelper destroyes itself when the RenderFrame is destroyed.
83 new ShellFrameHelper(render_frame
, extension_dispatcher_
.get());
86 void ShellContentRendererClient::RenderViewCreated(
87 content::RenderView
* render_view
) {
88 new extensions::ExtensionHelper(render_view
, extension_dispatcher_
.get());
91 bool ShellContentRendererClient::WillSendRequest(
92 blink::WebFrame
* frame
,
93 content::PageTransition transition_type
,
95 const GURL
& first_party_for_cookies
,
97 // TODO(jamescook): Cause an error for bad extension scheme requests?
101 void ShellContentRendererClient::DidCreateScriptContext(
102 WebFrame
* frame
, v8::Handle
<v8::Context
> context
, int extension_group
,
104 extension_dispatcher_
->DidCreateScriptContext(
105 frame
, context
, extension_group
, world_id
);
108 bool ShellContentRendererClient::ShouldEnableSiteIsolationPolicy() const {
109 // Extension renderers don't need site isolation.