diff --git a/content/base/public/nsContentUtils.h b/content/base/public/nsContentUtils.h index f650a2f53f76..32426d368ee7 100644 --- a/content/base/public/nsContentUtils.h +++ b/content/base/public/nsContentUtils.h @@ -1699,12 +1699,12 @@ public: * a presentation with an associated widget, and use that widget's * layer manager. * - * If one can't be found, a BasicLayerManager is created and returned. - * * @param aDoc the document for which to return a layer manager. + * @param aAllowRetaining an outparam that states whether the returned + * layer manager should be used for retained layers */ static already_AddRefed - LayerManagerForDocument(nsIDocument *aDoc); + LayerManagerForDocument(nsIDocument *aDoc, bool *aAllowRetaining = nsnull); /** * Returns a layer manager to use for the given document. Basically we @@ -1716,12 +1716,12 @@ public: * forseeable future. This function should be used carefully as it may change * the document's layer manager. * - * If one can't be found, a BasicLayerManager is created and returned. - * * @param aDoc the document for which to return a layer manager. + * @param aAllowRetaining an outparam that states whether the returned + * layer manager should be used for retained layers */ static already_AddRefed - PersistentLayerManagerForDocument(nsIDocument *aDoc); + PersistentLayerManagerForDocument(nsIDocument *aDoc, bool *aAllowRetaining = nsnull); /** * Determine whether a content node is focused or not, diff --git a/content/base/src/nsContentUtils.cpp b/content/base/src/nsContentUtils.cpp index 826f06e78e11..6658636d2a92 100644 --- a/content/base/src/nsContentUtils.cpp +++ b/content/base/src/nsContentUtils.cpp @@ -6354,7 +6354,8 @@ static nsIView* GetDisplayRootFor(nsIView* aView) } static already_AddRefed -LayerManagerForDocumentInternal(nsIDocument *aDoc, bool aRequirePersistent) +LayerManagerForDocumentInternal(nsIDocument *aDoc, bool aRequirePersistent, + bool* aAllowRetaining) { nsIDocument* doc = aDoc; nsIDocument* displayDoc = doc->GetDisplayDocument(); @@ -6394,7 +6395,8 @@ LayerManagerForDocumentInternal(nsIDocument *aDoc, bool aRequirePersistent) nsRefPtr manager = static_cast(widget)-> GetLayerManager(aRequirePersistent ? nsIWidget_MOZILLA_2_0_BRANCH::LAYER_MANAGER_PERSISTENT : - nsIWidget_MOZILLA_2_0_BRANCH::LAYER_MANAGER_CURRENT); + nsIWidget_MOZILLA_2_0_BRANCH::LAYER_MANAGER_CURRENT, + aAllowRetaining); return manager.forget(); } } @@ -6406,15 +6408,15 @@ LayerManagerForDocumentInternal(nsIDocument *aDoc, bool aRequirePersistent) } already_AddRefed -nsContentUtils::LayerManagerForDocument(nsIDocument *aDoc) +nsContentUtils::LayerManagerForDocument(nsIDocument *aDoc, bool *aAllowRetaining) { - return LayerManagerForDocumentInternal(aDoc, false); + return LayerManagerForDocumentInternal(aDoc, false, aAllowRetaining); } already_AddRefed -nsContentUtils::PersistentLayerManagerForDocument(nsIDocument *aDoc) +nsContentUtils::PersistentLayerManagerForDocument(nsIDocument *aDoc, bool *aAllowRetaining) { - return LayerManagerForDocumentInternal(aDoc, true); + return LayerManagerForDocumentInternal(aDoc, true, aAllowRetaining); } bool diff --git a/layout/generic/nsObjectFrame.cpp b/layout/generic/nsObjectFrame.cpp index e18b60bd529a..c26ea79fc5ac 100644 --- a/layout/generic/nsObjectFrame.cpp +++ b/layout/generic/nsObjectFrame.cpp @@ -1642,7 +1642,7 @@ nsObjectFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, #endif } - ImageContainer* container = GetImageContainer(); + nsRefPtr container = GetImageContainer(); nsRefPtr currentImage = container ? container->GetCurrentImage() : nsnull; if (!currentImage || !isVisible || container->GetCurrentSize() != gfxIntSize(window->width, window->height)) { @@ -1884,31 +1884,43 @@ nsObjectFrame::PrintPlugin(nsIRenderingContext& aRenderingContext, nsnull, status); // DidReflow will take care of it } -ImageContainer* +already_AddRefed nsObjectFrame::GetImageContainer(LayerManager* aManager) { nsRefPtr manager = aManager; + bool retain = false; if (!manager) { - manager = nsContentUtils::LayerManagerForDocument(mContent->GetOwnerDoc()); + manager = nsContentUtils::LayerManagerForDocument(mContent->GetOwnerDoc(), &retain); } if (!manager) { return nsnull; } + + nsRefPtr container; // XXX - in the future image containers will be manager independent and // we can remove the manager equals check and only check the backend type. if (mImageContainer) { if ((!mImageContainer->Manager() || mImageContainer->Manager() == manager) && - mImageContainer->GetBackendType() == manager->GetBackendType()) - return mImageContainer; - // Clear current image before we reset mImageContainer. Only mImageContainer - // is allowed to contain the image for this plugin. - mImageContainer->SetCurrentImage(nsnull); + mImageContainer->GetBackendType() == manager->GetBackendType()) { + container = mImageContainer; + return container.forget(); + } } - mImageContainer = manager->CreateImageContainer(); - return mImageContainer; + container = manager->CreateImageContainer(); + + if (retain) { + // Clear current image before we reset mImageContainer. Only mImageContainer + // is allowed to contain the image for this plugin. + if (mImageContainer) { + mImageContainer->SetCurrentImage(nsnull); + } + mImageContainer = container; + } + + return container.forget(); } nsRect diff --git a/layout/generic/nsObjectFrame.h b/layout/generic/nsObjectFrame.h index cf0e530de1f3..1bb7dea594fc 100644 --- a/layout/generic/nsObjectFrame.h +++ b/layout/generic/nsObjectFrame.h @@ -191,7 +191,7 @@ public: virtual LayerState GetLayerState(nsDisplayListBuilder* aBuilder, LayerManager* aManager); - ImageContainer* GetImageContainer(LayerManager* aManager = nsnull); + already_AddRefed GetImageContainer(LayerManager* aManager = nsnull); /** * Get the rectangle (relative to this frame) which it will paint. Normally * the frame's content-box but may be smaller if the plugin is rendering