зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1380716 - Reinitialize ImageContainer::mImageClient if its parent ImageBridgeChild was also reinitialized. r=sotaro
This commit is contained in:
Родитель
2be2d91c31
Коммит
b306aa3fb2
|
@ -126,6 +126,15 @@ ImageContainerListener::ClearImageContainer()
|
|||
mImageContainer = nullptr;
|
||||
}
|
||||
|
||||
already_AddRefed<ImageClient>
|
||||
ImageContainer::GetImageClient()
|
||||
{
|
||||
ReentrantMonitorAutoEnter mon(mReentrantMonitor);
|
||||
EnsureImageClient();
|
||||
RefPtr<ImageClient> imageClient = mImageClient;
|
||||
return imageClient.forget();
|
||||
}
|
||||
|
||||
void
|
||||
ImageContainer::EnsureImageClient()
|
||||
{
|
||||
|
@ -298,9 +307,9 @@ ImageContainer::SetCurrentImages(const nsTArray<NonOwningImage>& aImages)
|
|||
{
|
||||
MOZ_ASSERT(!aImages.IsEmpty());
|
||||
ReentrantMonitorAutoEnter mon(mReentrantMonitor);
|
||||
if (mImageClient) {
|
||||
if (mIsAsync) {
|
||||
if (RefPtr<ImageBridgeChild> imageBridge = ImageBridgeChild::GetSingleton()) {
|
||||
imageBridge->UpdateImageClient(mImageClient, this);
|
||||
imageBridge->UpdateImageClient(this);
|
||||
}
|
||||
}
|
||||
SetCurrentImageInternal(aImages);
|
||||
|
|
|
@ -603,6 +603,13 @@ public:
|
|||
return mNotifyCompositeListener;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the ImageClient associated with this container. Returns only after
|
||||
* validating, and it will recreate the image client if that fails.
|
||||
* Returns nullptr if not applicable.
|
||||
*/
|
||||
already_AddRefed<ImageClient> GetImageClient();
|
||||
|
||||
/**
|
||||
* Main thread only.
|
||||
*/
|
||||
|
|
|
@ -383,9 +383,9 @@ ImageBridgeChild::DispatchReleaseTextureClient(TextureClient* aClient)
|
|||
}
|
||||
|
||||
void
|
||||
ImageBridgeChild::UpdateImageClient(RefPtr<ImageClient> aClient, RefPtr<ImageContainer> aContainer)
|
||||
ImageBridgeChild::UpdateImageClient(RefPtr<ImageContainer> aContainer)
|
||||
{
|
||||
if (!aClient || !aContainer) {
|
||||
if (!aContainer) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -393,7 +393,6 @@ ImageBridgeChild::UpdateImageClient(RefPtr<ImageClient> aClient, RefPtr<ImageCon
|
|||
RefPtr<Runnable> runnable = WrapRunnable(
|
||||
RefPtr<ImageBridgeChild>(this),
|
||||
&ImageBridgeChild::UpdateImageClient,
|
||||
aClient,
|
||||
aContainer);
|
||||
GetMessageLoop()->PostTask(runnable.forget());
|
||||
return;
|
||||
|
@ -403,14 +402,19 @@ ImageBridgeChild::UpdateImageClient(RefPtr<ImageClient> aClient, RefPtr<ImageCon
|
|||
return;
|
||||
}
|
||||
|
||||
RefPtr<ImageClient> client = aContainer->GetImageClient();
|
||||
if (NS_WARN_IF(!client)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// If the client has become disconnected before this event was dispatched,
|
||||
// early return now.
|
||||
if (!aClient->IsConnected()) {
|
||||
if (!client->IsConnected()) {
|
||||
return;
|
||||
}
|
||||
|
||||
BeginTransaction();
|
||||
aClient->UpdateImage(aContainer, Layer::CONTENT_OPAQUE);
|
||||
client->UpdateImage(aContainer, Layer::CONTENT_OPAQUE);
|
||||
EndTransaction();
|
||||
}
|
||||
|
||||
|
|
|
@ -204,7 +204,7 @@ public:
|
|||
already_AddRefed<CanvasClient> CreateCanvasClient(CanvasClient::CanvasClientType aType,
|
||||
TextureFlags aFlag);
|
||||
void UpdateAsyncCanvasRenderer(AsyncCanvasRenderer* aClient);
|
||||
void UpdateImageClient(RefPtr<ImageClient> aClient, RefPtr<ImageContainer> aContainer);
|
||||
void UpdateImageClient(RefPtr<ImageContainer> aContainer);
|
||||
static void DispatchReleaseTextureClient(TextureClient* aClient);
|
||||
|
||||
/**
|
||||
|
|
Загрузка…
Ссылка в новой задаче