/* -*- 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/. */ #include "mozilla/StyleSheet.h" #include "mozilla/dom/ShadowRoot.h" #include "mozilla/ServoStyleSheet.h" #include "mozilla/StyleSheetInlines.h" #include "mozilla/CSSStyleSheet.h" #include "nsNullPrincipal.h" namespace mozilla { StyleSheet::StyleSheet(StyleBackendType aType, css::SheetParsingMode aParsingMode) : mDocument(nullptr) , mOwningNode(nullptr) , mParsingMode(aParsingMode) , mType(aType) , mDisabled(false) { } StyleSheet::StyleSheet(const StyleSheet& aCopy, nsIDocument* aDocumentToUse, nsINode* aOwningNodeToUse) : mTitle(aCopy.mTitle) , mDocument(aDocumentToUse) , mOwningNode(aOwningNodeToUse) , mParsingMode(aCopy.mParsingMode) , mType(aCopy.mType) , mDisabled(aCopy.mDisabled) { } mozilla::dom::CSSStyleSheetParsingMode StyleSheet::ParsingModeDOM() { #define CHECK(X, Y) \ static_assert(static_cast(X) == static_cast(Y), \ "mozilla::dom::CSSStyleSheetParsingMode and mozilla::css::SheetParsingMode should have identical values"); CHECK(mozilla::dom::CSSStyleSheetParsingMode::Agent, css::eAgentSheetFeatures); CHECK(mozilla::dom::CSSStyleSheetParsingMode::User, css::eUserSheetFeatures); CHECK(mozilla::dom::CSSStyleSheetParsingMode::Author, css::eAuthorSheetFeatures); #undef CHECK return static_cast(mParsingMode); } bool StyleSheet::IsComplete() const { return SheetInfo().mComplete; } void StyleSheet::SetComplete() { NS_ASSERTION(!IsGecko() || !AsGecko()->mDirty, "Can't set a dirty sheet complete!"); SheetInfo().mComplete = true; if (mDocument && !mDisabled) { // Let the document know mDocument->BeginUpdate(UPDATE_STYLE); mDocument->SetStyleSheetApplicableState(this, true); mDocument->EndUpdate(UPDATE_STYLE); } if (mOwningNode && !mDisabled && mOwningNode->HasFlag(NODE_IS_IN_SHADOW_TREE) && mOwningNode->IsContent()) { dom::ShadowRoot* shadowRoot = mOwningNode->AsContent()->GetContainingShadow(); shadowRoot->StyleSheetChanged(); } } StyleSheetInfo::StyleSheetInfo(CORSMode aCORSMode, ReferrerPolicy aReferrerPolicy, const dom::SRIMetadata& aIntegrity) : mPrincipal(nsNullPrincipal::Create()) , mCORSMode(aCORSMode) , mReferrerPolicy(aReferrerPolicy) , mIntegrity(aIntegrity) , mComplete(false) #ifdef DEBUG , mPrincipalSet(false) #endif { if (!mPrincipal) { NS_RUNTIMEABORT("nsNullPrincipal::Init failed"); } } // nsIDOMStyleSheet interface NS_IMETHODIMP StyleSheet::GetType(nsAString& aType) { aType.AssignLiteral("text/css"); return NS_OK; } NS_IMETHODIMP StyleSheet::GetDisabled(bool* aDisabled) { *aDisabled = Disabled(); return NS_OK; } NS_IMETHODIMP StyleSheet::SetDisabled(bool aDisabled) { // DOM method, so handle BeginUpdate/EndUpdate MOZ_AUTO_DOC_UPDATE(mDocument, UPDATE_STYLE, true); if (IsGecko()) { AsGecko()->SetEnabled(!aDisabled); } else { MOZ_CRASH("stylo: unimplemented SetEnabled"); } return NS_OK; } NS_IMETHODIMP StyleSheet::GetOwnerNode(nsIDOMNode** aOwnerNode) { nsCOMPtr ownerNode = do_QueryInterface(GetOwnerNode()); ownerNode.forget(aOwnerNode); return NS_OK; } NS_IMETHODIMP StyleSheet::GetHref(nsAString& aHref) { if (nsIURI* sheetURI = SheetInfo().mOriginalSheetURI) { nsAutoCString str; nsresult rv = sheetURI->GetSpec(str); NS_ENSURE_SUCCESS(rv, rv); CopyUTF8toUTF16(str, aHref); } else { SetDOMStringToNull(aHref); } return NS_OK; } NS_IMETHODIMP StyleSheet::GetTitle(nsAString& aTitle) { aTitle.Assign(mTitle); return NS_OK; } } // namespace mozilla