Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/guestview/webview/webview_guest.h" | 5 #include "chrome/browser/guestview/webview/webview_guest.h" |
| 6 | 6 |
| 7 #include "base/debug/stack_trace.h" | 7 #include "base/debug/stack_trace.h" |
| 8 #include "chrome/browser/extensions/api/web_request/web_request_api.h" | 8 #include "chrome/browser/extensions/api/web_request/web_request_api.h" |
| 9 #include "chrome/browser/extensions/extension_renderer_state.h" | 9 #include "chrome/browser/extensions/extension_renderer_state.h" |
| 10 #include "chrome/browser/extensions/script_executor.h" | 10 #include "chrome/browser/extensions/script_executor.h" |
| 11 #include "chrome/browser/guestview/guestview_constants.h" | 11 #include "chrome/browser/guestview/guestview_constants.h" |
| 12 #include "chrome/browser/guestview/webview/webview_constants.h" | 12 #include "chrome/browser/guestview/webview/webview_constants.h" |
| 13 #include "content/public/browser/browser_thread.h" | 13 #include "content/public/browser/browser_thread.h" |
| 14 #include "content/public/browser/notification_source.h" | |
| 15 #include "content/public/browser/notification_types.h" | |
| 14 #include "content/public/browser/render_process_host.h" | 16 #include "content/public/browser/render_process_host.h" |
| 15 #include "content/public/browser/web_contents.h" | 17 #include "content/public/browser/web_contents.h" |
| 16 | 18 |
| 17 using content::WebContents; | 19 using content::WebContents; |
| 18 | 20 |
| 19 namespace { | 21 namespace { |
| 20 | 22 |
| 21 void RemoveWebViewEventListenersOnIOThread( | 23 void RemoveWebViewEventListenersOnIOThread( |
| 22 void* profile, | 24 void* profile, |
| 23 const std::string& extension_id, | 25 const std::string& extension_id, |
| 24 int embedder_process_id, | 26 int embedder_process_id, |
| 25 int guest_instance_id) { | 27 int guest_instance_id) { |
| 26 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); | 28 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
| 27 ExtensionWebRequestEventRouter::GetInstance()->RemoveWebViewEventListeners( | 29 ExtensionWebRequestEventRouter::GetInstance()->RemoveWebViewEventListeners( |
| 28 profile, extension_id, embedder_process_id, guest_instance_id); | 30 profile, extension_id, embedder_process_id, guest_instance_id); |
| 29 } | 31 } |
| 30 | 32 |
| 31 } // namespace | 33 } // namespace |
| 32 | 34 |
| 33 WebViewGuest::WebViewGuest(WebContents* guest_web_contents) | 35 WebViewGuest::WebViewGuest(WebContents* guest_web_contents) |
| 34 : GuestView(guest_web_contents), | 36 : GuestView(guest_web_contents), |
| 35 WebContentsObserver(guest_web_contents), | 37 WebContentsObserver(guest_web_contents), |
| 36 script_executor_(new extensions::ScriptExecutor(guest_web_contents, | 38 script_executor_(new extensions::ScriptExecutor(guest_web_contents, |
| 37 &script_observers_)) { | 39 &script_observers_)) { |
| 40 notification_registrar_.Add( | |
| 41 this, content::NOTIFICATION_LOAD_COMPLETED_MAIN_FRAME, | |
| 42 content::Source<WebContents>(guest_web_contents)); | |
| 38 } | 43 } |
| 39 | 44 |
| 40 // static | 45 // static |
| 41 WebViewGuest* WebViewGuest::From(int embedder_process_id, | 46 WebViewGuest* WebViewGuest::From(int embedder_process_id, |
| 42 int guest_instance_id) { | 47 int guest_instance_id) { |
| 43 GuestView* guest = GuestView::From(embedder_process_id, guest_instance_id); | 48 GuestView* guest = GuestView::From(embedder_process_id, guest_instance_id); |
| 44 if (!guest) | 49 if (!guest) |
| 45 return NULL; | 50 return NULL; |
| 46 return guest->AsWebView(); | 51 return guest->AsWebView(); |
| 47 } | 52 } |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 61 } | 66 } |
| 62 | 67 |
| 63 WebViewGuest* WebViewGuest::AsWebView() { | 68 WebViewGuest* WebViewGuest::AsWebView() { |
| 64 return this; | 69 return this; |
| 65 } | 70 } |
| 66 | 71 |
| 67 AdViewGuest* WebViewGuest::AsAdView() { | 72 AdViewGuest* WebViewGuest::AsAdView() { |
| 68 return NULL; | 73 return NULL; |
| 69 } | 74 } |
| 70 | 75 |
| 76 void WebViewGuest::Observe(int type, | |
| 77 const content::NotificationSource& source, | |
| 78 const content::NotificationDetails& details) { | |
| 79 switch (type) { | |
| 80 case content::NOTIFICATION_LOAD_COMPLETED_MAIN_FRAME: { | |
| 81 DCHECK_EQ(content::Source<WebContents>(source).ptr(), | |
| 82 guest_web_contents()); | |
| 83 LoadHandlerCalled(); | |
|
lazyboy
2013/06/28 18:55:08
if (source == guest_web_contents()) {
LoadHandle
Fady Samuel
2013/06/28 21:24:35
Done.
| |
| 84 break; | |
| 85 } | |
| 86 default: | |
| 87 NOTREACHED() << "Unexpected notification sent."; | |
| 88 break; | |
| 89 } | |
| 90 } | |
| 91 | |
| 71 void WebViewGuest::Go(int relative_index) { | 92 void WebViewGuest::Go(int relative_index) { |
| 72 guest_web_contents()->GetController().GoToOffset(relative_index); | 93 guest_web_contents()->GetController().GoToOffset(relative_index); |
| 73 } | 94 } |
| 74 | 95 |
| 75 WebViewGuest::~WebViewGuest() { | 96 WebViewGuest::~WebViewGuest() { |
| 76 } | 97 } |
| 77 | 98 |
| 78 void WebViewGuest::DidCommitProvisionalLoadForFrame( | 99 void WebViewGuest::DidCommitProvisionalLoadForFrame( |
| 79 int64 frame_id, | 100 int64 frame_id, |
| 80 bool is_main_frame, | 101 bool is_main_frame, |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 102 content::BrowserThread::IO, | 123 content::BrowserThread::IO, |
| 103 FROM_HERE, | 124 FROM_HERE, |
| 104 base::Bind( | 125 base::Bind( |
| 105 &RemoveWebViewEventListenersOnIOThread, | 126 &RemoveWebViewEventListenersOnIOThread, |
| 106 browser_context(), extension_id(), | 127 browser_context(), extension_id(), |
| 107 embedder_render_process_id(), | 128 embedder_render_process_id(), |
| 108 view_instance_id())); | 129 view_instance_id())); |
| 109 delete this; | 130 delete this; |
| 110 } | 131 } |
| 111 | 132 |
| 133 void WebViewGuest::LoadHandlerCalled() { | |
| 134 scoped_ptr<DictionaryValue> args(new DictionaryValue()); | |
| 135 DispatchEvent(new GuestView::Event(webview::kEventContentLoad, args.Pass())); | |
| 136 } | |
| 137 | |
| 112 void WebViewGuest::AddWebViewToExtensionRendererState() { | 138 void WebViewGuest::AddWebViewToExtensionRendererState() { |
| 113 ExtensionRendererState::WebViewInfo webview_info; | 139 ExtensionRendererState::WebViewInfo webview_info; |
| 114 webview_info.embedder_process_id = embedder_render_process_id(); | 140 webview_info.embedder_process_id = embedder_render_process_id(); |
| 115 webview_info.embedder_routing_id = embedder_web_contents()->GetRoutingID(); | 141 webview_info.embedder_routing_id = embedder_web_contents()->GetRoutingID(); |
| 116 webview_info.guest_instance_id = guest_instance_id(); | 142 webview_info.guest_instance_id = guest_instance_id(); |
| 117 webview_info.instance_id = view_instance_id(); | 143 webview_info.instance_id = view_instance_id(); |
| 118 | 144 |
| 119 content::BrowserThread::PostTask( | 145 content::BrowserThread::PostTask( |
| 120 content::BrowserThread::IO, FROM_HERE, | 146 content::BrowserThread::IO, FROM_HERE, |
| 121 base::Bind( | 147 base::Bind( |
| 122 &ExtensionRendererState::AddWebView, | 148 &ExtensionRendererState::AddWebView, |
| 123 base::Unretained(ExtensionRendererState::GetInstance()), | 149 base::Unretained(ExtensionRendererState::GetInstance()), |
| 124 guest_web_contents()->GetRenderProcessHost()->GetID(), | 150 guest_web_contents()->GetRenderProcessHost()->GetID(), |
| 125 guest_web_contents()->GetRoutingID(), | 151 guest_web_contents()->GetRoutingID(), |
| 126 webview_info)); | 152 webview_info)); |
| 127 } | 153 } |
| 128 | 154 |
| 129 // static | 155 // static |
| 130 void WebViewGuest::RemoveWebViewFromExtensionRendererState( | 156 void WebViewGuest::RemoveWebViewFromExtensionRendererState( |
| 131 WebContents* web_contents) { | 157 WebContents* web_contents) { |
| 132 content::BrowserThread::PostTask( | 158 content::BrowserThread::PostTask( |
| 133 content::BrowserThread::IO, FROM_HERE, | 159 content::BrowserThread::IO, FROM_HERE, |
| 134 base::Bind( | 160 base::Bind( |
| 135 &ExtensionRendererState::RemoveWebView, | 161 &ExtensionRendererState::RemoveWebView, |
| 136 base::Unretained(ExtensionRendererState::GetInstance()), | 162 base::Unretained(ExtensionRendererState::GetInstance()), |
| 137 web_contents->GetRenderProcessHost()->GetID(), | 163 web_contents->GetRenderProcessHost()->GetID(), |
| 138 web_contents->GetRoutingID())); | 164 web_contents->GetRoutingID())); |
| 139 } | 165 } |
| OLD | NEW |