gecko-dev/layout/inspector/ServoStyleRuleMap.h
Xidorn Quan e3c82192cb Bug 1359217 part 6 - Add ServoStyleRuleMap to handle style rule mapping. r=heycam
This commit adds class ServoStyleRuleMap which caches the mapping from
raw Servo style rule to Gecko's wrapper object.

It is a per-document object, and is added as an observer of document
when constructed, so that it updates data inside when possible.

For safety consideration, this change also makes ServoStyleRule support
weak pointer, and use weak pointer inside ServoStyleRuleMap.

MozReview-Commit-ID: YxBnZ88tjf

--HG--
extra : source : 0f2bc306d27b8ab22f1aa08aa9d44af0dba4694d
2017-06-19 15:45:43 +10:00

72 lines
2.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/. */
#ifndef mozilla_ServoStyleRuleMap_h
#define mozilla_ServoStyleRuleMap_h
#include "mozilla/ServoStyleRule.h"
#include "nsDataHashtable.h"
#include "nsICSSLoaderObserver.h"
#include "nsStubDocumentObserver.h"
struct RawServoStyleRule;
namespace mozilla {
class ServoCSSRuleList;
class ServoStyleSet;
namespace css {
class Rule;
} // namespace css
class ServoStyleRuleMap final : public nsStubDocumentObserver
, public nsICSSLoaderObserver
{
public:
NS_DECL_ISUPPORTS
explicit ServoStyleRuleMap(ServoStyleSet* aStyleSet);
void EnsureTable();
ServoStyleRule* Lookup(const RawServoStyleRule* aRawRule) const {
return mTable.Get(aRawRule);
}
// nsIDocumentObserver methods
void StyleSheetAdded(StyleSheet* aStyleSheet, bool aDocumentSheet) final;
void StyleSheetRemoved(StyleSheet* aStyleSheet, bool aDocumentSheet) final;
void StyleSheetApplicableStateChanged(StyleSheet* aStyleSheet) final;
void StyleRuleAdded(StyleSheet* aStyleSheet, css::Rule* aStyleRule) final;
void StyleRuleRemoved(StyleSheet* aStyleSheet, css::Rule* aStyleRule) final;
// nsICSSLoaderObserver
NS_IMETHOD StyleSheetLoaded(StyleSheet* aSheet,
bool aWasAlternate, nsresult aStatus) final;
size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const;
private:
~ServoStyleRuleMap();
// Since we would never have a document which contains no style rule,
// we use IsEmpty as an indication whether we need to walk through
// all stylesheets to fill the table.
bool IsEmpty() const { return mTable.Count() == 0; }
void FillTableFromRule(css::Rule* aRule);
void FillTableFromRuleList(ServoCSSRuleList* aRuleList);
void FillTableFromStyleSheet(ServoStyleSheet* aSheet);
typedef nsDataHashtable<nsPtrHashKey<const RawServoStyleRule>,
WeakPtr<ServoStyleRule>> Hashtable;
Hashtable mTable;
ServoStyleSet* mStyleSet;
};
} // namespace mozilla
#endif // mozilla_ServoStyleRuleMap_h