| 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 "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 52 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 63       : WebContentsObserver(guest->embedder_web_contents()), | 63       : WebContentsObserver(guest->embedder_web_contents()), | 
| 64         destroyed_(false), | 64         destroyed_(false), | 
| 65         guest_(guest) { | 65         guest_(guest) { | 
| 66   } | 66   } | 
| 67 | 67 | 
| 68   virtual ~EmbedderWebContentsObserver() { | 68   virtual ~EmbedderWebContentsObserver() { | 
| 69   } | 69   } | 
| 70 | 70 | 
| 71   // WebContentsObserver implementation. | 71   // WebContentsObserver implementation. | 
| 72   virtual void WebContentsDestroyed() OVERRIDE { | 72   virtual void WebContentsDestroyed() OVERRIDE { | 
|  | 73     // If the embedder is destroyed then destroy the guest. | 
| 73     Destroy(); | 74     Destroy(); | 
| 74   } | 75   } | 
| 75 | 76 | 
| 76   virtual void RenderViewHostChanged( | 77   virtual void AboutToNavigateRenderView( | 
| 77       content::RenderViewHost* old_host, | 78       content::RenderViewHost* render_view_host) OVERRIDE { | 
| 78       content::RenderViewHost* new_host) OVERRIDE { | 79     // If the embedder navigates then destroy the guest. | 
| 79     Destroy(); | 80     Destroy(); | 
| 80   } | 81   } | 
| 81 | 82 | 
| 82   virtual void RenderProcessGone(base::TerminationStatus status) OVERRIDE { | 83   virtual void RenderProcessGone(base::TerminationStatus status) OVERRIDE { | 
|  | 84     // If the embedder crashes, then destroy the guest. | 
| 83     Destroy(); | 85     Destroy(); | 
| 84   } | 86   } | 
| 85 | 87 | 
| 86  private: | 88  private: | 
| 87   bool destroyed_; | 89   bool destroyed_; | 
| 88   GuestViewBase* guest_; | 90   GuestViewBase* guest_; | 
| 89 | 91 | 
| 90   void Destroy() { | 92   void Destroy() { | 
| 91     if (destroyed_) | 93     if (destroyed_) | 
| 92       return; | 94       return; | 
| (...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 290   // WebContents. | 292   // WebContents. | 
| 291   CHECK(!attached()); | 293   CHECK(!attached()); | 
| 292   CHECK_EQ(host->GetID(), embedder_render_process_id()); | 294   CHECK_EQ(host->GetID(), embedder_render_process_id()); | 
| 293 | 295 | 
| 294   // This code path may be reached if the embedder WebContents is killed for | 296   // This code path may be reached if the embedder WebContents is killed for | 
| 295   // whatever reason immediately after a called to GuestViewInternal.createGuest | 297   // whatever reason immediately after a called to GuestViewInternal.createGuest | 
| 296   // and before attaching the new guest to a frame. | 298   // and before attaching the new guest to a frame. | 
| 297   Destroy(); | 299   Destroy(); | 
| 298 } | 300 } | 
| 299 | 301 | 
| 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) { | 302 void GuestViewBase::DidAttach(int guest_proxy_routing_id) { | 
| 319   // Give the derived class an opportunity to perform some actions. | 303   // Give the derived class an opportunity to perform some actions. | 
| 320   DidAttachToEmbedder(); | 304   DidAttachToEmbedder(); | 
| 321 | 305 | 
| 322   // Inform the associated GuestViewContainer that the contentWindow is ready. | 306   // Inform the associated GuestViewContainer that the contentWindow is ready. | 
| 323   embedder_web_contents()->Send(new ExtensionMsg_GuestAttached( | 307   embedder_web_contents()->Send(new ExtensionMsg_GuestAttached( | 
| 324       embedder_web_contents()->GetMainFrame()->GetRoutingID(), | 308       embedder_web_contents()->GetMainFrame()->GetRoutingID(), | 
| 325       element_instance_id_, | 309       element_instance_id_, | 
| 326       guest_proxy_routing_id)); | 310       guest_proxy_routing_id)); | 
| 327 | 311 | 
| 328   SendQueuedEvents(); | 312   SendQueuedEvents(); | 
| 329 } | 313 } | 
| 330 | 314 | 
| 331 void GuestViewBase::ElementSizeChanged(const gfx::Size& old_size, | 315 void GuestViewBase::ElementSizeChanged(const gfx::Size& old_size, | 
| 332                                        const gfx::Size& new_size) { | 316                                        const gfx::Size& new_size) { | 
| 333   element_size_ = new_size; | 317   element_size_ = new_size; | 
| 334 } | 318 } | 
| 335 | 319 | 
| 336 void GuestViewBase::GuestSizeChanged(const gfx::Size& old_size, | 320 void GuestViewBase::GuestSizeChanged(const gfx::Size& old_size, | 
| 337                                      const gfx::Size& new_size) { | 321                                      const gfx::Size& new_size) { | 
| 338   if (!auto_size_enabled_) | 322   if (!auto_size_enabled_) | 
| 339     return; | 323     return; | 
| 340   guest_size_ = new_size; | 324   guest_size_ = new_size; | 
| 341   GuestSizeChangedDueToAutoSize(old_size, new_size); | 325   GuestSizeChangedDueToAutoSize(old_size, new_size); | 
| 342 } | 326 } | 
| 343 | 327 | 
|  | 328 void GuestViewBase::Destroy() { | 
|  | 329   DCHECK(web_contents()); | 
|  | 330   content::RenderProcessHost* host = | 
|  | 331       content::RenderProcessHost::FromID(embedder_render_process_id()); | 
|  | 332   if (host) | 
|  | 333     host->RemoveObserver(this); | 
|  | 334 | 
|  | 335   // Give the derived class an opportunity to perform some cleanup. | 
|  | 336   WillDestroy(); | 
|  | 337 | 
|  | 338   // Give the content module an opportunity to perform some cleanup. | 
|  | 339   if (!destruction_callback_.is_null()) | 
|  | 340     destruction_callback_.Run(); | 
|  | 341 | 
|  | 342   webcontents_guestview_map.Get().erase(web_contents()); | 
|  | 343   GuestViewManager::FromBrowserContext(browser_context_)-> | 
|  | 344       RemoveGuest(guest_instance_id_); | 
|  | 345   pending_events_.clear(); | 
|  | 346 | 
|  | 347   delete web_contents(); | 
|  | 348 } | 
|  | 349 | 
| 344 void GuestViewBase::SetAttachParams(const base::DictionaryValue& params) { | 350 void GuestViewBase::SetAttachParams(const base::DictionaryValue& params) { | 
| 345   attach_params_.reset(params.DeepCopy()); | 351   attach_params_.reset(params.DeepCopy()); | 
| 346   attach_params_->GetInteger(guestview::kParameterInstanceId, | 352   attach_params_->GetInteger(guestview::kParameterInstanceId, | 
| 347                              &view_instance_id_); | 353                              &view_instance_id_); | 
| 348 } | 354 } | 
| 349 | 355 | 
| 350 void GuestViewBase::SetOpener(GuestViewBase* guest) { | 356 void GuestViewBase::SetOpener(GuestViewBase* guest) { | 
| 351   if (guest && guest->IsViewType(GetViewType())) { | 357   if (guest && guest->IsViewType(GetViewType())) { | 
| 352     opener_ = guest->AsWeakPtr(); | 358     opener_ = guest->AsWeakPtr(); | 
| 353     return; | 359     return; | 
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 389   GuestReady(); | 395   GuestReady(); | 
| 390   content::RenderViewHost* rvh = web_contents()->GetRenderViewHost(); | 396   content::RenderViewHost* rvh = web_contents()->GetRenderViewHost(); | 
| 391   if (auto_size_enabled_) { | 397   if (auto_size_enabled_) { | 
| 392     rvh->EnableAutoResize(min_auto_size_, max_auto_size_); | 398     rvh->EnableAutoResize(min_auto_size_, max_auto_size_); | 
| 393   } else { | 399   } else { | 
| 394     rvh->DisableAutoResize(element_size_); | 400     rvh->DisableAutoResize(element_size_); | 
| 395   } | 401   } | 
| 396 } | 402 } | 
| 397 | 403 | 
| 398 void GuestViewBase::WebContentsDestroyed() { | 404 void GuestViewBase::WebContentsDestroyed() { | 
|  | 405   // Let the derived class know that its WebContents is in the process of | 
|  | 406   // being destroyed. web_contents() is still valid at this point. | 
|  | 407   // TODO(fsamuel): This allows for reentrant code into WebContents during | 
|  | 408   // destruction. This could potentially lead to bugs. Perhaps we should get rid | 
|  | 409   // of this? | 
| 399   GuestDestroyed(); | 410   GuestDestroyed(); | 
|  | 411 | 
|  | 412   // Self-destruct. | 
| 400   delete this; | 413   delete this; | 
| 401 } | 414 } | 
| 402 | 415 | 
| 403 void GuestViewBase::ActivateContents(WebContents* web_contents) { | 416 void GuestViewBase::ActivateContents(WebContents* web_contents) { | 
| 404   if (!attached() || !embedder_web_contents()->GetDelegate()) | 417   if (!attached() || !embedder_web_contents()->GetDelegate()) | 
| 405     return; | 418     return; | 
| 406 | 419 | 
| 407   embedder_web_contents()->GetDelegate()->ActivateContents( | 420   embedder_web_contents()->GetDelegate()->ActivateContents( | 
| 408       embedder_web_contents()); | 421       embedder_web_contents()); | 
| 409 } | 422 } | 
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 491 | 504 | 
| 492 // static | 505 // static | 
| 493 void GuestViewBase::RegisterGuestViewTypes() { | 506 void GuestViewBase::RegisterGuestViewTypes() { | 
| 494   AppViewGuest::Register(); | 507   AppViewGuest::Register(); | 
| 495   ExtensionOptionsGuest::Register(); | 508   ExtensionOptionsGuest::Register(); | 
| 496   MimeHandlerViewGuest::Register(); | 509   MimeHandlerViewGuest::Register(); | 
| 497   WebViewGuest::Register(); | 510   WebViewGuest::Register(); | 
| 498 } | 511 } | 
| 499 | 512 | 
| 500 }  // namespace extensions | 513 }  // namespace extensions | 
| OLD | NEW | 
|---|