OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 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/guest_view/guest_view_base.h" | 5 #include "chrome/browser/guest_view/guest_view_base.h" |
6 | 6 |
7 #include "base/lazy_instance.h" | 7 #include "base/lazy_instance.h" |
8 #include "chrome/browser/guest_view/ad_view/ad_view_guest.h" | 8 #include "chrome/browser/guest_view/ad_view/ad_view_guest.h" |
9 #include "chrome/browser/guest_view/guest_view_constants.h" | 9 #include "chrome/browser/guest_view/guest_view_constants.h" |
10 #include "chrome/browser/guest_view/guest_view_manager.h" | 10 #include "chrome/browser/guest_view/guest_view_manager.h" |
(...skipping 22 matching lines...) Expand all Loading... |
33 : name_(name), args_(args.Pass()) { | 33 : name_(name), args_(args.Pass()) { |
34 } | 34 } |
35 | 35 |
36 GuestViewBase::Event::~Event() { | 36 GuestViewBase::Event::~Event() { |
37 } | 37 } |
38 | 38 |
39 scoped_ptr<base::DictionaryValue> GuestViewBase::Event::GetArguments() { | 39 scoped_ptr<base::DictionaryValue> GuestViewBase::Event::GetArguments() { |
40 return args_.Pass(); | 40 return args_.Pass(); |
41 } | 41 } |
42 | 42 |
| 43 // This observer ensures that the GuestViewBase destroys itself when its |
| 44 // embedder goes away. |
| 45 class GuestViewBase::EmbedderWebContentsObserver : public WebContentsObserver { |
| 46 public: |
| 47 explicit EmbedderWebContentsObserver(GuestViewBase* guest) |
| 48 : WebContentsObserver(guest->embedder_web_contents()), |
| 49 guest_(guest) { |
| 50 } |
| 51 |
| 52 virtual ~EmbedderWebContentsObserver() { |
| 53 } |
| 54 |
| 55 // WebContentsObserver implementation. |
| 56 virtual void WebContentsDestroyed() OVERRIDE { |
| 57 guest_->embedder_web_contents_ = NULL; |
| 58 guest_->EmbedderDestroyed(); |
| 59 guest_->Destroy(); |
| 60 } |
| 61 |
| 62 private: |
| 63 GuestViewBase* guest_; |
| 64 |
| 65 DISALLOW_COPY_AND_ASSIGN(EmbedderWebContentsObserver); |
| 66 }; |
| 67 |
43 GuestViewBase::GuestViewBase(int guest_instance_id, | 68 GuestViewBase::GuestViewBase(int guest_instance_id, |
44 WebContents* guest_web_contents, | 69 WebContents* guest_web_contents, |
45 const std::string& embedder_extension_id) | 70 const std::string& embedder_extension_id) |
46 : guest_web_contents_(guest_web_contents), | 71 : WebContentsObserver(guest_web_contents), |
47 embedder_web_contents_(NULL), | 72 embedder_web_contents_(NULL), |
48 embedder_extension_id_(embedder_extension_id), | 73 embedder_extension_id_(embedder_extension_id), |
49 embedder_render_process_id_(0), | 74 embedder_render_process_id_(0), |
50 browser_context_(guest_web_contents->GetBrowserContext()), | 75 browser_context_(guest_web_contents->GetBrowserContext()), |
51 guest_instance_id_(guest_instance_id), | 76 guest_instance_id_(guest_instance_id), |
52 view_instance_id_(guestview::kInstanceIDNone), | 77 view_instance_id_(guestview::kInstanceIDNone), |
53 weak_ptr_factory_(this) { | 78 weak_ptr_factory_(this) { |
54 guest_web_contents->SetDelegate(this); | 79 guest_web_contents->SetDelegate(this); |
55 webcontents_guestview_map.Get().insert( | 80 webcontents_guestview_map.Get().insert( |
56 std::make_pair(guest_web_contents, this)); | 81 std::make_pair(guest_web_contents, this)); |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
148 incognito)); | 173 incognito)); |
149 } | 174 } |
150 | 175 |
151 base::WeakPtr<GuestViewBase> GuestViewBase::AsWeakPtr() { | 176 base::WeakPtr<GuestViewBase> GuestViewBase::AsWeakPtr() { |
152 return weak_ptr_factory_.GetWeakPtr(); | 177 return weak_ptr_factory_.GetWeakPtr(); |
153 } | 178 } |
154 | 179 |
155 void GuestViewBase::Attach(content::WebContents* embedder_web_contents, | 180 void GuestViewBase::Attach(content::WebContents* embedder_web_contents, |
156 const base::DictionaryValue& args) { | 181 const base::DictionaryValue& args) { |
157 embedder_web_contents_ = embedder_web_contents; | 182 embedder_web_contents_ = embedder_web_contents; |
| 183 embedder_web_contents_observer_.reset( |
| 184 new EmbedderWebContentsObserver(this)); |
158 embedder_render_process_id_ = | 185 embedder_render_process_id_ = |
159 embedder_web_contents->GetRenderProcessHost()->GetID(); | 186 embedder_web_contents->GetRenderProcessHost()->GetID(); |
160 args.GetInteger(guestview::kParameterInstanceId, &view_instance_id_); | 187 args.GetInteger(guestview::kParameterInstanceId, &view_instance_id_); |
161 extra_params_.reset(args.DeepCopy()); | 188 extra_params_.reset(args.DeepCopy()); |
162 | 189 |
163 // GuestViewBase::Attach is called prior to initialization (and initial | 190 // GuestViewBase::Attach is called prior to initialization (and initial |
164 // navigation) of the guest in the content layer in order to permit mapping | 191 // navigation) of the guest in the content layer in order to permit mapping |
165 // the necessary associations between the <*view> element and its guest. This | 192 // the necessary associations between the <*view> element and its guest. This |
166 // is needed by the <webview> WebRequest API to allow intercepting resource | 193 // is needed by the <webview> WebRequest API to allow intercepting resource |
167 // requests during navigation. However, queued events should be fired after | 194 // requests during navigation. However, queued events should be fired after |
168 // content layer initialization in order to ensure that load events (such as | 195 // content layer initialization in order to ensure that load events (such as |
169 // 'loadstop') fire in embedder after the contentWindow is available. | 196 // 'loadstop') fire in embedder after the contentWindow is available. |
170 if (!in_extension()) | 197 if (!in_extension()) |
171 return; | 198 return; |
172 | 199 |
173 base::MessageLoop::current()->PostTask( | 200 base::MessageLoop::current()->PostTask( |
174 FROM_HERE, | 201 FROM_HERE, |
175 base::Bind(&GuestViewBase::SendQueuedEvents, | 202 base::Bind(&GuestViewBase::SendQueuedEvents, |
176 weak_ptr_factory_.GetWeakPtr())); | 203 weak_ptr_factory_.GetWeakPtr())); |
177 } | 204 } |
178 | 205 |
179 void GuestViewBase::Destroy() { | 206 void GuestViewBase::Destroy() { |
180 if (!destruction_callback_.is_null()) | 207 if (!destruction_callback_.is_null()) |
181 destruction_callback_.Run(guest_web_contents()); | 208 destruction_callback_.Run(); |
182 delete guest_web_contents(); | 209 delete guest_web_contents(); |
183 } | 210 } |
184 | 211 |
185 | 212 |
186 void GuestViewBase::SetOpener(GuestViewBase* guest) { | 213 void GuestViewBase::SetOpener(GuestViewBase* guest) { |
187 if (guest && guest->IsViewType(GetViewType())) { | 214 if (guest && guest->IsViewType(GetViewType())) { |
188 opener_ = guest->AsWeakPtr(); | 215 opener_ = guest->AsWeakPtr(); |
189 return; | 216 return; |
190 } | 217 } |
191 opener_ = base::WeakPtr<GuestViewBase>(); | 218 opener_ = base::WeakPtr<GuestViewBase>(); |
192 } | 219 } |
193 | 220 |
194 void GuestViewBase::RegisterDestructionCallback( | 221 void GuestViewBase::RegisterDestructionCallback( |
195 const DestructionCallback& callback) { | 222 const DestructionCallback& callback) { |
196 destruction_callback_ = callback; | 223 destruction_callback_ = callback; |
197 } | 224 } |
198 | 225 |
| 226 void GuestViewBase::WebContentsDestroyed() { |
| 227 delete this; |
| 228 } |
| 229 |
199 bool GuestViewBase::ShouldFocusPageAfterCrash() { | 230 bool GuestViewBase::ShouldFocusPageAfterCrash() { |
200 // Focus is managed elsewhere. | 231 // Focus is managed elsewhere. |
201 return false; | 232 return false; |
202 } | 233 } |
203 | 234 |
204 bool GuestViewBase::PreHandleGestureEvent(content::WebContents* source, | 235 bool GuestViewBase::PreHandleGestureEvent(content::WebContents* source, |
205 const blink::WebGestureEvent& event) { | 236 const blink::WebGestureEvent& event) { |
206 return event.type == blink::WebGestureEvent::GesturePinchBegin || | 237 return event.type == blink::WebGestureEvent::GesturePinchBegin || |
207 event.type == blink::WebGestureEvent::GesturePinchUpdate || | 238 event.type == blink::WebGestureEvent::GesturePinchUpdate || |
208 event.type == blink::WebGestureEvent::GesturePinchEnd; | 239 event.type == blink::WebGestureEvent::GesturePinchEnd; |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
251 | 282 |
252 void GuestViewBase::SendQueuedEvents() { | 283 void GuestViewBase::SendQueuedEvents() { |
253 if (!attached()) | 284 if (!attached()) |
254 return; | 285 return; |
255 while (!pending_events_.empty()) { | 286 while (!pending_events_.empty()) { |
256 linked_ptr<Event> event_ptr = pending_events_.front(); | 287 linked_ptr<Event> event_ptr = pending_events_.front(); |
257 pending_events_.pop_front(); | 288 pending_events_.pop_front(); |
258 DispatchEvent(event_ptr.release()); | 289 DispatchEvent(event_ptr.release()); |
259 } | 290 } |
260 } | 291 } |
OLD | NEW |