зеркало из https://github.com/mozilla/gecko-dev.git
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:
Родитель
e02b370847
Коммит
d631a75643
|
@ -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,
|
||||
|
|
Загрузка…
Ссылка в новой задаче