Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(42)

Side by Side Diff: extensions/browser/guest_view/guest_view_base.cc

Issue 618823002: GuestView: Move lifetime management out of content (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix extensionoptions cleanup Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 "extensions/browser/guest_view/guest_view_base.h" 5 #include "extensions/browser/guest_view/guest_view_base.h"
6 6
7 #include "base/lazy_instance.h" 7 #include "base/lazy_instance.h"
8 #include "base/strings/utf_string_conversions.h" 8 #include "base/strings/utf_string_conversions.h"
9 #include "content/public/browser/render_frame_host.h" 9 #include "content/public/browser/render_frame_host.h"
10 #include "content/public/browser/render_process_host.h" 10 #include "content/public/browser/render_process_host.h"
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
72 virtual void WebContentsDestroyed() OVERRIDE { 72 virtual void WebContentsDestroyed() OVERRIDE {
73 Destroy(); 73 Destroy();
74 } 74 }
75 75
76 virtual void RenderViewHostChanged( 76 virtual void RenderViewHostChanged(
77 content::RenderViewHost* old_host, 77 content::RenderViewHost* old_host,
78 content::RenderViewHost* new_host) OVERRIDE { 78 content::RenderViewHost* new_host) OVERRIDE {
79 Destroy(); 79 Destroy();
80 } 80 }
81 81
82 virtual void AboutToNavigateRenderView(
83 content::RenderViewHost* render_view_host) OVERRIDE {
84 Destroy();
lfg 2014/09/30 18:59:27 Why do we need this? Is it safe? This call will d
Fady Samuel 2014/09/30 22:50:03 Add comments throughout to explain lifetime manage
lfg 2014/09/30 23:29:42 I see. Makes sense now :)
85 }
86
82 virtual void RenderProcessGone(base::TerminationStatus status) OVERRIDE { 87 virtual void RenderProcessGone(base::TerminationStatus status) OVERRIDE {
83 Destroy(); 88 Destroy();
84 } 89 }
85 90
86 private: 91 private:
87 bool destroyed_; 92 bool destroyed_;
88 GuestViewBase* guest_; 93 GuestViewBase* guest_;
89 94
90 void Destroy() { 95 void Destroy() {
91 if (destroyed_) 96 if (destroyed_)
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after
290 // WebContents. 295 // WebContents.
291 CHECK(!attached()); 296 CHECK(!attached());
292 CHECK_EQ(host->GetID(), embedder_render_process_id()); 297 CHECK_EQ(host->GetID(), embedder_render_process_id());
293 298
294 // This code path may be reached if the embedder WebContents is killed for 299 // This code path may be reached if the embedder WebContents is killed for
295 // whatever reason immediately after a called to GuestViewInternal.createGuest 300 // whatever reason immediately after a called to GuestViewInternal.createGuest
296 // and before attaching the new guest to a frame. 301 // and before attaching the new guest to a frame.
297 Destroy(); 302 Destroy();
298 } 303 }
299 304
300 void GuestViewBase::Destroy() {
301 DCHECK(web_contents());
302 content::RenderProcessHost* host =
303 content::RenderProcessHost::FromID(embedder_render_process_id());
304 if (host)
305 host->RemoveObserver(this);
306 WillDestroy();
307 if (!destruction_callback_.is_null())
308 destruction_callback_.Run();
309
310 webcontents_guestview_map.Get().erase(web_contents());
311 GuestViewManager::FromBrowserContext(browser_context_)->
312 RemoveGuest(guest_instance_id_);
313 pending_events_.clear();
314
315 delete web_contents();
316 }
317
318 void GuestViewBase::DidAttach(int guest_proxy_routing_id) { 305 void GuestViewBase::DidAttach(int guest_proxy_routing_id) {
319 // Give the derived class an opportunity to perform some actions. 306 // Give the derived class an opportunity to perform some actions.
320 DidAttachToEmbedder(); 307 DidAttachToEmbedder();
321 308
322 // Inform the associated GuestViewContainer that the contentWindow is ready. 309 // Inform the associated GuestViewContainer that the contentWindow is ready.
323 embedder_web_contents()->Send(new ExtensionMsg_GuestAttached( 310 embedder_web_contents()->Send(new ExtensionMsg_GuestAttached(
324 embedder_web_contents()->GetMainFrame()->GetRoutingID(), 311 embedder_web_contents()->GetMainFrame()->GetRoutingID(),
325 element_instance_id_, 312 element_instance_id_,
326 guest_proxy_routing_id)); 313 guest_proxy_routing_id));
327 314
328 SendQueuedEvents(); 315 SendQueuedEvents();
329 } 316 }
330 317
331 void GuestViewBase::ElementSizeChanged(const gfx::Size& old_size, 318 void GuestViewBase::ElementSizeChanged(const gfx::Size& old_size,
332 const gfx::Size& new_size) { 319 const gfx::Size& new_size) {
333 element_size_ = new_size; 320 element_size_ = new_size;
334 } 321 }
335 322
336 void GuestViewBase::GuestSizeChanged(const gfx::Size& old_size, 323 void GuestViewBase::GuestSizeChanged(const gfx::Size& old_size,
337 const gfx::Size& new_size) { 324 const gfx::Size& new_size) {
338 if (!auto_size_enabled_) 325 if (!auto_size_enabled_)
339 return; 326 return;
340 guest_size_ = new_size; 327 guest_size_ = new_size;
341 GuestSizeChangedDueToAutoSize(old_size, new_size); 328 GuestSizeChangedDueToAutoSize(old_size, new_size);
342 } 329 }
343 330
331 void GuestViewBase::Destroy() {
332 DCHECK(web_contents());
333 content::RenderProcessHost* host =
334 content::RenderProcessHost::FromID(embedder_render_process_id());
335 if (host)
336 host->RemoveObserver(this);
337 WillDestroy();
338 if (!destruction_callback_.is_null())
339 destruction_callback_.Run();
340
341 webcontents_guestview_map.Get().erase(web_contents());
342 GuestViewManager::FromBrowserContext(browser_context_)->
343 RemoveGuest(guest_instance_id_);
344 pending_events_.clear();
345
346 delete web_contents();
347 }
348
344 void GuestViewBase::SetAttachParams(const base::DictionaryValue& params) { 349 void GuestViewBase::SetAttachParams(const base::DictionaryValue& params) {
345 attach_params_.reset(params.DeepCopy()); 350 attach_params_.reset(params.DeepCopy());
346 attach_params_->GetInteger(guestview::kParameterInstanceId, 351 attach_params_->GetInteger(guestview::kParameterInstanceId,
347 &view_instance_id_); 352 &view_instance_id_);
348 } 353 }
349 354
350 void GuestViewBase::SetOpener(GuestViewBase* guest) { 355 void GuestViewBase::SetOpener(GuestViewBase* guest) {
351 if (guest && guest->IsViewType(GetViewType())) { 356 if (guest && guest->IsViewType(GetViewType())) {
352 opener_ = guest->AsWeakPtr(); 357 opener_ = guest->AsWeakPtr();
353 return; 358 return;
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
491 496
492 // static 497 // static
493 void GuestViewBase::RegisterGuestViewTypes() { 498 void GuestViewBase::RegisterGuestViewTypes() {
494 AppViewGuest::Register(); 499 AppViewGuest::Register();
495 ExtensionOptionsGuest::Register(); 500 ExtensionOptionsGuest::Register();
496 MimeHandlerViewGuest::Register(); 501 MimeHandlerViewGuest::Register();
497 WebViewGuest::Register(); 502 WebViewGuest::Register();
498 } 503 }
499 504
500 } // namespace extensions 505 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698