Bug 1430608: Make nsMediaFeatures work with a document, not a pres context. r=heycam

Returning a zero-sized viewport in the case there's no shell / pres context.

For now, no other change yet. After this we can start tweaking the ShadowRoot
Stylist setup, and even try to return computed styles without a document \o/.

MozReview-Commit-ID: 3cT2PKQISri
This commit is contained in:
Emilio Cobos Álvarez 2018-01-15 15:33:25 +01:00
parent 56cc5a0fb8
commit 141792488a
8 changed files with 190 additions and 154 deletions

View file

@ -2215,6 +2215,16 @@ public:
mIsBeingUsedAsImage = true; mIsBeingUsedAsImage = true;
} }
bool IsSVGGlyphsDocument() const
{
return mIsSVGGlyphsDocument;
}
void SetIsSVGGlyphsDocument()
{
mIsSVGGlyphsDocument = true;
}
bool IsResourceDoc() const { bool IsResourceDoc() const {
return IsBeingUsedAsImage() || // Are we a helper-doc for an SVG image? return IsBeingUsedAsImage() || // Are we a helper-doc for an SVG image?
mHasDisplayDocument; // Are we an external resource doc? mHasDisplayDocument; // Are we an external resource doc?
@ -3542,6 +3552,9 @@ protected:
// created. // created.
bool mIsShadowDOMEnabled : 1; bool mIsShadowDOMEnabled : 1;
// True if this document is for an SVG-in-OpenType font.
bool mIsSVGGlyphsDocument : 1;
// Whether <style scoped> support is enabled in this document. // Whether <style scoped> support is enabled in this document.
enum { eScopedStyle_Unknown, eScopedStyle_Disabled, eScopedStyle_Enabled }; enum { eScopedStyle_Unknown, eScopedStyle_Disabled, eScopedStyle_Enabled };
unsigned int mIsScopedStyleEnabled : 2; unsigned int mIsScopedStyleEnabled : 2;

View file

@ -157,11 +157,8 @@ gfxSVGGlyphsDocument::SetupPresentation()
nsCOMPtr<nsIPresShell> presShell; nsCOMPtr<nsIPresShell> presShell;
rv = viewer->GetPresShell(getter_AddRefs(presShell)); rv = viewer->GetPresShell(getter_AddRefs(presShell));
NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_SUCCESS(rv, rv);
nsPresContext* presContext = presShell->GetPresContext();
presContext->SetIsGlyph(true);
if (!presShell->DidInitialize()) { if (!presShell->DidInitialize()) {
nsRect rect = presContext->GetVisibleArea(); nsRect rect = presShell->GetPresContext()->GetVisibleArea();
rv = presShell->Initialize(rect.Width(), rect.Height()); rv = presShell->Initialize(rect.Width(), rect.Height());
NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_SUCCESS(rv, rv);
} }
@ -395,6 +392,7 @@ gfxSVGGlyphsDocument::ParseDocument(const uint8_t *aBuffer, uint32_t aBufLen)
// Set this early because various decisions during page-load depend on it. // Set this early because various decisions during page-load depend on it.
document->SetIsBeingUsedAsImage(); document->SetIsBeingUsedAsImage();
document->SetIsSVGGlyphsDocument();
document->SetReadyStateInternal(nsIDocument::READYSTATE_UNINITIALIZED); document->SetReadyStateInternal(nsIDocument::READYSTATE_UNINITIALIZED);
nsCOMPtr<nsIStreamListener> listener; nsCOMPtr<nsIStreamListener> listener;

View file

@ -1131,14 +1131,6 @@ public:
void NotifyNonBlankPaint(); void NotifyNonBlankPaint();
bool IsGlyph() const {
return mIsGlyph;
}
void SetIsGlyph(bool aValue) {
mIsGlyph = aValue;
}
bool UsesRootEMUnits() const { bool UsesRootEMUnits() const {
return mUsesRootEMUnits; return mUsesRootEMUnits;
} }

View file

@ -85,130 +85,145 @@ const OperatingSystemVersionInfo osVersionStrings[] = {
}; };
#endif #endif
static nsPresContext*
GetPresContext(nsIDocument* aDocument)
{
nsIPresShell* presShell = aDocument->GetShell();
if (!presShell) {
return nullptr;
}
return presShell->GetPresContext();
}
// A helper for four features below // A helper for four features below
static nsSize static nsSize
GetSize(nsPresContext* aPresContext) GetSize(nsIDocument* aDocument)
{ {
nsSize size; nsPresContext* pc = GetPresContext(aDocument);
if (aPresContext->IsRootPaginatedDocument())
// Per spec, return a 0x0 viewport if we're not being rendered. See:
//
// * https://github.com/w3c/csswg-drafts/issues/571
// * https://github.com/whatwg/html/issues/1813
//
if (!pc) {
return { };
}
if (pc->IsRootPaginatedDocument()) {
// We want the page size, including unprintable areas and margins. // We want the page size, including unprintable areas and margins.
size = aPresContext->GetPageSize(); //
else // FIXME(emilio, bug 1414600): Not quite!
size = aPresContext->GetVisibleArea().Size(); return pc->GetPageSize();
return size; }
return pc->GetVisibleArea().Size();
} }
static void static void
GetWidth(nsPresContext* aPresContext, const nsMediaFeature*, GetWidth(nsIDocument* aDocument, const nsMediaFeature*,
nsCSSValue& aResult) nsCSSValue& aResult)
{ {
nsSize size = GetSize(aPresContext); nsSize size = GetSize(aDocument);
float pixelWidth = aPresContext->AppUnitsToFloatCSSPixels(size.width); aResult.SetFloatValue(CSSPixel::FromAppUnits(size.width), eCSSUnit_Pixel);
aResult.SetFloatValue(pixelWidth, eCSSUnit_Pixel);
} }
static void static void
GetHeight(nsPresContext* aPresContext, const nsMediaFeature*, GetHeight(nsIDocument* aDocument, const nsMediaFeature*,
nsCSSValue& aResult) nsCSSValue& aResult)
{ {
nsSize size = GetSize(aPresContext); nsSize size = GetSize(aDocument);
float pixelHeight = aPresContext->AppUnitsToFloatCSSPixels(size.height); aResult.SetFloatValue(CSSPixel::FromAppUnits(size.height), eCSSUnit_Pixel);
aResult.SetFloatValue(pixelHeight, eCSSUnit_Pixel);
}
inline static nsDeviceContext*
GetDeviceContextFor(nsPresContext* aPresContext)
{
// It would be nice to call
// nsLayoutUtils::GetDeviceContextForScreenInfo here, except for two
// things: (1) it can flush, and flushing is bad here, and (2) it
// doesn't really get us consistency in multi-monitor situations
// *anyway*.
return aPresContext->DeviceContext();
} }
static bool static bool
ShouldResistFingerprinting(nsPresContext* aPresContext) ShouldResistFingerprinting(nsIDocument* aDocument)
{ {
return nsContentUtils::ShouldResistFingerprinting(aPresContext->GetDocShell()); return nsContentUtils::ShouldResistFingerprinting(aDocument->GetDocShell());
}
static bool
IsDeviceSizePageSize(nsIDocument* aDocument)
{
nsIDocShell* docShell = aDocument->GetDocShell();
if (!docShell) {
return false;
}
return docShell->GetDeviceSizeIsPageSize();
} }
// A helper for three features below. // A helper for three features below.
static nsSize static nsSize
GetDeviceSize(nsPresContext* aPresContext) GetDeviceSize(nsIDocument* aDocument)
{ {
nsSize size; if (ShouldResistFingerprinting(aDocument) || IsDeviceSizePageSize(aDocument)) {
return GetSize(aDocument);
}
if (ShouldResistFingerprinting(aPresContext) || aPresContext->IsDeviceSizePageSize()) { nsPresContext* pc = GetPresContext(aDocument);
size = GetSize(aPresContext); // NOTE(emilio): We should probably figure out how to return an appropriate
} else if (aPresContext->IsRootPaginatedDocument()) { // device size here, though in a multi-screen world that makes no sense
// really.
if (!pc) {
return { };
}
if (pc->IsRootPaginatedDocument()) {
// We want the page size, including unprintable areas and margins. // We want the page size, including unprintable areas and margins.
// XXX The spec actually says we want the "page sheet size", but // XXX The spec actually says we want the "page sheet size", but
// how is that different? // how is that different?
size = aPresContext->GetPageSize(); return pc->GetPageSize();
} else {
GetDeviceContextFor(aPresContext)->
GetDeviceSurfaceDimensions(size.width, size.height);
} }
nsSize size;
pc->DeviceContext()->GetDeviceSurfaceDimensions(size.width, size.height);
return size; return size;
} }
static void static void
GetDeviceWidth(nsPresContext* aPresContext, const nsMediaFeature*, GetDeviceWidth(nsIDocument* aDocument, const nsMediaFeature*,
nsCSSValue& aResult) nsCSSValue& aResult)
{ {
nsSize size = GetDeviceSize(aPresContext); nsSize size = GetDeviceSize(aDocument);
float pixelWidth = aPresContext->AppUnitsToFloatCSSPixels(size.width); aResult.SetFloatValue(CSSPixel::FromAppUnits(size.width), eCSSUnit_Pixel);
aResult.SetFloatValue(pixelWidth, eCSSUnit_Pixel);
} }
static void static void
GetDeviceHeight(nsPresContext* aPresContext, const nsMediaFeature*, GetDeviceHeight(nsIDocument* aDocument, const nsMediaFeature*,
nsCSSValue& aResult) nsCSSValue& aResult)
{ {
nsSize size = GetDeviceSize(aPresContext); nsSize size = GetDeviceSize(aDocument);
float pixelHeight = aPresContext->AppUnitsToFloatCSSPixels(size.height); aResult.SetFloatValue(CSSPixel::FromAppUnits(size.height), eCSSUnit_Pixel);
aResult.SetFloatValue(pixelHeight, eCSSUnit_Pixel);
} }
static void static void
GetOrientation(nsPresContext* aPresContext, const nsMediaFeature*, GetOrientation(nsIDocument* aDocument, const nsMediaFeature*,
nsCSSValue& aResult) nsCSSValue& aResult)
{ {
nsSize size = GetSize(aPresContext); nsSize size = GetSize(aDocument);
int32_t orientation; // Per spec, square viewports should be 'portrait'
if (size.width > size.height) { int32_t orientation = size.width > size.height
orientation = NS_STYLE_ORIENTATION_LANDSCAPE; ? NS_STYLE_ORIENTATION_LANDSCAPE : NS_STYLE_ORIENTATION_PORTRAIT;
} else {
// Per spec, square viewports should be 'portrait'
orientation = NS_STYLE_ORIENTATION_PORTRAIT;
}
aResult.SetIntValue(orientation, eCSSUnit_Enumerated); aResult.SetIntValue(orientation, eCSSUnit_Enumerated);
} }
static void static void
GetDeviceOrientation(nsPresContext* aPresContext, const nsMediaFeature*, GetDeviceOrientation(nsIDocument* aDocument, const nsMediaFeature*,
nsCSSValue& aResult) nsCSSValue& aResult)
{ {
nsSize size = GetDeviceSize(aPresContext); nsSize size = GetDeviceSize(aDocument);
int32_t orientation; // Per spec, square viewports should be 'portrait'
if (size.width > size.height) { int32_t orientation = size.width > size.height
orientation = NS_STYLE_ORIENTATION_LANDSCAPE; ? NS_STYLE_ORIENTATION_LANDSCAPE : NS_STYLE_ORIENTATION_PORTRAIT;
} else {
// Per spec, square viewports should be 'portrait'
orientation = NS_STYLE_ORIENTATION_PORTRAIT;
}
aResult.SetIntValue(orientation, eCSSUnit_Enumerated); aResult.SetIntValue(orientation, eCSSUnit_Enumerated);
} }
static void static void
GetIsResourceDocument(nsPresContext* aPresContext, const nsMediaFeature*, GetIsResourceDocument(nsIDocument* aDocument, const nsMediaFeature*,
nsCSSValue& aResult) nsCSSValue& aResult)
{ {
nsIDocument* doc = aPresContext->Document(); aResult.SetIntValue(aDocument->IsResourceDoc() ? 1 : 0, eCSSUnit_Integer);
aResult.SetIntValue(doc && doc->IsResourceDoc() ? 1 : 0, eCSSUnit_Integer);
} }
// Helper for two features below // Helper for two features below
@ -224,32 +239,46 @@ MakeArray(const nsSize& aSize, nsCSSValue& aResult)
} }
static void static void
GetAspectRatio(nsPresContext* aPresContext, const nsMediaFeature*, GetAspectRatio(nsIDocument* aDocument, const nsMediaFeature*,
nsCSSValue& aResult) nsCSSValue& aResult)
{ {
MakeArray(GetSize(aPresContext), aResult); MakeArray(GetSize(aDocument), aResult);
} }
static void static void
GetDeviceAspectRatio(nsPresContext* aPresContext, const nsMediaFeature*, GetDeviceAspectRatio(nsIDocument* aDocument, const nsMediaFeature*,
nsCSSValue& aResult) nsCSSValue& aResult)
{ {
MakeArray(GetDeviceSize(aPresContext), aResult); MakeArray(GetDeviceSize(aDocument), aResult);
}
static nsDeviceContext*
GetDeviceContextFor(nsIDocument* aDocument)
{
nsPresContext* pc = GetPresContext(aDocument);
if (!pc) {
return nullptr;
}
// It would be nice to call nsLayoutUtils::GetDeviceContextForScreenInfo here,
// except for two things: (1) it can flush, and flushing is bad here, and (2)
// it doesn't really get us consistency in multi-monitor situations *anyway*.
return pc->DeviceContext();
} }
static void static void
GetColor(nsPresContext* aPresContext, const nsMediaFeature*, GetColor(nsIDocument* aDocument, const nsMediaFeature*,
nsCSSValue& aResult) nsCSSValue& aResult)
{ {
uint32_t depth = 24; // Use depth of 24 when resisting fingerprinting. // Use depth of 24 when resisting fingerprinting, or when we're not being
// rendered.
uint32_t depth = 24;
if (!ShouldResistFingerprinting(aPresContext)) { if (!ShouldResistFingerprinting(aDocument)) {
// FIXME: This implementation is bogus. nsDeviceContext if (nsDeviceContext* dx = GetDeviceContextFor(aDocument)) {
// doesn't provide reliable information (should be fixed in bug // FIXME: On a monochrome device, return 0!
// 424386). dx->GetDepth(depth);
// FIXME: On a monochrome device, return 0! }
nsDeviceContext *dx = GetDeviceContextFor(aPresContext);
dx->GetDepth(depth);
} }
// The spec says to use bits *per color component*, so divide by 3, // The spec says to use bits *per color component*, so divide by 3,
@ -260,7 +289,7 @@ GetColor(nsPresContext* aPresContext, const nsMediaFeature*,
} }
static void static void
GetColorIndex(nsPresContext* aPresContext, const nsMediaFeature*, GetColorIndex(nsIDocument* aDocument, const nsMediaFeature*,
nsCSSValue& aResult) nsCSSValue& aResult)
{ {
// We should return zero if the device does not use a color lookup // We should return zero if the device does not use a color lookup
@ -273,7 +302,7 @@ GetColorIndex(nsPresContext* aPresContext, const nsMediaFeature*,
} }
static void static void
GetMonochrome(nsPresContext* aPresContext, const nsMediaFeature*, GetMonochrome(nsIDocument* aDocument, const nsMediaFeature*,
nsCSSValue& aResult) nsCSSValue& aResult)
{ {
// For color devices we should return 0. // For color devices we should return 0.
@ -283,7 +312,7 @@ GetMonochrome(nsPresContext* aPresContext, const nsMediaFeature*,
} }
static void static void
GetResolution(nsPresContext* aPresContext, const nsMediaFeature*, GetResolution(nsIDocument* aDocument, const nsMediaFeature*,
nsCSSValue& aResult) nsCSSValue& aResult)
{ {
// We're returning resolution in terms of device pixels per css pixel, since // We're returning resolution in terms of device pixels per css pixel, since
@ -291,23 +320,23 @@ GetResolution(nsPresContext* aPresContext, const nsMediaFeature*,
// introducing precision error from conversion to and from less-used // introducing precision error from conversion to and from less-used
// physical units like inches. // physical units like inches.
float dppx; float dppx = 1.;
if (!ShouldResistFingerprinting(aPresContext)) { if (nsDeviceContext* dx = GetDeviceContextFor(aDocument)) {
// Get the actual device pixel ratio, which also takes zoom into account. if (ShouldResistFingerprinting(aDocument)) {
dppx = float(nsPresContext::AppUnitsPerCSSPixel()) / dppx = dx->GetFullZoom();
aPresContext->AppUnitsPerDevPixel(); } else {
} else { // Get the actual device pixel ratio, which also takes zoom into account.
// We are resisting fingerprinting, so pretend we have a device pixel ratio dppx =
// of 1. In that case, we simply report the zoom level. float(nsPresContext::AppUnitsPerCSSPixel()) / dx->AppUnitsPerDevPixel();
dppx = aPresContext->GetDeviceFullZoom(); }
} }
aResult.SetFloatValue(dppx, eCSSUnit_Pixel); aResult.SetFloatValue(dppx, eCSSUnit_Pixel);
} }
static void static void
GetScan(nsPresContext* aPresContext, const nsMediaFeature*, GetScan(nsIDocument* aDocument, const nsMediaFeature*,
nsCSSValue& aResult) nsCSSValue& aResult)
{ {
// Since Gecko doesn't support the 'tv' media type, the 'scan' // Since Gecko doesn't support the 'tv' media type, the 'scan'
@ -315,35 +344,27 @@ GetScan(nsPresContext* aPresContext, const nsMediaFeature*,
aResult.Reset(); aResult.Reset();
} }
static nsIDocument*
TopDocument(nsIDocument* aDocument)
{
nsIDocument* current = aDocument;
while (nsIDocument* parent = current->GetParentDocument()) {
current = parent;
}
return current;
}
static void static void
GetDisplayMode(nsPresContext* aPresContext, const nsMediaFeature*, GetDisplayMode(nsIDocument* aDocument, const nsMediaFeature*,
nsCSSValue& aResult) nsCSSValue& aResult)
{ {
nsCOMPtr<nsISupports> container; nsIDocument* rootDocument = TopDocument(aDocument);
RefPtr<nsIDocShell> docShell;
if (!aPresContext) { nsCOMPtr<nsISupports> container = rootDocument->GetContainer();
aResult.SetIntValue(NS_STYLE_DISPLAY_MODE_BROWSER, eCSSUnit_Enumerated); if (nsCOMPtr<nsIBaseWindow> baseWindow = do_QueryInterface(container)) {
return;
}
if (aPresContext) {
// Calling GetRootPresContext() can be slow, so make sure to call it
// just once.
nsRootPresContext* root = aPresContext->GetRootPresContext();
if (root && root->Document()) {
container = root->Document()->GetContainer();
docShell = root->GetDocShell();
}
}
nsCOMPtr<nsIBaseWindow> baseWindow = do_QueryInterface(container);
if (baseWindow) {
nsCOMPtr<nsIWidget> mainWidget; nsCOMPtr<nsIWidget> mainWidget;
baseWindow->GetMainWidget(getter_AddRefs(mainWidget)); baseWindow->GetMainWidget(getter_AddRefs(mainWidget));
nsSizeMode mode = mainWidget ? mainWidget->SizeMode() : nsSizeMode_Normal; if (mainWidget && mainWidget->SizeMode() == nsSizeMode_Fullscreen) {
if (mode == nsSizeMode_Fullscreen) {
aResult.SetIntValue(NS_STYLE_DISPLAY_MODE_FULLSCREEN, eCSSUnit_Enumerated); aResult.SetIntValue(NS_STYLE_DISPLAY_MODE_FULLSCREEN, eCSSUnit_Enumerated);
return; return;
} }
@ -356,7 +377,7 @@ GetDisplayMode(nsPresContext* aPresContext, const nsMediaFeature*,
"nsIDocShell display modes must mach nsStyleConsts.h"); "nsIDocShell display modes must mach nsStyleConsts.h");
uint32_t displayMode = NS_STYLE_DISPLAY_MODE_BROWSER; uint32_t displayMode = NS_STYLE_DISPLAY_MODE_BROWSER;
if (docShell) { if (nsIDocShell* docShell = rootDocument->GetDocShell()) {
docShell->GetDisplayMode(&displayMode); docShell->GetDisplayMode(&displayMode);
} }
@ -364,7 +385,7 @@ GetDisplayMode(nsPresContext* aPresContext, const nsMediaFeature*,
} }
static void static void
GetGrid(nsPresContext* aPresContext, const nsMediaFeature*, GetGrid(nsIDocument* aDocument, const nsMediaFeature*,
nsCSSValue& aResult) nsCSSValue& aResult)
{ {
// Gecko doesn't support grid devices (e.g., ttys), so the 'grid' // Gecko doesn't support grid devices (e.g., ttys), so the 'grid'
@ -373,19 +394,32 @@ GetGrid(nsPresContext* aPresContext, const nsMediaFeature*,
} }
static void static void
GetDevicePixelRatio(nsPresContext* aPresContext, const nsMediaFeature*, GetDevicePixelRatio(nsIDocument* aDocument, const nsMediaFeature*,
nsCSSValue& aResult) nsCSSValue& aResult)
{ {
if (!ShouldResistFingerprinting(aPresContext)) { if (ShouldResistFingerprinting(aDocument)) {
float ratio = aPresContext->CSSPixelsToDevPixels(1.0f);
aResult.SetFloatValue(ratio, eCSSUnit_Number);
} else {
aResult.SetFloatValue(1.0, eCSSUnit_Number); aResult.SetFloatValue(1.0, eCSSUnit_Number);
return;
} }
nsIPresShell* presShell = aDocument->GetShell();
if (!presShell) {
aResult.SetFloatValue(1.0, eCSSUnit_Number);
return;
}
nsPresContext* pc = presShell->GetPresContext();
if (!pc) {
aResult.SetFloatValue(1.0, eCSSUnit_Number);
return;
}
float ratio = pc->CSSPixelsToDevPixels(1.0f);
aResult.SetFloatValue(ratio, eCSSUnit_Number);
} }
static void static void
GetTransform3d(nsPresContext* aPresContext, const nsMediaFeature*, GetTransform3d(nsIDocument* aDocument, const nsMediaFeature*,
nsCSSValue& aResult) nsCSSValue& aResult)
{ {
// Gecko supports 3d transforms, so this feature is always 1. // Gecko supports 3d transforms, so this feature is always 1.
@ -409,7 +443,7 @@ GetWindowsThemeIdentifier()
#endif #endif
static void static void
GetSystemMetric(nsPresContext* aPresContext, const nsMediaFeature* aFeature, GetSystemMetric(nsIDocument* aDocument, const nsMediaFeature* aFeature,
nsCSSValue& aResult) nsCSSValue& aResult)
{ {
aResult.Reset(); aResult.Reset();
@ -420,8 +454,7 @@ GetSystemMetric(nsPresContext* aPresContext, const nsMediaFeature* aFeature,
MOZ_ASSERT(!isAccessibleFromContentPages || MOZ_ASSERT(!isAccessibleFromContentPages ||
*aFeature->mName == nsGkAtoms::_moz_touch_enabled); *aFeature->mName == nsGkAtoms::_moz_touch_enabled);
if (isAccessibleFromContentPages && if (isAccessibleFromContentPages && ShouldResistFingerprinting(aDocument)) {
ShouldResistFingerprinting(aPresContext)) {
// If "privacy.resistFingerprinting" is enabled, then we simply don't // If "privacy.resistFingerprinting" is enabled, then we simply don't
// return any system-backed media feature values. (No spoofed values // return any system-backed media feature values. (No spoofed values
// returned.) // returned.)
@ -437,13 +470,13 @@ GetSystemMetric(nsPresContext* aPresContext, const nsMediaFeature* aFeature,
} }
static void static void
GetWindowsTheme(nsPresContext* aPresContext, const nsMediaFeature* aFeature, GetWindowsTheme(nsIDocument* aDocument, const nsMediaFeature* aFeature,
nsCSSValue& aResult) nsCSSValue& aResult)
{ {
aResult.Reset(); aResult.Reset();
MOZ_ASSERT(aFeature->mReqFlags & nsMediaFeature::eUserAgentAndChromeOnly); MOZ_ASSERT(aFeature->mReqFlags & nsMediaFeature::eUserAgentAndChromeOnly);
if (ShouldResistFingerprinting(aPresContext)) { if (ShouldResistFingerprinting(aDocument)) {
return; return;
} }
@ -466,13 +499,13 @@ GetWindowsTheme(nsPresContext* aPresContext, const nsMediaFeature* aFeature,
} }
static void static void
GetOperatingSystemVersion(nsPresContext* aPresContext, const nsMediaFeature* aFeature, GetOperatingSystemVersion(nsIDocument* aDocument, const nsMediaFeature* aFeature,
nsCSSValue& aResult) nsCSSValue& aResult)
{ {
aResult.Reset(); aResult.Reset();
MOZ_ASSERT(aFeature->mReqFlags & nsMediaFeature::eUserAgentAndChromeOnly); MOZ_ASSERT(aFeature->mReqFlags & nsMediaFeature::eUserAgentAndChromeOnly);
if (ShouldResistFingerprinting(aPresContext)) { if (ShouldResistFingerprinting(aDocument)) {
return; return;
} }
@ -493,11 +526,11 @@ GetOperatingSystemVersion(nsPresContext* aPresContext, const nsMediaFeature* aFe
} }
static void static void
GetIsGlyph(nsPresContext* aPresContext, const nsMediaFeature* aFeature, GetIsGlyph(nsIDocument* aDocument, const nsMediaFeature* aFeature,
nsCSSValue& aResult) nsCSSValue& aResult)
{ {
MOZ_ASSERT(aFeature->mReqFlags & nsMediaFeature::eUserAgentAndChromeOnly); MOZ_ASSERT(aFeature->mReqFlags & nsMediaFeature::eUserAgentAndChromeOnly);
aResult.SetIntValue(aPresContext->IsGlyph() ? 1 : 0, eCSSUnit_Integer); aResult.SetIntValue(aDocument->IsSVGGlyphsDocument() ? 1 : 0, eCSSUnit_Integer);
} }
/* static */ void /* static */ void

View file

@ -12,11 +12,11 @@
#include "nsCSSProps.h" #include "nsCSSProps.h"
class nsAtom; class nsAtom;
class nsPresContext; class nsIDocument;
class nsCSSValue; class nsCSSValue;
struct nsMediaFeature; struct nsMediaFeature;
typedef void (*nsMediaFeatureValueGetter)(nsPresContext* aPresContext, typedef void (*nsMediaFeatureValueGetter)(nsIDocument* aDocument,
const nsMediaFeature* aFeature, const nsMediaFeature* aFeature,
nsCSSValue& aResult); nsCSSValue& aResult);

View file

@ -29,7 +29,7 @@ int32_t DoCompare(Numeric a, Numeric b)
} }
bool bool
nsMediaExpression::Matches(nsPresContext *aPresContext, nsMediaExpression::Matches(nsPresContext* aPresContext,
const nsCSSValue& aActualValue) const const nsCSSValue& aActualValue) const
{ {
const nsCSSValue& actual = aActualValue; const nsCSSValue& actual = aActualValue;
@ -221,7 +221,7 @@ nsMediaQueryResultCacheKey::Matches(nsPresContext* aPresContext) const
const FeatureEntry *entry = &mFeatureCache[i]; const FeatureEntry *entry = &mFeatureCache[i];
nsCSSValue actual; nsCSSValue actual;
entry->mFeature->mGetter(aPresContext, entry->mFeature, actual); entry->mFeature->mGetter(aPresContext->Document(), entry->mFeature, actual);
for (uint32_t j = 0; j < entry->mExpressions.Length(); ++j) { for (uint32_t j = 0; j < entry->mExpressions.Length(); ++j) {
const ExpressionEntry &eentry = entry->mExpressions[j]; const ExpressionEntry &eentry = entry->mExpressions[j];
@ -476,7 +476,7 @@ nsMediaQuery::Matches(nsPresContext* aPresContext,
for (uint32_t i = 0, i_end = mExpressions.Length(); match && i < i_end; ++i) { for (uint32_t i = 0, i_end = mExpressions.Length(); match && i < i_end; ++i) {
const nsMediaExpression &expr = mExpressions[i]; const nsMediaExpression &expr = mExpressions[i];
nsCSSValue actual; nsCSSValue actual;
expr.mFeature->mGetter(aPresContext, expr.mFeature, actual); expr.mFeature->mGetter(aPresContext->Document(), expr.mFeature, actual);
match = expr.Matches(aPresContext, actual); match = expr.Matches(aPresContext, actual);
if (aKey) { if (aKey) {

View file

@ -260,7 +260,7 @@ nsSVGDisplayContainerFrame::PaintSVG(gfxContext& aContext,
{ {
NS_ASSERTION(!NS_SVGDisplayListPaintingEnabled() || NS_ASSERTION(!NS_SVGDisplayListPaintingEnabled() ||
(mState & NS_FRAME_IS_NONDISPLAY) || (mState & NS_FRAME_IS_NONDISPLAY) ||
PresContext()->IsGlyph(), PresContext()->Document()->IsSVGGlyphsDocument(),
"If display lists are enabled, only painting of non-display " "If display lists are enabled, only painting of non-display "
"SVG should take this code path"); "SVG should take this code path");

View file

@ -657,7 +657,7 @@ nsSVGUtils::PaintFrameWithEffects(nsIFrame *aFrame,
{ {
NS_ASSERTION(!NS_SVGDisplayListPaintingEnabled() || NS_ASSERTION(!NS_SVGDisplayListPaintingEnabled() ||
(aFrame->GetStateBits() & NS_FRAME_IS_NONDISPLAY) || (aFrame->GetStateBits() & NS_FRAME_IS_NONDISPLAY) ||
aFrame->PresContext()->IsGlyph(), aFrame->PresContext()->Document()->IsSVGGlyphsDocument(),
"If display lists are enabled, only painting of non-display " "If display lists are enabled, only painting of non-display "
"SVG should take this code path"); "SVG should take this code path");