gecko-dev/layout/style/ServoStyleRule.cpp
Phil Ringnalda 686006613e Backed out 20 changesets (bug 851892) for load failures in Android crashtest-4
Backed out changeset b9c4115cdeac (bug 851892)
Backed out changeset 5f491bf49b85 (bug 851892)
Backed out changeset 9bf5bcb3e8c5 (bug 851892)
Backed out changeset a9cab46e8b45 (bug 851892)
Backed out changeset 73858e15c8c0 (bug 851892)
Backed out changeset a25638588b6b (bug 851892)
Backed out changeset d58e0e5069ef (bug 851892)
Backed out changeset d8da2a3d8f10 (bug 851892)
Backed out changeset a8da3c34983f (bug 851892)
Backed out changeset 29cf8acbd21e (bug 851892)
Backed out changeset c53cd7bdf8b3 (bug 851892)
Backed out changeset e841a2796375 (bug 851892)
Backed out changeset 2eab85b00159 (bug 851892)
Backed out changeset ca4b1fb9cae4 (bug 851892)
Backed out changeset 74c0ba66f108 (bug 851892)
Backed out changeset 719bb9f41e5b (bug 851892)
Backed out changeset d6aa4c6192df (bug 851892)
Backed out changeset dc81a167a75d (bug 851892)
Backed out changeset 65422477b3a5 (bug 851892)
Backed out changeset 3089dd379077 (bug 851892)
2017-01-15 11:50:10 -08:00

