Bug 856317 - Expose the column number of style rules via inIDOMUtils. r=dbaron

This commit is contained in:
David Creswick 2013-04-06 12:38:56 -05:00
Родитель ab74228011
Коммит 206e93e61e
8 изменённых файлов: 152 добавлений и 6 удалений

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

@ -16,12 +16,13 @@ interface nsIDOMFontFaceList;
interface nsIDOMRange;
interface nsIDOMCSSStyleSheet;
[scriptable, uuid(1d9c29dc-230a-441e-bba9-49104ffa185e)]
[scriptable, uuid(c10e5142-e936-45d7-ad5b-21a32ce739a3)]
interface inIDOMUtils : nsISupports
{
// CSS utilities
nsISupportsArray getCSSStyleRules(in nsIDOMElement aElement, [optional] in DOMString aPseudo);
unsigned long getRuleLine(in nsIDOMCSSStyleRule aRule);
unsigned long getRuleColumn(in nsIDOMCSSStyleRule aRule);
// Utilities for working with selectors. We don't have a JS OM representation
// of a single selector or a selector list yet, but given a rule we can index

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

@ -230,6 +230,18 @@ inDOMUtils::GetRuleLine(nsIDOMCSSStyleRule *aRule, uint32_t *_retval)
return NS_OK;
}
NS_IMETHODIMP
inDOMUtils::GetRuleColumn(nsIDOMCSSStyleRule *aRule, uint32_t *_retval)
{
ErrorResult rv;
nsRefPtr<StyleRule> rule = GetRuleFromDOMRule(aRule, rv);
if (rv.Failed()) {
return rv.ErrorCode();
}
*_retval = rule->GetColumnNumber();
return NS_OK;
}
NS_IMETHODIMP
inDOMUtils::GetSelectorCount(nsIDOMCSSStyleRule* aRule, uint32_t *aCount)
{

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

@ -20,6 +20,8 @@ MOCHITEST_FILES =\
test_bug557726.html \
test_bug609549.xhtml \
test_bug806192.html \
test_bug856317.html \
bug856317.css \
test_isinheritableproperty.html \
$(NULL)

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

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

@ -1281,6 +1281,7 @@ StyleRule::StyleRule(nsCSSSelectorList* aSelector,
mImportantRule(nullptr),
mDOMRule(nullptr),
mLineNumber(0),
mColumnNumber(0),
mWasMatched(false)
{
NS_PRECONDITION(aDeclaration, "must have a declaration");
@ -1294,6 +1295,7 @@ StyleRule::StyleRule(const StyleRule& aCopy)
mImportantRule(nullptr),
mDOMRule(nullptr),
mLineNumber(aCopy.mLineNumber),
mColumnNumber(aCopy.mColumnNumber),
mWasMatched(false)
{
// rest is constructed lazily on existing data
@ -1308,6 +1310,7 @@ StyleRule::StyleRule(StyleRule& aCopy,
mImportantRule(nullptr),
mDOMRule(aCopy.mDOMRule),
mLineNumber(aCopy.mLineNumber),
mColumnNumber(aCopy.mColumnNumber),
mWasMatched(false)
{
// The DOM rule is replacing |aCopy| with |this|, so transfer

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

@ -317,7 +317,10 @@ public:
nsCSSSelectorList* Selector() { return mSelector; }
uint32_t GetLineNumber() const { return mLineNumber; }
void SetLineNumber(uint32_t aLineNumber) { mLineNumber = aLineNumber; }
uint32_t GetColumnNumber() const { return mColumnNumber; }
void SetLineNumberAndColumnNumber(uint32_t aLineNumber,
uint32_t aColumnNumber)
{ mLineNumber = aLineNumber; mColumnNumber = aColumnNumber; }
Declaration* GetDeclaration() const { return mDeclaration; }
@ -373,7 +376,8 @@ private:
ImportantRule* mImportantRule; // initialized by RuleMatched
DOMCSSStyleRule* mDOMRule;
// Keep the same type so that MSVC packs them.
uint32_t mLineNumber : 31;
uint32_t mLineNumber;
uint32_t mColumnNumber : 31;
uint32_t mWasMatched : 1;
private:

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

@ -331,6 +331,7 @@ protected:
bool GetToken(bool aSkipWS);
void UngetToken();
bool GetNextTokenLocation(bool aSkipWS, uint32_t *linenum, uint32_t *colnum);
bool ExpectSymbol(PRUnichar aSymbol, bool aSkipWS);
bool ExpectEndProperty();
@ -1436,6 +1437,21 @@ CSSParserImpl::UngetToken()
mHavePushBack = true;
}
bool
CSSParserImpl::GetNextTokenLocation(bool aSkipWS, uint32_t *linenum, uint32_t *colnum)
{
// Peek at next token so that mScanner updates line and column vals
if (!GetToken(aSkipWS)) {
return false;
}
UngetToken();
// The scanner uses one-indexing for line numbers but zero-indexing
// for column numbers.
*linenum = mScanner->GetLineNumber();
*colnum = 1 + mScanner->GetColumnNumber();
return true;
}
bool
CSSParserImpl::ExpectSymbol(PRUnichar aSymbol,
bool aSkipWS)
@ -2888,8 +2904,9 @@ CSSParserImpl::ParseRuleSet(RuleAppendFunc aAppendFunc, void* aData,
{
// First get the list of selectors for the rule
nsCSSSelectorList* slist = nullptr;
uint32_t linenum = mScanner->GetLineNumber();
if (! ParseSelectorList(slist, PRUnichar('{'))) {
uint32_t linenum, colnum;
if (!GetNextTokenLocation(true, &linenum, &colnum) ||
!ParseSelectorList(slist, PRUnichar('{'))) {
REPORT_UNEXPECTED(PEBadSelectorRSIgnored);
OUTPUT_ERROR();
SkipRuleSet(aInsideBraces);
@ -2917,7 +2934,7 @@ CSSParserImpl::ParseRuleSet(RuleAppendFunc aAppendFunc, void* aData,
// Translate the selector list and declaration block into style data
nsRefPtr<css::StyleRule> rule = new css::StyleRule(slist, declaration);
rule->SetLineNumber(linenum);
rule->SetLineNumberAndColumnNumber(linenum, colnum);
(*aAppendFunc)(rule, aData);
return true;