Some method impls are also moved from CSSStyleSheet to StyleSheet so that they can be shared between the two subclasses. The new interface methods added to ServoStyleSheet is currently left unimplemented. They would be implemented in later patches. MozReview-Commit-ID: 45wHT9BSHTK
158 lines
4.0 KiB
C++
158 lines
4.0 KiB
C++
/* -*- 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<int>(X) == static_cast<int>(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<mozilla::dom::CSSStyleSheetParsingMode>(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<nsIDOMNode> 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
|