OLD | NEW |
| (Empty) |
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. | |
4 | |
5 #include "apps/shell/renderer/shell_content_renderer_client.h" | |
6 | |
7 #include "apps/shell/common/shell_extensions_client.h" | |
8 #include "apps/shell/renderer/shell_dispatcher_delegate.h" | |
9 #include "apps/shell/renderer/shell_extensions_renderer_client.h" | |
10 #include "apps/shell/renderer/shell_renderer_main_delegate.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" | |
16 #include "extensions/renderer/dispatcher.h" | |
17 #include "extensions/renderer/extension_helper.h" | |
18 | |
19 using blink::WebFrame; | |
20 using blink::WebString; | |
21 using content::RenderThread; | |
22 | |
23 namespace apps { | |
24 | |
25 namespace { | |
26 | |
27 // TODO: promote ExtensionFrameHelper to a common place and share with this. | |
28 class ShellFrameHelper | |
29 : public content::RenderFrameObserver, | |
30 public content::RenderFrameObserverTracker<ShellFrameHelper> { | |
31 public: | |
32 ShellFrameHelper(content::RenderFrame* render_frame, | |
33 extensions::Dispatcher* extension_dispatcher); | |
34 virtual ~ShellFrameHelper(); | |
35 | |
36 // RenderFrameObserver implementation. | |
37 virtual void WillReleaseScriptContext(v8::Handle<v8::Context>, | |
38 int world_id) OVERRIDE; | |
39 | |
40 private: | |
41 extensions::Dispatcher* extension_dispatcher_; | |
42 | |
43 DISALLOW_COPY_AND_ASSIGN(ShellFrameHelper); | |
44 }; | |
45 | |
46 ShellFrameHelper::ShellFrameHelper(content::RenderFrame* render_frame, | |
47 extensions::Dispatcher* extension_dispatcher) | |
48 : content::RenderFrameObserver(render_frame), | |
49 content::RenderFrameObserverTracker<ShellFrameHelper>(render_frame), | |
50 extension_dispatcher_(extension_dispatcher) {} | |
51 | |
52 ShellFrameHelper::~ShellFrameHelper() {} | |
53 | |
54 void ShellFrameHelper::WillReleaseScriptContext(v8::Handle<v8::Context> context, | |
55 int world_id) { | |
56 extension_dispatcher_->WillReleaseScriptContext( | |
57 render_frame()->GetWebFrame(), context, world_id); | |
58 } | |
59 | |
60 } // namespace | |
61 | |
62 ShellContentRendererClient::ShellContentRendererClient( | |
63 scoped_ptr<ShellRendererMainDelegate> delegate) | |
64 : delegate_(delegate.Pass()) { | |
65 } | |
66 | |
67 ShellContentRendererClient::~ShellContentRendererClient() {} | |
68 | |
69 void ShellContentRendererClient::RenderThreadStarted() { | |
70 RenderThread* thread = RenderThread::Get(); | |
71 | |
72 extensions_client_.reset(new ShellExtensionsClient); | |
73 extensions::ExtensionsClient::Set(extensions_client_.get()); | |
74 | |
75 extensions_renderer_client_.reset(new ShellExtensionsRendererClient); | |
76 extensions::ExtensionsRendererClient::Set(extensions_renderer_client_.get()); | |
77 | |
78 extension_dispatcher_delegate_.reset(new ShellDispatcherDelegate()); | |
79 | |
80 // Must be initialized after ExtensionsRendererClient. | |
81 extension_dispatcher_.reset( | |
82 new extensions::Dispatcher(extension_dispatcher_delegate_.get())); | |
83 thread->AddObserver(extension_dispatcher_.get()); | |
84 | |
85 // TODO(jamescook): Init WebSecurityPolicy for chrome-extension: schemes. | |
86 // See ChromeContentRendererClient for details. | |
87 if (delegate_) | |
88 delegate_->OnThreadStarted(thread); | |
89 } | |
90 | |
91 void ShellContentRendererClient::RenderFrameCreated( | |
92 content::RenderFrame* render_frame) { | |
93 // ShellFrameHelper destroyes itself when the RenderFrame is destroyed. | |
94 new ShellFrameHelper(render_frame, extension_dispatcher_.get()); | |
95 } | |
96 | |
97 void ShellContentRendererClient::RenderViewCreated( | |
98 content::RenderView* render_view) { | |
99 new extensions::ExtensionHelper(render_view, extension_dispatcher_.get()); | |
100 if (delegate_) | |
101 delegate_->OnViewCreated(render_view); | |
102 } | |
103 | |
104 bool ShellContentRendererClient::WillSendRequest( | |
105 blink::WebFrame* frame, | |
106 content::PageTransition transition_type, | |
107 const GURL& url, | |
108 const GURL& first_party_for_cookies, | |
109 GURL* new_url) { | |
110 // TODO(jamescook): Cause an error for bad extension scheme requests? | |
111 return false; | |
112 } | |
113 | |
114 void ShellContentRendererClient::DidCreateScriptContext( | |
115 WebFrame* frame, v8::Handle<v8::Context> context, int extension_group, | |
116 int world_id) { | |
117 extension_dispatcher_->DidCreateScriptContext( | |
118 frame, context, extension_group, world_id); | |
119 } | |
120 | |
121 bool ShellContentRendererClient::ShouldEnableSiteIsolationPolicy() const { | |
122 // Extension renderers don't need site isolation. | |
123 return false; | |
124 } | |
125 | |
126 } // namespace apps | |
OLD | NEW |