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