OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2010, Google Inc. All rights reserved. | 2 * Copyright (C) 2010, Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
52 #include "wtf/OwnPtr.h" | 52 #include "wtf/OwnPtr.h" |
53 #include "wtf/PassOwnPtr.h" | 53 #include "wtf/PassOwnPtr.h" |
54 #include "wtf/text/StringBuilder.h" | 54 #include "wtf/text/StringBuilder.h" |
55 #include "wtf/text/TextPosition.h" | 55 #include "wtf/text/TextPosition.h" |
56 | 56 |
57 using WebCore::TypeBuilder::Array; | 57 using WebCore::TypeBuilder::Array; |
58 using WebCore::RuleSourceDataList; | 58 using WebCore::RuleSourceDataList; |
59 using WebCore::CSSRuleSourceData; | 59 using WebCore::CSSRuleSourceData; |
60 using WebCore::CSSStyleSheet; | 60 using WebCore::CSSStyleSheet; |
61 | 61 |
62 static PassOwnPtr<WebCore::BisonCSSParser> createCSSParser(WebCore::Document* do
cument) | |
63 { | |
64 return adoptPtr(new WebCore::BisonCSSParser(document ? WebCore::CSSParserCon
text(*document, 0) : WebCore::strictCSSParserContext())); | |
65 } | |
66 | |
67 namespace { | 62 namespace { |
68 | 63 |
69 using namespace WebCore; | 64 using namespace WebCore; |
70 | 65 |
| 66 static CSSParserContext parserContextForDocument(Document *document) |
| 67 { |
| 68 return document ? CSSParserContext(*document, 0) : strictCSSParserContext(); |
| 69 } |
| 70 |
71 class StyleSheetHandler FINAL : public CSSParserObserver { | 71 class StyleSheetHandler FINAL : public CSSParserObserver { |
72 public: | 72 public: |
73 StyleSheetHandler(const String& parsedText, Document* document, StyleSheetCo
ntents* styleSheetContents, RuleSourceDataList* result) | 73 StyleSheetHandler(const String& parsedText, Document* document, StyleSheetCo
ntents* styleSheetContents, RuleSourceDataList* result) |
74 : m_parsedText(parsedText) | 74 : m_parsedText(parsedText) |
75 , m_document(document) | 75 , m_document(document) |
76 , m_styleSheetContents(styleSheetContents) | 76 , m_styleSheetContents(styleSheetContents) |
77 , m_result(result) | 77 , m_result(result) |
| 78 , m_commentParser(parserContextForDocument(document)) |
78 , m_propertyRangeStart(UINT_MAX) | 79 , m_propertyRangeStart(UINT_MAX) |
79 , m_selectorRangeStart(UINT_MAX) | 80 , m_selectorRangeStart(UINT_MAX) |
80 , m_commentRangeStart(UINT_MAX) | 81 , m_commentRangeStart(UINT_MAX) |
81 { | 82 { |
82 ASSERT(m_result); | 83 ASSERT(m_result); |
83 } | 84 } |
84 | 85 |
85 private: | 86 private: |
86 virtual void startRuleHeader(CSSRuleSourceData::Type, unsigned) OVERRIDE; | 87 virtual void startRuleHeader(CSSRuleSourceData::Type, unsigned) OVERRIDE; |
87 virtual void endRuleHeader(unsigned) OVERRIDE; | 88 virtual void endRuleHeader(unsigned) OVERRIDE; |
(...skipping 11 matching lines...) Expand all Loading... |
99 PassRefPtr<CSSRuleSourceData> popRuleData(); | 100 PassRefPtr<CSSRuleSourceData> popRuleData(); |
100 template <typename CharacterType> inline void setRuleHeaderEnd(const Charact
erType*, unsigned); | 101 template <typename CharacterType> inline void setRuleHeaderEnd(const Charact
erType*, unsigned); |
101 void fixUnparsedPropertyRanges(CSSRuleSourceData*); | 102 void fixUnparsedPropertyRanges(CSSRuleSourceData*); |
102 | 103 |
103 const String& m_parsedText; | 104 const String& m_parsedText; |
104 Document* m_document; | 105 Document* m_document; |
105 StyleSheetContents* m_styleSheetContents; | 106 StyleSheetContents* m_styleSheetContents; |
106 RuleSourceDataList* m_result; | 107 RuleSourceDataList* m_result; |
107 RuleSourceDataList m_currentRuleDataStack; | 108 RuleSourceDataList m_currentRuleDataStack; |
108 RefPtr<CSSRuleSourceData> m_currentRuleData; | 109 RefPtr<CSSRuleSourceData> m_currentRuleData; |
109 OwnPtr<BisonCSSParser> m_commentParser; | 110 BisonCSSParser m_commentParser; |
110 unsigned m_propertyRangeStart; | 111 unsigned m_propertyRangeStart; |
111 unsigned m_selectorRangeStart; | 112 unsigned m_selectorRangeStart; |
112 unsigned m_commentRangeStart; | 113 unsigned m_commentRangeStart; |
113 }; | 114 }; |
114 | 115 |
115 void StyleSheetHandler::startRuleHeader(CSSRuleSourceData::Type type, unsigned o
ffset) | 116 void StyleSheetHandler::startRuleHeader(CSSRuleSourceData::Type type, unsigned o
ffset) |
116 { | 117 { |
117 // Pop off data for a previous invalid rule. | 118 // Pop off data for a previous invalid rule. |
118 if (m_currentRuleData) | 119 if (m_currentRuleData) |
119 m_currentRuleDataStack.removeLast(); | 120 m_currentRuleDataStack.removeLast(); |
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
326 commentText = commentText.substring(2); | 327 commentText = commentText.substring(2); |
327 | 328 |
328 // Require well-formed comments. | 329 // Require well-formed comments. |
329 if (!commentText.endsWith("*/")) | 330 if (!commentText.endsWith("*/")) |
330 return; | 331 return; |
331 commentText = commentText.substring(0, commentText.length() - 2).stripWhiteS
pace(); | 332 commentText = commentText.substring(0, commentText.length() - 2).stripWhiteS
pace(); |
332 if (commentText.isEmpty()) | 333 if (commentText.isEmpty()) |
333 return; | 334 return; |
334 | 335 |
335 // FIXME: Use the actual rule type rather than STYLE_RULE? | 336 // FIXME: Use the actual rule type rather than STYLE_RULE? |
336 if (!m_commentParser) | |
337 m_commentParser = createCSSParser(m_document); | |
338 RuleSourceDataList sourceData; | 337 RuleSourceDataList sourceData; |
339 | 338 |
340 // FIXME: Use another subclass of BisonCSSParser::SourceDataHandler and asse
rt that | 339 // FIXME: Use another subclass of BisonCSSParser::SourceDataHandler and asse
rt that |
341 // no comments are encountered (will not need m_document and m_styleSheetCon
tents). | 340 // no comments are encountered (will not need m_document and m_styleSheetCon
tents). |
342 StyleSheetHandler handler(commentText, m_document, m_styleSheetContents, &so
urceData); | 341 StyleSheetHandler handler(commentText, m_document, m_styleSheetContents, &so
urceData); |
343 RefPtrWillBeRawPtr<MutableStylePropertySet> tempMutableStyle = MutableStyleP
ropertySet::create(); | 342 RefPtrWillBeRawPtr<MutableStylePropertySet> tempMutableStyle = MutableStyleP
ropertySet::create(); |
344 m_commentParser->parseDeclaration(tempMutableStyle.get(), commentText, &hand
ler, m_styleSheetContents); | 343 m_commentParser.parseDeclaration(tempMutableStyle.get(), commentText, &handl
er, m_styleSheetContents); |
345 Vector<CSSPropertySourceData>& commentPropertyData = sourceData.first()->sty
leSourceData->propertyData; | 344 Vector<CSSPropertySourceData>& commentPropertyData = sourceData.first()->sty
leSourceData->propertyData; |
346 if (commentPropertyData.size() != 1) | 345 if (commentPropertyData.size() != 1) |
347 return; | 346 return; |
348 CSSPropertySourceData& propertyData = commentPropertyData.at(0); | 347 CSSPropertySourceData& propertyData = commentPropertyData.at(0); |
349 if (propertyData.range.length() != commentText.length()) | 348 if (propertyData.range.length() != commentText.length()) |
350 return; | 349 return; |
351 | 350 |
352 unsigned topRuleBodyRangeStart = m_currentRuleDataStack.last()->ruleBodyRang
e.start; | 351 unsigned topRuleBodyRangeStart = m_currentRuleDataStack.last()->ruleBodyRang
e.start; |
353 m_currentRuleDataStack.last()->styleSourceData->propertyData.append( | 352 m_currentRuleDataStack.last()->styleSourceData->propertyData.append( |
354 CSSPropertySourceData(propertyData.name, propertyData.value, false, true
, true, SourceRange(startOffset - topRuleBodyRangeStart, offset - topRuleBodyRan
geStart))); | 353 CSSPropertySourceData(propertyData.name, propertyData.value, false, true
, true, SourceRange(startOffset - topRuleBodyRangeStart, offset - topRuleBodyRan
geStart))); |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
412 { | 411 { |
413 if (hasSourceData()) | 412 if (hasSourceData()) |
414 return true; | 413 return true; |
415 | 414 |
416 if (!hasText()) | 415 if (!hasText()) |
417 return false; | 416 return false; |
418 | 417 |
419 RefPtrWillBeRawPtr<StyleSheetContents> newStyleSheet = StyleSheetContents::c
reate(strictCSSParserContext()); | 418 RefPtrWillBeRawPtr<StyleSheetContents> newStyleSheet = StyleSheetContents::c
reate(strictCSSParserContext()); |
420 OwnPtr<RuleSourceDataList> result = adoptPtr(new RuleSourceDataList()); | 419 OwnPtr<RuleSourceDataList> result = adoptPtr(new RuleSourceDataList()); |
421 StyleSheetHandler handler(text(), m_pageStyleSheet->ownerDocument(), newStyl
eSheet.get(), result.get()); | 420 StyleSheetHandler handler(text(), m_pageStyleSheet->ownerDocument(), newStyl
eSheet.get(), result.get()); |
422 createCSSParser(m_pageStyleSheet->ownerDocument())->parseSheet(newStyleSheet
.get(), text(), TextPosition::minimumPosition(), &handler); | 421 BisonCSSParser(parserContextForDocument(m_pageStyleSheet->ownerDocument())).
parseSheet(newStyleSheet.get(), text(), TextPosition::minimumPosition(), &handle
r); |
423 setSourceData(result.release()); | 422 setSourceData(result.release()); |
424 return hasSourceData(); | 423 return hasSourceData(); |
425 } | 424 } |
426 | 425 |
427 void ParsedStyleSheet::setSourceData(PassOwnPtr<RuleSourceDataList> sourceData) | 426 void ParsedStyleSheet::setSourceData(PassOwnPtr<RuleSourceDataList> sourceData) |
428 { | 427 { |
429 if (!sourceData) { | 428 if (!sourceData) { |
430 m_sourceData.clear(); | 429 m_sourceData.clear(); |
431 return; | 430 return; |
432 } | 431 } |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
549 } | 548 } |
550 | 549 |
551 bool InspectorStyle::verifyPropertyText(const String& propertyText, bool canOmit
Semicolon) | 550 bool InspectorStyle::verifyPropertyText(const String& propertyText, bool canOmit
Semicolon) |
552 { | 551 { |
553 DEFINE_STATIC_LOCAL(String, bogusPropertyName, ("-webkit-boguz-propertee")); | 552 DEFINE_STATIC_LOCAL(String, bogusPropertyName, ("-webkit-boguz-propertee")); |
554 RefPtrWillBeRawPtr<MutableStylePropertySet> tempMutableStyle = MutableStyleP
ropertySet::create(); | 553 RefPtrWillBeRawPtr<MutableStylePropertySet> tempMutableStyle = MutableStyleP
ropertySet::create(); |
555 RuleSourceDataList sourceData; | 554 RuleSourceDataList sourceData; |
556 RefPtrWillBeRawPtr<StyleSheetContents> styleSheetContents = StyleSheetConten
ts::create(strictCSSParserContext()); | 555 RefPtrWillBeRawPtr<StyleSheetContents> styleSheetContents = StyleSheetConten
ts::create(strictCSSParserContext()); |
557 String declarationText = propertyText + (canOmitSemicolon ? ";" : " ") + bog
usPropertyName + ": none"; | 556 String declarationText = propertyText + (canOmitSemicolon ? ";" : " ") + bog
usPropertyName + ": none"; |
558 StyleSheetHandler handler(declarationText, ownerDocument(), styleSheetConten
ts.get(), &sourceData); | 557 StyleSheetHandler handler(declarationText, ownerDocument(), styleSheetConten
ts.get(), &sourceData); |
559 createCSSParser(ownerDocument())->parseDeclaration(tempMutableStyle.get(), d
eclarationText, &handler, styleSheetContents.get()); | 558 BisonCSSParser(parserContextForDocument(ownerDocument())).parseDeclaration(t
empMutableStyle.get(), declarationText, &handler, styleSheetContents.get()); |
560 Vector<CSSPropertySourceData>& propertyData = sourceData.first()->styleSourc
eData->propertyData; | 559 Vector<CSSPropertySourceData>& propertyData = sourceData.first()->styleSourc
eData->propertyData; |
561 unsigned propertyCount = propertyData.size(); | 560 unsigned propertyCount = propertyData.size(); |
562 | 561 |
563 // At least one property + the bogus property added just above should be pre
sent. | 562 // At least one property + the bogus property added just above should be pre
sent. |
564 if (propertyCount < 2) | 563 if (propertyCount < 2) |
565 return false; | 564 return false; |
566 | 565 |
567 // Check for the proper propertyText termination (the parser could at least
restore to the PROPERTY_NAME state). | 566 // Check for the proper propertyText termination (the parser could at least
restore to the PROPERTY_NAME state). |
568 if (propertyData.at(propertyCount - 1).name != bogusPropertyName) | 567 if (propertyData.at(propertyCount - 1).name != bogusPropertyName) |
569 return false; | 568 return false; |
(...skipping 417 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
987 String sheetText = m_parsedStyleSheet->text(); | 986 String sheetText = m_parsedStyleSheet->text(); |
988 sheetText.replace(sourceData->ruleHeaderRange.start, sourceData->ruleHeaderR
ange.length(), selector); | 987 sheetText.replace(sourceData->ruleHeaderRange.start, sourceData->ruleHeaderR
ange.length(), selector); |
989 m_parsedStyleSheet->setText(sheetText); | 988 m_parsedStyleSheet->setText(sheetText); |
990 fireStyleSheetChanged(); | 989 fireStyleSheetChanged(); |
991 return true; | 990 return true; |
992 } | 991 } |
993 | 992 |
994 static bool checkStyleRuleSelector(Document* document, const String& selector) | 993 static bool checkStyleRuleSelector(Document* document, const String& selector) |
995 { | 994 { |
996 CSSSelectorList selectorList; | 995 CSSSelectorList selectorList; |
997 createCSSParser(document)->parseSelector(selector, selectorList); | 996 BisonCSSParser(parserContextForDocument(document)).parseSelector(selector, s
electorList); |
998 return selectorList.isValid(); | 997 return selectorList.isValid(); |
999 } | 998 } |
1000 | 999 |
1001 CSSStyleRule* InspectorStyleSheet::addRule(const String& selector, ExceptionStat
e& exceptionState) | 1000 CSSStyleRule* InspectorStyleSheet::addRule(const String& selector, ExceptionStat
e& exceptionState) |
1002 { | 1001 { |
1003 if (!checkStyleRuleSelector(m_pageStyleSheet->ownerDocument(), selector)) { | 1002 if (!checkStyleRuleSelector(m_pageStyleSheet->ownerDocument(), selector)) { |
1004 exceptionState.throwDOMException(SyntaxError, "The selector '" + selecto
r + "' could not be added."); | 1003 exceptionState.throwDOMException(SyntaxError, "The selector '" + selecto
r + "' could not be added."); |
1005 return 0; | 1004 return 0; |
1006 } | 1005 } |
1007 | 1006 |
(...skipping 581 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1589 if (m_styleText.isEmpty()) { | 1588 if (m_styleText.isEmpty()) { |
1590 RefPtr<CSSRuleSourceData> result = CSSRuleSourceData::create(CSSRuleSour
ceData::STYLE_RULE); | 1589 RefPtr<CSSRuleSourceData> result = CSSRuleSourceData::create(CSSRuleSour
ceData::STYLE_RULE); |
1591 result->ruleBodyRange.start = 0; | 1590 result->ruleBodyRange.start = 0; |
1592 result->ruleBodyRange.end = 0; | 1591 result->ruleBodyRange.end = 0; |
1593 return result.release(); | 1592 return result.release(); |
1594 } | 1593 } |
1595 | 1594 |
1596 RefPtrWillBeRawPtr<MutableStylePropertySet> tempDeclaration = MutableStylePr
opertySet::create(); | 1595 RefPtrWillBeRawPtr<MutableStylePropertySet> tempDeclaration = MutableStylePr
opertySet::create(); |
1597 RuleSourceDataList ruleSourceDataResult; | 1596 RuleSourceDataList ruleSourceDataResult; |
1598 StyleSheetHandler handler(m_styleText, &m_element->document(), m_element->do
cument().elementSheet().contents(), &ruleSourceDataResult); | 1597 StyleSheetHandler handler(m_styleText, &m_element->document(), m_element->do
cument().elementSheet().contents(), &ruleSourceDataResult); |
1599 createCSSParser(&m_element->document())->parseDeclaration(tempDeclaration.ge
t(), m_styleText, &handler, m_element->document().elementSheet().contents()); | 1598 BisonCSSParser(parserContextForDocument(&m_element->document())).parseDeclar
ation(tempDeclaration.get(), m_styleText, &handler, m_element->document().elemen
tSheet().contents()); |
1600 return ruleSourceDataResult.first().release(); | 1599 return ruleSourceDataResult.first().release(); |
1601 } | 1600 } |
1602 | 1601 |
1603 } // namespace WebCore | 1602 } // namespace WebCore |
1604 | 1603 |
OLD | NEW |