зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1482109 - Use the generic memory pressure observer in PuppetWidget. r=sotaro
This commit is contained in:
Родитель
33f0e6077e
Коммит
03b39c61f2
|
@ -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;
|
||||
|
|
Загрузка…
Ссылка в новой задаче