mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-22 17:55:50 +00:00
686006613e
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)
236 lines
6.3 KiB
C++
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
|