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 if (content::Source<WebContents>(source).ptr() == guest_web_contents()) |
| 84 LoadHandlerCalled(); |
| 85 break; |
| 86 } |
| 87 default: |
| 88 NOTREACHED() << "Unexpected notification sent."; |
| 89 break; |
| 90 } |
| 91 } |
| 92 |
71 void WebViewGuest::Go(int relative_index) { | 93 void WebViewGuest::Go(int relative_index) { |
72 guest_web_contents()->GetController().GoToOffset(relative_index); | 94 guest_web_contents()->GetController().GoToOffset(relative_index); |
73 } | 95 } |
74 | 96 |
75 WebViewGuest::~WebViewGuest() { | 97 WebViewGuest::~WebViewGuest() { |
76 } | 98 } |
77 | 99 |
78 void WebViewGuest::DidCommitProvisionalLoadForFrame( | 100 void WebViewGuest::DidCommitProvisionalLoadForFrame( |
79 int64 frame_id, | 101 int64 frame_id, |
80 bool is_main_frame, | 102 bool is_main_frame, |
(...skipping 21 matching lines...) Expand all Loading... |
102 content::BrowserThread::IO, | 124 content::BrowserThread::IO, |
103 FROM_HERE, | 125 FROM_HERE, |
104 base::Bind( | 126 base::Bind( |
105 &RemoveWebViewEventListenersOnIOThread, | 127 &RemoveWebViewEventListenersOnIOThread, |
106 browser_context(), extension_id(), | 128 browser_context(), extension_id(), |
107 embedder_render_process_id(), | 129 embedder_render_process_id(), |
108 view_instance_id())); | 130 view_instance_id())); |
109 delete this; | 131 delete this; |
110 } | 132 } |
111 | 133 |
| 134 void WebViewGuest::LoadHandlerCalled() { |
| 135 scoped_ptr<DictionaryValue> args(new DictionaryValue()); |
| 136 DispatchEvent(new GuestView::Event(webview::kEventContentLoad, args.Pass())); |
| 137 } |
| 138 |
112 void WebViewGuest::AddWebViewToExtensionRendererState() { | 139 void WebViewGuest::AddWebViewToExtensionRendererState() { |
113 ExtensionRendererState::WebViewInfo webview_info; | 140 ExtensionRendererState::WebViewInfo webview_info; |
114 webview_info.embedder_process_id = embedder_render_process_id(); | 141 webview_info.embedder_process_id = embedder_render_process_id(); |
115 webview_info.embedder_routing_id = embedder_web_contents()->GetRoutingID(); | 142 webview_info.embedder_routing_id = embedder_web_contents()->GetRoutingID(); |
116 webview_info.guest_instance_id = guest_instance_id(); | 143 webview_info.guest_instance_id = guest_instance_id(); |
117 webview_info.instance_id = view_instance_id(); | 144 webview_info.instance_id = view_instance_id(); |
118 | 145 |
119 content::BrowserThread::PostTask( | 146 content::BrowserThread::PostTask( |
120 content::BrowserThread::IO, FROM_HERE, | 147 content::BrowserThread::IO, FROM_HERE, |
121 base::Bind( | 148 base::Bind( |
122 &ExtensionRendererState::AddWebView, | 149 &ExtensionRendererState::AddWebView, |
123 base::Unretained(ExtensionRendererState::GetInstance()), | 150 base::Unretained(ExtensionRendererState::GetInstance()), |
124 guest_web_contents()->GetRenderProcessHost()->GetID(), | 151 guest_web_contents()->GetRenderProcessHost()->GetID(), |
125 guest_web_contents()->GetRoutingID(), | 152 guest_web_contents()->GetRoutingID(), |
126 webview_info)); | 153 webview_info)); |
127 } | 154 } |
128 | 155 |
129 // static | 156 // static |
130 void WebViewGuest::RemoveWebViewFromExtensionRendererState( | 157 void WebViewGuest::RemoveWebViewFromExtensionRendererState( |
131 WebContents* web_contents) { | 158 WebContents* web_contents) { |
132 content::BrowserThread::PostTask( | 159 content::BrowserThread::PostTask( |
133 content::BrowserThread::IO, FROM_HERE, | 160 content::BrowserThread::IO, FROM_HERE, |
134 base::Bind( | 161 base::Bind( |
135 &ExtensionRendererState::RemoveWebView, | 162 &ExtensionRendererState::RemoveWebView, |
136 base::Unretained(ExtensionRendererState::GetInstance()), | 163 base::Unretained(ExtensionRendererState::GetInstance()), |
137 web_contents->GetRenderProcessHost()->GetID(), | 164 web_contents->GetRenderProcessHost()->GetID(), |
138 web_contents->GetRoutingID())); | 165 web_contents->GetRoutingID())); |
139 } | 166 } |
OLD | NEW |