Source code
Revision control
Copy as Markdown
Other Tools
/* 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
export class PageStyleParent extends JSWindowActorParent {
// This has the most recent information about the content stylesheets for
// that actor. It's populated via the PageStyle:Add and PageStyle:Clear
// messages from the content process. It has the following structure:
//
// filteredStyleSheets (Array):
// An Array of objects with a filtered list representing all stylesheets
// that the current page offers. Each object has the following members:
//
// title (String):
// The title of the stylesheet
//
// disabled (bool):
// Whether or not the stylesheet is currently applied
//
// href (String):
// The URL of the stylesheet. Stylesheets loaded via a data URL will
// have this property set to null.
//
// preferredStyleSheetSet (bool):
// Whether or not the user currently has the "Default" style selected
// for the current page.
#styleSheetInfo = null;
receiveMessage(msg) {
// Check if things are alive:
let browser = this.browsingContext.top.embedderElement;
if (!browser || browser.ownerGlobal.closed) {
return;
}
// We always store information at the top of the frame tree.
let actor =
this.browsingContext.top.currentWindowGlobal.getActor("PageStyle");
switch (msg.name) {
case "PageStyle:Add":
actor.addSheetInfo(msg.data);
break;
case "PageStyle:Clear":
if (actor == this) {
this.#styleSheetInfo = null;
}
break;
}
}
/**
* Add/append styleSheets to the _pageStyleSheets weakmap.
* @param newSheetData
* The stylesheet data, including new stylesheets to add,
* and the preferred stylesheet set for this document.
*/
addSheetInfo(newSheetData) {
let info = this.getSheetInfo();
info.filteredStyleSheets.push(...newSheetData.filteredStyleSheets);
info.preferredStyleSheetSet ||= newSheetData.preferredStyleSheetSet;
}
getSheetInfo() {
if (!this.#styleSheetInfo) {
this.#styleSheetInfo = {
filteredStyleSheets: [],
preferredStyleSheetSet: true,
};
}
return this.#styleSheetInfo;
}
}