Bug 1482109 - Use the generic memory pressure observer in PuppetWidget. r=sotaro

This commit is contained in:
Nicolas Silva 2018-08-10 17:15:18 +02:00
Родитель 33f0e6077e
Коммит 03b39c61f2
2 изменённых файлов: 13 добавлений и 47 удалений

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

@ -139,11 +139,7 @@ PuppetWidget::InfallibleCreate(nsIWidget* aParent,
else {
Resize(mBounds.X(), mBounds.Y(), mBounds.Width(), mBounds.Height(), false);
}
nsCOMPtr<nsIObserverService> obs = mozilla::services::GetObserverService();
if (obs) {
mMemoryPressureObserver = new MemoryPressureObserver(this);
obs->AddObserver(mMemoryPressureObserver, "memory-pressure", false);
}
mMemoryPressureObserver = MemoryPressureObserver::Create(this);
}
nsresult
@ -193,9 +189,9 @@ PuppetWidget::Destroy()
Base::Destroy();
mPaintTask.Revoke();
if (mMemoryPressureObserver) {
mMemoryPressureObserver->Remove();
mMemoryPressureObserver->Unregister();
mMemoryPressureObserver = nullptr;
}
mMemoryPressureObserver = nullptr;
mChild = nullptr;
if (mLayerManager) {
mLayerManager->Destroy();
@ -1137,36 +1133,15 @@ PuppetWidget::PaintNowIfNeeded()
}
}
NS_IMPL_ISUPPORTS(PuppetWidget::MemoryPressureObserver, nsIObserver)
NS_IMETHODIMP
PuppetWidget::MemoryPressureObserver::Observe(nsISupports* aSubject,
const char* aTopic,
const char16_t* aData)
{
if (!mWidget) {
return NS_OK;
}
if (strcmp("memory-pressure", aTopic) == 0 &&
!StringBeginsWith(nsDependentString(aData),
NS_LITERAL_STRING("low-memory-ongoing"))) {
if (!mWidget->mVisible && mWidget->mLayerManager &&
XRE_IsContentProcess()) {
mWidget->mLayerManager->ClearCachedResources();
}
}
return NS_OK;
}
void
PuppetWidget::MemoryPressureObserver::Remove()
PuppetWidget::OnMemoryPressure(layers::MemoryPressureReason aWhy)
{
nsCOMPtr<nsIObserverService> obs = mozilla::services::GetObserverService();
if (obs) {
obs->RemoveObserver(this, "memory-pressure");
if (aWhy != MemoryPressureReason::LOW_MEMORY_ONGOING &&
mVisible &&
mLayerManager &&
XRE_IsContentProcess()) {
mLayerManager->ClearCachedResources();
}
mWidget = nullptr;
}
bool

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

@ -27,6 +27,7 @@
#include "mozilla/ContentCache.h"
#include "mozilla/EventForwards.h"
#include "mozilla/TextEventDispatcherListener.h"
#include "mozilla/layers/MemoryPressureObserver.h"
namespace mozilla {
@ -40,6 +41,7 @@ struct AutoCacheNativeKeyCommands;
class PuppetWidget : public nsBaseWidget
, public TextEventDispatcherListener
, public layers::MemoryPressureListener
{
typedef mozilla::CSSRect CSSRect;
typedef mozilla::dom::TabChild TabChild;
@ -322,6 +324,7 @@ public:
uint32_t aIndexOfKeypress,
void* aData) override;
virtual void OnMemoryPressure(layers::MemoryPressureReason aWhy) override;
private:
nsresult Paint();
@ -358,18 +361,6 @@ private:
PuppetWidget* mWidget;
};
class MemoryPressureObserver : public nsIObserver {
public:
NS_DECL_ISUPPORTS
NS_DECL_NSIOBSERVER
explicit MemoryPressureObserver(PuppetWidget* aWidget) : mWidget(aWidget) {}
void Remove();
private:
virtual ~MemoryPressureObserver() {}
PuppetWidget* mWidget;
};
friend class MemoryPressureObserver;
// TabChild normally holds a strong reference to this PuppetWidget
// or its root ancestor, but each PuppetWidget also needs a
// reference back to TabChild (e.g. to delegate nsIWidget IME calls
@ -382,7 +373,7 @@ private:
RefPtr<PuppetWidget> mChild;
LayoutDeviceIntRegion mDirtyRegion;
nsRevocableEventPtr<PaintTask> mPaintTask;
RefPtr<MemoryPressureObserver> mMemoryPressureObserver;
RefPtr<layers::MemoryPressureObserver> mMemoryPressureObserver;
// XXX/cjones: keeping this around until we teach LayerManager to do
// retained-content-only transactions
RefPtr<DrawTarget> mDrawTarget;