Skip to content

Commit

Permalink
[nemo][embedlite] Share layermanager correctly. Fixes JB#49914
Browse files Browse the repository at this point in the history
This commit also guards few please use after destroyed.

Signed-off-by: Raine Makelainen <raine.makelainen@jolla.com>
  • Loading branch information
rainemak committed May 27, 2020
1 parent 8b6d8e0 commit 9105102
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 14 deletions.
10 changes: 7 additions & 3 deletions embedding/embedlite/embedshared/EmbedLitePuppetWidget.cpp
Expand Up @@ -387,18 +387,20 @@ void EmbedLitePuppetWidget::CreateCompositor(int aWidth, int aHeight)
LayerManager *
EmbedLitePuppetWidget::GetLayerManager(PLayerTransactionChild *aShadowManager, LayersBackend aBackendHint, LayerManagerPersistence aPersistence)
{
LOGT();
LOGC("EmbedLiteLayerManager", "layer manager %p is shutdown %p this: %p", mLayerManager, mShutdownObserver, this);

if (!mLayerManager) {
if (!mShutdownObserver) {
if (!mShutdownObserver || mOnDestroyCalled) {
// We are shutting down, do not try to re-create a LayerManager
LOGC("EmbedLiteLayerManager", "Shutting down or puppet destroyed.");
return nullptr;
}
}

LayerManager *lm = PuppetWidgetBase::GetLayerManager(aShadowManager, aBackendHint, aPersistence);
if (lm) {
mLayerManager = lm;
LOGC("EmbedLiteLayerManager", "base layer manager: %p this: %p", mLayerManager, this);
return mLayerManager;
}

Expand All @@ -413,7 +415,9 @@ EmbedLitePuppetWidget::GetLayerManager(PLayerTransactionChild *aShadowManager, L
return mLayerManager;
}

mLayerManager = new ClientLayerManager(this);
nsIWidget* topWidget = GetTopLevelWidget();
mLayerManager = topWidget->GetLayerManager(aShadowManager, aBackendHint, aPersistence);
LOGC("EmbedLiteLayerManager", "Get layer manager from top: %p this: %p", mLayerManager, this);
return mLayerManager;
}

Expand Down
23 changes: 13 additions & 10 deletions embedding/embedlite/embedshared/PuppetWidgetBase.cpp
Expand Up @@ -80,10 +80,8 @@ PuppetWidgetBase::Destroy()

mOnDestroyCalled = true;

nsIWidget* topWidget = GetTopLevelWidget();
if (mLayerManager && topWidget == this) {
mLayerManager->Destroy();
}
LOGC("EmbedLiteLayerManager", "Destroy %s this: %p", Type(), this);

mLayerManager = nullptr;

Base::OnDestroy();
Expand Down Expand Up @@ -264,6 +262,14 @@ NS_IMETHODIMP
PuppetWidgetBase::Invalidate(const LayoutDeviceIntRect &aRect)
{
Unused << aRect;

LOGC("EmbedLiteLayerManager", "destroyed: %d type: %s LayerManager %p this: %p",
mOnDestroyCalled, Type(), mLayerManager, this);

if (mOnDestroyCalled) {
NS_OK;
}

nsIWidgetListener* listener = GetWidgetListener();
if (listener) {
listener->WillPaintWindow(this);
Expand Down Expand Up @@ -375,6 +381,8 @@ PuppetWidgetBase::GetLayerManager(PLayerTransactionChild *aShadowManager,
LayersBackend aBackendHint,
LayerManagerPersistence aPersistence)
{
LOGC("EmbedLiteLayerManager", "lm: %p", mLayerManager);

if (mLayerManager) {
// This layer manager might be used for painting outside of DoDraw(), so we need
// to set the correct rotation on it.
Expand All @@ -387,12 +395,7 @@ PuppetWidgetBase::GetLayerManager(PLayerTransactionChild *aShadowManager,
return mLayerManager;
}

LOGT();

nsIWidget* topWidget = GetTopLevelWidget();
if (topWidget != this) {
mLayerManager = topWidget->GetLayerManager();
}
LOGC("EmbedLiteLayerManager", "lm: %p", mLayerManager);

// Layer manager can be null here. Sub-class shall handle this.
return mLayerManager;
Expand Down
13 changes: 12 additions & 1 deletion embedding/embedlite/embedshared/nsWindow.cpp
Expand Up @@ -86,9 +86,13 @@ nsWindow::Create(nsIWidget *aParent, nsNativeWidget aNativeParent, const LayoutD
void
nsWindow::Destroy()
{
PuppetWidgetBase::Destroy();
if (mLayerManager) {
mLayerManager->Destroy();
}
mWindow = nullptr;

PuppetWidgetBase::Destroy();

Shutdown();
#if DEBUG
DumpWidgetTree();
Expand Down Expand Up @@ -190,6 +194,8 @@ nsWindow::GetNativeData(uint32_t aDataType)
LayerManager *
nsWindow::GetLayerManager(PLayerTransactionChild *aShadowManager, LayersBackend aBackendHint, LayerManagerPersistence aPersistence)
{
LOGC("EmbedLiteLayerManager", "lm: %p", mLayerManager);

if (!mLayerManager) {
if (!mShutdownObserver) {
// We are shutting down, do not try to re-create a LayerManager
Expand All @@ -198,13 +204,16 @@ nsWindow::GetLayerManager(PLayerTransactionChild *aShadowManager, LayersBackend
}

LayerManager *lm = PuppetWidgetBase::GetLayerManager(aShadowManager, aBackendHint, aPersistence);
LOGC("EmbedLiteLayerManager", "lm: %p this: %p", lm, this);

if (lm) {
mLayerManager = lm;
return mLayerManager;
}

if (mWindow && ShouldUseOffMainThreadCompositing()) {
CreateCompositor();
LOGC("EmbedLiteLayerManager", "Created compositor, lm: %p", mLayerManager);
if (mLayerManager) {
return mLayerManager;
}
Expand All @@ -213,6 +222,8 @@ nsWindow::GetLayerManager(PLayerTransactionChild *aShadowManager, LayersBackend
}

mLayerManager = new ClientLayerManager(this);
LOGC("EmbedLiteLayerManager", "New client layer manager: %p", mLayerManager);

return mLayerManager;
}

Expand Down

0 comments on commit 9105102

Please sign in to comment.