Bug 1662840: Move `overrideDPPX` from nsIContentViewer to BrowsingContext. r=whimboo,remote-protocol-reviewers,mtigley,emilio

Differential Revision: https://phabricator.services.mozilla.com/D104001
This commit is contained in:
Kris Maglione 2021-02-10 01:30:35 +00:00
Родитель b8ccc83b06
Коммит 0ec4615244
17 изменённых файлов: 85 добавлений и 136 удалений

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

@ -35,16 +35,7 @@ add_task(async function() {
async function assertDocshell(tab, expectedRDMMode, expectedDPPX) {
await asyncWaitUntil(async () => {
const { overrideDPPX, inRDMPane } = await SpecialPowers.spawn(
tab.linkedBrowser,
[],
() => {
return {
overrideDPPX: content.docShell.contentViewer.overrideDPPX,
inRDMPane: content.docShell.browsingContext.inRDMPane,
};
}
);
const { overrideDPPX, inRDMPane } = tab.linkedBrowser.browsingContext;
return inRDMPane === expectedRDMMode && overrideDPPX === expectedDPPX;
});
ok(true, "The state of the docshell is correct");

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

@ -1072,19 +1072,7 @@ const AccessibleWalkerActor = ActorClassWithSpec(accessibleWalkerSpec, {
* highlighter features correctly.
*/
get pixelRatio() {
const { contentViewer } = this.targetActor.docShell;
const { windowUtils } = this.rootWin;
const overrideDPPX = contentViewer.overrideDPPX;
let ratio;
if (overrideDPPX) {
contentViewer.overrideDPPX = 0;
ratio = windowUtils.screenPixelsPerCSSPixel;
contentViewer.overrideDPPX = overrideDPPX;
} else {
ratio = windowUtils.screenPixelsPerCSSPixel;
}
return ratio;
return this.rootWin.windowUtils.screenPixelsPerCSSPixelNoOverride;
},
/**

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

@ -104,13 +104,14 @@ const ResponsiveActor = protocol.ActorClassWithSpec(responsiveSpec, {
this._previousDPPXOverride = this.getDPPXOverride();
}
this.docShell.contentViewer.overrideDPPX = dppx;
// FIXME: This should be set in the parent process.
this.docShell.browsingContext.overrideDPPX = dppx;
return true;
},
getDPPXOverride() {
return this.docShell.contentViewer.overrideDPPX;
return this.docShell.browsingContext.overrideDPPX;
},
clearDPPXOverride() {

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

@ -185,6 +185,14 @@ BrowsingContext* BrowsingContext::Top() {
return bc;
}
const BrowsingContext* BrowsingContext::Top() const {
const BrowsingContext* bc = this;
while (bc->mParentWindow) {
bc = bc->GetParent();
}
return bc;
}
int32_t BrowsingContext::IndexOf(BrowsingContext* aChild) {
int32_t index = -1;
for (BrowsingContext* child : Children()) {
@ -2567,6 +2575,28 @@ void BrowsingContext::DidSet(FieldIndex<IDX_Muted>) {
});
}
bool BrowsingContext::CanSet(FieldIndex<IDX_OverrideDPPX>, const float& aValue,
ContentParent* aSource) {
// FIXME: Should only be settable by the parent process, but devtools code
// currently sets it from the child.
return IsTop() && LegacyCheckOnlyOwningProcessCanSet(aSource);
}
void BrowsingContext::DidSet(FieldIndex<IDX_OverrideDPPX>, float aOldValue) {
MOZ_ASSERT(IsTop());
if (GetOverrideDPPX() == aOldValue) {
return;
}
PreOrderWalk([&](BrowsingContext* aContext) {
if (nsIDocShell* shell = aContext->GetDocShell()) {
if (nsPresContext* pc = shell->GetPresContext()) {
pc->RecomputeBrowsingContextDependentData();
}
}
});
}
void BrowsingContext::SetCustomUserAgent(const nsAString& aUserAgent,
ErrorResult& aRv) {
Top()->SetUserAgentOverride(aUserAgent, aRv);

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

@ -169,6 +169,7 @@ enum class ExplicitActiveStatus : uint8_t {
FIELD(FullZoom, float) \
FIELD(WatchedByDevToolsInternal, bool) \
FIELD(TextZoom, float) \
FIELD(OverrideDPPX, float) \
/* The current in-progress load. */ \
FIELD(CurrentLoadIdentifier, Maybe<uint64_t>) \
/* See nsIRequest for possible flags. */ \
@ -389,6 +390,7 @@ class BrowsingContext : public nsILoadContext, public nsWrapperCache {
BrowsingContext* GetParent() const;
BrowsingContext* Top();
const BrowsingContext* Top() const;
int32_t IndexOf(BrowsingContext* aChild);
// NOTE: Unlike `GetEmbedderWindowGlobal`, `GetParentWindowContext` does not
@ -490,6 +492,8 @@ class BrowsingContext : public nsILoadContext, public nsWrapperCache {
float FullZoom() const { return GetFullZoom(); }
float TextZoom() const { return GetTextZoom(); }
float OverrideDPPX() const { return Top()->GetOverrideDPPX(); }
bool SuspendMediaWhenInactive() const {
return GetSuspendMediaWhenInactive();
}
@ -936,6 +940,10 @@ class BrowsingContext : public nsILoadContext, public nsWrapperCache {
// volume of all media elements.
void DidSet(FieldIndex<IDX_Muted>);
bool CanSet(FieldIndex<IDX_OverrideDPPX>, const float& aValue,
ContentParent* aSource);
void DidSet(FieldIndex<IDX_OverrideDPPX>, float aOldValue);
bool CanSet(FieldIndex<IDX_EmbedderInnerWindowId>, const uint64_t& aValue,
ContentParent* aSource);

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

@ -7373,14 +7373,6 @@ nsresult nsDocShell::RestoreFromHistory() {
mSavingOldViewer = CanSavePresentation(mLoadType, request, doc);
}
nsCOMPtr<nsIContentViewer> oldCv(mContentViewer);
nsCOMPtr<nsIContentViewer> newCv(viewer);
float overrideDPPX = 0.0f;
if (oldCv) {
oldCv->GetOverrideDPPX(&overrideDPPX);
}
// Protect against mLSHE going away via a load triggered from
// pagehide or unload.
nsCOMPtr<nsISHEntry> origLSHE = mLSHE;
@ -7603,10 +7595,6 @@ nsresult nsDocShell::RestoreFromHistory() {
FavorPerformanceHint(true);
}
if (oldCv) {
newCv->SetOverrideDPPX(overrideDPPX);
}
if (document) {
RefPtr<nsDocShell> parent = GetInProcessParentDocshell();
if (parent) {
@ -8173,7 +8161,6 @@ nsresult nsDocShell::SetupNewViewer(nsIContentViewer* aNewViewer,
const Encoding* hintCharset = nullptr;
int32_t hintCharsetSource = kCharsetUninitialized;
float overrideDPPX = 1.0;
// |newMUDV| also serves as a flag to set the data from the above vars
nsCOMPtr<nsIContentViewer> newCv;
@ -8205,8 +8192,6 @@ nsresult nsDocShell::SetupNewViewer(nsIContentViewer* aNewViewer,
hintCharset = oldCv->GetHintCharset();
NS_ENSURE_SUCCESS(oldCv->GetHintCharacterSetSource(&hintCharsetSource),
NS_ERROR_FAILURE);
NS_ENSURE_SUCCESS(oldCv->GetOverrideDPPX(&overrideDPPX),
NS_ERROR_FAILURE);
}
}
}
@ -8263,9 +8248,10 @@ nsresult nsDocShell::SetupNewViewer(nsIContentViewer* aNewViewer,
newCv->SetHintCharset(hintCharset);
NS_ENSURE_SUCCESS(newCv->SetHintCharacterSetSource(hintCharsetSource),
NS_ERROR_FAILURE);
NS_ENSURE_SUCCESS(newCv->SetOverrideDPPX(overrideDPPX), NS_ERROR_FAILURE);
}
NS_ENSURE_TRUE(mContentViewer, NS_ERROR_FAILURE);
// Stuff the bgcolor from the old pres shell into the new
// pres shell. This improves page load continuity.
if (RefPtr<PresShell> presShell = mContentViewer->GetPresShell()) {

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

@ -257,13 +257,6 @@ interface nsIContentViewer : nsISupports
*/
readonly attribute float deviceFullZoomForTest;
/**
* The value used to override devicePixelRatio and media queries dppx.
* Default is 0.0, that means no overriding is done (only a positive value
* is applied).
*/
attribute float overrideDPPX;
/**
* Disable entire author style level (including HTML presentation hints),
* for this viewer but not any child viewers.

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

@ -890,18 +890,6 @@ void ExternalResourceMap::ShowViewers() {
}
}
void TransferOverrideDPPX(Document* aFromDoc, Document* aToDoc) {
MOZ_ASSERT(aFromDoc && aToDoc, "transferring zoom levels from/to null doc");
nsPresContext* fromCtxt = aFromDoc->GetPresContext();
if (!fromCtxt) return;
nsPresContext* toCtxt = aToDoc->GetPresContext();
if (!toCtxt) return;
toCtxt->SetOverrideDPPX(fromCtxt->GetOverrideDPPX());
}
void TransferShowingState(Document* aFromDoc, Document* aToDoc) {
MOZ_ASSERT(aFromDoc && aToDoc, "transferring showing state from/to null doc");
@ -955,7 +943,6 @@ nsresult ExternalResourceMap::AddExternalResource(nsIURI* aURI,
if (nsPresContext* pc = doc->GetPresContext()) {
pc->RecomputeBrowsingContextDependentData();
}
TransferOverrideDPPX(aDisplayDocument, doc);
TransferShowingState(aDisplayDocument, doc);
}

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

@ -129,6 +129,13 @@ interface BrowsingContext {
[SetterThrows] attribute float textZoom;
// Override the dots-per-CSS-pixel scaling factor in this BrowsingContext
// and all of its descendants. May only be set on the top BC, and should
// only be set from the parent process.
//
// A value of 0.0 causes us to use the global default scaling factor.
[SetterThrows] attribute float overrideDPPX;
[SetterThrows] attribute boolean suspendMediaWhenInactive;
// Default value for nsIContentViewer::authorStyleDisabled in any new

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

@ -42,8 +42,10 @@ const setOverrideDPPX = (value) => {
info(`restore window's dppx to default value`);
}
SpecialPowers.setOverrideDPPX(window, value);
}
return SpecialPowers.spawnChrome([value], dppx => {
browsingContext.top.overrideDPPX = dppx;
});
};
const setFullZoom = (value) => {
info(`set window's fullZoom to ${value}`);
@ -95,17 +97,17 @@ const waitForMediaQueryListEvent = (mediaQueryList) => {
}
const gTests = {
"test overrideDPPX with devicePixelRatio": (done) => {
"test overrideDPPX with devicePixelRatio": async (done) => {
assertValuesAreInitial();
setOverrideDPPX(dppx);
await setOverrideDPPX(dppx);
is(window.devicePixelRatio, dppx,
"devicePixelRatio overridden.");
is(frameWindow.devicePixelRatio, dppx,
"frame's devicePixelRatio overridden.");
setOverrideDPPX(0);
await setOverrideDPPX(0);
is(window.devicePixelRatio, originalDPR,
"devicePixelRatio back to default.");
@ -114,18 +116,18 @@ const gTests = {
done();
},
"test overrideDPPX with devicePixelRatio and fullZoom": (done) => {
"test overrideDPPX with devicePixelRatio and fullZoom": async (done) => {
assertValuesAreInitial();
setFullZoom(zoom);
setOverrideDPPX(dppx);
await setOverrideDPPX(dppx);
is(window.devicePixelRatio, dppx,
"devicePixelRatio overridden; fullZoom ignored");
is(frameWindow.devicePixelRatio, dppx,
"frame's devicePixelRatio overridden; fullZoom ignored");
setOverrideDPPX(0);
await setOverrideDPPX(0);
is(window.devicePixelRatio, originalDPR * zoom,
"devicePixelRatio now is affected by fullZoom");
@ -144,7 +146,7 @@ const gTests = {
done();
},
"test overrideDPPX with media queries": (done) => {
"test overrideDPPX with media queries": async (done) => {
assertValuesAreInitial();
let frameDoc = frameWindow.document;
@ -163,7 +165,7 @@ const gTests = {
is(frameCurrentFontSize, frameOriginalFontSize,
"frame's media queries are not applied yet");
setOverrideDPPX(dppx);
await setOverrideDPPX(dppx);
currentFontSize = getBodyFontSize(window);
frameCurrentFontSize = getBodyFontSize(frameWindow);
@ -178,7 +180,7 @@ const gTests = {
is(frameCurrentFontSize, "32px",
"frame's font size has the expected value.");
setOverrideDPPX(0);
await setOverrideDPPX(0);
currentFontSize = getBodyFontSize(window);
frameCurrentFontSize = getBodyFontSize(frameWindow);
@ -193,7 +195,7 @@ const gTests = {
done();
},
"test overrideDPPX with media queries and fullZoom": (done) => {
"test overrideDPPX with media queries and fullZoom": async (done) => {
assertValuesAreInitial();
let frameDoc = frameWindow.document;
@ -215,7 +217,7 @@ const gTests = {
"frame's media queries are not applied yet");
setFullZoom(zoom);
setOverrideDPPX(dppx);
await setOverrideDPPX(dppx);
currentFontSize = getBodyFontSize(window);
frameCurrentFontSize = getBodyFontSize(frameWindow);
@ -224,7 +226,7 @@ const gTests = {
is(frameCurrentFontSize, "32px",
"frame's media queries are applied for overridden DDPX; fullZoom ignored.");
setOverrideDPPX(0);
await setOverrideDPPX(0);
currentFontSize = getBodyFontSize(window);
frameCurrentFontSize = getBodyFontSize(frameWindow);
@ -262,7 +264,7 @@ const gTests = {
setOverrideDPPX(dppx);
},
"test OverrideDPPX with MediaQueryList and fullZoom": (done) => {
"test OverrideDPPX with MediaQueryList and fullZoom": async (done) => {
assertValuesAreInitial();
let promises = [
@ -272,7 +274,7 @@ const gTests = {
window.matchMedia(`(resolution: ${originalDPR * zoom}dppx)`)),
];
setOverrideDPPX(dppx);
await setOverrideDPPX(dppx);
setFullZoom(zoom);
promises[0]
@ -281,7 +283,7 @@ const gTests = {
.then(() => setFullZoom(originalZoom))
.then(done, e => {throw e});
},
"test OverrideDPPX is kept on document navigation": (done) => {
"test OverrideDPPX is kept on document navigation": async (done) => {
assertValuesAreInitial();
let frameOriginalFontSize = getBodyFontSize(frameWindow);
@ -291,7 +293,7 @@ const gTests = {
is(frameCurrentFontSize, frameOriginalFontSize,
"frame's media queries are not applied yet");
setOverrideDPPX(dppx);
await setOverrideDPPX(dppx);
frameCurrentFontSize = getBodyFontSize(frameWindow);
@ -302,7 +304,7 @@ const gTests = {
is(frameCurrentFontSize, "32px",
"frame's font size has the expected value.");
frameWindow.frameElement.addEventListener("load", function() {
frameWindow.frameElement.addEventListener("load", async function() {
frameStyle = createFontStyleForDPPX(frameWindow.document, dppx, "32");
frameCurrentFontSize = getBodyFontSize(frameWindow);
@ -316,7 +318,7 @@ const gTests = {
frameStyle.remove();
setOverrideDPPX(0);
await setOverrideDPPX(0);
done();
}, {once: true});
@ -343,28 +345,28 @@ const gTests = {
// so that the first override will always trigger a load.
isnot(originalDPR, 8, "originalDPR differs from final test value");
loaded = new Promise(resolve => image.onload = resolve);
setOverrideDPPX(8);
await setOverrideDPPX(8);
await loaded;
is(image.currentSrc, imageSets["8x"],
"Image is properly set for 8dppx.");
loaded = new Promise(resolve => image.onload = resolve);
setOverrideDPPX(1);
await setOverrideDPPX(1);
await loaded;
is(image.currentSrc, imageSets["1x"],
"Image url is properly set for 1dppx.");
loaded = new Promise(resolve => image.onload = resolve);
setOverrideDPPX(1.5);
await setOverrideDPPX(1.5);
await loaded;
is(image.currentSrc, imageSets["1.5x"],
"Image url is properly set for 1.5dppx.");
loaded = new Promise(resolve => image.onload = resolve);
setOverrideDPPX(2);
await setOverrideDPPX(2);
await loaded;
is(image.currentSrc, imageSets["2x"],
@ -374,14 +376,14 @@ const gTests = {
// so that resetting to the default will always trigger a load.
isnot(originalDPR, 8, "originalDPR differs from final test value");
loaded = new Promise(resolve => image.onload = resolve);
setOverrideDPPX(8);
await setOverrideDPPX(8);
await loaded;
is(image.currentSrc, imageSets["8x"],
"Image is properly set for 8dppx.");
loaded = new Promise(resolve => image.onload = resolve);
setOverrideDPPX(0);
await setOverrideDPPX(0);
await loaded;
is(image.currentSrc, originalSrc,

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

@ -459,8 +459,6 @@ class nsDocumentViewer final : public nsIContentViewer,
nsIntRect mBounds;
float mOverrideDPPX; // DPPX overrided, defaults to 0.0
int16_t mNumURLStarts;
int16_t mDestroyBlockedCount;
@ -537,7 +535,6 @@ void nsDocumentViewer::PrepareToStartLoad() {
nsDocumentViewer::nsDocumentViewer()
: mParentWidget(nullptr),
mAttachedToParent(false),
mOverrideDPPX(0.0),
mNumURLStarts(0),
mDestroyBlockedCount(0),
mStopped(false),
@ -758,7 +755,6 @@ nsresult nsDocumentViewer::InitPresentationStuff(bool aDoInitialReflow) {
mPresContext->SetVisibleArea(nsRect(0, 0, width, height));
// We rely on the default zoom not being initialized until here.
mPresContext->RecomputeBrowsingContextDependentData();
mPresContext->SetOverrideDPPX(mOverrideDPPX);
}
if (mWindow && mDocument->IsTopLevelContentDocument()) {
@ -2610,34 +2606,6 @@ nsDocumentViewer::GetDeviceFullZoomForTest(float* aDeviceFullZoom) {
return NS_OK;
}
NS_IMETHODIMP
nsDocumentViewer::SetOverrideDPPX(float aDPPX) {
// If we don't have a document, then we need to bail.
if (!mDocument) {
return NS_ERROR_FAILURE;
}
mOverrideDPPX = aDPPX;
auto childFn = [aDPPX](nsDocumentViewer* aChild) {
aChild->SetOverrideDPPX(aDPPX);
};
auto presContextFn = [aDPPX](nsPresContext* aPc) {
aPc->SetOverrideDPPX(aDPPX);
};
PropagateToPresContextsHelper(childFn, presContextFn);
return NS_OK;
}
NS_IMETHODIMP
nsDocumentViewer::GetOverrideDPPX(float* aDPPX) {
NS_ENSURE_ARG_POINTER(aDPPX);
nsPresContext* pc = GetPresContext();
*aDPPX = pc ? pc->GetOverrideDPPX() : mOverrideDPPX;
return NS_OK;
}
NS_IMETHODIMP
nsDocumentViewer::SetAuthorStyleDisabled(bool aStyleDisabled) {
if (mPresShell) {

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

@ -773,6 +773,7 @@ void nsPresContext::RecomputeBrowsingContextDependentData() {
}
SetFullZoom(browsingContext->FullZoom());
SetTextZoom(browsingContext->TextZoom());
SetOverrideDPPX(browsingContext->OverrideDPPX());
if (doc == mDocument) {
// Medium doesn't apply to resource documents, etc.
auto* top = browsingContext->Top();

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

@ -531,6 +531,7 @@ class nsPresContext : public nsISupports, public mozilla::SupportsWeakPtr {
UpdateEffectiveTextZoom();
}
void SetFullZoom(float aZoom);
void SetOverrideDPPX(float);
public:
float GetFullZoom() { return mFullZoom; }
@ -542,7 +543,6 @@ class nsPresContext : public nsISupports, public mozilla::SupportsWeakPtr {
float GetDeviceFullZoom();
float GetOverrideDPPX() const { return mMediaEmulationData.mDPPX; }
void SetOverrideDPPX(float);
/**
* Recomputes the data dependent on the browsing context, like zoom and text

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

@ -37,8 +37,4 @@ class Emulation extends ContentProcessDomain {
});
});
}
_setDPPXOverride(dppx) {
this.docShell.contentViewer.overrideDPPX = dppx;
}
}

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

@ -69,7 +69,8 @@ class Emulation extends Domain {
const { tab } = this.session.target;
const { linkedBrowser: browser } = tab;
await this.executeInChild("_setDPPXOverride", deviceScaleFactor);
const { browsingContext } = this.session.target;
browsingContext.overrideDPPX = deviceScaleFactor;
// With a value of 0 the current size is used
const { layoutViewport } = await this.session.execute(

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

@ -506,10 +506,7 @@ async function getDevicePixelRatio() {
}
async function setDevicePixelRatio(dppx) {
await SpecialPowers.spawn(gBrowser.selectedBrowser, [dppx], function(dppx) {
content.docShell.contentViewer.overrideDPPX = dppx;
is(content.devicePixelRatio, dppx, "devicePixelRatio override set");
});
gBrowser.selectedBrowser.browsingContext.overrideDPPX = dppx;
}
async function getImageDetails(image) {

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

@ -1182,13 +1182,6 @@ class SpecialPowersChild extends JSWindowActorChild {
BrowsingContext.getFromWindow(window).textZoom = zoom;
}
getOverrideDPPX(window) {
return this._getMUDV(window).overrideDPPX;
}
setOverrideDPPX(window, dppx) {
this._getMUDV(window).overrideDPPX = dppx;
}
emulateMedium(window, mediaType) {
BrowsingContext.getFromWindow(window).top.mediumOverride = mediaType;
}