Bug 637901 - Don't trash our cached ImageContainer unless the retained layer manager has changed. r=tnikkel a=blocking2.0

This commit is contained in:
Matt Woodrow 2011-03-02 21:53:27 +13:00
parent 5d44b220c1
commit 8c8c3d3be5
4 changed files with 37 additions and 23 deletions

View File

@ -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<mozilla::layers::LayerManager>
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<mozilla::layers::LayerManager>
PersistentLayerManagerForDocument(nsIDocument *aDoc);
PersistentLayerManagerForDocument(nsIDocument *aDoc, bool *aAllowRetaining = nsnull);
/**
* Determine whether a content node is focused or not,

View File

@ -6354,7 +6354,8 @@ static nsIView* GetDisplayRootFor(nsIView* aView)
}
static already_AddRefed<LayerManager>
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<LayerManager> manager =
static_cast<nsIWidget_MOZILLA_2_0_BRANCH*>(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<LayerManager>
nsContentUtils::LayerManagerForDocument(nsIDocument *aDoc)
nsContentUtils::LayerManagerForDocument(nsIDocument *aDoc, bool *aAllowRetaining)
{
return LayerManagerForDocumentInternal(aDoc, false);
return LayerManagerForDocumentInternal(aDoc, false, aAllowRetaining);
}
already_AddRefed<LayerManager>
nsContentUtils::PersistentLayerManagerForDocument(nsIDocument *aDoc)
nsContentUtils::PersistentLayerManagerForDocument(nsIDocument *aDoc, bool *aAllowRetaining)
{
return LayerManagerForDocumentInternal(aDoc, true);
return LayerManagerForDocumentInternal(aDoc, true, aAllowRetaining);
}
bool

View File

@ -1642,7 +1642,7 @@ nsObjectFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
#endif
}
ImageContainer* container = GetImageContainer();
nsRefPtr<ImageContainer> container = GetImageContainer();
nsRefPtr<Image> 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<ImageContainer>
nsObjectFrame::GetImageContainer(LayerManager* aManager)
{
nsRefPtr<LayerManager> manager = aManager;
bool retain = false;
if (!manager) {
manager = nsContentUtils::LayerManagerForDocument(mContent->GetOwnerDoc());
manager = nsContentUtils::LayerManagerForDocument(mContent->GetOwnerDoc(), &retain);
}
if (!manager) {
return nsnull;
}
nsRefPtr<ImageContainer> 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

View File

@ -191,7 +191,7 @@ public:
virtual LayerState GetLayerState(nsDisplayListBuilder* aBuilder,
LayerManager* aManager);
ImageContainer* GetImageContainer(LayerManager* aManager = nsnull);
already_AddRefed<ImageContainer> 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