author | Boris Zbarsky <bzbarsky@mit.edu> |
Wed, 05 Feb 2014 23:37:30 -0500 | |
changeset 167147 | 9dcc5957f89eab6a77e0745425180cd7e96171e1 |
parent 167146 | ef6e5cfea527314e63184499e78d3d277dae3d6e |
child 167148 | 8c388e9bc5b55eeecf8ca7dcf92701056ea26803 |
push id | 26159 |
push user | cbook@mozilla.com |
push date | Thu, 06 Feb 2014 11:50:11 +0000 |
treeherder | mozilla-central@b04e2524e2eb [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | peterv |
bugs | 964875 |
milestone | 30.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/dom/base/nsGlobalWindow.cpp +++ b/dom/base/nsGlobalWindow.cpp @@ -12892,266 +12892,376 @@ NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_ NS_INTERFACE_MAP_END_INHERITING(nsGlobalWindow) NS_IMPL_ADDREF_INHERITED(nsGlobalChromeWindow, nsGlobalWindow) NS_IMPL_RELEASE_INHERITED(nsGlobalChromeWindow, nsGlobalWindow) NS_IMETHODIMP nsGlobalChromeWindow::GetWindowState(uint16_t* aWindowState) { - *aWindowState = nsIDOMChromeWindow::STATE_NORMAL; - + *aWindowState = WindowState(); + return NS_OK; +} + +uint16_t +nsGlobalWindow::WindowState() +{ nsCOMPtr<nsIWidget> widget = GetMainWidget(); int32_t mode = widget ? widget->SizeMode() : 0; switch (mode) { case nsSizeMode_Minimized: - *aWindowState = nsIDOMChromeWindow::STATE_MINIMIZED; - break; + return nsIDOMChromeWindow::STATE_MINIMIZED; case nsSizeMode_Maximized: - *aWindowState = nsIDOMChromeWindow::STATE_MAXIMIZED; - break; + return nsIDOMChromeWindow::STATE_MAXIMIZED; case nsSizeMode_Fullscreen: - *aWindowState = nsIDOMChromeWindow::STATE_FULLSCREEN; - break; + return nsIDOMChromeWindow::STATE_FULLSCREEN; case nsSizeMode_Normal: - *aWindowState = nsIDOMChromeWindow::STATE_NORMAL; - break; + return nsIDOMChromeWindow::STATE_NORMAL; default: NS_WARNING("Illegal window state for this chrome window"); break; } - return NS_OK; + return nsIDOMChromeWindow::STATE_NORMAL; } NS_IMETHODIMP nsGlobalChromeWindow::Maximize() { + ErrorResult rv; + Maximize(rv); + return rv.ErrorCode(); +} + +void +nsGlobalWindow::Maximize(ErrorResult& aError) +{ nsCOMPtr<nsIWidget> widget = GetMainWidget(); - nsresult rv = NS_OK; if (widget) { - rv = widget->SetSizeMode(nsSizeMode_Maximized); - } - - return rv; + aError = widget->SetSizeMode(nsSizeMode_Maximized); + } } NS_IMETHODIMP nsGlobalChromeWindow::Minimize() { + ErrorResult rv; + Minimize(rv); + return rv.ErrorCode(); +} + +void +nsGlobalWindow::Minimize(ErrorResult& aError) +{ nsCOMPtr<nsIWidget> widget = GetMainWidget(); - nsresult rv = NS_OK; - - if (widget) - rv = widget->SetSizeMode(nsSizeMode_Minimized); - - return rv; + + if (widget) { + aError = widget->SetSizeMode(nsSizeMode_Minimized); + } } NS_IMETHODIMP nsGlobalChromeWindow::Restore() { + ErrorResult rv; + Restore(rv); + return rv.ErrorCode(); +} + +void +nsGlobalWindow::Restore(ErrorResult& aError) +{ nsCOMPtr<nsIWidget> widget = GetMainWidget(); - nsresult rv = NS_OK; if (widget) { - rv = widget->SetSizeMode(nsSizeMode_Normal); - } - - return rv; + aError = widget->SetSizeMode(nsSizeMode_Normal); + } } NS_IMETHODIMP nsGlobalChromeWindow::GetAttention() { - return GetAttentionWithCycleCount(-1); + ErrorResult rv; + GetAttention(rv); + return rv.ErrorCode(); +} + +void +nsGlobalWindow::GetAttention(ErrorResult& aResult) +{ + return GetAttentionWithCycleCount(-1, aResult); } NS_IMETHODIMP nsGlobalChromeWindow::GetAttentionWithCycleCount(int32_t aCycleCount) { + ErrorResult rv; + GetAttentionWithCycleCount(aCycleCount, rv); + return rv.ErrorCode(); +} + +void +nsGlobalWindow::GetAttentionWithCycleCount(int32_t aCycleCount, + ErrorResult& aError) +{ nsCOMPtr<nsIWidget> widget = GetMainWidget(); - nsresult rv = NS_OK; if (widget) { - rv = widget->GetAttention(aCycleCount); - } - - return rv; + aError = widget->GetAttention(aCycleCount); + } } NS_IMETHODIMP nsGlobalChromeWindow::BeginWindowMove(nsIDOMEvent *aMouseDownEvent, nsIDOMElement* aPanel) { + NS_ENSURE_TRUE(aMouseDownEvent, NS_ERROR_FAILURE); + nsDOMEvent* mouseDownEvent = aMouseDownEvent->InternalDOMEvent(); + NS_ENSURE_TRUE(mouseDownEvent, NS_ERROR_FAILURE); + + nsCOMPtr<Element> panel = do_QueryInterface(aPanel); + NS_ENSURE_TRUE(panel || !aPanel, NS_ERROR_FAILURE); + + ErrorResult rv; + BeginWindowMove(*mouseDownEvent, panel, rv); + return rv.ErrorCode(); +} + +void +nsGlobalWindow::BeginWindowMove(nsDOMEvent& aMouseDownEvent, Element* aPanel, + ErrorResult& aError) +{ nsCOMPtr<nsIWidget> widget; // if a panel was supplied, use its widget instead. #ifdef MOZ_XUL if (aPanel) { - nsCOMPtr<nsIContent> panel = do_QueryInterface(aPanel); - NS_ENSURE_TRUE(panel, NS_ERROR_FAILURE); - - nsIFrame* frame = panel->GetPrimaryFrame(); - NS_ENSURE_TRUE(frame && frame->GetType() == nsGkAtoms::menuPopupFrame, NS_OK); + nsIFrame* frame = aPanel->GetPrimaryFrame(); + if (!frame || frame->GetType() != nsGkAtoms::menuPopupFrame) { + return; + } widget = (static_cast<nsMenuPopupFrame*>(frame))->GetWidget(); } else { #endif widget = GetMainWidget(); #ifdef MOZ_XUL } #endif if (!widget) { - return NS_OK; - } - - NS_ENSURE_TRUE(aMouseDownEvent, NS_ERROR_FAILURE); + return; + } + WidgetMouseEvent* mouseEvent = - aMouseDownEvent->GetInternalNSEvent()->AsMouseEvent(); - NS_ENSURE_TRUE(mouseEvent && mouseEvent->eventStructType == NS_MOUSE_EVENT, - NS_ERROR_FAILURE); - return widget->BeginMoveDrag(mouseEvent); + aMouseDownEvent.GetInternalNSEvent()->AsMouseEvent(); + if (!mouseEvent || mouseEvent->eventStructType != NS_MOUSE_EVENT) { + aError.Throw(NS_ERROR_FAILURE); + return; + } + + aError = widget->BeginMoveDrag(mouseEvent); } //Note: This call will lock the cursor, it will not change as it moves. //To unlock, the cursor must be set back to CURSOR_AUTO. NS_IMETHODIMP nsGlobalChromeWindow::SetCursor(const nsAString& aCursor) { - FORWARD_TO_OUTER_CHROME(SetCursor, (aCursor), NS_ERROR_NOT_INITIALIZED); - - nsresult rv = NS_OK; + ErrorResult rv; + SetCursor(aCursor, rv); + return rv.ErrorCode(); +} + +void +nsGlobalWindow::SetCursor(const nsAString& aCursor, ErrorResult& aError) +{ + FORWARD_TO_OUTER_OR_THROW(SetCursor, (aCursor, aError), aError, ); + int32_t cursor; if (aCursor.EqualsLiteral("auto")) cursor = NS_STYLE_CURSOR_AUTO; else { nsCSSKeyword keyword = nsCSSKeywords::LookupKeyword(aCursor); if (eCSSKeyword_UNKNOWN == keyword || !nsCSSProps::FindKeyword(keyword, nsCSSProps::kCursorKTable, cursor)) { - return NS_OK; + return; } } nsRefPtr<nsPresContext> presContext; if (mDocShell) { mDocShell->GetPresContext(getter_AddRefs(presContext)); } if (presContext) { // Need root widget. nsCOMPtr<nsIPresShell> presShell = mDocShell->GetPresShell(); - NS_ENSURE_TRUE(presShell, NS_ERROR_FAILURE); + if (!presShell) { + aError.Throw(NS_ERROR_FAILURE); + return; + } nsViewManager* vm = presShell->GetViewManager(); - NS_ENSURE_TRUE(vm, NS_ERROR_FAILURE); + if (!vm) { + aError.Throw(NS_ERROR_FAILURE); + return; + } nsView* rootView = vm->GetRootView(); - NS_ENSURE_TRUE(rootView, NS_ERROR_FAILURE); + if (!rootView) { + aError.Throw(NS_ERROR_FAILURE); + return; + } nsIWidget* widget = rootView->GetNearestWidget(nullptr); - NS_ENSURE_TRUE(widget, NS_ERROR_FAILURE); + if (!widget) { + aError.Throw(NS_ERROR_FAILURE); + return; + } // Call esm and set cursor. - rv = presContext->EventStateManager()->SetCursor(cursor, nullptr, - false, 0.0f, 0.0f, - widget, true); - } - - return rv; + aError = presContext->EventStateManager()->SetCursor(cursor, nullptr, + false, 0.0f, 0.0f, + widget, true); + } } NS_IMETHODIMP nsGlobalChromeWindow::GetBrowserDOMWindow(nsIBrowserDOMWindow **aBrowserWindow) { - FORWARD_TO_OUTER_CHROME(GetBrowserDOMWindow, (aBrowserWindow), - NS_ERROR_NOT_INITIALIZED); - - NS_ENSURE_ARG_POINTER(aBrowserWindow); - - *aBrowserWindow = mBrowserDOMWindow; - NS_IF_ADDREF(*aBrowserWindow); - return NS_OK; + ErrorResult rv; + NS_IF_ADDREF(*aBrowserWindow = GetBrowserDOMWindow(rv)); + return rv.ErrorCode(); +} + +nsIBrowserDOMWindow* +nsGlobalWindow::GetBrowserDOMWindow(ErrorResult& aError) +{ + FORWARD_TO_OUTER_OR_THROW(GetBrowserDOMWindow, (aError), aError, nullptr); + + MOZ_ASSERT(IsChromeWindow()); + return static_cast<nsGlobalChromeWindow*>(this)->mBrowserDOMWindow; } NS_IMETHODIMP nsGlobalChromeWindow::SetBrowserDOMWindow(nsIBrowserDOMWindow *aBrowserWindow) { - FORWARD_TO_OUTER_CHROME(SetBrowserDOMWindow, (aBrowserWindow), - NS_ERROR_NOT_INITIALIZED); - - mBrowserDOMWindow = aBrowserWindow; - return NS_OK; + ErrorResult rv; + SetBrowserDOMWindow(aBrowserWindow, rv); + return rv.ErrorCode(); +} + +void +nsGlobalWindow::SetBrowserDOMWindow(nsIBrowserDOMWindow* aBrowserWindow, + ErrorResult& aError) +{ + FORWARD_TO_OUTER_OR_THROW(SetBrowserDOMWindow, (aBrowserWindow, aError), + aError, ); + MOZ_ASSERT(IsChromeWindow()); + static_cast<nsGlobalChromeWindow*>(this)->mBrowserDOMWindow = aBrowserWindow; } NS_IMETHODIMP nsGlobalChromeWindow::NotifyDefaultButtonLoaded(nsIDOMElement* aDefaultButton) { + nsCOMPtr<Element> defaultButton = do_QueryInterface(aDefaultButton); + NS_ENSURE_ARG(defaultButton); + + ErrorResult rv; + NotifyDefaultButtonLoaded(*defaultButton, rv); + return rv.ErrorCode(); +} + +void +nsGlobalWindow::NotifyDefaultButtonLoaded(Element& aDefaultButton, + ErrorResult& aError) +{ #ifdef MOZ_XUL - NS_ENSURE_ARG(aDefaultButton); - // Don't snap to a disabled button. nsCOMPtr<nsIDOMXULControlElement> xulControl = - do_QueryInterface(aDefaultButton); - NS_ENSURE_TRUE(xulControl, NS_ERROR_FAILURE); + do_QueryInterface(&aDefaultButton); + if (!xulControl) { + aError.Throw(NS_ERROR_FAILURE); + return; + } bool disabled; - nsresult rv = xulControl->GetDisabled(&disabled); - NS_ENSURE_SUCCESS(rv, rv); - if (disabled) - return NS_OK; + aError = xulControl->GetDisabled(&disabled); + if (aError.Failed() || disabled) { + return; + } // Get the button rect in screen coordinates. - nsCOMPtr<nsIContent> content(do_QueryInterface(aDefaultButton)); - NS_ENSURE_TRUE(content, NS_ERROR_FAILURE); - nsIFrame *frame = content->GetPrimaryFrame(); - NS_ENSURE_TRUE(frame, NS_ERROR_FAILURE); + nsIFrame *frame = aDefaultButton.GetPrimaryFrame(); + if (!frame) { + aError.Throw(NS_ERROR_FAILURE); + return; + } nsIntRect buttonRect = frame->GetScreenRect(); // Get the widget rect in screen coordinates. nsIWidget *widget = GetNearestWidget(); - NS_ENSURE_TRUE(widget, NS_ERROR_FAILURE); + if (!widget) { + aError.Throw(NS_ERROR_FAILURE); + return; + } nsIntRect widgetRect; - rv = widget->GetScreenBounds(widgetRect); - NS_ENSURE_SUCCESS(rv, rv); + aError = widget->GetScreenBounds(widgetRect); + if (aError.Failed()) { + return; + } // Convert the buttonRect coordinates from screen to the widget. buttonRect -= widgetRect.TopLeft(); - rv = widget->OnDefaultButtonLoaded(buttonRect); - if (rv == NS_ERROR_NOT_IMPLEMENTED) - return NS_OK; - return rv; + nsresult rv = widget->OnDefaultButtonLoaded(buttonRect); + if (NS_FAILED(rv) && rv != NS_ERROR_NOT_IMPLEMENTED) { + aError.Throw(rv); + } #else - return NS_ERROR_NOT_IMPLEMENTED; + aError.Throw(NS_ERROR_NOT_IMPLEMENTED); #endif } NS_IMETHODIMP nsGlobalChromeWindow::GetMessageManager(nsIMessageBroadcaster** aManager) { - FORWARD_TO_INNER_CHROME(GetMessageManager, (aManager), NS_ERROR_FAILURE); - if (!mMessageManager) { + ErrorResult rv; + NS_IF_ADDREF(*aManager = GetMessageManager(rv)); + return rv.ErrorCode(); +} + +nsIMessageBroadcaster* +nsGlobalWindow::GetMessageManager(ErrorResult& aError) +{ + FORWARD_TO_INNER_OR_THROW(GetMessageManager, (aError), aError, nullptr); + MOZ_ASSERT(IsChromeWindow()); + nsGlobalChromeWindow* myself = static_cast<nsGlobalChromeWindow*>(this); + if (!myself->mMessageManager) { nsIScriptContext* scx = GetContextInternal(); - NS_ENSURE_STATE(scx); + if (NS_WARN_IF(!scx)) { + aError.Throw(NS_ERROR_UNEXPECTED); + return nullptr; + } AutoPushJSContext cx(scx->GetNativeContext()); - NS_ENSURE_STATE(cx); + if (NS_WARN_IF(!cx)) { + aError.Throw(NS_ERROR_UNEXPECTED); + return nullptr; + } nsCOMPtr<nsIMessageBroadcaster> globalMM = do_GetService("@mozilla.org/globalmessagemanager;1"); - mMessageManager = + myself->mMessageManager = new nsFrameMessageManager(nullptr, static_cast<nsFrameMessageManager*>(globalMM.get()), MM_CHROME | MM_BROADCASTER); - NS_ENSURE_TRUE(mMessageManager, NS_ERROR_OUT_OF_MEMORY); - } - CallQueryInterface(mMessageManager, aManager); - return NS_OK; + } + return myself->mMessageManager; } // nsGlobalModalWindow implementation // QueryInterface implementation for nsGlobalModalWindow NS_IMPL_CYCLE_COLLECTION_INHERITED_1(nsGlobalModalWindow, nsGlobalWindow, mReturnValue)
--- a/dom/base/nsGlobalWindow.h +++ b/dom/base/nsGlobalWindow.h @@ -942,16 +942,36 @@ public: JSObject* Get_content(JSContext* aCx, mozilla::ErrorResult& aError) { if (mDoc) { mDoc->WarnOnceAbout(nsIDocument::eWindow_Content); } return GetContent(aCx, aError); } + // ChromeWindow bits. Do NOT call these unless your window is in + // fact an nsGlobalChromeWindow. + uint16_t WindowState(); + nsIBrowserDOMWindow* GetBrowserDOMWindow(mozilla::ErrorResult& aError); + void SetBrowserDOMWindow(nsIBrowserDOMWindow* aBrowserWindow, + mozilla::ErrorResult& aError); + void GetAttention(mozilla::ErrorResult& aError); + void GetAttentionWithCycleCount(int32_t aCycleCount, + mozilla::ErrorResult& aError); + void SetCursor(const nsAString& aCursor, mozilla::ErrorResult& aError); + void Maximize(mozilla::ErrorResult& aError); + void Minimize(mozilla::ErrorResult& aError); + void Restore(mozilla::ErrorResult& aError); + void NotifyDefaultButtonLoaded(mozilla::dom::Element& aDefaultButton, + mozilla::ErrorResult& aError); + nsIMessageBroadcaster* GetMessageManager(mozilla::ErrorResult& aError); + void BeginWindowMove(nsDOMEvent& aMouseDownEvent, + mozilla::dom::Element* aPanel, + mozilla::ErrorResult& aError); + protected: // Array of idle observers that are notified of idle events. nsTObserverArray<IdleObserverHolder> mIdleObservers; // Idle timer used for function callbacks to notify idle observers. nsCOMPtr<nsITimer> mIdleTimer; // Idle fuzz time added to idle timer callbacks. @@ -1562,16 +1582,28 @@ public: } mCleanMessageManager = false; } NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(nsGlobalChromeWindow, nsGlobalWindow) + using nsGlobalWindow::GetBrowserDOMWindow; + using nsGlobalWindow::SetBrowserDOMWindow; + using nsGlobalWindow::GetAttention; + using nsGlobalWindow::GetAttentionWithCycleCount; + using nsGlobalWindow::SetCursor; + using nsGlobalWindow::Maximize; + using nsGlobalWindow::Minimize; + using nsGlobalWindow::Restore; + using nsGlobalWindow::NotifyDefaultButtonLoaded; + using nsGlobalWindow::GetMessageManager; + using nsGlobalWindow::BeginWindowMove; + nsCOMPtr<nsIBrowserDOMWindow> mBrowserDOMWindow; nsCOMPtr<nsIMessageBroadcaster> mMessageManager; }; /* * nsGlobalModalWindow inherits from nsGlobalWindow. It is the global * object created for a modal content windows only (i.e. not modal * chrome dialogs).
--- a/dom/bindings/Bindings.conf +++ b/dom/bindings/Bindings.conf @@ -1915,21 +1915,25 @@ addExternalIface('MozRDFCompositeDataSou addExternalIface('MozRDFResource', nativeType='nsIRDFResource', notflattened=True) addExternalIface('MozTreeBoxObject', nativeType='nsITreeBoxObject', notflattened=True) addExternalIface('MozTreeColumn', nativeType='nsITreeColumn', headerFile='nsITreeColumns.h') addExternalIface('MozVoicemailStatus') addExternalIface('MozWakeLockListener', headerFile='nsIDOMWakeLockListener.h') addExternalIface('MozXULTemplateBuilder', nativeType='nsIXULTemplateBuilder') +addExternalIface('nsIBrowserDOMWindow', nativeType='nsIBrowserDOMWindow', + notflattened=True) addExternalIface('nsIControllers', nativeType='nsIControllers') addExternalIface('nsIDOMCrypto', nativeType='nsIDOMCrypto', headerFile='Crypto.h') addExternalIface('nsIInputStreamCallback', nativeType='nsIInputStreamCallback', headerFile='nsIAsyncInputStream.h') +addExternalIface('nsIMessageBroadcaster', nativeType='nsIMessageBroadcaster', + headerFile='nsIMessageManager.h', notflattened=True) addExternalIface('nsISelectionListener', nativeType='nsISelectionListener') addExternalIface('nsIStreamListener', nativeType='nsIStreamListener', notflattened=True) addExternalIface('nsISupports', nativeType='nsISupports') addExternalIface('nsIDocShell', nativeType='nsIDocShell', notflattened=True) addExternalIface('nsIEditor', nativeType='nsIEditor', notflattened=True) addExternalIface('nsIVariant', nativeType='nsIVariant', notflattened=True) addExternalIface('OutputStream', nativeType='nsIOutputStream', notflattened=True)
--- a/dom/webidl/Window.webidl +++ b/dom/webidl/Window.webidl @@ -12,16 +12,18 @@ * https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/RequestAnimationFrame/Overview.html * https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/NavigationTiming/Overview.html * https://dvcs.w3.org/hg/webcrypto-api/raw-file/tip/spec/Overview.html * http://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html */ interface ApplicationCache; interface MozFrameRequestCallback; +interface nsIBrowserDOMWindow; +interface nsIMessageBroadcaster; interface nsIDOMCrypto; typedef any Transferable; // http://www.whatwg.org/specs/web-apps/current-work/ [Global, NeedNewResolve] /*sealed*/ interface Window : EventTarget { // the current browsing context [Unforgeable, Throws, @@ -335,11 +337,70 @@ partial interface Window { [ChromeOnly, Throws] readonly attribute object? __content; }; Window implements TouchEventHandlers; Window implements OnErrorEventHandlerForWindow; -[ChromeOnly] interface ChromeWindow {}; +[ChromeOnly] interface ChromeWindow { + [Func="nsGlobalWindow::IsChromeWindow"] + const unsigned short STATE_MAXIMIZED = 1; + [Func="nsGlobalWindow::IsChromeWindow"] + const unsigned short STATE_MINIMIZED = 2; + [Func="nsGlobalWindow::IsChromeWindow"] + const unsigned short STATE_NORMAL = 3; + [Func="nsGlobalWindow::IsChromeWindow"] + const unsigned short STATE_FULLSCREEN = 4; + + [Func="nsGlobalWindow::IsChromeWindow"] + readonly attribute unsigned short windowState; + + /** + * browserDOMWindow provides access to yet another layer of + * utility functions implemented by chrome script. It will be null + * for DOMWindows not corresponding to browsers. + */ + [Throws, Func="nsGlobalWindow::IsChromeWindow"] + attribute nsIBrowserDOMWindow? browserDOMWindow; + + [Throws, Func="nsGlobalWindow::IsChromeWindow"] + void getAttention(); + + [Throws, Func="nsGlobalWindow::IsChromeWindow"] + void getAttentionWithCycleCount(long aCycleCount); + + [Throws, Func="nsGlobalWindow::IsChromeWindow"] + void setCursor(DOMString cursor); + + [Throws, Func="nsGlobalWindow::IsChromeWindow"] + void maximize(); + [Throws, Func="nsGlobalWindow::IsChromeWindow"] + void minimize(); + [Throws, Func="nsGlobalWindow::IsChromeWindow"] + void restore(); + + /** + * Notify a default button is loaded on a dialog or a wizard. + * defaultButton is the default button. + */ + [Throws, Func="nsGlobalWindow::IsChromeWindow"] + void notifyDefaultButtonLoaded(Element defaultButton); + + [Throws, Func="nsGlobalWindow::IsChromeWindow"] + readonly attribute nsIMessageBroadcaster messageManager; + + /** + * On some operating systems, we must allow the window manager to + * handle window dragging. This function tells the window manager to + * start dragging the window. This function will fail unless called + * while the left mouse button is held down, callers must check this. + * + * The optional panel argument should be set when moving a panel. + * + * Throws NS_ERROR_NOT_IMPLEMENTED if the OS doesn't support this. + */ + [Throws, Func="nsGlobalWindow::IsChromeWindow"] + void beginWindowMove(Event mouseDownEvent, optional Element? panel = null); +}; Window implements ChromeWindow;