Bug 1410074: Make the caller type from MatchMedia arrive to the CSS code. r=xidorn,bz

MozReview-Commit-ID: LUiobfHSUq1
This commit is contained in:
Emilio Cobos Álvarez 2017-10-19 16:06:50 +02:00
Родитель e02b370847
Коммит d631a75643
13 изменённых файлов: 69 добавлений и 30 удалений

Просмотреть файл

@ -7459,9 +7459,11 @@ nsDocument::ClearBoxObjectFor(nsIContent* aContent)
}
already_AddRefed<MediaQueryList>
nsIDocument::MatchMedia(const nsAString& aMediaQueryList)
nsIDocument::MatchMedia(const nsAString& aMediaQueryList,
CallerType aCallerType)
{
RefPtr<MediaQueryList> result = new MediaQueryList(this, aMediaQueryList);
RefPtr<MediaQueryList> result =
new MediaQueryList(this, aMediaQueryList, aCallerType);
mDOMMediaQueryLists.insertBack(result);

Просмотреть файл

@ -6319,7 +6319,8 @@ nsGlobalWindow::CancelAnimationFrame(int32_t aHandle, ErrorResult& aError)
}
already_AddRefed<MediaQueryList>
nsGlobalWindow::MatchMediaOuter(const nsAString& aMediaQueryList)
nsGlobalWindow::MatchMediaOuter(const nsAString& aMediaQueryList,
CallerType aCallerType)
{
MOZ_RELEASE_ASSERT(IsOuterWindow());
@ -6327,18 +6328,19 @@ nsGlobalWindow::MatchMediaOuter(const nsAString& aMediaQueryList)
return nullptr;
}
return mDoc->MatchMedia(aMediaQueryList);
return mDoc->MatchMedia(aMediaQueryList, aCallerType);
}
already_AddRefed<MediaQueryList>
nsGlobalWindow::MatchMedia(const nsAString& aMediaQueryList,
CallerType aCallerType,
ErrorResult& aError)
{
// FIXME: This whole forward-to-outer and then get a pres
// shell/context off the docshell dance is sort of silly; it'd make
// more sense to forward to the inner, but it's what everyone else
// (GetSelection, GetScrollXY, etc.) does around here.
FORWARD_TO_OUTER_OR_THROW(MatchMediaOuter, (aMediaQueryList), aError, nullptr);
FORWARD_TO_OUTER_OR_THROW(MatchMediaOuter, (aMediaQueryList, aCallerType), aError, nullptr);
}
void

Просмотреть файл

