diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2017-07-17 13:57:45 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2017-07-19 13:44:40 +0000 |
commit | 6ec7b8da05d21a3878bd21c691b41e675d74bb1c (patch) | |
tree | b87f250bc19413750b9bb9cdbf2da20ef5014820 /chromium/components/guest_view | |
parent | ec02ee4181c49b61fce1c8fb99292dbb8139cc90 (diff) | |
download | qtwebengine-chromium-6ec7b8da05d21a3878bd21c691b41e675d74bb1c.tar.gz |
BASELINE: Update Chromium to 60.0.3112.70
Change-Id: I9911c2280a014d4632f254857876a395d4baed2d
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
Diffstat (limited to 'chromium/components/guest_view')
10 files changed, 92 insertions, 138 deletions
diff --git a/chromium/components/guest_view/OWNERS b/chromium/components/guest_view/OWNERS index 5af20a0270b..728baf50245 100644 --- a/chromium/components/guest_view/OWNERS +++ b/chromium/components/guest_view/OWNERS @@ -4,5 +4,6 @@ lazyboy@chromium.org lfg@chromium.org wjmaclean@chromium.org paulmeyer@chromium.org +ekaramad@chromium.org # COMPONENT: Platform>Apps>BrowserTag diff --git a/chromium/components/guest_view/browser/BUILD.gn b/chromium/components/guest_view/browser/BUILD.gn index a0668fc7782..6430459a7f0 100644 --- a/chromium/components/guest_view/browser/BUILD.gn +++ b/chromium/components/guest_view/browser/BUILD.gn @@ -2,6 +2,10 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//extensions/features/features.gni") + +assert(enable_extensions) + static_library("browser") { output_name = "guest_view_browser" sources = [ diff --git a/chromium/components/guest_view/browser/guest_view_base.cc b/chromium/components/guest_view/browser/guest_view_base.cc index 4a260c65b66..27570202e8e 100644 --- a/chromium/components/guest_view/browser/guest_view_base.cc +++ b/chromium/components/guest_view/browser/guest_view_base.cc @@ -30,17 +30,13 @@ using content::WebContents; -namespace content { -struct FrameNavigateParams; -} - namespace guest_view { namespace { using WebContentsGuestViewMap = std::map<const WebContents*, GuestViewBase*>; -static base::LazyInstance<WebContentsGuestViewMap>::DestructorAtExit - webcontents_guestview_map = LAZY_INSTANCE_INITIALIZER; +base::LazyInstance<WebContentsGuestViewMap>::Leaky g_webcontents_guestview_map = + LAZY_INSTANCE_INITIALIZER; } // namespace @@ -149,7 +145,7 @@ class GuestViewBase::OwnerContentsObserver : public WebContentsObserver { // WebContents goes away before the GuestViewBase is attached. class GuestViewBase::OpenerLifetimeObserver : public WebContentsObserver { public: - OpenerLifetimeObserver(GuestViewBase* guest) + explicit OpenerLifetimeObserver(GuestViewBase* guest) : WebContentsObserver(guest->GetOpener()->web_contents()), guest_(guest) {} @@ -173,8 +169,7 @@ class GuestViewBase::OpenerLifetimeObserver : public WebContentsObserver { GuestViewBase::GuestViewBase(WebContents* owner_web_contents) : owner_web_contents_(owner_web_contents), browser_context_(owner_web_contents->GetBrowserContext()), - guest_instance_id_(GuestViewManager::FromBrowserContext(browser_context_) - ->GetNextInstanceID()), + guest_instance_id_(GetGuestViewManager()->GetNextInstanceID()), view_instance_id_(kInstanceIDNone), element_instance_id_(kInstanceIDNone), initialized_(false), @@ -184,9 +179,7 @@ GuestViewBase::GuestViewBase(WebContents* owner_web_contents) is_full_page_plugin_(false), guest_proxy_routing_id_(MSG_ROUTING_NONE), weak_ptr_factory_(this) { - owner_host_ = GuestViewManager::FromBrowserContext(browser_context_)-> - IsOwnedByExtension(this) ? - owner_web_contents->GetLastCommittedURL().host() : std::string(); + SetOwnerHost(); } GuestViewBase::~GuestViewBase() {} @@ -197,8 +190,7 @@ void GuestViewBase::Init(const base::DictionaryValue& create_params, return; initialized_ = true; - if (!GuestViewManager::FromBrowserContext(browser_context_)-> - IsGuestAvailableToContext(this)) { + if (!GetGuestViewManager()->IsGuestAvailableToContext(this)) { // The derived class did not create a WebContents so this class serves no // purpose. Let's self-destruct. delete this; @@ -233,15 +225,14 @@ void GuestViewBase::InitWithWebContents( // At this point, we have just created the guest WebContents, we need to add // an observer to the owner WebContents. This observer will be responsible // for destroying the guest WebContents if the owner goes away. - owner_contents_observer_.reset( - new OwnerContentsObserver(this, owner_web_contents_)); + owner_contents_observer_ = + base::MakeUnique<OwnerContentsObserver>(this, owner_web_contents_); WebContentsObserver::Observe(guest_web_contents); guest_web_contents->SetDelegate(this); - webcontents_guestview_map.Get().insert( + g_webcontents_guestview_map.Get().insert( std::make_pair(guest_web_contents, this)); - GuestViewManager::FromBrowserContext(browser_context_)-> - AddGuest(guest_instance_id_, guest_web_contents); + GetGuestViewManager()->AddGuest(guest_instance_id_, guest_web_contents); // Populate the view instance ID if we have it on creation. create_params.GetInteger(kParameterInstanceId, &view_instance_id_); @@ -271,7 +262,7 @@ void GuestViewBase::DispatchOnResizeEvent(const gfx::Size& old_size, return; // Dispatch the onResize event. - std::unique_ptr<base::DictionaryValue> args(new base::DictionaryValue()); + auto args = base::MakeUnique<base::DictionaryValue>(); args->SetInteger(kOldWidth, old_size.width()); args->SetInteger(kOldHeight, old_size.height()); args->SetInteger(kNewWidth, new_size.width()); @@ -281,14 +272,13 @@ void GuestViewBase::DispatchOnResizeEvent(const gfx::Size& old_size, } gfx::Size GuestViewBase::GetDefaultSize() const { - if (is_full_page_plugin()) { - // Full page plugins default to the size of the owner's viewport. - return owner_web_contents() - ->GetRenderWidgetHostView() - ->GetVisibleViewportSize(); - } else { + if (!is_full_page_plugin()) return gfx::Size(kDefaultWidth, kDefaultHeight); - } + + // Full page plugins default to the size of the owner's viewport. + return owner_web_contents() + ->GetRenderWidgetHostView() + ->GetVisibleViewportSize(); } void GuestViewBase::SetSize(const SetSizeParams& params) { @@ -355,7 +345,7 @@ void GuestViewBase::CleanUp(content::BrowserContext* browser_context, // static GuestViewBase* GuestViewBase::FromWebContents(const WebContents* web_contents) { - WebContentsGuestViewMap* guest_map = webcontents_guestview_map.Pointer(); + WebContentsGuestViewMap* guest_map = g_webcontents_guestview_map.Pointer(); auto it = guest_map->find(web_contents); return it == guest_map->end() ? nullptr : it->second; } @@ -402,13 +392,14 @@ bool GuestViewBase::ZoomPropagatesFromEmbedderToGuest() const { void GuestViewBase::SetContextMenuPosition(const gfx::Point& position) {} +GuestViewManager* GuestViewBase::GetGuestViewManager() { + return GuestViewManager::FromBrowserContext(browser_context()); +} + WebContents* GuestViewBase::CreateNewGuestWindow( const WebContents::CreateParams& create_params) { - auto* guest_manager = GuestViewManager::FromBrowserContext(browser_context()); - return guest_manager->CreateGuestWithWebContentsParams( - GetViewType(), - owner_web_contents(), - create_params); + return GetGuestViewManager()->CreateGuestWithWebContentsParams( + GetViewType(), owner_web_contents(), create_params); } void GuestViewBase::OnRenderFrameHostDeleted(int process_id, int routing_id) {} @@ -445,26 +436,6 @@ void GuestViewBase::DidDetach() { Destroy(true); } -bool GuestViewBase::HandleFindForEmbedder( - int request_id, - const base::string16& search_text, - const blink::WebFindOptions& options) { - if (ShouldHandleFindRequestsForEmbedder()) { - web_contents()->Find(request_id, search_text, options); - return true; - } - return false; -} - -bool GuestViewBase::HandleStopFindingForEmbedder( - content::StopFindAction action) { - if (ShouldHandleFindRequestsForEmbedder()) { - web_contents()->StopFinding(action); - return true; - } - return false; -} - WebContents* GuestViewBase::GetOwnerWebContents() const { return owner_web_contents_; } @@ -505,9 +476,8 @@ void GuestViewBase::Destroy(bool also_delete) { guest_host_->WillDestroy(); guest_host_ = nullptr; - webcontents_guestview_map.Get().erase(web_contents()); - GuestViewManager::FromBrowserContext(browser_context_)-> - RemoveGuest(guest_instance_id_); + g_webcontents_guestview_map.Get().erase(web_contents()); + GetGuestViewManager()->RemoveGuest(guest_instance_id_); pending_events_.clear(); if (also_delete) @@ -522,8 +492,10 @@ void GuestViewBase::SetAttachParams(const base::DictionaryValue& params) { void GuestViewBase::SetOpener(GuestViewBase* guest) { if (guest && guest->IsViewType(GetViewType())) { opener_ = guest->weak_ptr_factory_.GetWeakPtr(); - if (!attached()) - opener_lifetime_observer_.reset(new OpenerLifetimeObserver(this)); + if (!attached()) { + opener_lifetime_observer_ = + base::MakeUnique<OpenerLifetimeObserver>(this); + } return; } opener_ = base::WeakPtr<GuestViewBase>(); @@ -545,11 +517,9 @@ void GuestViewBase::WillAttach(WebContents* embedder_web_contents, if (owner_web_contents_ != embedder_web_contents) { DCHECK_EQ(owner_contents_observer_->web_contents(), owner_web_contents_); owner_web_contents_ = embedder_web_contents; - owner_contents_observer_.reset( - new OwnerContentsObserver(this, embedder_web_contents)); - owner_host_ = GuestViewManager::FromBrowserContext(browser_context_)-> - IsOwnedByExtension(this) ? - owner_web_contents()->GetLastCommittedURL().host() : std::string(); + owner_contents_observer_ = + base::MakeUnique<OwnerContentsObserver>(this, embedder_web_contents); + SetOwnerHost(); } // Start tracking the new embedder's zoom level. @@ -570,10 +540,6 @@ void GuestViewBase::SignalWhenReady(const base::Closure& callback) { callback.Run(); } -bool GuestViewBase::ShouldHandleFindRequestsForEmbedder() const { - return false; -} - int GuestViewBase::LogicalPixelsToPhysicalPixels(double logical_pixels) const { DCHECK(logical_pixels >= 0); double zoom_factor = GetEmbedderZoomFactor(); @@ -698,9 +664,7 @@ bool GuestViewBase::ShouldFocusPageAfterCrash() { bool GuestViewBase::PreHandleGestureEvent(WebContents* source, const blink::WebGestureEvent& event) { - return event.GetType() == blink::WebGestureEvent::kGesturePinchBegin || - event.GetType() == blink::WebGestureEvent::kGesturePinchUpdate || - event.GetType() == blink::WebGestureEvent::kGesturePinchEnd; + return blink::WebInputEvent::IsPinchGestureEventType(event.GetType()); } void GuestViewBase::UpdatePreferredSize(WebContents* target_web_contents, @@ -726,35 +690,15 @@ bool GuestViewBase::ShouldResumeRequestsForCreatedWindow() { return false; } -void GuestViewBase::FindReply(WebContents* source, - int request_id, - int number_of_matches, - const gfx::Rect& selection_rect, - int active_match_ordinal, - bool final_update) { - if (ShouldHandleFindRequestsForEmbedder() && - attached() && embedder_web_contents()->GetDelegate()) { - embedder_web_contents()->GetDelegate()->FindReply(embedder_web_contents(), - request_id, - number_of_matches, - selection_rect, - active_match_ordinal, - final_update); - } -} - content::RenderWidgetHost* GuestViewBase::GetOwnerRenderWidgetHost() { // We assume guests live inside an owner RenderFrame but the RenderFrame may // not be cross-process. In case a type of guest should be allowed to be // embedded in a cross-process frame, this method should be overrode for that // specific guest type. For all other guests, the owner RenderWidgetHost is // that of the owner WebContents. - if (GetOwnerWebContents() && - GetOwnerWebContents()->GetRenderWidgetHostView()) { - return GetOwnerWebContents() - ->GetRenderWidgetHostView() - ->GetRenderWidgetHost(); - } + auto* owner = GetOwnerWebContents(); + if (owner && owner->GetRenderWidgetHostView()) + return owner->GetRenderWidgetHostView()->GetRenderWidgetHost(); return nullptr; } @@ -935,4 +879,11 @@ void GuestViewBase::UpdateGuestSize(const gfx::Size& new_size, guest_size_ = new_size; } +void GuestViewBase::SetOwnerHost() { + auto* manager = GuestViewManager::FromBrowserContext(browser_context_); + owner_host_ = manager->IsOwnedByExtension(this) + ? owner_web_contents()->GetLastCommittedURL().host() + : std::string(); +} + } // namespace guest_view diff --git a/chromium/components/guest_view/browser/guest_view_base.h b/chromium/components/guest_view/browser/guest_view_base.h index c900a11b01f..67fdaf0e373 100644 --- a/chromium/components/guest_view/browser/guest_view_base.h +++ b/chromium/components/guest_view/browser/guest_view_base.h @@ -23,6 +23,7 @@ namespace guest_view { class GuestViewEvent; +class GuestViewManager; // A struct of parameters for SetSize(). The parameters are all declared as // scoped pointers since they are all optional. Null pointers indicate that the @@ -222,12 +223,6 @@ class GuestViewBase : public content::BrowserPluginGuestDelegate, const content::NativeWebKeyboardEvent& event) override; bool PreHandleGestureEvent(content::WebContents* source, const blink::WebGestureEvent& event) override; - void FindReply(content::WebContents* source, - int request_id, - int number_of_matches, - const gfx::Rect& selection_rect, - int active_match_ordinal, - bool final_update) override; // WebContentsObserver implementation. void DidFinishNavigation( @@ -296,11 +291,6 @@ class GuestViewBase : public content::BrowserPluginGuestDelegate, // asynchronous setup. virtual void SignalWhenReady(const base::Closure& callback); - // Returns true if this guest should handle find requests for its - // embedder. This should generally be true for guests that make up the - // entirety of the embedder's content. - virtual bool ShouldHandleFindRequestsForEmbedder() const; - // This method is called immediately before suspended resource loads have been // resumed on attachment to an embedder. // @@ -345,10 +335,6 @@ class GuestViewBase : public content::BrowserPluginGuestDelegate, void DidAttach(int guest_proxy_routing_id) final; void DidDetach() final; content::WebContents* GetOwnerWebContents() const final; - bool HandleFindForEmbedder(int request_id, - const base::string16& search_text, - const blink::WebFindOptions& options) final; - bool HandleStopFindingForEmbedder(content::StopFindAction action) final; void GuestSizeChanged(const gfx::Size& new_size) final; void SetGuestHost(content::GuestHost* guest_host) final; void WillAttach(content::WebContents* embedder_web_contents, @@ -411,6 +397,9 @@ class GuestViewBase : public content::BrowserPluginGuestDelegate, void UpdateGuestSize(const gfx::Size& new_size, bool due_to_auto_resize); + GuestViewManager* GetGuestViewManager(); + void SetOwnerHost(); + // This guest tracks the lifetime of the WebContents specified by // |owner_web_contents_|. If |owner_web_contents_| is destroyed then this // guest will also self-destruct. diff --git a/chromium/components/guest_view/browser/guest_view_manager.cc b/chromium/components/guest_view/browser/guest_view_manager.cc index 1c68e13912c..bc36a92f4ad 100644 --- a/chromium/components/guest_view/browser/guest_view_manager.cc +++ b/chromium/components/guest_view/browser/guest_view_manager.cc @@ -8,8 +8,8 @@ #include <utility> #include "base/macros.h" +#include "base/memory/ptr_util.h" #include "base/metrics/user_metrics.h" -#include "base/strings/stringprintf.h" #include "components/guest_view/browser/guest_view_base.h" #include "components/guest_view/browser/guest_view_manager_delegate.h" #include "components/guest_view/browser/guest_view_manager_factory.h" @@ -17,7 +17,7 @@ #include "content/public/browser/browser_context.h" #include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_process_host.h" -#include "content/public/browser/render_view_host.h" +#include "content/public/browser/site_instance.h" #include "content/public/browser/web_contents_observer.h" #include "content/public/common/child_process_host.h" #include "content/public/common/result_codes.h" @@ -31,6 +31,13 @@ using content::WebContents; namespace guest_view { +namespace { + +// Static factory instance (always NULL for non-test). +GuestViewManagerFactory* g_factory; + +} // namespace + // This observer observes the RenderProcessHosts of GuestView embedders, and // notifies the GuestViewManager when they are destroyed. class GuestViewManager::EmbedderRenderProcessHostObserver @@ -61,9 +68,6 @@ class GuestViewManager::EmbedderRenderProcessHostObserver int id_; }; -// static -GuestViewManagerFactory* GuestViewManager::factory_ = nullptr; - GuestViewManager::GuestViewManager( content::BrowserContext* context, std::unique_ptr<GuestViewManagerDelegate> delegate) @@ -81,13 +85,14 @@ GuestViewManager* GuestViewManager::CreateWithDelegate( std::unique_ptr<GuestViewManagerDelegate> delegate) { GuestViewManager* guest_manager = FromBrowserContext(context); if (!guest_manager) { - if (factory_) { + if (g_factory) { guest_manager = - factory_->CreateGuestViewManager(context, std::move(delegate)); + g_factory->CreateGuestViewManager(context, std::move(delegate)); } else { guest_manager = new GuestViewManager(context, std::move(delegate)); } - context->SetUserData(kGuestViewManagerKeyName, guest_manager); + context->SetUserData(kGuestViewManagerKeyName, + base::WrapUnique(guest_manager)); } return guest_manager; } @@ -99,6 +104,12 @@ GuestViewManager* GuestViewManager::FromBrowserContext( kGuestViewManagerKeyName)); } +// static +void GuestViewManager::set_factory_for_testing( + GuestViewManagerFactory* factory) { + g_factory = factory; +} + content::WebContents* GuestViewManager::GetGuestByInstanceIDSafely( int guest_instance_id, int embedder_render_process_id) { @@ -321,7 +332,7 @@ void GuestViewManager::CallViewDestructionCallbacks(int embedder_process_id, // If |view_instance_id| is guest_view::kInstanceIDNone, then all callbacks // for this embedder should be called. - if (view_instance_id == guest_view::kInstanceIDNone) { + if (view_instance_id == kInstanceIDNone) { // Call all callbacks for the embedder with ID |embedder_process_id|. for (auto& view_pair : callbacks_for_embedder) { Callbacks& callbacks_for_view = view_pair.second; @@ -344,8 +355,7 @@ void GuestViewManager::CallViewDestructionCallbacks(int embedder_process_id, } void GuestViewManager::CallViewDestructionCallbacks(int embedder_process_id) { - CallViewDestructionCallbacks(embedder_process_id, - guest_view::kInstanceIDNone); + CallViewDestructionCallbacks(embedder_process_id, kInstanceIDNone); } GuestViewBase* GuestViewManager::CreateGuestInternal( diff --git a/chromium/components/guest_view/browser/guest_view_manager.h b/chromium/components/guest_view/browser/guest_view_manager.h index 74e177d3fbf..4c1ad70b451 100644 --- a/chromium/components/guest_view/browser/guest_view_manager.h +++ b/chromium/components/guest_view/browser/guest_view_manager.h @@ -11,11 +11,9 @@ #include <vector> #include "base/bind.h" -#include "base/lazy_instance.h" #include "base/macros.h" #include "base/memory/weak_ptr.h" #include "content/public/browser/browser_plugin_guest_manager.h" -#include "content/public/browser/site_instance.h" #include "content/public/browser/web_contents.h" class GURL; @@ -26,8 +24,8 @@ class DictionaryValue; namespace content { class BrowserContext; -class WebContents; -} // namespace content +class SiteInstance; +} namespace guest_view { @@ -54,9 +52,8 @@ class GuestViewManager : public content::BrowserPluginGuestManager, // Overrides factory for testing. Default (NULL) value indicates regular // (non-test) environment. - static void set_factory_for_testing(GuestViewManagerFactory* factory) { - GuestViewManager::factory_ = factory; - } + static void set_factory_for_testing(GuestViewManagerFactory* factory); + // Returns the guest WebContents associated with the given |guest_instance_id| // if the provided |embedder_render_process_id| is allowed to access it. // If the embedder is not allowed access, the embedder will be killed, and @@ -204,9 +201,6 @@ class GuestViewManager : public content::BrowserPluginGuestManager, static bool GetFullPageGuestHelper(content::WebContents** result, content::WebContents* guest_web_contents); - // Static factory instance (always NULL for non-test). - static GuestViewManagerFactory* factory_; - // Contains guests' WebContents, mapping from their instance ids. using GuestInstanceMap = std::map<int, content::WebContents*>; GuestInstanceMap guest_web_contents_by_instance_id_; @@ -256,7 +250,7 @@ class GuestViewManager : public content::BrowserPluginGuestManager, // |last_instance_id_removed_| are kept here. std::set<int> removed_instance_ids_; - content::BrowserContext* context_; + content::BrowserContext* const context_; std::unique_ptr<GuestViewManagerDelegate> delegate_; diff --git a/chromium/components/guest_view/browser/guest_view_message_filter.cc b/chromium/components/guest_view/browser/guest_view_message_filter.cc index 03aefe803a3..c2124ed258f 100644 --- a/chromium/components/guest_view/browser/guest_view_message_filter.cc +++ b/chromium/components/guest_view/browser/guest_view_message_filter.cc @@ -144,7 +144,8 @@ void GuestViewMessageFilter::OnAttachToEmbedderFrame( guest->WillAttach( owner_web_contents, element_instance_id, false, - base::Bind(&GuestViewMessageFilter::WillAttachCallback, this, guest)); + base::Bind(&GuestViewBase::DidAttach, + guest->weak_ptr_factory_.GetWeakPtr(), MSG_ROUTING_NONE)); // Attach this inner WebContents |guest_web_contents| to the outer // WebContents |owner_web_contents|. The outer WebContents's @@ -155,8 +156,4 @@ void GuestViewMessageFilter::OnAttachToEmbedderFrame( embedder_frame); } -void GuestViewMessageFilter::WillAttachCallback(GuestViewBase* guest) { - guest->DidAttach(MSG_ROUTING_NONE); -} - } // namespace guest_view diff --git a/chromium/components/guest_view/browser/guest_view_message_filter.h b/chromium/components/guest_view/browser/guest_view_message_filter.h index 7c271d8a98c..1a24bf2cacd 100644 --- a/chromium/components/guest_view/browser/guest_view_message_filter.h +++ b/chromium/components/guest_view/browser/guest_view_message_filter.h @@ -23,7 +23,6 @@ class BrowserContext; } namespace guest_view { -class GuestViewBase; class GuestViewManager; // This class filters out incoming GuestView-specific IPC messages from the @@ -75,8 +74,6 @@ class GuestViewMessageFilter : public content::BrowserMessageFilter { void OnViewCreated(int view_instance_id, const std::string& view_type); void OnViewGarbageCollected(int view_instance_id); - void WillAttachCallback(GuestViewBase* guest); - DISALLOW_COPY_AND_ASSIGN(GuestViewMessageFilter); }; diff --git a/chromium/components/guest_view/renderer/BUILD.gn b/chromium/components/guest_view/renderer/BUILD.gn index c78feedc49e..479bdef0feb 100644 --- a/chromium/components/guest_view/renderer/BUILD.gn +++ b/chromium/components/guest_view/renderer/BUILD.gn @@ -2,6 +2,10 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//extensions/features/features.gni") + +assert(enable_extensions) + static_library("renderer") { sources = [ "guest_view_container.cc", diff --git a/chromium/components/guest_view/renderer/guest_view_container.cc b/chromium/components/guest_view/renderer/guest_view_container.cc index cc01a13e096..4d1e7a65079 100644 --- a/chromium/components/guest_view/renderer/guest_view_container.cc +++ b/chromium/components/guest_view/renderer/guest_view_container.cc @@ -186,8 +186,15 @@ void GuestViewContainer::RunDestructionCallback(bool embedder_frame_destroyed) { } void GuestViewContainer::OnHandleCallback(const IPC::Message& message) { + base::WeakPtr<content::BrowserPluginDelegate> weak_ptr(GetWeakPtr()); + // Handle the callback for the current request with a pending response. HandlePendingResponseCallback(message); + + // Check that this container has not been deleted (crbug.com/718292). + if (!weak_ptr) + return; + // Perform the subsequent request if one exists. PerformPendingRequest(); } |