Backed out changeset b49d8d47c3f1 (bug 1382078)

This commit is contained in:
Sebastian Hengst 2017-09-02 20:43:36 +02:00
Родитель 4ec0447af3
Коммит 3764de542b
7 изменённых файлов: 30 добавлений и 138 удалений

Просмотреть файл

@ -50,7 +50,6 @@
#include "nsThreadUtils.h"
#include "mozilla/dom/NodeListBinding.h"
#include "mozilla/dom/ScriptSettings.h"
#include "mozilla/ServoStyleSet.h"
#include "mozilla/Unused.h"
using namespace mozilla;
@ -746,59 +745,19 @@ nsBindingManager::MediumFeaturesChanged(nsPresContext* aPresContext)
{
bool rulesChanged = false;
RefPtr<nsPresContext> presContext = aPresContext;
bool isStyledByServo = mDocument->IsStyledByServo();
EnumerateBoundContentBindings([=, &rulesChanged](nsXBLBinding* aBinding) {
if (isStyledByServo) {
ServoStyleSet* styleSet = aBinding->PrototypeBinding()->GetServoStyleSet();
if (styleSet) {
bool styleSetChanged = false;
if (styleSet->IsPresContextChanged(presContext)) {
styleSetChanged = true;
} else {
// PresContext is not changed. This means aPresContext is still
// alive since the last time it initialized this XBL styleset.
// It's safe to check whether medium features changed.
bool viewportUnitsUsed = false;
styleSetChanged =
styleSet->MediumFeaturesChangedRules(&viewportUnitsUsed);
MOZ_ASSERT(!viewportUnitsUsed,
"Non-master stylesets shouldn't get flagged as using "
"viewport units!");
}
rulesChanged = rulesChanged || styleSetChanged;
}
} else {
nsIStyleRuleProcessor* ruleProcessor =
aBinding->PrototypeBinding()->GetRuleProcessor();
if (ruleProcessor) {
bool thisChanged = ruleProcessor->MediumFeaturesChanged(presContext);
rulesChanged = rulesChanged || thisChanged;
}
nsIStyleRuleProcessor* ruleProcessor =
aBinding->PrototypeBinding()->GetRuleProcessor();
if (ruleProcessor) {
bool thisChanged = ruleProcessor->MediumFeaturesChanged(presContext);
rulesChanged = rulesChanged || thisChanged;
}
});
return rulesChanged;
}
void
nsBindingManager::UpdateBoundContentBindingsForServo(nsPresContext* aPresContext)
{
MOZ_ASSERT(mDocument->IsStyledByServo(),
"This should be called only by servo-backend!");
RefPtr<nsPresContext> presContext = aPresContext;
EnumerateBoundContentBindings([=](nsXBLBinding* aBinding) {
nsXBLPrototypeBinding* protoBinding = aBinding->PrototypeBinding();
ServoStyleSet* styleSet = protoBinding->GetServoStyleSet();
if (styleSet && styleSet->StyleSheetsHaveChanged()) {
protoBinding->ComputeServoStyleSet(presContext);
}
});
}
void
nsBindingManager::AppendAllSheets(nsTArray<StyleSheet*>& aArray)
{

Просмотреть файл

@ -130,17 +130,13 @@ public:
void WalkAllRules(nsIStyleRuleProcessor::EnumFunc aFunc,
ElementDependentRuleProcessorData* aData);
// Do any processing that needs to happen as a result of a change in the
// characteristics of the medium, and return whether this rule processor's
// rules or the servo style set have changed (e.g., because of media
// queries).
/**
* Do any processing that needs to happen as a result of a change in
* the characteristics of the medium, and return whether this rule
* processor's rules have changed (e.g., because of media queries).
*/
bool MediumFeaturesChanged(nsPresContext* aPresContext);
// Update the content bindings in mBoundContentSet due to medium features
// changed.
void UpdateBoundContentBindingsForServo(nsPresContext* aPresContext);
void AppendAllSheets(nsTArray<mozilla::StyleSheet*>& aArray);
void Traverse(nsIContent *aContent,

Просмотреть файл

@ -569,14 +569,6 @@ nsXBLPrototypeBinding::GetRuleProcessor()
return nullptr;
}
void
nsXBLPrototypeBinding::ComputeServoStyleSet(nsPresContext* aPresContext)
{
if (mResources) {
mResources->ComputeServoStyleSet(aPresContext);
}
}
ServoStyleSet*
nsXBLPrototypeBinding::GetServoStyleSet() const
{

Просмотреть файл

@ -131,7 +131,6 @@ public:
void AppendStyleSheetsTo(nsTArray<mozilla::StyleSheet*>& aResult) const;
nsIStyleRuleProcessor* GetRuleProcessor();
void ComputeServoStyleSet(nsPresContext* aPresContext);
mozilla::ServoStyleSet* GetServoStyleSet() const;
nsresult FlushSkinSheets();

Просмотреть файл

@ -109,8 +109,6 @@ void
ServoStyleSet::Init(nsPresContext* aPresContext, nsBindingManager* aBindingManager)
{
mPresContext = aPresContext;
mPresContextInitXBLStyleSet = aPresContext;
mRawSet.reset(Servo_StyleSet_Init(aPresContext));
mBindingManager = aBindingManager;
@ -170,15 +168,11 @@ nsRestyleHint
ServoStyleSet::MediumFeaturesChanged(bool aViewportChanged)
{
bool viewportUnitsUsed = false;
bool rulesChanged = MediumFeaturesChangedRules(&viewportUnitsUsed);
const OriginFlags rulesChanged = static_cast<OriginFlags>(
Servo_StyleSet_MediumFeaturesChanged(mRawSet.get(), &viewportUnitsUsed));
if (mBindingManager &&
mBindingManager->MediumFeaturesChanged(mPresContext)) {
SetStylistXBLStyleSheetsDirty();
rulesChanged = true;
}
if (rulesChanged) {
if (rulesChanged != OriginFlags(0)) {
MarkOriginsDirty(rulesChanged);
return eRestyle_Subtree;
}
@ -189,22 +183,6 @@ ServoStyleSet::MediumFeaturesChanged(bool aViewportChanged)
return nsRestyleHint(0);
}
bool
ServoStyleSet::MediumFeaturesChangedRules(bool* aViewportUnitsUsed)
{
MOZ_ASSERT(aViewportUnitsUsed);
const OriginFlags rulesChanged = static_cast<OriginFlags>(
Servo_StyleSet_MediumFeaturesChanged(mRawSet.get(), aViewportUnitsUsed));
if (rulesChanged != OriginFlags(0)) {
MarkOriginsDirty(rulesChanged);
return true;
}
return false;
}
MOZ_DEFINE_MALLOC_SIZE_OF(ServoStyleSetMallocSizeOf)
void
@ -1394,21 +1372,13 @@ ServoStyleSet::UpdateStylist()
{
MOZ_ASSERT(StylistNeedsUpdate());
if (mStylistState & StylistState::StyleSheetsDirty) {
// There's no need to compute invalidations and such for an XBL styleset,
// since they are loaded and unloaded synchronously, and they don't have to
// deal with dynamic content changes.
Element* root =
IsMaster() ? mPresContext->Document()->GetDocumentElement() : nullptr;
Servo_StyleSet_FlushStyleSheets(mRawSet.get(), root);
}
if (MOZ_UNLIKELY(mStylistState & StylistState::XBLStyleSheetsDirty)) {
MOZ_ASSERT(IsMaster(), "Only master styleset can mark XBL stylesets dirty!");
mBindingManager->UpdateBoundContentBindingsForServo(mPresContext);
}
// There's no need to compute invalidations and such for an XBL styleset,
// since they are loaded and unloaded synchronously, and they don't have to
// deal with dynamic content changes.
Element* root =
IsMaster() ? mPresContext->Document()->GetDocumentElement() : nullptr;
Servo_StyleSet_FlushStyleSheets(mRawSet.get(), root);
mStylistState = StylistState::NotDirty;
}

Просмотреть файл

@ -46,22 +46,18 @@ struct TreeMatchContext;
namespace mozilla {
// A few flags used to track which kind of stylist state we may need to
// update.
/**
* A few flags used to track which kind of stylist state we may need to
* update.
*/
enum class StylistState : uint8_t {
// The stylist is not dirty, we should do nothing.
/** The stylist is not dirty, we should do nothing */
NotDirty = 0,
// The style sheets have changed, so we need to update the style data.
StyleSheetsDirty = 1 << 0,
// Some of the style sheets of the bound elements in binding manager have
// changed, so we need to tell the binding manager to update style data.
XBLStyleSheetsDirty = 1 << 1,
/** The style sheets have changed, so we need to update the style data. */
StyleSheetsDirty,
};
MOZ_MAKE_ENUM_CLASS_BITWISE_OPERATORS(StylistState)
// Bitfield type to represent Servo stylesheet origins.
enum class OriginFlags : uint8_t {
UserAgent = 0x01,
@ -137,9 +133,6 @@ public:
nsRestyleHint MediumFeaturesChanged(bool aViewportChanged);
// aViewportChanged outputs whether any viewport units is used.
bool MediumFeaturesChangedRules(bool* aViewportUnitsUsed);
void InvalidateStyleForCSSRuleChanges();
void AddSizeOfIncludingThis(nsWindowSizes& aSizes) const;
@ -440,11 +433,6 @@ public:
mPresContext = nullptr;
}
// Return whether this is the PresContext that initialized us.
bool IsPresContextChanged(nsPresContext* aPresContext) const {
return aPresContext != mPresContextInitXBLStyleSet;
}
/**
* Returns true if a modification to an an attribute with the specified
* local name might require us to restyle the element.
@ -537,12 +525,7 @@ private:
*/
void SetStylistStyleSheetsDirty()
{
mStylistState |= StylistState::StyleSheetsDirty;
}
void SetStylistXBLStyleSheetsDirty()
{
mStylistState |= StylistState::XBLStyleSheetsDirty;
mStylistState = StylistState::StyleSheetsDirty;
}
bool StylistNeedsUpdate() const
@ -582,15 +565,7 @@ private:
ServoStyleSheet* aSheet);
const Kind mKind;
// Nullptr if this is an XBL style set.
nsPresContext* MOZ_NON_OWNING_REF mPresContext = nullptr;
// Because XBL style set could be used by multiple PresContext, we need to
// store the PresContext pointer which initializes this style set for
// computing medium rule changes.
void* MOZ_NON_OWNING_REF mPresContextInitXBLStyleSet = nullptr;
nsPresContext* mPresContext;
UniquePtr<RawServoStyleSet> mRawSet;
EnumeratedArray<SheetType, SheetType::Count,
nsTArray<RefPtr<ServoStyleSheet>>> mSheets;

Просмотреть файл

@ -242,6 +242,7 @@ skip-if = !stylo
skip-if = android_version == '18' #debug-only failure; timed out #Android 4.3 aws only; bug 1030419
[test_media_queries_dynamic.html]
[test_media_queries_dynamic_xbl.html]
fail-if = stylo # bug 1382078
[test_media_query_list.html]
[test_media_query_serialization.html]
[test_moz_device_pixel_ratio.html]