mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-16 23:05:42 +00:00
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:
parent
5d44b220c1
commit
8c8c3d3be5
@ -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,
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user