236 lines
6.3 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/. */
/* representation of CSSStyleRule for stylo */
#include "mozilla/ServoStyleRule.h"
#include "mozilla/DeclarationBlockInlines.h"
#include "mozilla/ServoBindings.h"
#include "mozilla/ServoDeclarationBlock.h"
#include "nsDOMClassInfoID.h"
#include "mozAutoDocUpdate.h"
namespace mozilla {
// -- ServoStyleRuleDeclaration ---------------------------------------
ServoStyleRuleDeclaration::ServoStyleRuleDeclaration(
already_AddRefed<RawServoDeclarationBlock> aDecls)
: mDecls(new ServoDeclarationBlock(Move(aDecls)))
{
}
ServoStyleRuleDeclaration::~ServoStyleRuleDeclaration()
{
}
// QueryInterface implementation for ServoStyleRuleDeclaration
NS_INTERFACE_MAP_BEGIN(ServoStyleRuleDeclaration)
NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
// We forward the cycle collection interfaces to Rule(), which is
// never null (in fact, we're part of that object!)
if (aIID.Equals(NS_GET_IID(nsCycleCollectionISupports)) ||
aIID.Equals(NS_GET_IID(nsXPCOMCycleCollectionParticipant))) {
return Rule()->QueryInterface(aIID, aInstancePtr);
}
else
NS_IMPL_QUERY_TAIL_INHERITING(nsDOMCSSDeclaration)
NS_IMPL_ADDREF_USING_AGGREGATOR(ServoStyleRuleDeclaration, Rule())
NS_IMPL_RELEASE_USING_AGGREGATOR(ServoStyleRuleDeclaration, Rule())
/* nsDOMCSSDeclaration implementation */
NS_IMETHODIMP
ServoStyleRuleDeclaration::GetParentRule(nsIDOMCSSRule** aParent)
{
*aParent = do_AddRef(Rule()).take();
return NS_OK;
}
nsINode*
ServoStyleRuleDeclaration::GetParentObject()
{
return Rule()->GetDocument();
}
DeclarationBlock*
ServoStyleRuleDeclaration::GetCSSDeclaration(Operation aOperation)
{
return mDecls;
}
nsresult
ServoStyleRuleDeclaration::SetCSSDeclaration(DeclarationBlock* aDecl)
{
ServoStyleRule* rule = Rule();
if (RefPtr<ServoStyleSheet> sheet = rule->GetStyleSheet()->AsServo()) {
nsCOMPtr<nsIDocument> owningDoc = sheet->GetOwningDocument();
mozAutoDocUpdate updateBatch(owningDoc, UPDATE_STYLE, true);
if (aDecl != mDecls) {
RefPtr<ServoDeclarationBlock> decls = aDecl->AsServo();
Servo_StyleRule_SetStyle(rule->Raw(), decls->Raw());
mDecls = decls.forget();
}
if (owningDoc) {
owningDoc->StyleRuleChanged(sheet, rule);
}
}
return NS_OK;
}
nsIDocument*
ServoStyleRuleDeclaration::DocToUpdate()
{
return nullptr;
}
void
ServoStyleRuleDeclaration::GetCSSParsingEnvironment(
CSSParsingEnvironment& aCSSParseEnv)
{
GetCSSParsingEnvironmentForRule(Rule(), aCSSParseEnv);
}
// -- ServoStyleRule --------------------------------------------------
ServoStyleRule::ServoStyleRule(already_AddRefed<RawServoStyleRule> aRawRule)
: css::Rule(0, 0)
, mRawRule(aRawRule)
, mDecls(Servo_StyleRule_GetStyle(mRawRule).Consume())
{
}
// QueryInterface implementation for ServoStyleRule
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(ServoStyleRule)
NS_INTERFACE_MAP_ENTRY(nsIDOMCSSStyleRule)
NS_INTERFACE_MAP_ENTRY(nsIDOMCSSRule)
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, css::Rule)
NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(CSSStyleRule)
NS_INTERFACE_MAP_END
NS_IMPL_CYCLE_COLLECTING_ADDREF(ServoStyleRule)
NS_IMPL_CYCLE_COLLECTING_RELEASE(ServoStyleRule)
NS_IMPL_CYCLE_COLLECTION_CLASS(ServoStyleRule)
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(ServoStyleRule)
// Trace the wrapper for our declaration. This just expands out
// NS_IMPL_CYCLE_COLLECTION_TRACE_PRESERVED_WRAPPER which we can't use
// directly because the wrapper is on the declaration, not on us.
tmp->mDecls.TraceWrapper(aCallbacks, aClosure);
NS_IMPL_CYCLE_COLLECTION_TRACE_END
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(ServoStyleRule)
// Unlink the wrapper for our declaraton. This just expands out
// NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER which we can't use
// directly because the wrapper is on the declaration, not on us.
tmp->mDecls.ReleaseWrapper(static_cast<nsISupports*>(p));
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(ServoStyleRule)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
already_AddRefed<css::Rule>
ServoStyleRule::Clone() const
{
// Rule::Clone is only used when CSSStyleSheetInner is cloned in
// preparation of being mutated. However, ServoStyleSheet never clones
// anything, so this method should never be called.
MOZ_ASSERT_UNREACHABLE("Shouldn't be cloning ServoStyleRule");
return nullptr;
}
size_t
ServoStyleRule::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
{
// TODO Implement this!
return aMallocSizeOf(this);
}
#ifdef DEBUG
void
ServoStyleRule::List(FILE* out, int32_t aIndent) const
{
nsAutoCString str;
for (int32_t i = 0; i < aIndent; i++) {
str.AppendLiteral(" ");
}
Servo_StyleRule_Debug(mRawRule, &str);
fprintf_stderr(out, "%s\n", str.get());
}
#endif
/* CSSRule implementation */
NS_IMETHODIMP
ServoStyleRule::GetType(uint16_t* aType)
{
*aType = nsIDOMCSSRule::STYLE_RULE;
return NS_OK;
}
NS_IMETHODIMP
ServoStyleRule::GetCssText(nsAString& aCssText)
{
Servo_StyleRule_GetCssText(mRawRule, &aCssText);
return NS_OK;
}
NS_IMETHODIMP
ServoStyleRule::SetCssText(const nsAString& aCssText)
{
return NS_OK;
}
NS_IMETHODIMP
ServoStyleRule::GetParentStyleSheet(nsIDOMCSSStyleSheet** aSheet)
{
return css::Rule::GetParentStyleSheet(aSheet);
}
NS_IMETHODIMP
ServoStyleRule::GetParentRule(nsIDOMCSSRule** aParentRule)
{
*aParentRule = nullptr;
return NS_ERROR_NOT_IMPLEMENTED;
}
css::Rule*
ServoStyleRule::GetCSSRule()
{
return this;
}
/* CSSStyleRule implementation */
NS_IMETHODIMP
ServoStyleRule::GetSelectorText(nsAString& aSelectorText)
{
Servo_StyleRule_GetSelectorText(mRawRule, &aSelectorText);
return NS_OK;
}
NS_IMETHODIMP
ServoStyleRule::SetSelectorText(const nsAString& aSelectorText)
{
// XXX We need to implement this... But Gecko doesn't have this either
// so it's probably okay to leave it unimplemented currently?
// See bug 37468 and mozilla::css::StyleRule::SetSelectorText.
return NS_OK;
}
NS_IMETHODIMP
ServoStyleRule::GetStyle(nsIDOMCSSStyleDeclaration** aStyle)
{
*aStyle = do_AddRef(&mDecls).take();
return NS_OK;
}
} // namespace mozilla