2016-02-24 10:01:10 +03:00
|
|
|
/* -*- 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/ServoStyleSet.h"
|
|
|
|
|
|
|
|
#include "nsCSSAnonBoxes.h"
|
2016-03-18 23:14:07 +03:00
|
|
|
#include "nsCSSPseudoElements.h"
|
|
|
|
#include "nsStyleContext.h"
|
2016-02-26 04:51:02 +03:00
|
|
|
#include "nsStyleSet.h"
|
2016-02-24 10:01:10 +03:00
|
|
|
|
|
|
|
using namespace mozilla;
|
|
|
|
using namespace mozilla::dom;
|
|
|
|
|
2016-02-24 10:01:12 +03:00
|
|
|
ServoStyleSet::ServoStyleSet()
|
2016-03-18 23:14:07 +03:00
|
|
|
: mPresContext(nullptr)
|
|
|
|
, mRawSet(Servo_InitStyleSet())
|
2016-01-27 05:02:04 +03:00
|
|
|
, mBatching(0)
|
2016-02-24 10:01:12 +03:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2016-02-24 10:01:10 +03:00
|
|
|
void
|
|
|
|
ServoStyleSet::Init(nsPresContext* aPresContext)
|
|
|
|
{
|
2016-03-18 23:14:07 +03:00
|
|
|
mPresContext = aPresContext;
|
2016-02-24 10:01:10 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
ServoStyleSet::BeginShutdown()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
ServoStyleSet::Shutdown()
|
|
|
|
{
|
2016-01-27 05:02:04 +03:00
|
|
|
mRawSet = nullptr;
|
2016-02-24 10:01:10 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
ServoStyleSet::GetAuthorStyleDisabled() const
|
|
|
|
{
|
2016-02-24 10:01:12 +03:00
|
|
|
return false;
|
2016-02-24 10:01:10 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
nsresult
|
|
|
|
ServoStyleSet::SetAuthorStyleDisabled(bool aStyleDisabled)
|
|
|
|
{
|
|
|
|
MOZ_CRASH("stylo: not implemented");
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
ServoStyleSet::BeginUpdate()
|
|
|
|
{
|
2016-02-24 10:01:12 +03:00
|
|
|
++mBatching;
|
2016-02-24 10:01:10 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
nsresult
|
|
|
|
ServoStyleSet::EndUpdate()
|
|
|
|
{
|
2016-02-24 10:01:12 +03:00
|
|
|
MOZ_ASSERT(mBatching > 0);
|
|
|
|
if (--mBatching > 0) {
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
// ... do something ...
|
|
|
|
return NS_OK;
|
2016-02-24 10:01:10 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
// resolve a style context
|
|
|
|
already_AddRefed<nsStyleContext>
|
|
|
|
ServoStyleSet::ResolveStyleFor(Element* aElement,
|
|
|
|
nsStyleContext* aParentContext)
|
|
|
|
{
|
2016-03-18 23:14:07 +03:00
|
|
|
RefPtr<ServoComputedValues> computedValues = dont_AddRef(Servo_GetComputedValues(aElement));
|
|
|
|
MOZ_ASSERT(computedValues);
|
|
|
|
|
|
|
|
// XXXbholley: nsStyleSet does visited handling here.
|
|
|
|
|
|
|
|
// XXXbholley: Figure out the correct thing to pass here. Does this fixup
|
|
|
|
// duplicate something that servo already does?
|
|
|
|
bool skipFixup = false;
|
|
|
|
|
|
|
|
return NS_NewStyleContext(aParentContext, mPresContext, nullptr,
|
|
|
|
CSSPseudoElementType::NotPseudo,
|
|
|
|
computedValues.forget(), skipFixup);
|
2016-02-24 10:01:10 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
already_AddRefed<nsStyleContext>
|
|
|
|
ServoStyleSet::ResolveStyleFor(Element* aElement,
|
|
|
|
nsStyleContext* aParentContext,
|
|
|
|
TreeMatchContext& aTreeMatchContext)
|
|
|
|
{
|
|
|
|
MOZ_CRASH("stylo: not implemented");
|
|
|
|
}
|
|
|
|
|
|
|
|
already_AddRefed<nsStyleContext>
|
2016-04-22 02:18:41 +03:00
|
|
|
ServoStyleSet::ResolveStyleForNonElement(nsStyleContext* aParentContext,
|
|
|
|
nsIAtom* aPseudoTag)
|
2016-02-24 10:01:10 +03:00
|
|
|
{
|
|
|
|
MOZ_CRASH("stylo: not implemented");
|
|
|
|
}
|
|
|
|
|
|
|
|
already_AddRefed<nsStyleContext>
|
|
|
|
ServoStyleSet::ResolvePseudoElementStyle(Element* aParentElement,
|
|
|
|
CSSPseudoElementType aType,
|
|
|
|
nsStyleContext* aParentContext,
|
|
|
|
Element* aPseudoElement)
|
|
|
|
{
|
|
|
|
MOZ_CRASH("stylo: not implemented");
|
|
|
|
}
|
|
|
|
|
|
|
|
// aFlags is an nsStyleSet flags bitfield
|
|
|
|
already_AddRefed<nsStyleContext>
|
|
|
|
ServoStyleSet::ResolveAnonymousBoxStyle(nsIAtom* aPseudoTag,
|
|
|
|
nsStyleContext* aParentContext,
|
|
|
|
uint32_t aFlags)
|
|
|
|
{
|
2016-02-26 04:51:02 +03:00
|
|
|
MOZ_ASSERT(nsCSSAnonBoxes::IsAnonBox(aPseudoTag));
|
|
|
|
|
|
|
|
MOZ_ASSERT(aFlags == 0 ||
|
|
|
|
aFlags == nsStyleSet::eSkipParentDisplayBasedStyleFixup);
|
2016-03-18 23:14:07 +03:00
|
|
|
bool skipFixup = aFlags & nsStyleSet::eSkipParentDisplayBasedStyleFixup;
|
|
|
|
|
|
|
|
ServoComputedValues* parentStyle =
|
|
|
|
aParentContext ? aParentContext->StyleSource().AsServoComputedValues()
|
|
|
|
: nullptr;
|
|
|
|
RefPtr<ServoComputedValues> computedValues =
|
|
|
|
dont_AddRef(Servo_GetComputedValuesForAnonymousBox(parentStyle, aPseudoTag));
|
|
|
|
MOZ_ASSERT(computedValues);
|
|
|
|
|
|
|
|
return NS_NewStyleContext(aParentContext, mPresContext, nullptr,
|
|
|
|
CSSPseudoElementType::AnonBox,
|
|
|
|
computedValues.forget(), skipFixup);
|
2016-02-24 10:01:10 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
// manage the set of style sheets in the style set
|
|
|
|
nsresult
|
|
|
|
ServoStyleSet::AppendStyleSheet(SheetType aType,
|
2016-02-24 10:01:12 +03:00
|
|
|
ServoStyleSheet* aSheet)
|
2016-02-24 10:01:10 +03:00
|
|
|
{
|
2016-02-26 04:51:02 +03:00
|
|
|
MOZ_ASSERT(aSheet);
|
|
|
|
MOZ_ASSERT(aSheet->IsApplicable());
|
|
|
|
MOZ_ASSERT(nsStyleSet::IsCSSSheetType(aType));
|
|
|
|
|
|
|
|
mSheets[aType].RemoveElement(aSheet);
|
|
|
|
mSheets[aType].AppendElement(aSheet);
|
|
|
|
|
2016-02-26 05:57:42 +03:00
|
|
|
// Maintain a mirrored list of sheets on the servo side.
|
|
|
|
Servo_AppendStyleSheet(aSheet->RawSheet(), mRawSet.get());
|
|
|
|
|
2016-02-26 04:51:02 +03:00
|
|
|
return NS_OK;
|
2016-02-24 10:01:10 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
nsresult
|
|
|
|
ServoStyleSet::PrependStyleSheet(SheetType aType,
|
2016-02-24 10:01:12 +03:00
|
|
|
ServoStyleSheet* aSheet)
|
2016-02-24 10:01:10 +03:00
|
|
|
{
|
2016-02-26 04:51:02 +03:00
|
|
|
MOZ_ASSERT(aSheet);
|
|
|
|
MOZ_ASSERT(aSheet->IsApplicable());
|
|
|
|
MOZ_ASSERT(nsStyleSet::IsCSSSheetType(aType));
|
|
|
|
|
|
|
|
mSheets[aType].RemoveElement(aSheet);
|
|
|
|
mSheets[aType].InsertElementAt(0, aSheet);
|
|
|
|
|
2016-02-26 05:57:42 +03:00
|
|
|
// Maintain a mirrored list of sheets on the servo side.
|
|
|
|
Servo_PrependStyleSheet(aSheet->RawSheet(), mRawSet.get());
|
|
|
|
|
2016-02-26 04:51:02 +03:00
|
|
|
return NS_OK;
|
2016-02-24 10:01:10 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
nsresult
|
|
|
|
ServoStyleSet::RemoveStyleSheet(SheetType aType,
|
2016-02-24 10:01:12 +03:00
|
|
|
ServoStyleSheet* aSheet)
|
2016-02-24 10:01:10 +03:00
|
|
|
{
|
2016-02-26 05:57:42 +03:00
|
|
|
MOZ_ASSERT(aSheet);
|
|
|
|
MOZ_ASSERT(aSheet->IsApplicable());
|
|
|
|
MOZ_ASSERT(nsStyleSet::IsCSSSheetType(aType));
|
|
|
|
|
|
|
|
mSheets[aType].RemoveElement(aSheet);
|
|
|
|
|
|
|
|
// Maintain a mirrored list of sheets on the servo side.
|
|
|
|
Servo_RemoveStyleSheet(aSheet->RawSheet(), mRawSet.get());
|
|
|
|
|
|
|
|
return NS_OK;
|
2016-02-24 10:01:10 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
nsresult
|
|
|
|
ServoStyleSet::ReplaceSheets(SheetType aType,
|
2016-02-24 10:01:12 +03:00
|
|
|
const nsTArray<RefPtr<ServoStyleSheet>>& aNewSheets)
|
2016-02-24 10:01:10 +03:00
|
|
|
{
|
|
|
|
MOZ_CRASH("stylo: not implemented");
|
|
|
|
}
|
|
|
|
|
|
|
|
nsresult
|
|
|
|
ServoStyleSet::InsertStyleSheetBefore(SheetType aType,
|
2016-02-24 10:01:12 +03:00
|
|
|
ServoStyleSheet* aNewSheet,
|
|
|
|
ServoStyleSheet* aReferenceSheet)
|
2016-02-24 10:01:10 +03:00
|
|
|
{
|
|
|
|
MOZ_CRASH("stylo: not implemented");
|
|
|
|
}
|
|
|
|
|
|
|
|
int32_t
|
|
|
|
ServoStyleSet::SheetCount(SheetType aType) const
|
|
|
|
{
|
2016-02-26 04:51:02 +03:00
|
|
|
MOZ_ASSERT(nsStyleSet::IsCSSSheetType(aType));
|
|
|
|
return mSheets[aType].Length();
|
2016-02-24 10:01:10 +03:00
|
|
|
}
|
|
|
|
|
2016-02-24 10:01:12 +03:00
|
|
|
ServoStyleSheet*
|
2016-02-24 10:01:10 +03:00
|
|
|
ServoStyleSet::StyleSheetAt(SheetType aType,
|
|
|
|
int32_t aIndex) const
|
|
|
|
{
|
2016-02-26 04:51:02 +03:00
|
|
|
MOZ_ASSERT(nsStyleSet::IsCSSSheetType(aType));
|
|
|
|
return mSheets[aType][aIndex];
|
2016-02-24 10:01:10 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
nsresult
|
2016-02-24 10:01:12 +03:00
|
|
|
ServoStyleSet::RemoveDocStyleSheet(ServoStyleSheet* aSheet)
|
2016-02-24 10:01:10 +03:00
|
|
|
{
|
|
|
|
MOZ_CRASH("stylo: not implemented");
|
|
|
|
}
|
|
|
|
|
|
|
|
nsresult
|
2016-02-24 10:01:12 +03:00
|
|
|
ServoStyleSet::AddDocStyleSheet(ServoStyleSheet* aSheet,
|
2016-02-24 10:01:10 +03:00
|
|
|
nsIDocument* aDocument)
|
|
|
|
{
|
2016-02-26 05:57:42 +03:00
|
|
|
// XXXbholley: Implement this.
|
|
|
|
NS_ERROR("stylo: no support for adding doc stylesheets to ServoStyleSet");
|
|
|
|
return NS_OK;
|
2016-02-24 10:01:10 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
already_AddRefed<nsStyleContext>
|
|
|
|
ServoStyleSet::ProbePseudoElementStyle(Element* aParentElement,
|
|
|
|
CSSPseudoElementType aType,
|
|
|
|
nsStyleContext* aParentContext)
|
|
|
|
{
|
|
|
|
MOZ_CRASH("stylo: not implemented");
|
|
|
|
}
|
|
|
|
|
|
|
|
already_AddRefed<nsStyleContext>
|
|
|
|
ServoStyleSet::ProbePseudoElementStyle(Element* aParentElement,
|
|
|
|
CSSPseudoElementType aType,
|
|
|
|
nsStyleContext* aParentContext,
|
|
|
|
TreeMatchContext& aTreeMatchContext,
|
|
|
|
Element* aPseudoElement)
|
|
|
|
{
|
|
|
|
MOZ_CRASH("stylo: not implemented");
|
|
|
|
}
|
|
|
|
|
|
|
|
nsRestyleHint
|
|
|
|
ServoStyleSet::HasStateDependentStyle(dom::Element* aElement,
|
|
|
|
EventStates aStateMask)
|
|
|
|
{
|
|
|
|
MOZ_CRASH("stylo: not implemented");
|
|
|
|
}
|
|
|
|
|
|
|
|
nsRestyleHint
|
|
|
|
ServoStyleSet::HasStateDependentStyle(dom::Element* aElement,
|
|
|
|
CSSPseudoElementType aPseudoType,
|
|
|
|
dom::Element* aPseudoElement,
|
|
|
|
EventStates aStateMask)
|
|
|
|
{
|
|
|
|
MOZ_CRASH("stylo: not implemented");
|
|
|
|
}
|