Bug 1380716 - Reinitialize ImageContainer::mImageClient if its parent ImageBridgeChild was also reinitialized. r=sotaro

This commit is contained in:
Andrew Osmond 2017-07-15 07:52:02 -04:00
Родитель 2be2d91c31
Коммит b306aa3fb2
4 изменённых файлов: 28 добавлений и 8 удалений

Просмотреть файл

@ -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);
/**