import changes from `dev' branch of rmottola/Arctic-Fox:

- Bug 1181528 - nsISimpleEnumerator.h is needed by nsDocument.cpp, r=smaug (c4a3be0de)
- Bug 1177914 - throw a NotSupportedError when running document.importNode on a ShadowRoot or Document. r=wchen (7aa0adc52)
- Bug 1177991 - document.adoptNode should throw a HierarchyRequestError when adopting a ShadowRoot. r=wchen (f0e9f5400)
- Bug 1184789 - Remove unnecessary IsOuterWindow() check from nsGlobalWindow::GetCaches(). r=khuey (aa96e11e1)
- Bug 1182316: Part 1 - Remove FORWARD_TO_INNER_OR_THROW. r=peterv (04987b6ac)
- Bug 1170246 - Improving nsGlobalWindow::ConvertDialogOptions and adding some gTests, r=ehsan (926a47fb9)
This commit is contained in:
2021-06-08 15:03:49 +08:00
parent 2da2bfc91b
commit 71dfc28be9
15 changed files with 444 additions and 108 deletions
+18 -3
View File
@@ -82,6 +82,7 @@
#include "nsIRefreshURI.h"
#include "nsIWebNavigation.h"
#include "nsIScriptError.h"
#include "nsISimpleEnumerator.h"
#include "nsStyleSheetService.h"
#include "nsNetUtil.h" // for NS_NewURI
@@ -6739,8 +6740,17 @@ nsIDocument::ImportNode(nsINode& aNode, bool aDeep, ErrorResult& rv) const
nsINode* imported = &aNode;
switch (imported->NodeType()) {
case nsIDOMNode::ATTRIBUTE_NODE:
case nsIDOMNode::DOCUMENT_NODE:
{
break;
}
case nsIDOMNode::DOCUMENT_FRAGMENT_NODE:
{
if (ShadowRoot::FromNode(imported)) {
break;
}
}
case nsIDOMNode::ATTRIBUTE_NODE:
case nsIDOMNode::ELEMENT_NODE:
case nsIDOMNode::PROCESSING_INSTRUCTION_NODE:
case nsIDOMNode::TEXT_NODE:
@@ -6760,11 +6770,10 @@ nsIDocument::ImportNode(nsINode& aNode, bool aDeep, ErrorResult& rv) const
default:
{
NS_WARNING("Don't know how to clone this nodetype for importNode.");
rv.Throw(NS_ERROR_DOM_NOT_SUPPORTED_ERR);
}
}
rv.Throw(NS_ERROR_DOM_NOT_SUPPORTED_ERR);
return nullptr;
}
@@ -7767,6 +7776,12 @@ nsIDocument::AdoptNode(nsINode& aAdoptedNode, ErrorResult& rv)
break;
}
case nsIDOMNode::DOCUMENT_FRAGMENT_NODE:
{
if (ShadowRoot::FromNode(adoptedNode)) {
rv.Throw(NS_ERROR_DOM_HIERARCHY_REQUEST_ERR);
return nullptr;
}
}
case nsIDOMNode::ELEMENT_NODE:
case nsIDOMNode::PROCESSING_INSTRUCTION_NODE:
case nsIDOMNode::TEXT_NODE:
+141 -105
View File
@@ -409,18 +409,6 @@ nsGlobalWindow::DOMMinTimeoutValue() const {
} \
PR_END_MACRO
#define FORWARD_TO_INNER_OR_THROW(method, args, errorresult, err_rval) \
PR_BEGIN_MACRO \
if (IsOuterWindow()) { \
if (!mInnerWindow) { \
NS_WARNING("No inner window available!"); \
errorresult.Throw(NS_ERROR_NOT_INITIALIZED); \
return err_rval; \
} \
return GetCurrentInnerWindowInternal()->method args; \
} \
PR_END_MACRO
#define FORWARD_TO_INNER_MODAL_CONTENT_WINDOW(method, args, err_rval) \
PR_BEGIN_MACRO \
if (IsOuterWindow()) { \
@@ -3583,7 +3571,7 @@ nsGlobalWindow::GetSelf(nsIDOMWindow** aWindow)
Navigator*
nsGlobalWindow::GetNavigator(ErrorResult& aError)
{
FORWARD_TO_INNER_OR_THROW(GetNavigator, (aError), aError, nullptr);
MOZ_RELEASE_ASSERT(IsInnerWindow());
if (!mNavigator) {
mNavigator = new Navigator(this);
@@ -3595,6 +3583,8 @@ nsGlobalWindow::GetNavigator(ErrorResult& aError)
NS_IMETHODIMP
nsGlobalWindow::GetNavigator(nsIDOMNavigator** aNavigator)
{
FORWARD_TO_INNER(GetNavigator, (aNavigator), NS_ERROR_UNEXPECTED);
ErrorResult rv;
nsCOMPtr<nsIDOMNavigator> navigator = GetNavigator(rv);
navigator.forget(aNavigator);
@@ -3605,7 +3595,7 @@ nsGlobalWindow::GetNavigator(nsIDOMNavigator** aNavigator)
nsScreen*
nsGlobalWindow::GetScreen(ErrorResult& aError)
{
FORWARD_TO_INNER_OR_THROW(GetScreen, (aError), aError, nullptr);
MOZ_RELEASE_ASSERT(IsInnerWindow());
if (!mScreen) {
mScreen = nsScreen::Create(this);
@@ -3621,6 +3611,8 @@ nsGlobalWindow::GetScreen(ErrorResult& aError)
NS_IMETHODIMP
nsGlobalWindow::GetScreen(nsIDOMScreen** aScreen)
{
FORWARD_TO_INNER(GetScreen, (aScreen), NS_ERROR_UNEXPECTED);
ErrorResult rv;
nsRefPtr<nsScreen> screen = GetScreen(rv);
screen.forget(aScreen);
@@ -3631,7 +3623,7 @@ nsGlobalWindow::GetScreen(nsIDOMScreen** aScreen)
nsHistory*
nsGlobalWindow::GetHistory(ErrorResult& aError)
{
FORWARD_TO_INNER_OR_THROW(GetHistory, (aError), aError, nullptr);
MOZ_RELEASE_ASSERT(IsInnerWindow());
if (!mHistory) {
mHistory = new nsHistory(this);
@@ -3643,6 +3635,8 @@ nsGlobalWindow::GetHistory(ErrorResult& aError)
NS_IMETHODIMP
nsGlobalWindow::GetHistory(nsISupports** aHistory)
{
FORWARD_TO_INNER(GetHistory, (aHistory), NS_ERROR_FAILURE);
ErrorResult rv;
nsCOMPtr<nsISupports> history = GetHistory(rv);
history.forget(aHistory);
@@ -3769,7 +3763,7 @@ nsPIDOMWindow::RefreshMediaElements()
SpeechSynthesis*
nsGlobalWindow::GetSpeechSynthesis(ErrorResult& aError)
{
FORWARD_TO_INNER_OR_THROW(GetSpeechSynthesis, (aError), aError, nullptr);
MOZ_RELEASE_ASSERT(IsInnerWindow());
if (!mSpeechSynthesis) {
mSpeechSynthesis = new SpeechSynthesis(this);
@@ -3999,6 +3993,8 @@ nsGlobalWindow::GetContent(nsIDOMWindow** aContent)
MozSelfSupport*
nsGlobalWindow::GetMozSelfSupport(ErrorResult& aError)
{
MOZ_ASSERT(IsInnerWindow());
if (mMozSelfSupport) {
return mMozSelfSupport;
}
@@ -4047,7 +4043,7 @@ nsGlobalWindow::GetPrompter(nsIPrompt** aPrompt)
BarProp*
nsGlobalWindow::GetMenubar(ErrorResult& aError)
{
FORWARD_TO_INNER_OR_THROW(GetMenubar, (aError), aError, nullptr);
MOZ_RELEASE_ASSERT(IsInnerWindow());
if (!mMenubar) {
mMenubar = new MenubarProp(this);
@@ -4059,6 +4055,8 @@ nsGlobalWindow::GetMenubar(ErrorResult& aError)
NS_IMETHODIMP
nsGlobalWindow::GetMenubar(nsISupports** aMenubar)
{
FORWARD_TO_INNER(GetMenubar, (aMenubar), NS_ERROR_UNEXPECTED);
ErrorResult rv;
nsCOMPtr<nsISupports> menubar = GetMenubar(rv);
menubar.forget(aMenubar);
@@ -4069,7 +4067,7 @@ nsGlobalWindow::GetMenubar(nsISupports** aMenubar)
BarProp*
nsGlobalWindow::GetToolbar(ErrorResult& aError)
{
FORWARD_TO_INNER_OR_THROW(GetToolbar, (aError), aError, nullptr);
MOZ_RELEASE_ASSERT(IsInnerWindow());
if (!mToolbar) {
mToolbar = new ToolbarProp(this);
@@ -4081,6 +4079,8 @@ nsGlobalWindow::GetToolbar(ErrorResult& aError)
NS_IMETHODIMP
nsGlobalWindow::GetToolbar(nsISupports** aToolbar)
{
FORWARD_TO_INNER(GetToolbar, (aToolbar), NS_ERROR_UNEXPECTED);
ErrorResult rv;
nsCOMPtr<nsISupports> toolbar = GetToolbar(rv);
toolbar.forget(aToolbar);
@@ -4091,7 +4091,7 @@ nsGlobalWindow::GetToolbar(nsISupports** aToolbar)
BarProp*
nsGlobalWindow::GetLocationbar(ErrorResult& aError)
{
FORWARD_TO_INNER_OR_THROW(GetLocationbar, (aError), aError, nullptr);
MOZ_RELEASE_ASSERT(IsInnerWindow());
if (!mLocationbar) {
mLocationbar = new LocationbarProp(this);
@@ -4102,6 +4102,8 @@ nsGlobalWindow::GetLocationbar(ErrorResult& aError)
NS_IMETHODIMP
nsGlobalWindow::GetLocationbar(nsISupports** aLocationbar)
{
FORWARD_TO_INNER(GetLocationbar, (aLocationbar), NS_ERROR_UNEXPECTED);
ErrorResult rv;
nsCOMPtr<nsISupports> locationbar = GetLocationbar(rv);
locationbar.forget(aLocationbar);
@@ -4112,7 +4114,7 @@ nsGlobalWindow::GetLocationbar(nsISupports** aLocationbar)
BarProp*
nsGlobalWindow::GetPersonalbar(ErrorResult& aError)
{
FORWARD_TO_INNER_OR_THROW(GetPersonalbar, (aError), aError, nullptr);
MOZ_RELEASE_ASSERT(IsInnerWindow());
if (!mPersonalbar) {
mPersonalbar = new PersonalbarProp(this);
@@ -4123,6 +4125,8 @@ nsGlobalWindow::GetPersonalbar(ErrorResult& aError)
NS_IMETHODIMP
nsGlobalWindow::GetPersonalbar(nsISupports** aPersonalbar)
{
FORWARD_TO_INNER(GetPersonalbar, (aPersonalbar), NS_ERROR_UNEXPECTED);
ErrorResult rv;
nsCOMPtr<nsISupports> personalbar = GetPersonalbar(rv);
personalbar.forget(aPersonalbar);
@@ -4133,7 +4137,7 @@ nsGlobalWindow::GetPersonalbar(nsISupports** aPersonalbar)
BarProp*
nsGlobalWindow::GetStatusbar(ErrorResult& aError)
{
FORWARD_TO_INNER_OR_THROW(GetStatusbar, (aError), aError, nullptr);
MOZ_RELEASE_ASSERT(IsInnerWindow());
if (!mStatusbar) {
mStatusbar = new StatusbarProp(this);
@@ -4144,6 +4148,8 @@ nsGlobalWindow::GetStatusbar(ErrorResult& aError)
NS_IMETHODIMP
nsGlobalWindow::GetStatusbar(nsISupports** aStatusbar)
{
FORWARD_TO_INNER(GetStatusbar, (aStatusbar), NS_ERROR_UNEXPECTED);
ErrorResult rv;
nsCOMPtr<nsISupports> statusbar = GetStatusbar(rv);
statusbar.forget(aStatusbar);
@@ -4154,7 +4160,7 @@ nsGlobalWindow::GetStatusbar(nsISupports** aStatusbar)
BarProp*
nsGlobalWindow::GetScrollbars(ErrorResult& aError)
{
FORWARD_TO_INNER_OR_THROW(GetScrollbars, (aError), aError, nullptr);
MOZ_RELEASE_ASSERT(IsInnerWindow());
if (!mScrollbars) {
mScrollbars = new ScrollbarsProp(this);
@@ -4166,6 +4172,8 @@ nsGlobalWindow::GetScrollbars(ErrorResult& aError)
NS_IMETHODIMP
nsGlobalWindow::GetScrollbars(nsISupports** aScrollbars)
{
FORWARD_TO_INNER(GetScrollbars, (aScrollbars), NS_ERROR_UNEXPECTED);
ErrorResult rv;
nsCOMPtr<nsISupports> scrollbars = GetScrollbars(rv);
scrollbars.forget(aScrollbars);
@@ -4307,6 +4315,7 @@ void
nsGlobalWindow::GetOwnPropertyNames(JSContext* aCx, nsTArray<nsString>& aNames,
ErrorResult& aRv)
{
MOZ_ASSERT(IsInnerWindow());
// "Components" is marked as enumerable but only resolved on demand :-/.
//aNames.AppendElement(NS_LITERAL_STRING("Components"));
@@ -4351,7 +4360,7 @@ nsGlobalWindow::IsShowModalDialogEnabled(JSContext*, JSObject*)
nsIDOMOfflineResourceList*
nsGlobalWindow::GetApplicationCache(ErrorResult& aError)
{
FORWARD_TO_INNER_OR_THROW(GetApplicationCache, (aError), aError, nullptr);
MOZ_RELEASE_ASSERT(IsInnerWindow());
if (!mApplicationCache) {
nsCOMPtr<nsIWebNavigation> webNav(do_QueryInterface(GetDocShell()));
@@ -4383,6 +4392,8 @@ nsGlobalWindow::GetApplicationCache(ErrorResult& aError)
NS_IMETHODIMP
nsGlobalWindow::GetApplicationCache(nsIDOMOfflineResourceList **aApplicationCache)
{
FORWARD_TO_INNER(GetApplicationCache, (aApplicationCache), NS_ERROR_UNEXPECTED);
ErrorResult rv;
nsCOMPtr<nsIDOMOfflineResourceList> applicationCache =
GetApplicationCache(rv);
@@ -4394,7 +4405,7 @@ nsGlobalWindow::GetApplicationCache(nsIDOMOfflineResourceList **aApplicationCach
Crypto*
nsGlobalWindow::GetCrypto(ErrorResult& aError)
{
FORWARD_TO_INNER_OR_THROW(GetCrypto, (aError), aError, nullptr);
MOZ_RELEASE_ASSERT(IsInnerWindow());
if (!mCrypto) {
mCrypto = new Crypto();
@@ -4406,6 +4417,8 @@ nsGlobalWindow::GetCrypto(ErrorResult& aError)
NS_IMETHODIMP
nsGlobalWindow::GetCrypto(nsIDOMCrypto** aCrypto)
{
FORWARD_TO_INNER(GetCrypto, (aCrypto), NS_ERROR_UNEXPECTED);
ErrorResult rv;
nsCOMPtr<nsIDOMCrypto> crypto = GetCrypto(rv);
crypto.forget(aCrypto);
@@ -5308,6 +5321,8 @@ NS_IMETHODIMP
nsGlobalWindow::MozRequestAnimationFrame(nsIFrameRequestCallback* aCallback,
int32_t *aHandle)
{
FORWARD_TO_INNER(MozRequestAnimationFrame, (aCallback, aHandle), NS_ERROR_UNEXPECTED);
if (!aCallback) {
if (mDoc) {
mDoc->WarnOnceAbout(nsIDocument::eMozBeforePaint);
@@ -5326,6 +5341,8 @@ int32_t
nsGlobalWindow::RequestAnimationFrame(FrameRequestCallback& aCallback,
ErrorResult& aError)
{
MOZ_RELEASE_ASSERT(IsInnerWindow());
nsIDocument::FrameRequestCallbackHolder holder(&aCallback);
return RequestAnimationFrame(holder, aError);
}
@@ -5334,6 +5351,7 @@ int32_t
nsGlobalWindow::MozRequestAnimationFrame(nsIFrameRequestCallback* aCallback,
ErrorResult& aError)
{
MOZ_RELEASE_ASSERT(IsInnerWindow());
nsIDocument::FrameRequestCallbackHolder holder(aCallback);
return RequestAnimationFrame(holder, aError);
}
@@ -5342,8 +5360,7 @@ int32_t
nsGlobalWindow::RequestAnimationFrame(const nsIDocument::FrameRequestCallbackHolder& aCallback,
ErrorResult& aError)
{
FORWARD_TO_INNER_OR_THROW(RequestAnimationFrame, (aCallback, aError), aError,
0);
MOZ_RELEASE_ASSERT(IsInnerWindow());
if (!mDoc) {
return 0;
@@ -5363,6 +5380,7 @@ nsGlobalWindow::RequestAnimationFrame(JS::Handle<JS::Value> aCallback,
JSContext* cx,
int32_t* aHandle)
{
FORWARD_TO_INNER(RequestAnimationFrame, (aCallback, cx, aHandle), NS_ERROR_UNEXPECTED);
if (!aCallback.isObject() || !JS::IsCallable(&aCallback.toObject())) {
return NS_ERROR_INVALID_ARG;
}
@@ -5380,19 +5398,21 @@ nsGlobalWindow::RequestAnimationFrame(JS::Handle<JS::Value> aCallback,
NS_IMETHODIMP
nsGlobalWindow::MozCancelRequestAnimationFrame(int32_t aHandle)
{
FORWARD_TO_INNER(MozCancelRequestAnimationFrame, (aHandle), NS_ERROR_UNEXPECTED);
return CancelAnimationFrame(aHandle);
}
NS_IMETHODIMP
nsGlobalWindow::MozCancelAnimationFrame(int32_t aHandle)
{
FORWARD_TO_INNER(MozCancelAnimationFrame, (aHandle), NS_ERROR_UNEXPECTED);
return CancelAnimationFrame(aHandle);
}
void
nsGlobalWindow::CancelAnimationFrame(int32_t aHandle, ErrorResult& aError)
{
FORWARD_TO_INNER_OR_THROW(CancelAnimationFrame, (aHandle, aError), aError, );
MOZ_RELEASE_ASSERT(IsInnerWindow());
if (!mDoc) {
return;
@@ -5404,6 +5424,8 @@ nsGlobalWindow::CancelAnimationFrame(int32_t aHandle, ErrorResult& aError)
NS_IMETHODIMP
nsGlobalWindow::CancelAnimationFrame(int32_t aHandle)
{
FORWARD_TO_INNER(CancelAnimationFrame, (aHandle), NS_ERROR_UNEXPECTED);
ErrorResult rv;
CancelAnimationFrame(aHandle, rv);
@@ -5413,7 +5435,7 @@ nsGlobalWindow::CancelAnimationFrame(int32_t aHandle)
int64_t
nsGlobalWindow::GetMozAnimationStartTime(ErrorResult& aError)
{
FORWARD_TO_INNER_OR_THROW(GetMozAnimationStartTime, (aError), aError, 0);
MOZ_RELEASE_ASSERT(IsInnerWindow());
if (mDoc) {
nsIPresShell* presShell = mDoc->GetShell();
@@ -5430,6 +5452,8 @@ nsGlobalWindow::GetMozAnimationStartTime(ErrorResult& aError)
NS_IMETHODIMP
nsGlobalWindow::GetMozAnimationStartTime(int64_t *aTime)
{
FORWARD_TO_INNER(GetMozAnimationStartTime, (aTime), NS_ERROR_UNEXPECTED);
ErrorResult rv;
*aTime = GetMozAnimationStartTime(rv);
@@ -7521,6 +7545,8 @@ nsGlobalWindow::MozRequestOverfill(OverfillCallback& aCallback,
void
nsGlobalWindow::ClearTimeout(int32_t aHandle, ErrorResult& aError)
{
MOZ_RELEASE_ASSERT(IsInnerWindow());
if (aHandle > 0) {
ClearTimeoutOrInterval(aHandle, aError);
}
@@ -7529,6 +7555,8 @@ nsGlobalWindow::ClearTimeout(int32_t aHandle, ErrorResult& aError)
NS_IMETHODIMP
nsGlobalWindow::ClearTimeout(int32_t aHandle)
{
FORWARD_TO_INNER(ClearTimeout, (aHandle), NS_ERROR_UNEXPECTED);
ErrorResult rv;
ClearTimeout(aHandle, rv);
@@ -8919,12 +8947,47 @@ nsGlobalWindow::GetRealFrameElement(nsIDOMElement** aFrameElement)
return rv.StealNSResult();
}
/* static */ bool
nsGlobalWindow::TokenizeDialogOptions(nsAString& aToken,
nsAString::const_iterator& aIter,
nsAString::const_iterator aEnd)
{
while (aIter != aEnd && nsCRT::IsAsciiSpace(*aIter)) {
++aIter;
}
if (aIter == aEnd) {
return false;
}
if (*aIter == ';' || *aIter == ':' || *aIter == '=') {
aToken.Assign(*aIter);
++aIter;
return true;
}
nsAString::const_iterator start = aIter;
// Skip characters until we find whitespace, ';', ':', or '='
while (aIter != aEnd && !nsCRT::IsAsciiSpace(*aIter) &&
*aIter != ';' &&
*aIter != ':' &&
*aIter != '=') {
++aIter;
}
aToken.Assign(Substring(start, aIter));
return true;
}
// Helper for converting window.showModalDialog() options (list of ';'
// separated name (:|=) value pairs) to a format that's parsable by
// our normal window opening code.
/* static */
void
ConvertDialogOptions(const nsAString& aOptions, nsAString& aResult)
nsGlobalWindow::ConvertDialogOptions(const nsAString& aOptions,
nsAString& aResult)
{
nsAString::const_iterator end;
aOptions.EndReading(end);
@@ -8932,68 +8995,35 @@ ConvertDialogOptions(const nsAString& aOptions, nsAString& aResult)
nsAString::const_iterator iter;
aOptions.BeginReading(iter);
while (iter != end) {
// Skip whitespace.
while (nsCRT::IsAsciiSpace(*iter) && iter != end) {
++iter;
nsAutoString token;
nsAutoString name;
nsAutoString value;
while (true) {
if (!TokenizeDialogOptions(name, iter, end)) {
break;
}
nsAString::const_iterator name_start = iter;
// Skip characters until we find whitespace, ';', ':', or '='
while (iter != end && !nsCRT::IsAsciiSpace(*iter) &&
*iter != ';' &&
*iter != ':' &&
*iter != '=') {
++iter;
// Invalid name.
if (name.EqualsLiteral("=") ||
name.EqualsLiteral(":") ||
name.EqualsLiteral(";")) {
break;
}
nsAString::const_iterator name_end = iter;
// Skip whitespace.
while (nsCRT::IsAsciiSpace(*iter) && iter != end) {
++iter;
if (!TokenizeDialogOptions(token, iter, end)) {
break;
}
if (*iter == ';') {
// No value found, skip the ';' and keep going.
++iter;
if (!token.EqualsLiteral(":") && !token.EqualsLiteral("=")) {
continue;
}
nsAString::const_iterator value_start = iter;
nsAString::const_iterator value_end = iter;
if (*iter == ':' || *iter == '=') {
// We found name followed by ':' or '='. Look for a value.
iter++; // Skip the ':' or '='
// Skip whitespace.
while (nsCRT::IsAsciiSpace(*iter) && iter != end) {
++iter;
}
value_start = iter;
// Skip until we find whitespace, or ';'.
while (iter != end && !nsCRT::IsAsciiSpace(*iter) &&
*iter != ';') {
++iter;
}
value_end = iter;
// Skip whitespace.
while (nsCRT::IsAsciiSpace(*iter) && iter != end) {
++iter;
}
// We found name followed by ':' or '='. Look for a value.
if (!TokenizeDialogOptions(value, iter, end)) {
break;
}
const nsDependentSubstring& name = Substring(name_start, name_end);
const nsDependentSubstring& value = Substring(value_start, value_end);
if (name.LowerCaseEqualsLiteral("center")) {
if (value.LowerCaseEqualsLiteral("on") ||
value.LowerCaseEqualsLiteral("yes") ||
@@ -9034,11 +9064,11 @@ ConvertDialogOptions(const nsAString& aOptions, nsAString& aResult)
}
}
if (iter == end) {
if (iter == end ||
!TokenizeDialogOptions(token, iter, end) ||
!token.EqualsLiteral(";")) {
break;
}
iter++;
}
}
@@ -9620,11 +9650,10 @@ nsGlobalWindow::GetPrivateRoot()
return static_cast<nsGlobalWindow*>(top.get());
}
nsLocation*
nsGlobalWindow::GetLocation(ErrorResult& aError)
{
FORWARD_TO_INNER_OR_THROW(GetLocation, (aError), aError, nullptr);
MOZ_RELEASE_ASSERT(IsInnerWindow());
nsIDocShell *docShell = GetDocShell();
if (!mLocation && docShell) {
@@ -9636,6 +9665,8 @@ nsGlobalWindow::GetLocation(ErrorResult& aError)
NS_IMETHODIMP
nsGlobalWindow::GetLocation(nsIDOMLocation ** aLocation)
{
FORWARD_TO_INNER(GetLocation, (aLocation), NS_ERROR_UNEXPECTED);
ErrorResult rv;
nsCOMPtr<nsIDOMLocation> location = GetLocation(rv);
location.forget(aLocation);
@@ -10016,7 +10047,7 @@ private:
nsresult
nsGlobalWindow::DispatchAsyncHashchange(nsIURI *aOldURI, nsIURI *aNewURI)
{
FORWARD_TO_INNER(DispatchAsyncHashchange, (aOldURI, aNewURI), NS_OK);
MOZ_RELEASE_ASSERT(IsInnerWindow());
// Make sure that aOldURI and aNewURI are identical up to the '#', and that
// their hashes are different.
@@ -10046,8 +10077,9 @@ nsGlobalWindow::FireHashchange(const nsAString &aOldURL,
MOZ_ASSERT(IsInnerWindow());
// Don't do anything if the window is frozen.
if (IsFrozen())
if (IsFrozen()) {
return NS_OK;
}
// Get a presentation shell for use in creating the hashchange event.
NS_ENSURE_STATE(IsCurrentInnerWindow());
@@ -10077,8 +10109,7 @@ nsGlobalWindow::FireHashchange(const nsAString &aOldURL,
nsresult
nsGlobalWindow::DispatchSyncPopState()
{
FORWARD_TO_INNER(DispatchSyncPopState, (), NS_OK);
MOZ_RELEASE_ASSERT(IsInnerWindow());
NS_ASSERTION(nsContentUtils::IsSafeToRunScript(),
"Must be safe to run script here.");
@@ -10306,7 +10337,7 @@ nsGlobalWindow::GetComputedStyleHelper(Element& aElt,
DOMStorage*
nsGlobalWindow::GetSessionStorage(ErrorResult& aError)
{
FORWARD_TO_INNER_OR_THROW(GetSessionStorage, (aError), aError, nullptr);
MOZ_RELEASE_ASSERT(IsInnerWindow());
nsIPrincipal *principal = GetPrincipal();
nsIDocShell* docShell = GetDocShell();
@@ -10385,6 +10416,8 @@ nsGlobalWindow::GetSessionStorage(ErrorResult& aError)
NS_IMETHODIMP
nsGlobalWindow::GetSessionStorage(nsISupports** aSessionStorage)
{
FORWARD_TO_INNER(GetSessionStorage, (aSessionStorage), NS_ERROR_FAILURE);
ErrorResult rv;
nsCOMPtr<nsIDOMStorage> storage = GetSessionStorage(rv);
storage.forget(aSessionStorage);
@@ -10395,7 +10428,7 @@ nsGlobalWindow::GetSessionStorage(nsISupports** aSessionStorage)
DOMStorage*
nsGlobalWindow::GetLocalStorage(ErrorResult& aError)
{
FORWARD_TO_INNER_OR_THROW(GetLocalStorage, (aError), aError, nullptr);
MOZ_RELEASE_ASSERT(IsInnerWindow());
if (!Preferences::GetBool(kStorageEnabled)) {
return nullptr;
@@ -10451,6 +10484,7 @@ NS_IMETHODIMP
nsGlobalWindow::GetLocalStorage(nsISupports** aLocalStorage)
{
NS_ENSURE_ARG(aLocalStorage);
FORWARD_TO_INNER(GetLocalStorage, (aLocalStorage), NS_ERROR_UNEXPECTED);
ErrorResult rv;
nsCOMPtr<nsIDOMStorage> storage = GetLocalStorage(rv);
@@ -10462,6 +10496,7 @@ nsGlobalWindow::GetLocalStorage(nsISupports** aLocalStorage)
IDBFactory*
nsGlobalWindow::GetIndexedDB(ErrorResult& aError)
{
MOZ_RELEASE_ASSERT(IsInnerWindow());
if (!mIndexedDB) {
// This may keep mIndexedDB null without setting an error.
aError = IDBFactory::CreateForWindow(this, getter_AddRefs(mIndexedDB));
@@ -10564,13 +10599,9 @@ already_AddRefed<CacheStorage>
nsGlobalWindow::GetCaches(ErrorResult& aRv)
{
if (!mCacheStorage) {
bool forceTrustedOrigin = false;
if (IsOuterWindow()) {
forceTrustedOrigin = GetServiceWorkersTestingEnabled();
} else {
nsRefPtr<nsGlobalWindow> outer = GetOuterWindowInternal();
forceTrustedOrigin = outer->GetServiceWorkersTestingEnabled();
}
bool forceTrustedOrigin =
GetOuterWindowInternal()->GetServiceWorkersTestingEnabled();
mCacheStorage = CacheStorage::CreateOnMainThread(cache::DEFAULT_NAMESPACE,
this, GetPrincipal(),
IsPrivateBrowsing(),
@@ -12409,8 +12440,7 @@ nsGlobalWindow::RunTimeout(nsTimeout *aTimeout)
void
nsGlobalWindow::ClearTimeoutOrInterval(int32_t aTimerID, ErrorResult& aError)
{
FORWARD_TO_INNER_OR_THROW(ClearTimeoutOrInterval, (aTimerID, aError),
aError, );
MOZ_RELEASE_ASSERT(IsInnerWindow());
uint32_t public_id = (uint32_t)aTimerID;
nsTimeout *timeout;
@@ -13654,6 +13684,8 @@ nsGlobalWindow::NotifyDefaultButtonLoaded(Element& aDefaultButton,
NS_IMETHODIMP
nsGlobalChromeWindow::GetMessageManager(nsIMessageBroadcaster** aManager)
{
FORWARD_TO_INNER_CHROME(GetMessageManager, (aManager), NS_ERROR_UNEXPECTED);
ErrorResult rv;
NS_IF_ADDREF(*aManager = GetMessageManager(rv));
return rv.StealNSResult();
@@ -13662,8 +13694,8 @@ nsGlobalChromeWindow::GetMessageManager(nsIMessageBroadcaster** aManager)
nsIMessageBroadcaster*
nsGlobalWindow::GetMessageManager(ErrorResult& aError)
{
FORWARD_TO_INNER_OR_THROW(GetMessageManager, (aError), aError, nullptr);
MOZ_ASSERT(IsChromeWindow());
MOZ_RELEASE_ASSERT(IsInnerWindow());
nsGlobalChromeWindow* myself = static_cast<nsGlobalChromeWindow*>(this);
if (!myself->mMessageManager) {
nsCOMPtr<nsIMessageBroadcaster> globalMM =
@@ -13680,6 +13712,8 @@ NS_IMETHODIMP
nsGlobalChromeWindow::GetGroupMessageManager(const nsAString& aGroup,
nsIMessageBroadcaster** aManager)
{
FORWARD_TO_INNER_CHROME(GetGroupMessageManager, (aGroup, aManager), NS_ERROR_UNEXPECTED);
ErrorResult rv;
NS_IF_ADDREF(*aManager = GetGroupMessageManager(aGroup, rv));
return rv.StealNSResult();
@@ -13689,8 +13723,8 @@ nsIMessageBroadcaster*
nsGlobalWindow::GetGroupMessageManager(const nsAString& aGroup,
ErrorResult& aError)
{
FORWARD_TO_INNER_OR_THROW(GetGroupMessageManager, (aGroup, aError), aError, nullptr);
MOZ_ASSERT(IsChromeWindow());
MOZ_RELEASE_ASSERT(IsInnerWindow());
nsGlobalChromeWindow* myself = static_cast<nsGlobalChromeWindow*>(this);
nsCOMPtr<nsIMessageBroadcaster> messageManager =
@@ -13855,6 +13889,8 @@ NS_IMETHODIMP
nsGlobalWindow::GetConsole(JSContext* aCx,
JS::MutableHandle<JS::Value> aConsole)
{
FORWARD_TO_INNER(GetConsole, (aCx, aConsole), NS_ERROR_FAILURE);
ErrorResult rv;
nsRefPtr<Console> console = GetConsole(rv);
if (rv.Failed()) {
@@ -13879,7 +13915,7 @@ nsGlobalWindow::SetConsole(JSContext* aCx, JS::Handle<JS::Value> aValue)
Console*
nsGlobalWindow::GetConsole(ErrorResult& aRv)
{
FORWARD_TO_INNER_OR_THROW(GetConsole, (aRv), aRv, nullptr);
MOZ_RELEASE_ASSERT(IsInnerWindow());
if (!mConsole) {
mConsole = new Console(this);
@@ -13891,7 +13927,7 @@ nsGlobalWindow::GetConsole(ErrorResult& aRv)
already_AddRefed<External>
nsGlobalWindow::GetExternal(ErrorResult& aRv)
{
FORWARD_TO_INNER_OR_THROW(GetExternal, (aRv), aRv, nullptr);
MOZ_RELEASE_ASSERT(IsInnerWindow());
#ifdef HAVE_SIDEBAR
if (!mExternal) {
@@ -13917,7 +13953,7 @@ void
nsGlobalWindow::GetSidebar(OwningExternalOrWindowProxy& aResult,
ErrorResult& aRv)
{
FORWARD_TO_INNER_OR_THROW(GetSidebar, (aResult, aRv), aRv, );
MOZ_RELEASE_ASSERT(IsInnerWindow());
#ifdef HAVE_SIDEBAR
// First check for a named frame named "sidebar"
+8
View File
@@ -893,6 +893,13 @@ public:
mozilla::ErrorResult& aRv);
already_AddRefed<mozilla::dom::External> GetExternal(mozilla::ErrorResult& aRv);
// Exposed only for testing
static bool
TokenizeDialogOptions(nsAString& aToken, nsAString::const_iterator& aIter,
nsAString::const_iterator aEnd);
static void
ConvertDialogOptions(const nsAString& aOptions, nsAString& aResult);
protected:
bool AlertOrConfirm(bool aAlert, const nsAString& aMessage,
mozilla::ErrorResult& aError);
@@ -1622,6 +1629,7 @@ protected:
nsRefPtr<mozilla::dom::Navigator> mNavigator;
nsRefPtr<nsScreen> mScreen;
nsRefPtr<nsDOMWindowList> mFrames;
// All BarProps are inner window only.
nsRefPtr<mozilla::dom::BarProp> mMenubar;
nsRefPtr<mozilla::dom::BarProp> mToolbar;
nsRefPtr<mozilla::dom::BarProp> mLocationbar;
+1
View File
@@ -46,6 +46,7 @@ NS_INTERFACE_MAP_END
nsHistory::nsHistory(nsPIDOMWindow* aInnerWindow)
: mInnerWindow(do_GetWeakReference(aInnerWindow))
{
MOZ_ASSERT(aInnerWindow->IsInnerWindow());
}
nsHistory::~nsHistory()
+1
View File
@@ -25,6 +25,7 @@ using namespace mozilla::dom;
nsScreen::Create(nsPIDOMWindow* aWindow)
{
MOZ_ASSERT(aWindow);
MOZ_ASSERT(aWindow->IsInnerWindow());
if (!aWindow->GetDocShell()) {
return nullptr;
@@ -0,0 +1,138 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "gtest/gtest.h"
#include "nsGlobalWindow.h"
struct dialog_test {
const char* input;
const char* output;
};
void runTokenizeTest(dialog_test& test)
{
NS_ConvertUTF8toUTF16 input(test.input);
nsAString::const_iterator end;
input.EndReading(end);
nsAString::const_iterator iter;
input.BeginReading(iter);
nsAutoString result;
nsAutoString token;
while (nsGlobalWindow::TokenizeDialogOptions(token, iter, end)) {
if (!result.IsEmpty()) {
result.Append(',');
}
result.Append(token);
}
ASSERT_STREQ(test.output, NS_ConvertUTF16toUTF8(result).get()) << "Testing " << test.input;
}
void runTest(dialog_test& test)
{
NS_ConvertUTF8toUTF16 input(test.input);
nsAutoString result;
nsGlobalWindow::ConvertDialogOptions(input, result);
ASSERT_STREQ(test.output, NS_ConvertUTF16toUTF8(result).get()) << "Testing " << test.input;
}
TEST(GlobalWindowDialogOptions, TestDialogTokenize)
{
dialog_test tests[] = {
/// Empty strings
{ "", "" },
{ " ", "" },
{ " ", "" },
// 1 token
{ "a", "a" },
{ " a", "a" },
{ " a ", "a" },
{ "aa", "aa" },
{ " aa", "aa" },
{ " aa ", "aa" },
{ ";", ";" },
{ ":", ":" },
{ "=", "=" },
// 2 tokens
{ "a=", "a,=" },
{ " a= ", "a,=" },
{ " a = ", "a,=" },
{ "aa=", "aa,=" },
{ " aa= ", "aa,=" },
{ " aa = ", "aa,=" },
{ ";= ", ";,=" },
{ "==", "=,=" },
{ "::", ":,:" },
// 3 tokens
{ "a=2", "a,=,2" },
{ "===", "=,=,=" },
{ ";:=", ";,:,=" },
// more
{ "aaa;bbb:ccc", "aaa,;,bbb,:,ccc" },
// sentinel
{ nullptr, nullptr }
};
for (uint32_t i = 0; tests[i].input; ++i) {
runTokenizeTest(tests[i]);
}
}
TEST(GlobalWindowDialogOptions, TestDialogOptions)
{
dialog_test tests[] = {
/// Empty strings
{ "", "" },
{ " ", "" },
{ " ", "" },
// Name without params
{ "a", "" },
{ " a", "" },
{ " a ", "" },
{ "a=", "" },
{ " a= ", "" },
{ " a = ", "" },
// 1 unknown value
{ "a=2", "" },
{ " a=2 ", "" },
{ " a = 2 ", "" },
{ "a:2", "" },
{ " a:2 ", "" },
{ " a : 2 ", "" },
// 1 known value, wrong value
{ "center=2", "" },
{ "center:2", "" },
// 1 known value, good value
{ "center=on", ",centerscreen=1" },
{ "center:on", ",centerscreen=1" },
{ " center : on ", ",centerscreen=1" },
// nonsense stuff
{ " ; ", "" },
// sentinel
{ nullptr, nullptr }
};
for (uint32_t i = 0; tests[i].input; ++i) {
runTest(tests[i]);
}
}
+17
View File
@@ -0,0 +1,17 @@
# -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*-
# vim: set filetype=python:
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, you can obtain one at http://mozilla.org/MPL/2.0/.
UNIFIED_SOURCES += [
'TestParserDialogOptions.cpp',
]
LOCAL_INCLUDES += [
'/dom/base'
]
include('/ipc/chromium/chromium-config.mozbuild')
FINAL_LIBRARY = 'xul-gtest'
+1
View File
@@ -660,6 +660,7 @@ skip-if = buildapp == 'b2g' || toolkit == 'android' #bug 904183 # b2g(bug 904183
[test_createHTMLDocument.html]
[test_declare_stylesheet_obsolete.html]
[test_document_constructor.html]
[test_document_importNode_document.html]
[test_domparser_null_char.html]
[test_domparsing.html]
[test_elementTraversal.html]
+4
View File
@@ -36,3 +36,7 @@ MOCHITEST_CHROME_MANIFESTS += [
BROWSER_CHROME_MANIFESTS += [
'browser.ini',
]
TEST_DIRS += [
'gtest',
]
@@ -0,0 +1,32 @@
<!DOCTYPE HTML>
<html>
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=1177914
-->
<head>
<title>Test for Bug 1177914</title>
<script type="text/javascript" src="/MochiKit/MochiKit.js"></script>
<script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
</head>
<body>
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1177914">Mozilla Bug 1177914</a>
<p id="display"></p>
<div id="content" style="display: none">
</div>
<pre id="test">
<script class="testbody" type="text/javascript">
var thrownException = false;
try {
document.importNode(document);
} catch(err) {
thrownException = err;
}
ok(thrownException !== false, "An exception should've been thrown");
is(thrownException.name, "NotSupportedError", "A NotSupportedError exception should've been thrown");
</script>
</pre>
</body>
</html>
@@ -73,6 +73,7 @@ NS_IMPL_CYCLE_COLLECTING_RELEASE(SpeechSynthesis)
SpeechSynthesis::SpeechSynthesis(nsPIDOMWindow* aParent)
: mParent(aParent)
{
MOZ_ASSERT(aParent->IsInnerWindow());
}
SpeechSynthesis::~SpeechSynthesis()
@@ -17,6 +17,8 @@ support-files =
[test_fallback_dest_insertion_points.html]
[test_detached_style.html]
[test_dynamic_content_element_matching.html]
[test_document_adoptnode.html]
[test_document_importnode.html]
[test_document_register.html]
[test_document_register_base_queue.html]
[test_document_register_lifecycle.html]
@@ -0,0 +1,36 @@
<!DOCTYPE HTML>
<html>
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=1177991
-->
<head>
<title>Test for Bug 1177991</title>
<script type="text/javascript" src="/MochiKit/MochiKit.js"></script>
<script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
</head>
<body>
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1177991">Mozilla Bug 1177991</a>
<p id="display"></p>
<div id="content" style="display: none">
</div>
<pre id="test">
<script class="testbody" type="text/javascript">
var thrownException = false;
var shadowRoot = document.createElement('a').createShadowRoot();
try {
document.adoptNode(shadowRoot);
} catch(err) {
thrownException = err;
}
ok(thrownException !== false, "A HierarchyRequestError");
is(thrownException.name, "HierarchyRequestError", "A HierarchyRequestError should've been thrown");
</script>
</pre>
</body>
</html>
@@ -0,0 +1,37 @@
<!DOCTYPE HTML>
<html>
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=1177914
-->
<head>
<title>Test for Bug 1177914</title>
<script type="text/javascript" src="/MochiKit/MochiKit.js"></script>
<script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
</head>
<body>
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1177914">Mozilla Bug 1177914</a>
<p id="display"></p>
<div id="content" style="display: none">
</div>
<pre id="test">
<script class="testbody" type="text/javascript">
var thrownException = false;
var shadowRoot = document.createElement('a').createShadowRoot();
try {
document.importNode(shadowRoot);
} catch(err) {
thrownException = err;
}
ok(thrownException !== false, "An exception should've been thrown");
is(thrownException.name, "NotSupportedError", "A NotSupportedError exception should've been thrown");
</script>
</pre>
</body>
</html>
+7
View File
@@ -1962,8 +1962,15 @@ void nsXULWindow::PlaceWindowLayersBehind(uint32_t aLowLevel,
void nsXULWindow::SetContentScrollbarVisibility(bool aVisible)
{
nsCOMPtr<nsPIDOMWindow> contentWin(do_GetInterface(mPrimaryContentShell));
if (!contentWin) {
return;
}
MOZ_ASSERT(contentWin->IsOuterWindow());
contentWin = contentWin->GetCurrentInnerWindow();
if (contentWin) {
mozilla::ErrorResult rv;
nsRefPtr<nsGlobalWindow> window = static_cast<nsGlobalWindow*>(contentWin.get());
nsRefPtr<mozilla::dom::BarProp> scrollbars = window->GetScrollbars(rv);
if (scrollbars) {