summaryrefslogtreecommitdiffstats
path: root/dom/base/nsGlobalWindow.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'dom/base/nsGlobalWindow.cpp')
-rw-r--r--dom/base/nsGlobalWindow.cpp322
1 files changed, 6 insertions, 316 deletions
diff --git a/dom/base/nsGlobalWindow.cpp b/dom/base/nsGlobalWindow.cpp
index 47b46dda0..c965d5b97 100644
--- a/dom/base/nsGlobalWindow.cpp
+++ b/dom/base/nsGlobalWindow.cpp
@@ -909,7 +909,6 @@ nsPIDOMWindow<T>::nsPIDOMWindow(nsPIDOMWindowOuter *aOuterWindow)
mMayHaveMouseEnterLeaveEventListener(false),
mMayHavePointerEnterLeaveEventListener(false),
mInnerObjectsFreed(false),
- mIsModalContentWindow(false),
mIsActive(false), mIsBackground(false),
mMediaSuspend(Preferences::GetBool("media.block-autoplay-until-in-foreground", true) ?
nsISuspendedTypes::SUSPENDED_BLOCK : nsISuspendedTypes::NONE_SUSPENDED),
@@ -1957,7 +1956,6 @@ nsGlobalWindow::CleanUp()
}
mArguments = nullptr;
- mDialogArguments = nullptr;
CleanupCachedXBLHandlers(this);
@@ -2195,7 +2193,6 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INTERNAL(nsGlobalWindow)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mControllers)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mArguments)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mDialogArguments)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mReturnValue)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mNavigator)
@@ -2274,7 +2271,6 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(nsGlobalWindow)
NS_IMPL_CYCLE_COLLECTION_UNLINK(mControllers)
NS_IMPL_CYCLE_COLLECTION_UNLINK(mArguments)
- NS_IMPL_CYCLE_COLLECTION_UNLINK(mDialogArguments)
NS_IMPL_CYCLE_COLLECTION_UNLINK(mReturnValue)
NS_IMPL_CYCLE_COLLECTION_UNLINK(mNavigator)
@@ -3019,8 +3015,6 @@ nsGlobalWindow::SetNewDocument(nsIDocument* aDocument,
} else {
if (thisChrome) {
newInnerWindow = nsGlobalChromeWindow::Create(this);
- } else if (mIsModalContentWindow) {
- newInnerWindow = nsGlobalModalWindow::Create(this);
} else {
newInnerWindow = nsGlobalWindow::Create(this);
}
@@ -3871,31 +3865,16 @@ nsGlobalWindow::SetArguments(nsIArray *aArguments)
MOZ_ASSERT(IsOuterWindow());
nsresult rv;
- // Historically, we've used the same machinery to handle openDialog arguments
- // (exposed via window.arguments) and showModalDialog arguments (exposed via
- // window.dialogArguments), even though the former is XUL-only and uses an XPCOM
- // array while the latter is web-exposed and uses an arbitrary JS value.
- // Moreover, per-spec |dialogArguments| is a property of the browsing context
- // (outer), whereas |arguments| lives on the inner.
- //
// We've now mostly separated them, but the difference is still opaque to
// nsWindowWatcher (the caller of SetArguments in this little back-and-forth
// embedding waltz we do here).
//
// So we need to demultiplex the two cases here.
nsGlobalWindow *currentInner = GetCurrentInnerWindowInternal();
- if (mIsModalContentWindow) {
- // nsWindowWatcher blindly converts the original nsISupports into an array
- // of length 1. We need to recover it, and then cast it back to the concrete
- // object we know it to be.
- nsCOMPtr<nsISupports> supports = do_QueryElementAt(aArguments, 0, &rv);
- NS_ENSURE_SUCCESS(rv, rv);
- mDialogArguments = static_cast<DialogValueHolder*>(supports.get());
- } else {
- mArguments = aArguments;
- rv = currentInner->DefineArgumentsProperty(aArguments);
- NS_ENSURE_SUCCESS(rv, rv);
- }
+
+ mArguments = aArguments;
+ rv = currentInner->DefineArgumentsProperty(aArguments);
+ NS_ENSURE_SUCCESS(rv, rv);
return NS_OK;
}
@@ -3904,7 +3883,6 @@ nsresult
nsGlobalWindow::DefineArgumentsProperty(nsIArray *aArguments)
{
MOZ_ASSERT(IsInnerWindow());
- MOZ_ASSERT(!mIsModalContentWindow); // Handled separately.
nsIScriptContext *ctx = GetOuterWindowInternal()->mContext;
NS_ENSURE_TRUE(aArguments && ctx, NS_ERROR_NOT_INITIALIZED);
@@ -4263,8 +4241,9 @@ CustomElementRegistry*
nsGlobalWindow::CustomElements()
{
MOZ_RELEASE_ASSERT(IsInnerWindow());
+
if (!mCustomElements) {
- mCustomElements = CustomElementRegistry::Create(AsInner());
+ mCustomElements = new CustomElementRegistry(AsInner());
}
return mCustomElements;
@@ -5040,21 +5019,6 @@ nsGlobalWindow::IsPrivilegedChromeWindow(JSContext* aCx, JSObject* aObj)
nsContentUtils::ObjectPrincipal(aObj) == nsContentUtils::GetSystemPrincipal();
}
-/* static */ bool
-nsGlobalWindow::IsShowModalDialogEnabled(JSContext*, JSObject*)
-{
- static bool sAddedPrefCache = false;
- static bool sIsDisabled;
- static const char sShowModalDialogPref[] = "dom.disable_window_showModalDialog";
-
- if (!sAddedPrefCache) {
- Preferences::AddBoolVarCache(&sIsDisabled, sShowModalDialogPref, false);
- sAddedPrefCache = true;
- }
-
- return !sIsDisabled && !XRE_IsContentProcess();
-}
-
nsIDOMOfflineResourceList*
nsGlobalWindow::GetApplicationCache(ErrorResult& aError)
{
@@ -9741,126 +9705,6 @@ nsGlobalWindow::ConvertDialogOptions(const nsAString& aOptions,
}
}
-already_AddRefed<nsIVariant>
-nsGlobalWindow::ShowModalDialogOuter(const nsAString& aUrl,
- nsIVariant* aArgument,
- const nsAString& aOptions,
- nsIPrincipal& aSubjectPrincipal,
- ErrorResult& aError)
-{
- MOZ_RELEASE_ASSERT(IsOuterWindow());
-
- if (mDoc) {
- mDoc->WarnOnceAbout(nsIDocument::eShowModalDialog);
- }
-
- if (!IsShowModalDialogEnabled()) {
- aError.Throw(NS_ERROR_NOT_AVAILABLE);
- return nullptr;
- }
-
- RefPtr<DialogValueHolder> argHolder =
- new DialogValueHolder(&aSubjectPrincipal, aArgument);
-
- // Before bringing up the window/dialog, unsuppress painting and flush
- // pending reflows.
- EnsureReflowFlushAndPaint();
-
- if (!AreDialogsEnabled()) {
- // We probably want to keep throwing here; silently doing nothing is a bit
- // weird given the typical use cases of showModalDialog().
- aError.Throw(NS_ERROR_NOT_AVAILABLE);
- return nullptr;
- }
-
- if (ShouldPromptToBlockDialogs() && !ConfirmDialogIfNeeded()) {
- aError.Throw(NS_ERROR_NOT_AVAILABLE);
- return nullptr;
- }
-
- nsCOMPtr<nsPIDOMWindowOuter> dlgWin;
- nsAutoString options(NS_LITERAL_STRING("-moz-internal-modal=1,status=1"));
-
- ConvertDialogOptions(aOptions, options);
-
- options.AppendLiteral(",scrollbars=1,centerscreen=1,resizable=0");
-
- EnterModalState();
- uint32_t oldMicroTaskLevel = nsContentUtils::MicroTaskLevel();
- nsContentUtils::SetMicroTaskLevel(0);
- aError = OpenInternal(aUrl, EmptyString(), options,
- false, // aDialog
- true, // aContentModal
- true, // aCalledNoScript
- true, // aDoJSFixups
- true, // aNavigate
- nullptr, argHolder, // args
- nullptr, // aLoadInfo
- false, // aForceNoOpener
- getter_AddRefs(dlgWin));
- nsContentUtils::SetMicroTaskLevel(oldMicroTaskLevel);
- LeaveModalState();
- if (aError.Failed()) {
- return nullptr;
- }
-
- nsCOMPtr<nsIDOMModalContentWindow> dialog = do_QueryInterface(dlgWin);
- if (!dialog) {
- return nullptr;
- }
-
- nsCOMPtr<nsIVariant> retVal;
- aError = dialog->GetReturnValue(getter_AddRefs(retVal));
- MOZ_ASSERT(!aError.Failed());
-
- return retVal.forget();
-}
-
-already_AddRefed<nsIVariant>
-nsGlobalWindow::ShowModalDialog(const nsAString& aUrl, nsIVariant* aArgument,
- const nsAString& aOptions,
- nsIPrincipal& aSubjectPrincipal,
- ErrorResult& aError)
-{
- FORWARD_TO_OUTER_OR_THROW(ShowModalDialogOuter,
- (aUrl, aArgument, aOptions, aSubjectPrincipal,
- aError), aError, nullptr);
-}
-
-void
-nsGlobalWindow::ShowModalDialog(JSContext* aCx, const nsAString& aUrl,
- JS::Handle<JS::Value> aArgument,
- const nsAString& aOptions,
- JS::MutableHandle<JS::Value> aRetval,
- nsIPrincipal& aSubjectPrincipal,
- ErrorResult& aError)
-{
- MOZ_ASSERT(IsInnerWindow());
-
- nsCOMPtr<nsIVariant> args;
- aError = nsContentUtils::XPConnect()->JSToVariant(aCx,
- aArgument,
- getter_AddRefs(args));
- if (aError.Failed()) {
- return;
- }
-
- nsCOMPtr<nsIVariant> retVal =
- ShowModalDialog(aUrl, args, aOptions, aSubjectPrincipal, aError);
- if (aError.Failed()) {
- return;
- }
-
- JS::Rooted<JS::Value> result(aCx);
- if (retVal) {
- aError = nsContentUtils::XPConnect()->VariantToJS(aCx,
- FastGetGlobalJSObject(),
- retVal, aRetval);
- } else {
- aRetval.setNull();
- }
-}
-
class ChildCommandDispatcher : public Runnable
{
public:
@@ -14613,70 +14457,6 @@ nsGlobalChromeWindow::TakeOpenerForInitialContentBrowser(mozIDOMWindowProxy** aO
return NS_OK;
}
-// nsGlobalModalWindow implementation
-
-// QueryInterface implementation for nsGlobalModalWindow
-NS_INTERFACE_MAP_BEGIN(nsGlobalModalWindow)
- NS_INTERFACE_MAP_ENTRY(nsIDOMModalContentWindow)
-NS_INTERFACE_MAP_END_INHERITING(nsGlobalWindow)
-
-NS_IMPL_ADDREF_INHERITED(nsGlobalModalWindow, nsGlobalWindow)
-NS_IMPL_RELEASE_INHERITED(nsGlobalModalWindow, nsGlobalWindow)
-
-
-void
-nsGlobalWindow::GetDialogArgumentsOuter(JSContext* aCx,
- JS::MutableHandle<JS::Value> aRetval,
- nsIPrincipal& aSubjectPrincipal,
- ErrorResult& aError)
-{
- MOZ_RELEASE_ASSERT(IsOuterWindow());
- MOZ_ASSERT(IsModalContentWindow(),
- "This should only be called on modal windows!");
-
- if (!mDialogArguments) {
- MOZ_ASSERT(mIsClosed, "This window should be closed!");
- aRetval.setUndefined();
- return;
- }
-
- // This does an internal origin check, and returns undefined if the subject
- // does not subsumes the origin of the arguments.
- JS::Rooted<JSObject*> wrapper(aCx, GetWrapper());
- JSAutoCompartment ac(aCx, wrapper);
- mDialogArguments->Get(aCx, wrapper, &aSubjectPrincipal, aRetval, aError);
-}
-
-void
-nsGlobalWindow::GetDialogArguments(JSContext* aCx,
- JS::MutableHandle<JS::Value> aRetval,
- nsIPrincipal& aSubjectPrincipal,
- ErrorResult& aError)
-{
- FORWARD_TO_OUTER_OR_THROW(GetDialogArgumentsOuter,
- (aCx, aRetval, aSubjectPrincipal, aError),
- aError, );
-}
-
-/* static */ already_AddRefed<nsGlobalModalWindow>
-nsGlobalModalWindow::Create(nsGlobalWindow *aOuterWindow)
-{
- RefPtr<nsGlobalModalWindow> window = new nsGlobalModalWindow(aOuterWindow);
- window->InitWasOffline();
- return window.forget();
-}
-
-NS_IMETHODIMP
-nsGlobalModalWindow::GetDialogArguments(nsIVariant **aArguments)
-{
- FORWARD_TO_OUTER_MODAL_CONTENT_WINDOW(GetDialogArguments, (aArguments),
- NS_ERROR_NOT_INITIALIZED);
-
- // This does an internal origin check, and returns undefined if the subject
- // does not subsumes the origin of the arguments.
- return mDialogArguments->Get(nsContentUtils::SubjectPrincipal(), aArguments);
-}
-
/* static */ already_AddRefed<nsGlobalWindow>
nsGlobalWindow::Create(nsGlobalWindow *aOuterWindow)
{
@@ -14691,96 +14471,6 @@ nsGlobalWindow::InitWasOffline()
mWasOffline = NS_IsOffline();
}
-void
-nsGlobalWindow::GetReturnValueOuter(JSContext* aCx,
- JS::MutableHandle<JS::Value> aReturnValue,
- nsIPrincipal& aSubjectPrincipal,
- ErrorResult& aError)
-{
- MOZ_RELEASE_ASSERT(IsOuterWindow());
- MOZ_ASSERT(IsModalContentWindow(),
- "This should only be called on modal windows!");
-
- if (mReturnValue) {
- JS::Rooted<JSObject*> wrapper(aCx, GetWrapper());
- JSAutoCompartment ac(aCx, wrapper);
- mReturnValue->Get(aCx, wrapper, &aSubjectPrincipal, aReturnValue, aError);
- } else {
- aReturnValue.setUndefined();
- }
-}
-
-void
-nsGlobalWindow::GetReturnValue(JSContext* aCx,
- JS::MutableHandle<JS::Value> aReturnValue,
- nsIPrincipal& aSubjectPrincipal,
- ErrorResult& aError)
-{
- FORWARD_TO_OUTER_OR_THROW(GetReturnValueOuter,
- (aCx, aReturnValue, aSubjectPrincipal, aError),
- aError, );
-}
-
-NS_IMETHODIMP
-nsGlobalModalWindow::GetReturnValue(nsIVariant **aRetVal)
-{
- FORWARD_TO_OUTER_MODAL_CONTENT_WINDOW(GetReturnValue, (aRetVal), NS_OK);
-
- if (!mReturnValue) {
- nsCOMPtr<nsIVariant> variant = CreateVoidVariant();
- variant.forget(aRetVal);
- return NS_OK;
- }
- return mReturnValue->Get(nsContentUtils::SubjectPrincipal(), aRetVal);
-}
-
-void
-nsGlobalWindow::SetReturnValueOuter(JSContext* aCx,
- JS::Handle<JS::Value> aReturnValue,
- nsIPrincipal& aSubjectPrincipal,
- ErrorResult& aError)
-{
- MOZ_RELEASE_ASSERT(IsOuterWindow());
- MOZ_ASSERT(IsModalContentWindow(),
- "This should only be called on modal windows!");
-
- nsCOMPtr<nsIVariant> returnValue;
- aError =
- nsContentUtils::XPConnect()->JSToVariant(aCx, aReturnValue,
- getter_AddRefs(returnValue));
- if (!aError.Failed()) {
- mReturnValue = new DialogValueHolder(&aSubjectPrincipal, returnValue);
- }
-}
-
-void
-nsGlobalWindow::SetReturnValue(JSContext* aCx,
- JS::Handle<JS::Value> aReturnValue,
- nsIPrincipal& aSubjectPrincipal,
- ErrorResult& aError)
-{
- FORWARD_TO_OUTER_OR_THROW(SetReturnValueOuter,
- (aCx, aReturnValue, aSubjectPrincipal, aError),
- aError, );
-}
-
-NS_IMETHODIMP
-nsGlobalModalWindow::SetReturnValue(nsIVariant *aRetVal)
-{
- FORWARD_TO_OUTER_MODAL_CONTENT_WINDOW(SetReturnValue, (aRetVal), NS_OK);
-
- mReturnValue = new DialogValueHolder(nsContentUtils::SubjectPrincipal(),
- aRetVal);
- return NS_OK;
-}
-
-/* static */
-bool
-nsGlobalWindow::IsModalContentWindow(JSContext* aCx, JSObject* aGlobal)
-{
- return xpc::WindowOrNull(aGlobal)->IsModalContentWindow();
-}
-
#if defined(MOZ_WIDGET_ANDROID)
int16_t
nsGlobalWindow::Orientation(CallerType aCallerType) const