From 0f25ea7c0d76af5b2f980c230648180a915011a7 Mon Sep 17 00:00:00 2001 From: Bill McCloskey Date: Wed, 15 Jan 2014 13:10:39 -0800 Subject: [PATCH] Bug 919878 - Fix abort in graphics code if content process shuts down quickly (r=mattwoodrow) --- dom/ipc/PBrowser.ipdl | 7 ++++-- dom/ipc/TabChild.cpp | 18 ++++++++------ dom/ipc/TabChild.h | 4 +--- dom/ipc/TabParent.cpp | 40 ++++++++++++++++++++------------ dom/ipc/TabParent.h | 14 +++++------ layout/ipc/RenderFrameParent.cpp | 16 +++++++++---- layout/ipc/RenderFrameParent.h | 14 +++++++---- 7 files changed, 69 insertions(+), 44 deletions(-) diff --git a/dom/ipc/PBrowser.ipdl b/dom/ipc/PBrowser.ipdl index fba6f69abbb..a663dfffebe 100644 --- a/dom/ipc/PBrowser.ipdl +++ b/dom/ipc/PBrowser.ipdl @@ -227,9 +227,12 @@ parent: * Create a layout frame (encapsulating a remote layer tree) for * the page that is currently loaded in the . */ - sync PRenderFrame() + sync PRenderFrame(); + + sync InitRenderFrame(PRenderFrame aFrame) returns (ScrollingBehavior scrolling, - TextureFactoryIdentifier textureFactoryIdentifier, uint64_t layersId); + TextureFactoryIdentifier textureFactoryIdentifier, uint64_t layersId, + bool success); /** * Starts an offline application cache update. diff --git a/dom/ipc/TabChild.cpp b/dom/ipc/TabChild.cpp index 40af3079f3d..104e4090fc5 100644 --- a/dom/ipc/TabChild.cpp +++ b/dom/ipc/TabChild.cpp @@ -2195,9 +2195,7 @@ TabChild::RecvSetUpdateHitRegion(const bool& aEnabled) } PRenderFrameChild* -TabChild::AllocPRenderFrameChild(ScrollingBehavior* aScrolling, - TextureFactoryIdentifier* aTextureFactoryIdentifier, - uint64_t* aLayersId) +TabChild::AllocPRenderFrameChild() { return new RenderFrameChild(); } @@ -2254,12 +2252,18 @@ TabChild::InitRenderingState() static_cast(mWidget.get())->InitIMEState(); uint64_t id; + bool success; RenderFrameChild* remoteFrame = - static_cast(SendPRenderFrameConstructor( - &mScrolling, &mTextureFactoryIdentifier, &id)); + static_cast(SendPRenderFrameConstructor()); if (!remoteFrame) { - NS_WARNING("failed to construct RenderFrame"); - return false; + NS_WARNING("failed to construct RenderFrame"); + return false; + } + SendInitRenderFrame(remoteFrame, &mScrolling, &mTextureFactoryIdentifier, &id, &success); + if (!success) { + NS_WARNING("failed to construct RenderFrame"); + PRenderFrameChild::Send__delete__(remoteFrame); + return false; } PLayerTransactionChild* shadowManager = nullptr; diff --git a/dom/ipc/TabChild.h b/dom/ipc/TabChild.h index a4542ce97ff..abad7d9a624 100644 --- a/dom/ipc/TabChild.h +++ b/dom/ipc/TabChild.h @@ -367,9 +367,7 @@ public: } protected: - virtual PRenderFrameChild* AllocPRenderFrameChild(ScrollingBehavior* aScrolling, - TextureFactoryIdentifier* aTextureFactoryIdentifier, - uint64_t* aLayersId) MOZ_OVERRIDE; + virtual PRenderFrameChild* AllocPRenderFrameChild() MOZ_OVERRIDE; virtual bool DeallocPRenderFrameChild(PRenderFrameChild* aFrame) MOZ_OVERRIDE; virtual bool RecvDestroy() MOZ_OVERRIDE; virtual bool RecvSetUpdateHitRegion(const bool& aEnabled) MOZ_OVERRIDE; diff --git a/dom/ipc/TabParent.cpp b/dom/ipc/TabParent.cpp index 16dcea38413..9a3aa6bbab3 100644 --- a/dom/ipc/TabParent.cpp +++ b/dom/ipc/TabParent.cpp @@ -1525,23 +1525,36 @@ TabParent::HandleDelayedDialogs() } } -PRenderFrameParent* -TabParent::AllocPRenderFrameParent(ScrollingBehavior* aScrolling, - TextureFactoryIdentifier* aTextureFactoryIdentifier, - uint64_t* aLayersId) +bool +TabParent::RecvInitRenderFrame(PRenderFrameParent* aFrame, + ScrollingBehavior* aScrolling, + TextureFactoryIdentifier* aTextureFactoryIdentifier, + uint64_t* aLayersId, + bool *aSuccess) { - MOZ_ASSERT(ManagedPRenderFrameParent().IsEmpty()); + *aScrolling = UseAsyncPanZoom() ? ASYNC_PAN_ZOOM : DEFAULT_SCROLLING; + *aTextureFactoryIdentifier = TextureFactoryIdentifier(); + *aLayersId = 0; nsRefPtr frameLoader = GetFrameLoader(); if (!frameLoader) { - NS_WARNING("Can't allocate graphics resources, aborting subprocess"); - return nullptr; + NS_WARNING("Can't allocate graphics resources. May already be shutting down."); + *aSuccess = false; + return true; } - *aScrolling = UseAsyncPanZoom() ? ASYNC_PAN_ZOOM : DEFAULT_SCROLLING; - return new RenderFrameParent(frameLoader, - *aScrolling, - aTextureFactoryIdentifier, aLayersId); + static_cast(aFrame)->Init(frameLoader, *aScrolling, + aTextureFactoryIdentifier, aLayersId); + + *aSuccess = true; + return true; +} + +PRenderFrameParent* +TabParent::AllocPRenderFrameParent() +{ + MOZ_ASSERT(ManagedPRenderFrameParent().IsEmpty()); + return new RenderFrameParent(); } bool @@ -1692,10 +1705,7 @@ TabParent::RecvBrowserFrameOpenWindow(PBrowserParent* aOpener, } bool -TabParent::RecvPRenderFrameConstructor(PRenderFrameParent* actor, - ScrollingBehavior* scrolling, - TextureFactoryIdentifier* factoryIdentifier, - uint64_t* layersId) +TabParent::RecvPRenderFrameConstructor(PRenderFrameParent* actor) { return true; } diff --git a/dom/ipc/TabParent.h b/dom/ipc/TabParent.h index 88361ad35b5..1b38e567c33 100644 --- a/dom/ipc/TabParent.h +++ b/dom/ipc/TabParent.h @@ -112,10 +112,12 @@ public: virtual bool RecvMoveFocus(const bool& aForward); virtual bool RecvEvent(const RemoteDOMEvent& aEvent); - virtual bool RecvPRenderFrameConstructor(PRenderFrameParent* actor, - ScrollingBehavior* scrolling, - TextureFactoryIdentifier* identifier, - uint64_t* layersId); + virtual bool RecvPRenderFrameConstructor(PRenderFrameParent* actor); + virtual bool RecvInitRenderFrame(PRenderFrameParent* aFrame, + ScrollingBehavior* scrolling, + TextureFactoryIdentifier* identifier, + uint64_t* layersId, + bool *aSuccess); virtual bool RecvBrowserFrameOpenWindow(PBrowserParent* aOpener, const nsString& aURL, const nsString& aName, @@ -312,9 +314,7 @@ protected: bool ShouldDelayDialogs(); bool AllowContentIME(); - virtual PRenderFrameParent* AllocPRenderFrameParent(ScrollingBehavior* aScrolling, - TextureFactoryIdentifier* aTextureFactoryIdentifier, - uint64_t* aLayersId) MOZ_OVERRIDE; + virtual PRenderFrameParent* AllocPRenderFrameParent() MOZ_OVERRIDE; virtual bool DeallocPRenderFrameParent(PRenderFrameParent* aFrame) MOZ_OVERRIDE; // IME diff --git a/layout/ipc/RenderFrameParent.cpp b/layout/ipc/RenderFrameParent.cpp index 077a5ddd229..5a11edfeee7 100644 --- a/layout/ipc/RenderFrameParent.cpp +++ b/layout/ipc/RenderFrameParent.cpp @@ -670,15 +670,21 @@ private: ZoomConstraints mZoomConstraints; }; -RenderFrameParent::RenderFrameParent(nsFrameLoader* aFrameLoader, - ScrollingBehavior aScrollingBehavior, - TextureFactoryIdentifier* aTextureFactoryIdentifier, - uint64_t* aId) +RenderFrameParent::RenderFrameParent() : mLayersId(0) - , mFrameLoader(aFrameLoader) , mFrameLoaderDestroyed(false) , mBackgroundColor(gfxRGBA(1, 1, 1)) { +} + +void +RenderFrameParent::Init(nsFrameLoader* aFrameLoader, + ScrollingBehavior aScrollingBehavior, + TextureFactoryIdentifier* aTextureFactoryIdentifier, + uint64_t* aId) +{ + mFrameLoader = aFrameLoader; + *aId = 0; nsRefPtr lm = GetFrom(mFrameLoader); diff --git a/layout/ipc/RenderFrameParent.h b/layout/ipc/RenderFrameParent.h index 9289db955ec..365ebb0daa6 100644 --- a/layout/ipc/RenderFrameParent.h +++ b/layout/ipc/RenderFrameParent.h @@ -55,16 +55,20 @@ class RenderFrameParent : public PRenderFrameParent, public: typedef std::map > ViewMap; + /* Init should be called immediately after allocation. */ + RenderFrameParent(); + virtual ~RenderFrameParent(); + /** * Select the desired scrolling behavior. If ASYNC_PAN_ZOOM is * chosen, then RenderFrameParent will watch input events and use * them to asynchronously pan and zoom. */ - RenderFrameParent(nsFrameLoader* aFrameLoader, - ScrollingBehavior aScrollingBehavior, - TextureFactoryIdentifier* aTextureFactoryIdentifier, - uint64_t* aId); - virtual ~RenderFrameParent(); + void + Init(nsFrameLoader* aFrameLoader, + ScrollingBehavior aScrollingBehavior, + TextureFactoryIdentifier* aTextureFactoryIdentifier, + uint64_t* aId); void Destroy();