forked from mirrors/gecko-dev
Bug 1416878 - Move the implementation of nsIWidgetListener from nsWebBrowser / nsWebShellWindow to a separate object. r=bz
MozReview-Commit-ID: 5QV6lkCCGW5
This commit is contained in:
parent
561949fb5e
commit
f9aeb462d4
4 changed files with 227 additions and 27 deletions
|
|
@ -67,6 +67,7 @@ nsWebBrowser::nsWebBrowser()
|
|||
, mIsActive(true)
|
||||
, mParentNativeWindow(nullptr)
|
||||
, mProgressListener(nullptr)
|
||||
, mWidgetListenerDelegate(this)
|
||||
, mBackgroundColor(0)
|
||||
, mPersistCurrentState(nsIWebBrowserPersist::PERSIST_STATE_READY)
|
||||
, mPersistResult(NS_OK)
|
||||
|
|
@ -1200,7 +1201,7 @@ nsWebBrowser::Create()
|
|||
LayoutDeviceIntRect bounds(mInitInfo->x, mInitInfo->y,
|
||||
mInitInfo->cx, mInitInfo->cy);
|
||||
|
||||
mInternalWidget->SetWidgetListener(this);
|
||||
mInternalWidget->SetWidgetListener(&mWidgetListenerDelegate);
|
||||
rv = mInternalWidget->Create(nullptr, mParentNativeWindow, bounds,
|
||||
&widgetInit);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
|
@ -1903,3 +1904,25 @@ nsWebBrowser::SetFocusedElement(nsIDOMElement* aFocusedElement)
|
|||
nsCOMPtr<nsIFocusManager> fm = do_GetService(FOCUSMANAGER_CONTRACTID);
|
||||
return fm ? fm->SetFocus(aFocusedElement, 0) : NS_OK;
|
||||
}
|
||||
|
||||
void
|
||||
nsWebBrowser::WidgetListenerDelegate::WindowActivated()
|
||||
{
|
||||
RefPtr<nsWebBrowser> holder = mWebBrowser;
|
||||
holder->WindowActivated();
|
||||
}
|
||||
|
||||
void
|
||||
nsWebBrowser::WidgetListenerDelegate::WindowDeactivated()
|
||||
{
|
||||
RefPtr<nsWebBrowser> holder = mWebBrowser;
|
||||
holder->WindowDeactivated();
|
||||
}
|
||||
|
||||
bool
|
||||
nsWebBrowser::WidgetListenerDelegate::PaintWindow(
|
||||
nsIWidget* aWidget, mozilla::LayoutDeviceIntRegion aRegion)
|
||||
{
|
||||
RefPtr<nsWebBrowser> holder = mWebBrowser;
|
||||
return holder->PaintWindow(aWidget, aRegion);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -82,12 +82,31 @@ class nsWebBrowser final : public nsIWebBrowser,
|
|||
public nsIWebBrowserPersist,
|
||||
public nsIWebBrowserFocus,
|
||||
public nsIWebProgressListener,
|
||||
public nsIWidgetListener,
|
||||
public nsSupportsWeakReference
|
||||
{
|
||||
friend class nsDocShellTreeOwner;
|
||||
|
||||
public:
|
||||
|
||||
// The implementation of non-refcounted nsIWidgetListener, which would hold a
|
||||
// strong reference on stack before calling nsWebBrowser's
|
||||
// MOZ_CAN_RUN_SCRIPT methods.
|
||||
class WidgetListenerDelegate : public nsIWidgetListener
|
||||
{
|
||||
public:
|
||||
explicit WidgetListenerDelegate(nsWebBrowser* aWebBrowser)
|
||||
: mWebBrowser(aWebBrowser) {}
|
||||
MOZ_CAN_RUN_SCRIPT_BOUNDARY virtual void WindowActivated() override;
|
||||
MOZ_CAN_RUN_SCRIPT_BOUNDARY virtual void WindowDeactivated() override;
|
||||
MOZ_CAN_RUN_SCRIPT_BOUNDARY virtual bool PaintWindow(
|
||||
nsIWidget* aWidget, mozilla::LayoutDeviceIntRegion aRegion) override;
|
||||
|
||||
private:
|
||||
// The lifetime of WidgetListenerDelegate is bound to nsWebBrowser so we
|
||||
// just use raw pointer here.
|
||||
nsWebBrowser* mWebBrowser;
|
||||
};
|
||||
|
||||
nsWebBrowser();
|
||||
|
||||
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
|
||||
|
|
@ -117,11 +136,11 @@ protected:
|
|||
NS_IMETHOD UnBindListener(nsISupports* aListener, const nsIID& aIID);
|
||||
NS_IMETHOD EnableGlobalHistory(bool aEnable);
|
||||
|
||||
// nsIWidgetListener
|
||||
virtual void WindowActivated() override;
|
||||
virtual void WindowDeactivated() override;
|
||||
virtual bool PaintWindow(nsIWidget* aWidget,
|
||||
mozilla::LayoutDeviceIntRegion aRegion) override;
|
||||
// nsIWidgetListener methods for WidgetListenerDelegate.
|
||||
MOZ_CAN_RUN_SCRIPT void WindowActivated();
|
||||
MOZ_CAN_RUN_SCRIPT void WindowDeactivated();
|
||||
MOZ_CAN_RUN_SCRIPT bool PaintWindow(
|
||||
nsIWidget* aWidget, mozilla::LayoutDeviceIntRegion aRegion);
|
||||
|
||||
protected:
|
||||
RefPtr<nsDocShellTreeOwner> mDocShellTreeOwner;
|
||||
|
|
@ -146,6 +165,8 @@ protected:
|
|||
|
||||
nsCOMPtr<nsIPrintSettings> mPrintSettings;
|
||||
|
||||
WidgetListenerDelegate mWidgetListenerDelegate;
|
||||
|
||||
// cached background color
|
||||
nscolor mBackgroundColor;
|
||||
|
||||
|
|
|
|||
|
|
@ -91,6 +91,7 @@ static NS_DEFINE_CID(kWindowCID, NS_WINDOW_CID);
|
|||
nsWebShellWindow::nsWebShellWindow(uint32_t aChromeFlags)
|
||||
: nsXULWindow(aChromeFlags)
|
||||
, mSPTimerLock("nsWebShellWindow.mSPTimerLock")
|
||||
, mWidgetListenerDelegate(this)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
@ -180,7 +181,7 @@ nsresult nsWebShellWindow::Initialize(nsIXULWindow* aParent,
|
|||
mParentWindow = do_GetWeakReference(aParent);
|
||||
}
|
||||
|
||||
mWindow->SetWidgetListener(this);
|
||||
mWindow->SetWidgetListener(&mWidgetListenerDelegate);
|
||||
rv = mWindow->Create((nsIWidget *)parentWidget, // Parent nsIWidget
|
||||
nullptr, // Native parent widget
|
||||
deskRect, // Widget dimensions
|
||||
|
|
@ -782,3 +783,108 @@ NS_IMETHODIMP nsWebShellWindow::Destroy()
|
|||
}
|
||||
return nsXULWindow::Destroy();
|
||||
}
|
||||
|
||||
nsIXULWindow*
|
||||
nsWebShellWindow::WidgetListenerDelegate::GetXULWindow()
|
||||
{
|
||||
return mWebShellWindow->GetXULWindow();
|
||||
}
|
||||
|
||||
nsIPresShell*
|
||||
nsWebShellWindow::WidgetListenerDelegate::GetPresShell()
|
||||
{
|
||||
return mWebShellWindow->GetPresShell();
|
||||
}
|
||||
|
||||
bool
|
||||
nsWebShellWindow::WidgetListenerDelegate::WindowMoved(
|
||||
nsIWidget* aWidget, int32_t aX, int32_t aY)
|
||||
{
|
||||
RefPtr<nsWebShellWindow> holder = mWebShellWindow;
|
||||
return holder->WindowMoved(aWidget, aX, aY);
|
||||
}
|
||||
|
||||
bool
|
||||
nsWebShellWindow::WidgetListenerDelegate::WindowResized(
|
||||
nsIWidget* aWidget, int32_t aWidth, int32_t aHeight)
|
||||
{
|
||||
RefPtr<nsWebShellWindow> holder = mWebShellWindow;
|
||||
return holder->WindowResized(aWidget, aWidth, aHeight);
|
||||
}
|
||||
|
||||
bool
|
||||
nsWebShellWindow::WidgetListenerDelegate::RequestWindowClose(nsIWidget* aWidget)
|
||||
{
|
||||
RefPtr<nsWebShellWindow> holder = mWebShellWindow;
|
||||
return holder->RequestWindowClose(aWidget);
|
||||
}
|
||||
|
||||
void
|
||||
nsWebShellWindow::WidgetListenerDelegate::SizeModeChanged(nsSizeMode aSizeMode)
|
||||
{
|
||||
RefPtr<nsWebShellWindow> holder = mWebShellWindow;
|
||||
holder->SizeModeChanged(aSizeMode);
|
||||
}
|
||||
|
||||
void
|
||||
nsWebShellWindow::WidgetListenerDelegate::UIResolutionChanged()
|
||||
{
|
||||
RefPtr<nsWebShellWindow> holder = mWebShellWindow;
|
||||
holder->UIResolutionChanged();
|
||||
}
|
||||
|
||||
void
|
||||
nsWebShellWindow::WidgetListenerDelegate::FullscreenWillChange(
|
||||
bool aInFullscreen)
|
||||
{
|
||||
RefPtr<nsWebShellWindow> holder = mWebShellWindow;
|
||||
holder->FullscreenWillChange(aInFullscreen);
|
||||
}
|
||||
|
||||
void
|
||||
nsWebShellWindow::WidgetListenerDelegate::FullscreenChanged(bool aInFullscreen)
|
||||
{
|
||||
RefPtr<nsWebShellWindow> holder = mWebShellWindow;
|
||||
holder->FullscreenChanged(aInFullscreen);
|
||||
}
|
||||
|
||||
void
|
||||
nsWebShellWindow::WidgetListenerDelegate::OcclusionStateChanged(
|
||||
bool aIsFullyOccluded)
|
||||
{
|
||||
RefPtr<nsWebShellWindow> holder = mWebShellWindow;
|
||||
holder->OcclusionStateChanged(aIsFullyOccluded);
|
||||
}
|
||||
|
||||
void
|
||||
nsWebShellWindow::WidgetListenerDelegate::OSToolbarButtonPressed()
|
||||
{
|
||||
RefPtr<nsWebShellWindow> holder = mWebShellWindow;
|
||||
holder->OSToolbarButtonPressed();
|
||||
}
|
||||
|
||||
bool
|
||||
nsWebShellWindow::WidgetListenerDelegate::ZLevelChanged(
|
||||
bool aImmediate, nsWindowZ *aPlacement, nsIWidget* aRequestBelow,
|
||||
nsIWidget** aActualBelow)
|
||||
{
|
||||
RefPtr<nsWebShellWindow> holder = mWebShellWindow;
|
||||
return holder->ZLevelChanged(aImmediate,
|
||||
aPlacement,
|
||||
aRequestBelow,
|
||||
aActualBelow);
|
||||
}
|
||||
|
||||
void
|
||||
nsWebShellWindow::WidgetListenerDelegate::WindowActivated()
|
||||
{
|
||||
RefPtr<nsWebShellWindow> holder = mWebShellWindow;
|
||||
holder->WindowActivated();
|
||||
}
|
||||
|
||||
void
|
||||
nsWebShellWindow::WidgetListenerDelegate::WindowDeactivated()
|
||||
{
|
||||
RefPtr<nsWebShellWindow> holder = mWebShellWindow;
|
||||
holder->WindowDeactivated();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -24,10 +24,57 @@ class WebShellWindowTimerCallback;
|
|||
} // namespace mozilla
|
||||
|
||||
class nsWebShellWindow final : public nsXULWindow,
|
||||
public nsIWebProgressListener,
|
||||
public nsIWidgetListener
|
||||
public nsIWebProgressListener
|
||||
{
|
||||
public:
|
||||
|
||||
// The implementation of non-refcounted nsIWidgetListener, which would hold a
|
||||
// strong reference on stack before calling nsWebShellWindow's
|
||||
// MOZ_CAN_RUN_SCRIPT methods.
|
||||
class WidgetListenerDelegate : public nsIWidgetListener
|
||||
{
|
||||
public:
|
||||
explicit WidgetListenerDelegate(nsWebShellWindow* aWebShellWindow)
|
||||
: mWebShellWindow(aWebShellWindow) {}
|
||||
|
||||
MOZ_CAN_RUN_SCRIPT_BOUNDARY
|
||||
virtual nsIXULWindow* GetXULWindow() override;
|
||||
MOZ_CAN_RUN_SCRIPT_BOUNDARY
|
||||
virtual nsIPresShell* GetPresShell() override;
|
||||
MOZ_CAN_RUN_SCRIPT_BOUNDARY
|
||||
virtual bool WindowMoved(nsIWidget* aWidget, int32_t x, int32_t y) override;
|
||||
MOZ_CAN_RUN_SCRIPT_BOUNDARY
|
||||
virtual bool WindowResized(nsIWidget* aWidget, int32_t aWidth, int32_t aHeight) override;
|
||||
MOZ_CAN_RUN_SCRIPT_BOUNDARY
|
||||
virtual bool RequestWindowClose(nsIWidget* aWidget) override;
|
||||
MOZ_CAN_RUN_SCRIPT_BOUNDARY
|
||||
virtual void SizeModeChanged(nsSizeMode sizeMode) override;
|
||||
MOZ_CAN_RUN_SCRIPT_BOUNDARY
|
||||
virtual void UIResolutionChanged() override;
|
||||
MOZ_CAN_RUN_SCRIPT_BOUNDARY
|
||||
virtual void FullscreenWillChange(bool aInFullscreen) override;
|
||||
MOZ_CAN_RUN_SCRIPT_BOUNDARY
|
||||
virtual void FullscreenChanged(bool aInFullscreen) override;
|
||||
MOZ_CAN_RUN_SCRIPT_BOUNDARY
|
||||
virtual void OcclusionStateChanged(bool aIsFullyOccluded) override;
|
||||
MOZ_CAN_RUN_SCRIPT_BOUNDARY
|
||||
virtual void OSToolbarButtonPressed() override;
|
||||
MOZ_CAN_RUN_SCRIPT_BOUNDARY
|
||||
virtual bool ZLevelChanged(bool aImmediate,
|
||||
nsWindowZ *aPlacement,
|
||||
nsIWidget* aRequestBelow,
|
||||
nsIWidget** aActualBelow) override;
|
||||
MOZ_CAN_RUN_SCRIPT_BOUNDARY
|
||||
virtual void WindowActivated() override;
|
||||
MOZ_CAN_RUN_SCRIPT_BOUNDARY
|
||||
virtual void WindowDeactivated() override;
|
||||
|
||||
private:
|
||||
// The lifetime of WidgetListenerDelegate is bound to nsWebShellWindow so
|
||||
// we just use a raw pointer here.
|
||||
nsWebShellWindow* mWebShellWindow;
|
||||
};
|
||||
|
||||
explicit nsWebShellWindow(uint32_t aChromeFlags);
|
||||
|
||||
// nsISupports interface...
|
||||
|
|
@ -50,22 +97,25 @@ public:
|
|||
// nsIBaseWindow
|
||||
NS_IMETHOD Destroy() override;
|
||||
|
||||
// nsIWidgetListener
|
||||
virtual nsIXULWindow* GetXULWindow() override { return this; }
|
||||
virtual nsIPresShell* GetPresShell() override;
|
||||
virtual bool WindowMoved(nsIWidget* aWidget, int32_t x, int32_t y) override;
|
||||
virtual bool WindowResized(nsIWidget* aWidget, int32_t aWidth, int32_t aHeight) override;
|
||||
virtual bool RequestWindowClose(nsIWidget* aWidget) override;
|
||||
virtual void SizeModeChanged(nsSizeMode sizeMode) override;
|
||||
virtual void UIResolutionChanged() override;
|
||||
virtual void FullscreenWillChange(bool aInFullscreen) override;
|
||||
virtual void FullscreenChanged(bool aInFullscreen) override;
|
||||
virtual void OcclusionStateChanged(bool aIsFullyOccluded) override;
|
||||
virtual void OSToolbarButtonPressed() override;
|
||||
virtual bool ZLevelChanged(bool aImmediate, nsWindowZ *aPlacement,
|
||||
nsIWidget* aRequestBelow, nsIWidget** aActualBelow) override;
|
||||
virtual void WindowActivated() override;
|
||||
virtual void WindowDeactivated() override;
|
||||
// nsIWidgetListener methods for WidgetListenerDelegate.
|
||||
nsIXULWindow* GetXULWindow() { return this; }
|
||||
nsIPresShell* GetPresShell();
|
||||
MOZ_CAN_RUN_SCRIPT
|
||||
bool WindowMoved(nsIWidget* aWidget, int32_t aX, int32_t aY);
|
||||
MOZ_CAN_RUN_SCRIPT
|
||||
bool WindowResized(nsIWidget* aWidget, int32_t aWidth, int32_t aHeight);
|
||||
MOZ_CAN_RUN_SCRIPT bool RequestWindowClose(nsIWidget* aWidget);
|
||||
MOZ_CAN_RUN_SCRIPT void SizeModeChanged(nsSizeMode aSizeMode);
|
||||
MOZ_CAN_RUN_SCRIPT void UIResolutionChanged();
|
||||
MOZ_CAN_RUN_SCRIPT void FullscreenWillChange(bool aInFullscreen);
|
||||
MOZ_CAN_RUN_SCRIPT void FullscreenChanged(bool aInFullscreen);
|
||||
MOZ_CAN_RUN_SCRIPT void OcclusionStateChanged(bool aIsFullyOccluded);
|
||||
MOZ_CAN_RUN_SCRIPT void OSToolbarButtonPressed();
|
||||
MOZ_CAN_RUN_SCRIPT
|
||||
bool ZLevelChanged(bool aImmediate, nsWindowZ *aPlacement,
|
||||
nsIWidget* aRequestBelow, nsIWidget** aActualBelow);
|
||||
MOZ_CAN_RUN_SCRIPT void WindowActivated();
|
||||
MOZ_CAN_RUN_SCRIPT void WindowDeactivated();
|
||||
|
||||
protected:
|
||||
friend class mozilla::WebShellWindowTimerCallback;
|
||||
|
|
@ -77,10 +127,10 @@ protected:
|
|||
|
||||
nsCOMPtr<nsITimer> mSPTimer;
|
||||
mozilla::Mutex mSPTimerLock;
|
||||
WidgetListenerDelegate mWidgetListenerDelegate;
|
||||
|
||||
void SetPersistenceTimer(uint32_t aDirtyFlags);
|
||||
void FirePersistenceTimer();
|
||||
};
|
||||
|
||||
|
||||
#endif /* nsWebShellWindow_h__ */
|
||||
|
|
|
|||
Loading…
Reference in a new issue