@ -1041,9 +1041,13 @@ public:
already_AddRefed<nsICSSDeclaration>
GetComputedStyle(mozilla::dom::Element& aElt, const nsAString& aPseudoElt,
mozilla::ErrorResult& aError) override;
already_AddRefed<mozilla::dom::MediaQueryList> MatchMediaOuter(const nsAString& aQuery);
already_AddRefed<mozilla::dom::MediaQueryList> MatchMedia(const nsAString& aQuery,
mozilla::ErrorResult& aError);
already_AddRefed<mozilla::dom::MediaQueryList> MatchMediaOuter(
const nsAString& aQuery,
mozilla::dom::CallerType aCallerType);
already_AddRefed<mozilla::dom::MediaQueryList> MatchMedia(
const nsAString& aQuery,
mozilla::dom::CallerType aCallerType,
mozilla::ErrorResult& aError);
nsScreen* GetScreen(mozilla::ErrorResult& aError);
nsIDOMScreen* GetScreen() override;
void MoveToOuter(int32_t aXPos, int32_t aYPos,

Просмотреть файл

@ -2078,7 +2078,8 @@ public:
*/
already_AddRefed<mozilla::dom::MediaQueryList>
MatchMedia(const nsAString& aMediaQueryList);
MatchMedia(const nsAString& aMediaQueryList,
mozilla::dom::CallerType aCallerType);
mozilla::LinkedList<mozilla::dom::MediaQueryList>& MediaQueryLists() {
return mDOMMediaQueryLists;

Просмотреть файл

@ -141,8 +141,8 @@ dictionary ScrollToOptions : ScrollOptions {
};
partial interface Window {
//[Throws,NewObject] MediaQueryList matchMedia(DOMString query);
[Throws,NewObject] MediaQueryList? matchMedia(DOMString query);
//[Throws, NewObject, NeedsCallerType] MediaQueryList matchMedia(DOMString query);
[Throws, NewObject, NeedsCallerType] MediaQueryList? matchMedia(DOMString query);
// Per spec, screen is SameObject, but we don't actually guarantee that given
// nsGlobalWindow::Cleanup. :(
//[SameObject, Replaceable, Throws] readonly attribute Screen screen;

Просмотреть файл

@ -72,16 +72,19 @@ MediaList::DoMediaChange(Func aCallback)
}
/* static */ already_AddRefed<MediaList>
MediaList::Create(StyleBackendType aBackendType, const nsAString& aMedia)
MediaList::Create(
StyleBackendType aBackendType,
const nsAString& aMedia,
CallerType aCallerType)
{
if (aBackendType == StyleBackendType::Servo) {
RefPtr<ServoMediaList> mediaList = new ServoMediaList(aMedia);
RefPtr<ServoMediaList> mediaList = new ServoMediaList(aMedia, aCallerType);
return mediaList.forget();
}
nsCSSParser parser;
RefPtr<nsMediaList> mediaList = new nsMediaList();
parser.ParseMediaList(aMedia, nullptr, 0, mediaList);
parser.ParseMediaList(aMedia, nullptr, 0, mediaList, aCallerType);
return mediaList.forget();
}

Просмотреть файл

@ -44,7 +44,9 @@ public:
* Creates a MediaList backed by the given StyleBackendType.
*/
static already_AddRefed<MediaList> Create(StyleBackendType,
const nsAString& aMedia);
const nsAString& aMedia,
CallerType aCallerType =
CallerType::NonSystem);
virtual already_AddRefed<MediaList> Clone() = 0;

Просмотреть файл

@ -21,12 +21,15 @@ namespace mozilla {
namespace dom {
MediaQueryList::MediaQueryList(nsIDocument* aDocument,
const nsAString& aMediaQueryList)
const nsAString& aMediaQueryList,
CallerType aCallerType)
: mDocument(aDocument)
, mMatchesValid(false)
{
mMediaList =
MediaList::Create(aDocument->GetStyleBackendType(), aMediaQueryList);
MediaList::Create(aDocument->GetStyleBackendType(),
aMediaQueryList,
aCallerType);
KeepAliveIfHasListenersFor(ONCHANGE_STRING);
}

Просмотреть файл

@ -32,8 +32,9 @@ class MediaQueryList final : public DOMEventTargetHelper,
public:
// The caller who constructs is responsible for calling Evaluate
// before calling any other methods.
MediaQueryList(nsIDocument *aDocument,
const nsAString &aMediaQueryList);
MediaQueryList(nsIDocument* aDocument,
const nsAString& aMediaQueryList,
mozilla::dom::CallerType aCallerType);
private:
~MediaQueryList();

Просмотреть файл

@ -26,10 +26,11 @@ ServoMediaList::ServoMediaList()
{
}
ServoMediaList::ServoMediaList(const nsAString& aMedia)
ServoMediaList::ServoMediaList(const nsAString& aMedia,
dom::CallerType aCallerType)
: ServoMediaList()
{
SetText(aMedia);
SetTextInternal(aMedia, aCallerType);
}
void
@ -40,6 +41,13 @@ ServoMediaList::GetText(nsAString& aMediaText)
void
ServoMediaList::SetText(const nsAString& aMediaText)
{
SetTextInternal(aMediaText, dom::CallerType::NonSystem);
}
void
ServoMediaList::SetTextInternal(const nsAString& aMediaText,
dom::CallerType aCallerType)
{
NS_ConvertUTF16toUTF8 mediaText(aMediaText);
Servo_MediaList_SetText(mRawList, &mediaText);

Просмотреть файл

@ -19,7 +19,7 @@ class ServoMediaList final : public dom::MediaList
public:
explicit ServoMediaList(already_AddRefed<RawServoMediaList> aRawList)
: mRawList(aRawList) {}
explicit ServoMediaList(const nsAString& aMedia);
ServoMediaList(const nsAString& aMedia, dom::CallerType);
ServoMediaList();
already_AddRefed<dom::MediaList> Clone() final;
@ -42,6 +42,7 @@ public:
protected:
nsresult Delete(const nsAString& aOldMedium) final;
nsresult Append(const nsAString& aNewMedium) final;
void SetTextInternal(const nsAString& aMediaText, dom::CallerType);
~ServoMediaList() {}

Просмотреть файл

@ -199,7 +199,8 @@ public:
void ParseMediaList(const nsAString& aBuffer,
nsIURI* aURL, // for error reporting
uint32_t aLineNumber, // for error reporting
nsMediaList* aMediaList);
nsMediaList* aMediaList,
mozilla::dom::CallerType aCallerType);
bool ParseSourceSizeList(const nsAString& aBuffer,
nsIURI* aURI, // for error reporting
@ -495,7 +496,8 @@ protected:
void InitScanner(nsCSSScanner& aScanner,
css::ErrorReporter& aReporter,
nsIURI* aSheetURI, nsIURI* aBaseURI,
nsIPrincipal* aSheetPrincipal);
nsIPrincipal* aSheetPrincipal,
dom::CallerType aCallerType = dom::CallerType::NonSystem);
void ReleaseScanner(void);
/**
@ -1327,6 +1329,9 @@ protected:
nsXMLNameSpaceMap *mNameSpaceMap; // weak, mSheet owns it
// Whether the caller of the DOM API that invoked us is chrome or not.
dom::CallerType mDomCallerType = dom::CallerType::NonSystem;
// After an UngetToken is done this flag is true. The next call to
// GetToken clears the flag.
bool mHavePushBack : 1;
@ -1547,7 +1552,8 @@ void
CSSParserImpl::InitScanner(nsCSSScanner& aScanner,
css::ErrorReporter& aReporter,
nsIURI* aSheetURI, nsIURI* aBaseURI,
nsIPrincipal* aSheetPrincipal)
nsIPrincipal* aSheetPrincipal,
dom::CallerType aCallerType)
{
NS_PRECONDITION(!mParsingCompoundProperty, "Bad initial state");
NS_PRECONDITION(!mScanner, "already have scanner");
@ -1560,6 +1566,7 @@ CSSParserImpl::InitScanner(nsCSSScanner& aScanner,
mSheetURI = aSheetURI;
mSheetPrincipal = aSheetPrincipal;
mHavePushBack = false;
mDomCallerType = aCallerType;
}
void
@ -1570,6 +1577,7 @@ CSSParserImpl::ReleaseScanner()
mBaseURI = nullptr;
mSheetURI = nullptr;
mSheetPrincipal = nullptr;
mDomCallerType = dom::CallerType::NonSystem;
}
nsresult
@ -1996,7 +2004,8 @@ void
CSSParserImpl::ParseMediaList(const nsAString& aBuffer,
nsIURI* aURI, // for error reporting
uint32_t aLineNumber, // for error reporting
nsMediaList* aMediaList)
nsMediaList* aMediaList,
dom::CallerType aCallerType)
{
// XXX Are there cases where the caller wants to keep what it already
// has in case of parser error? If GatherMedia ever changes to return
@ -2006,7 +2015,7 @@ CSSParserImpl::ParseMediaList(const nsAString& aBuffer,
// fake base URI since media lists don't have URIs in them
nsCSSScanner scanner(aBuffer, aLineNumber);
css::ErrorReporter reporter(scanner, mSheet, mChildLoader, aURI);
InitScanner(scanner, reporter, aURI, aURI, nullptr);
InitScanner(scanner, reporter, aURI, aURI, nullptr, aCallerType);
DebugOnly<bool> parsedOK = GatherMedia(aMediaList, false);
NS_ASSERTION(parsedOK, "GatherMedia returned false; we probably want to avoid "
@ -18009,10 +18018,11 @@ void
nsCSSParser::ParseMediaList(const nsAString& aBuffer,
nsIURI* aURI,
uint32_t aLineNumber,
nsMediaList* aMediaList)
nsMediaList* aMediaList,
dom::CallerType aCallerType)
{
static_cast<CSSParserImpl*>(mImpl)->
ParseMediaList(aBuffer, aURI, aLineNumber, aMediaList);
ParseMediaList(aBuffer, aURI, aLineNumber, aMediaList, aCallerType);
}
bool

Просмотреть файл

@ -164,7 +164,9 @@ public:
void ParseMediaList(const nsAString& aBuffer,
nsIURI* aURL,
uint32_t aLineNumber,
nsMediaList* aMediaList);
nsMediaList* aMediaList,
mozilla::dom::CallerType aCallerType =
mozilla::dom::CallerType::NonSystem);
/*
* Parse aBuffer into a list of media queries and their associated values,