/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim: set ts=8 sts=2 et sw=2 tw=80: */ /* 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
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
/* implementation of interface for managing user and user-agent style sheets */
bool result;
nsIURI* uri = aSheet->GetSheetURI(); return uri && NS_SUCCEEDED(uri->Equals(aSheetURI, &result)) && result;
}
int32_t nsStyleSheetService::FindSheetByURI(uint32_t aSheetType,
nsIURI* aSheetURI) {
SheetArray& sheets = mSheets[aSheetType]; for (int32_t i = sheets.Length() - 1; i >= 0; i--) { if (SheetHasURI(sheets[i], aSheetURI)) { return i;
}
}
return -1;
}
nsresult nsStyleSheetService::Init() { // Child processes get their style sheets from the ContentParent. if (XRE_IsContentProcess()) { return NS_OK;
}
RegisterWeakMemoryReporter(this);
return NS_OK;
}
NS_IMETHODIMP
nsStyleSheetService::LoadAndRegisterSheet(nsIURI* aSheetURI,
uint32_t aSheetType) { // Warn developers if their stylesheet URL has a #ref at the end. // Stylesheet URIs don't benefit from having a #ref suffix -- and if the // sheet is a data URI, someone might've created this #ref by accident (and // truncated their data-URI stylesheet) by using an unescaped # character in // a #RRGGBB color or #foo() ID-selector in their data-URI representation. bool hasRef;
nsresult rv = aSheetURI->GetHasRef(&hasRef);
NS_ENSURE_SUCCESS(rv, rv); if (aSheetURI && hasRef) {
nsCOMPtr<nsIConsoleService> consoleService =
do_GetService(NS_CONSOLESERVICE_CONTRACTID);
NS_WARNING_ASSERTION(consoleService, "Failed to get console service!"); if (consoleService) { const char16_t* message =
u"nsStyleSheetService::LoadAndRegisterSheet: "
u"URI contains unescaped hash character, which might be truncating "
u"the sheet, if it's a data URI.";
consoleService->LogStringMessage(message);
}
}
rv = LoadAndRegisterSheetInternal(aSheetURI, aSheetType); if (NS_SUCCEEDED(rv)) { // Hold on to a copy of the registered PresShells. for (PresShell* presShell : mPresShells.Clone()) {
StyleSheet* sheet = mSheets[aSheetType].LastElement();
presShell->NotifyStyleSheetServiceSheetAdded(sheet, aSheetType);
}
if (XRE_IsParentProcess()) {
nsTArray<dom::ContentParent*> children;
dom::ContentParent::GetAll(children);
if (children.IsEmpty()) { return rv;
}
for (uint32_t i = 0; i < children.Length(); i++) {
Unused << children[i]->SendLoadAndRegisterSheet(aSheetURI, aSheetType);
}
}
} return rv;
}
case USER_SHEET:
parsingMode = css::eUserSheetFeatures; break;
case AUTHOR_SHEET:
parsingMode = css::eAuthorSheetFeatures; break;
default:
NS_WARNING("invalid sheet type argument"); return NS_ERROR_INVALID_ARG;
}
auto loader = MakeRefPtr<css::Loader>(); auto result = loader->LoadSheetSync(aSheetURI, parsingMode,
css::Loader::UseSystemPrincipal::Yes); if (result.isErr()) { return result.unwrapErr();
}
mSheets[aSheetType].AppendElement(result.unwrap()); return NS_OK;
}
// Hold on to a copy of the registered PresShells. for (PresShell* presShell : mPresShells.Clone()) { if (presShell->StyleSet()) { if (sheet) {
presShell->NotifyStyleSheetServiceSheetRemoved(sheet, aSheetType);
}
}
}
if (XRE_IsParentProcess()) {
nsTArray<dom::ContentParent*> children;
dom::ContentParent::GetAll(children);
if (children.IsEmpty()) { return NS_OK;
}
for (uint32_t i = 0; i < children.Length(); i++) {
Unused << children[i]->SendUnregisterSheet(aSheetURI, aSheetType);
}
}
return NS_OK;
}
// static
nsStyleSheetService* nsStyleSheetService::GetInstance() { staticbool first = true; if (first) { // make sure at first call that it's inited
nsCOMPtr<nsIStyleSheetService> dummy =
do_GetService(NS_STYLESHEETSERVICE_CONTRACTID);
first = false;
}
NS_IMETHODIMP
nsStyleSheetService::CollectReports(nsIHandleReportCallback* aHandleReport,
nsISupports* aData, bool aAnonymize) {
MOZ_COLLECT_REPORT( "explicit/layout/style-sheet-service", KIND_HEAP, UNITS_BYTES,
SizeOfIncludingThis(StyleSheetServiceMallocSizeOf), "Memory used for style sheets held by the style sheet service.");
return NS_OK;
}
size_t nsStyleSheetService::SizeOfIncludingThis(
mozilla::MallocSizeOf aMallocSizeOf) const {
size_t n = aMallocSizeOf(this); for (auto& sheetArray : mSheets) {
n += sheetArray.ShallowSizeOfExcludingThis(aMallocSizeOf); for (StyleSheet* sheet : sheetArray) { if (sheet) {
n += sheet->SizeOfIncludingThis(aMallocSizeOf);
}
}
} return n;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.