| 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 454 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 465 | 465 |
| 466 if (rule->type() == CSSRule::MEDIA_RULE) | 466 if (rule->type() == CSSRule::MEDIA_RULE) |
| 467 return toCSSMediaRule(rule)->cssRules(); | 467 return toCSSMediaRule(rule)->cssRules(); |
| 468 | 468 |
| 469 if (rule->type() == CSSRule::SUPPORTS_RULE) | 469 if (rule->type() == CSSRule::SUPPORTS_RULE) |
| 470 return toCSSSupportsRule(rule)->cssRules(); | 470 return toCSSSupportsRule(rule)->cssRules(); |
| 471 | 471 |
| 472 return nullptr; | 472 return nullptr; |
| 473 } | 473 } |
| 474 | 474 |
| 475 PassRefPtrWillBeRawPtr<InspectorStyle> InspectorStyle::create(const InspectorCSS
Id& styleId, PassRefPtrWillBeRawPtr<CSSStyleDeclaration> style, InspectorStyleSh
eetBase* parentStyleSheet) | 475 PassRefPtrWillBeRawPtr<InspectorStyle> InspectorStyle::create(unsigned ruleIndex
, PassRefPtrWillBeRawPtr<CSSStyleDeclaration> style, InspectorStyleSheetBase* pa
rentStyleSheet) |
| 476 { | 476 { |
| 477 return adoptRefWillBeNoop(new InspectorStyle(styleId, style, parentStyleShee
t)); | 477 return adoptRefWillBeNoop(new InspectorStyle(ruleIndex, style, parentStyleSh
eet)); |
| 478 } | 478 } |
| 479 | 479 |
| 480 InspectorStyle::InspectorStyle(const InspectorCSSId& styleId, PassRefPtrWillBeRa
wPtr<CSSStyleDeclaration> style, InspectorStyleSheetBase* parentStyleSheet) | 480 InspectorStyle::InspectorStyle(unsigned ruleIndex, PassRefPtrWillBeRawPtr<CSSSty
leDeclaration> style, InspectorStyleSheetBase* parentStyleSheet) |
| 481 : m_styleId(styleId) | 481 : m_ruleIndex(ruleIndex) |
| 482 , m_style(style) | 482 , m_style(style) |
| 483 , m_parentStyleSheet(parentStyleSheet) | 483 , m_parentStyleSheet(parentStyleSheet) |
| 484 , m_formatAcquired(false) | 484 , m_formatAcquired(false) |
| 485 { | 485 { |
| 486 ASSERT(m_style); | 486 ASSERT(m_style); |
| 487 } | 487 } |
| 488 | 488 |
| 489 PassRefPtr<TypeBuilder::CSS::CSSStyle> InspectorStyle::buildObjectForStyle() con
st | 489 PassRefPtr<TypeBuilder::CSS::CSSStyle> InspectorStyle::buildObjectForStyle() con
st |
| 490 { | 490 { |
| 491 RefPtr<TypeBuilder::CSS::CSSStyle> result = styleWithProperties(); | 491 RefPtr<TypeBuilder::CSS::CSSStyle> result = styleWithProperties(); |
| 492 if (!m_styleId.isEmpty()) | 492 if (m_parentStyleSheet && !m_parentStyleSheet->id().isEmpty()) |
| 493 result->setStyleSheetId(m_styleId.styleSheetId()); | 493 result->setStyleSheetId(m_parentStyleSheet->id()); |
| 494 | 494 |
| 495 RefPtrWillBeRawPtr<CSSRuleSourceData> sourceData = extractSourceData(); | 495 RefPtrWillBeRawPtr<CSSRuleSourceData> sourceData = extractSourceData(); |
| 496 if (sourceData) | 496 if (sourceData) |
| 497 result->setRange(buildSourceRangeObject(sourceData->ruleBodyRange, m_par
entStyleSheet->lineEndings())); | 497 result->setRange(buildSourceRangeObject(sourceData->ruleBodyRange, m_par
entStyleSheet->lineEndings())); |
| 498 | 498 |
| 499 return result.release(); | 499 return result.release(); |
| 500 } | 500 } |
| 501 | 501 |
| 502 PassRefPtr<TypeBuilder::Array<TypeBuilder::CSS::CSSComputedStyleProperty> > Insp
ectorStyle::buildArrayForComputedStyle() const | 502 PassRefPtr<TypeBuilder::Array<TypeBuilder::CSS::CSSComputedStyleProperty> > Insp
ectorStyle::buildArrayForComputedStyle() const |
| 503 { | 503 { |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 535 if (propertyData.at(propertyCount - 1).name != bogusPropertyName) | 535 if (propertyData.at(propertyCount - 1).name != bogusPropertyName) |
| 536 return false; | 536 return false; |
| 537 | 537 |
| 538 return true; | 538 return true; |
| 539 } | 539 } |
| 540 | 540 |
| 541 bool InspectorStyle::setPropertyText(unsigned index, const String& propertyText,
bool overwrite, ExceptionState& exceptionState) | 541 bool InspectorStyle::setPropertyText(unsigned index, const String& propertyText,
bool overwrite, ExceptionState& exceptionState) |
| 542 { | 542 { |
| 543 ASSERT(m_parentStyleSheet); | 543 ASSERT(m_parentStyleSheet); |
| 544 | 544 |
| 545 if (m_ruleIndex == UINT_MAX) { |
| 546 exceptionState.throwDOMException(NotFoundError, "The style is read-only.
"); |
| 547 return false; |
| 548 } |
| 549 |
| 545 if (!m_parentStyleSheet->ensureParsedDataReady()) { | 550 if (!m_parentStyleSheet->ensureParsedDataReady()) { |
| 546 exceptionState.throwDOMException(NotFoundError, "The parent style sheet'
s data hasn't been processed."); | 551 exceptionState.throwDOMException(NotFoundError, "The parent style sheet'
s data hasn't been processed."); |
| 547 return false; | 552 return false; |
| 548 } | 553 } |
| 549 | 554 |
| 550 if (!propertyText.stripWhiteSpace().isEmpty()) { | 555 if (!propertyText.stripWhiteSpace().isEmpty()) { |
| 551 if (!verifyPropertyText(propertyText, false) && !verifyPropertyText(prop
ertyText, true)) { | 556 if (!verifyPropertyText(propertyText, false) && !verifyPropertyText(prop
ertyText, true)) { |
| 552 exceptionState.throwDOMException(SyntaxError, "The property '" + pro
pertyText + "' could not be set."); | 557 exceptionState.throwDOMException(SyntaxError, "The property '" + pro
pertyText + "' could not be set."); |
| 553 return false; | 558 return false; |
| 554 } | 559 } |
| (...skipping 19 matching lines...) Expand all Loading... |
| 574 if (overwrite) { | 579 if (overwrite) { |
| 575 if (index >= allProperties.size()) { | 580 if (index >= allProperties.size()) { |
| 576 exceptionState.throwDOMException(IndexSizeError, "The index provided
(" + String::number(index) + ") is greater than or equal to the maximum bound (
" + String::number(allProperties.size()) + ")."); | 581 exceptionState.throwDOMException(IndexSizeError, "The index provided
(" + String::number(index) + ") is greater than or equal to the maximum bound (
" + String::number(allProperties.size()) + ")."); |
| 577 return false; | 582 return false; |
| 578 } | 583 } |
| 579 editor.replaceProperty(index, propertyText); | 584 editor.replaceProperty(index, propertyText); |
| 580 } else { | 585 } else { |
| 581 editor.insertProperty(index, propertyText); | 586 editor.insertProperty(index, propertyText); |
| 582 } | 587 } |
| 583 | 588 |
| 584 return m_parentStyleSheet->setStyleText(m_styleId, editor.styleText()); | 589 return m_parentStyleSheet->setStyleText(m_ruleIndex, editor.styleText()); |
| 585 } | 590 } |
| 586 | 591 |
| 587 bool InspectorStyle::styleText(String* result) const | 592 bool InspectorStyle::styleText(String* result) const |
| 588 { | 593 { |
| 589 RefPtrWillBeRawPtr<CSSRuleSourceData> sourceData = extractSourceData(); | 594 RefPtrWillBeRawPtr<CSSRuleSourceData> sourceData = extractSourceData(); |
| 590 if (!sourceData) | 595 if (!sourceData) |
| 591 return false; | 596 return false; |
| 592 | 597 |
| 593 return textForRange(sourceData->ruleBodyRange, result); | 598 return textForRange(sourceData->ruleBodyRange, result); |
| 594 } | 599 } |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 688 } | 693 } |
| 689 | 694 |
| 690 RefPtr<TypeBuilder::CSS::CSSStyle> result = TypeBuilder::CSS::CSSStyle::crea
te() | 695 RefPtr<TypeBuilder::CSS::CSSStyle> result = TypeBuilder::CSS::CSSStyle::crea
te() |
| 691 .setCssProperties(propertiesObject) | 696 .setCssProperties(propertiesObject) |
| 692 .setShorthandEntries(shorthandEntries); | 697 .setShorthandEntries(shorthandEntries); |
| 693 return result.release(); | 698 return result.release(); |
| 694 } | 699 } |
| 695 | 700 |
| 696 PassRefPtrWillBeRawPtr<CSSRuleSourceData> InspectorStyle::extractSourceData() co
nst | 701 PassRefPtrWillBeRawPtr<CSSRuleSourceData> InspectorStyle::extractSourceData() co
nst |
| 697 { | 702 { |
| 698 if (!m_parentStyleSheet || !m_parentStyleSheet->ensureParsedDataReady()) | 703 if (m_ruleIndex == UINT_MAX || !m_parentStyleSheet || !m_parentStyleSheet->e
nsureParsedDataReady()) |
| 699 return nullptr; | 704 return nullptr; |
| 700 return m_parentStyleSheet->ruleSourceDataAt(m_styleId.ordinal()); | 705 return m_parentStyleSheet->ruleSourceDataAt(m_ruleIndex); |
| 701 } | 706 } |
| 702 | 707 |
| 703 String InspectorStyle::shorthandValue(const String& shorthandProperty) const | 708 String InspectorStyle::shorthandValue(const String& shorthandProperty) const |
| 704 { | 709 { |
| 705 String value = m_style->getPropertyValue(shorthandProperty); | 710 String value = m_style->getPropertyValue(shorthandProperty); |
| 706 if (value.isEmpty()) { | 711 if (value.isEmpty()) { |
| 707 StringBuilder builder; | 712 StringBuilder builder; |
| 708 | 713 |
| 709 for (unsigned i = 0; i < m_style->length(); ++i) { | 714 for (unsigned i = 0; i < m_style->length(); ++i) { |
| 710 String individualProperty = m_style->item(i); | 715 String individualProperty = m_style->item(i); |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 801 visitor->trace(m_parentStyleSheet); | 806 visitor->trace(m_parentStyleSheet); |
| 802 } | 807 } |
| 803 | 808 |
| 804 InspectorStyleSheetBase::InspectorStyleSheetBase(const String& id, Listener* lis
tener) | 809 InspectorStyleSheetBase::InspectorStyleSheetBase(const String& id, Listener* lis
tener) |
| 805 : m_id(id) | 810 : m_id(id) |
| 806 , m_listener(listener) | 811 , m_listener(listener) |
| 807 , m_lineEndings(adoptPtr(new LineEndings())) | 812 , m_lineEndings(adoptPtr(new LineEndings())) |
| 808 { | 813 { |
| 809 } | 814 } |
| 810 | 815 |
| 811 bool InspectorStyleSheetBase::setPropertyText(const InspectorCSSId& id, unsigned
propertyIndex, const String& text, bool overwrite, ExceptionState& exceptionSta
te) | 816 bool InspectorStyleSheetBase::setPropertyText(unsigned ruleIndex, unsigned prope
rtyIndex, const String& text, bool overwrite, ExceptionState& exceptionState) |
| 812 { | 817 { |
| 813 RefPtrWillBeRawPtr<InspectorStyle> inspectorStyle = inspectorStyleForId(id); | 818 RefPtrWillBeRawPtr<InspectorStyle> inspectorStyle = inspectorStyleAt(ruleInd
ex); |
| 814 if (!inspectorStyle) { | 819 if (!inspectorStyle) { |
| 815 exceptionState.throwDOMException(NotFoundError, "No property could be fo
und for the given ID."); | 820 exceptionState.throwDOMException(NotFoundError, "No property could be fo
und for the given ID."); |
| 816 return false; | 821 return false; |
| 817 } | 822 } |
| 818 return inspectorStyle->setPropertyText(propertyIndex, text, overwrite, excep
tionState); | 823 return inspectorStyle->setPropertyText(propertyIndex, text, overwrite, excep
tionState); |
| 819 } | 824 } |
| 820 | 825 |
| 821 bool InspectorStyleSheetBase::getStyleText(const InspectorCSSId& id, String* tex
t) | 826 bool InspectorStyleSheetBase::getStyleText(unsigned ruleIndex, String* text) |
| 822 { | 827 { |
| 823 RefPtrWillBeRawPtr<InspectorStyle> inspectorStyle = inspectorStyleForId(id); | 828 RefPtrWillBeRawPtr<InspectorStyle> inspectorStyle = inspectorStyleAt(ruleInd
ex); |
| 824 if (!inspectorStyle) | 829 if (!inspectorStyle) |
| 825 return false; | 830 return false; |
| 826 return inspectorStyle->styleText(text); | 831 return inspectorStyle->styleText(text); |
| 827 } | 832 } |
| 828 | 833 |
| 829 void InspectorStyleSheetBase::onStyleSheetTextChanged() | 834 void InspectorStyleSheetBase::onStyleSheetTextChanged() |
| 830 { | 835 { |
| 831 m_lineEndings = adoptPtr(new LineEndings()); | 836 m_lineEndings = adoptPtr(new LineEndings()); |
| 832 if (listener()) | 837 if (listener()) |
| 833 listener()->styleSheetChanged(this); | 838 listener()->styleSheetChanged(this); |
| 834 } | 839 } |
| 835 | 840 |
| 836 PassRefPtr<TypeBuilder::CSS::CSSStyle> InspectorStyleSheetBase::buildObjectForSt
yle(CSSStyleDeclaration* style) | 841 PassRefPtr<TypeBuilder::CSS::CSSStyle> InspectorStyleSheetBase::buildObjectForSt
yle(CSSStyleDeclaration* style) |
| 837 { | 842 { |
| 838 RefPtrWillBeRawPtr<CSSRuleSourceData> sourceData = nullptr; | 843 RefPtrWillBeRawPtr<CSSRuleSourceData> sourceData = nullptr; |
| 839 if (ensureParsedDataReady()) | 844 unsigned ruleIndex = indexOf(style); |
| 840 sourceData = ruleSourceDataAt(styleId(style).ordinal()); | 845 if (ruleIndex != UINT_MAX && ensureParsedDataReady()) |
| 846 sourceData = ruleSourceDataAt(ruleIndex); |
| 841 | 847 |
| 842 InspectorCSSId id = styleId(style); | 848 if (ruleIndex == UINT_MAX) { |
| 843 if (id.isEmpty()) { | |
| 844 // Any rule coming from User Agent and not from DefaultStyleSheet will n
ot have id. | 849 // Any rule coming from User Agent and not from DefaultStyleSheet will n
ot have id. |
| 845 // See InspectorCSSAgent::buildObjectForRule for details. | 850 // See InspectorCSSAgent::buildObjectForRule for details. |
| 846 RefPtrWillBeRawPtr<InspectorStyle> inspectorStyle = InspectorStyle::crea
te(id, style, this); | 851 RefPtrWillBeRawPtr<InspectorStyle> inspectorStyle = InspectorStyle::crea
te(UINT_MAX, style, this); |
| 847 return inspectorStyle->buildObjectForStyle(); | 852 return inspectorStyle->buildObjectForStyle(); |
| 848 } | 853 } |
| 849 RefPtrWillBeRawPtr<InspectorStyle> inspectorStyle = inspectorStyleForId(id); | 854 RefPtrWillBeRawPtr<InspectorStyle> inspectorStyle = inspectorStyleAt(ruleInd
ex); |
| 850 RefPtr<TypeBuilder::CSS::CSSStyle> result = inspectorStyle->buildObjectForSt
yle(); | 855 RefPtr<TypeBuilder::CSS::CSSStyle> result = inspectorStyle->buildObjectForSt
yle(); |
| 851 | 856 |
| 852 // Style text cannot be retrieved without stylesheet, so set cssText here. | 857 // Style text cannot be retrieved without stylesheet, so set cssText here. |
| 853 if (sourceData) { | 858 if (sourceData) { |
| 854 String sheetText; | 859 String sheetText; |
| 855 bool success = getText(&sheetText); | 860 bool success = getText(&sheetText); |
| 856 if (success) { | 861 if (success) { |
| 857 const SourceRange& bodyRange = sourceData->ruleBodyRange; | 862 const SourceRange& bodyRange = sourceData->ruleBodyRange; |
| 858 result->setCssText(sheetText.substring(bodyRange.start, bodyRange.en
d - bodyRange.start)); | 863 result->setCssText(sheetText.substring(bodyRange.start, bodyRange.en
d - bodyRange.start)); |
| 859 } | 864 } |
| (...skipping 18 matching lines...) Expand all Loading... |
| 878 if (lineNumber >= endings->size()) | 883 if (lineNumber >= endings->size()) |
| 879 return false; | 884 return false; |
| 880 unsigned charactersInLine = lineNumber > 0 ? endings->at(lineNumber) - endin
gs->at(lineNumber - 1) - 1 : endings->at(0); | 885 unsigned charactersInLine = lineNumber > 0 ? endings->at(lineNumber) - endin
gs->at(lineNumber - 1) - 1 : endings->at(0); |
| 881 if (columnNumber > charactersInLine) | 886 if (columnNumber > charactersInLine) |
| 882 return false; | 887 return false; |
| 883 TextPosition position(OrdinalNumber::fromZeroBasedInt(lineNumber), OrdinalNu
mber::fromZeroBasedInt(columnNumber)); | 888 TextPosition position(OrdinalNumber::fromZeroBasedInt(lineNumber), OrdinalNu
mber::fromZeroBasedInt(columnNumber)); |
| 884 *offset = position.toOffset(*endings).zeroBasedInt(); | 889 *offset = position.toOffset(*endings).zeroBasedInt(); |
| 885 return true; | 890 return true; |
| 886 } | 891 } |
| 887 | 892 |
| 888 bool InspectorStyleSheetBase::findPropertyByRange(const SourceRange& sourceRange
, InspectorCSSId* ruleId, unsigned* propertyIndex, bool* overwrite) | 893 bool InspectorStyleSheetBase::findPropertyByRange(const SourceRange& sourceRange
, unsigned* ruleIndex, unsigned* propertyIndex, bool* overwrite) |
| 889 { | 894 { |
| 890 if (!ensureParsedDataReady()) | 895 if (!ensureParsedDataReady()) |
| 891 return false; | 896 return false; |
| 892 for (size_t i = 0; i < ruleCount(); ++i) { | 897 for (size_t i = 0; i < ruleCount(); ++i) { |
| 893 RefPtrWillBeRawPtr<CSSRuleSourceData> ruleSourceData = ruleSourceDataAt(
i); | 898 RefPtrWillBeRawPtr<CSSRuleSourceData> ruleSourceData = ruleSourceDataAt(
i); |
| 894 RefPtrWillBeRawPtr<CSSStyleSourceData> styleSourceData = ruleSourceData-
>styleSourceData; | 899 RefPtrWillBeRawPtr<CSSStyleSourceData> styleSourceData = ruleSourceData-
>styleSourceData; |
| 895 if (!styleSourceData) | 900 if (!styleSourceData) |
| 896 continue; | 901 continue; |
| 897 if (ruleSourceData->ruleBodyRange.end < sourceRange.start || sourceRange
.end < ruleSourceData->ruleBodyRange.start) | 902 if (ruleSourceData->ruleBodyRange.end < sourceRange.start || sourceRange
.end < ruleSourceData->ruleBodyRange.start) |
| 898 continue; | 903 continue; |
| 899 WillBeHeapVector<CSSPropertySourceData>& propertyData = styleSourceData-
>propertyData; | 904 WillBeHeapVector<CSSPropertySourceData>& propertyData = styleSourceData-
>propertyData; |
| 900 for (size_t j = 0; j < propertyData.size(); ++j) { | 905 for (size_t j = 0; j < propertyData.size(); ++j) { |
| 901 CSSPropertySourceData& property = propertyData.at(j); | 906 CSSPropertySourceData& property = propertyData.at(j); |
| 902 unsigned styleStart = ruleSourceData->ruleBodyRange.start; | 907 unsigned styleStart = ruleSourceData->ruleBodyRange.start; |
| 903 if (sourceRange.length() && property.range.start == sourceRange.star
t && property.range.end == sourceRange.end) { | 908 if (sourceRange.length() && property.range.start == sourceRange.star
t && property.range.end == sourceRange.end) { |
| 904 *ruleId = InspectorCSSId(id(), i); | 909 *ruleIndex = i; |
| 905 *propertyIndex = j; | 910 *propertyIndex = j; |
| 906 *overwrite = true; | 911 *overwrite = true; |
| 907 return true; | 912 return true; |
| 908 } | 913 } |
| 909 if (!sourceRange.length() && styleStart <= sourceRange.start && sour
ceRange.start <= property.range.start) { | 914 if (!sourceRange.length() && styleStart <= sourceRange.start && sour
ceRange.start <= property.range.start) { |
| 910 *ruleId = InspectorCSSId(id(), i); | 915 *ruleIndex = i; |
| 911 *propertyIndex = j; | 916 *propertyIndex = j; |
| 912 *overwrite = false; | 917 *overwrite = false; |
| 913 return true; | 918 return true; |
| 914 } | 919 } |
| 915 } | 920 } |
| 916 if (!sourceRange.length() && ruleSourceData->ruleBodyRange.start <= sour
ceRange.start && sourceRange.start <= ruleSourceData->ruleBodyRange.end) { | 921 if (!sourceRange.length() && ruleSourceData->ruleBodyRange.start <= sour
ceRange.start && sourceRange.start <= ruleSourceData->ruleBodyRange.end) { |
| 917 *ruleId = InspectorCSSId(id(), i); | 922 *ruleIndex = i; |
| 918 *propertyIndex = propertyData.size(); | 923 *propertyIndex = propertyData.size(); |
| 919 *overwrite = false; | 924 *overwrite = false; |
| 920 return true; | 925 return true; |
| 921 } | 926 } |
| 922 } | 927 } |
| 923 return false; | 928 return false; |
| 924 } | 929 } |
| 925 | 930 |
| 926 PassRefPtrWillBeRawPtr<InspectorStyleSheet> InspectorStyleSheet::create(Inspecto
rResourceAgent* resourceAgent, const String& id, PassRefPtrWillBeRawPtr<CSSStyle
Sheet> pageStyleSheet, TypeBuilder::CSS::StyleSheetOrigin::Enum origin, const St
ring& documentURL, InspectorCSSAgent* cssAgent) | 931 PassRefPtrWillBeRawPtr<InspectorStyleSheet> InspectorStyleSheet::create(Inspecto
rResourceAgent* resourceAgent, const String& id, PassRefPtrWillBeRawPtr<CSSStyle
Sheet> pageStyleSheet, TypeBuilder::CSS::StyleSheetOrigin::Enum origin, const St
ring& documentURL, InspectorCSSAgent* cssAgent) |
| 927 { | 932 { |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 984 m_pageStyleSheet->contents()->parseString(text); | 989 m_pageStyleSheet->contents()->parseString(text); |
| 985 } | 990 } |
| 986 | 991 |
| 987 if (listener()) | 992 if (listener()) |
| 988 listener()->didReparseStyleSheet(); | 993 listener()->didReparseStyleSheet(); |
| 989 onStyleSheetTextChanged(); | 994 onStyleSheetTextChanged(); |
| 990 m_pageStyleSheet->ownerDocument()->styleResolverChanged(FullStyleUpdate); | 995 m_pageStyleSheet->ownerDocument()->styleResolverChanged(FullStyleUpdate); |
| 991 return true; | 996 return true; |
| 992 } | 997 } |
| 993 | 998 |
| 994 String InspectorStyleSheet::ruleSelector(const InspectorCSSId& id, ExceptionStat
e& exceptionState) | 999 String InspectorStyleSheet::ruleSelector(unsigned ruleIndex, ExceptionState& exc
eptionState) |
| 995 { | 1000 { |
| 996 CSSStyleRule* rule = ruleForId(id); | 1001 CSSStyleRule* rule = ruleAt(ruleIndex); |
| 997 if (!rule) { | 1002 if (!rule) { |
| 998 exceptionState.throwDOMException(NotFoundError, "No rule was found for t
he given ID."); | 1003 exceptionState.throwDOMException(NotFoundError, "No rule was found for t
he given ID."); |
| 999 return ""; | 1004 return ""; |
| 1000 } | 1005 } |
| 1001 return rule->selectorText(); | 1006 return rule->selectorText(); |
| 1002 } | 1007 } |
| 1003 | 1008 |
| 1004 bool InspectorStyleSheet::setRuleSelector(const InspectorCSSId& id, const String
& selector, ExceptionState& exceptionState) | 1009 bool InspectorStyleSheet::setRuleSelector(unsigned ruleIndex, const String& sele
ctor, ExceptionState& exceptionState) |
| 1005 { | 1010 { |
| 1006 CSSStyleRule* rule = ruleForId(id); | 1011 CSSStyleRule* rule = ruleAt(ruleIndex); |
| 1007 if (!rule) { | 1012 if (!rule) { |
| 1008 exceptionState.throwDOMException(NotFoundError, "No rule was found for t
he given ID."); | 1013 exceptionState.throwDOMException(NotFoundError, "No rule was found for t
he given ID."); |
| 1009 return false; | 1014 return false; |
| 1010 } | 1015 } |
| 1011 CSSStyleSheet* styleSheet = rule->parentStyleSheet(); | 1016 CSSStyleSheet* styleSheet = rule->parentStyleSheet(); |
| 1012 if (!styleSheet || !ensureParsedDataReady()) { | 1017 if (!styleSheet || !ensureParsedDataReady()) { |
| 1013 exceptionState.throwDOMException(NotFoundError, "No stylesheet could be
found in which to set the selector."); | 1018 exceptionState.throwDOMException(NotFoundError, "No stylesheet could be
found in which to set the selector."); |
| 1014 return false; | 1019 return false; |
| 1015 } | 1020 } |
| 1016 | 1021 |
| 1017 if (!verifySelectorText(selector)) { | 1022 if (!verifySelectorText(selector)) { |
| 1018 exceptionState.throwDOMException(SyntaxError, "Selector text is not vali
d."); | 1023 exceptionState.throwDOMException(SyntaxError, "Selector text is not vali
d."); |
| 1019 return false; | 1024 return false; |
| 1020 } | 1025 } |
| 1021 | 1026 |
| 1022 rule->setSelectorText(selector); | 1027 rule->setSelectorText(selector); |
| 1023 RefPtrWillBeRawPtr<CSSRuleSourceData> sourceData = ruleSourceDataAt(id.ordin
al()); | 1028 RefPtrWillBeRawPtr<CSSRuleSourceData> sourceData = ruleSourceDataAt(ruleInde
x); |
| 1024 ASSERT(sourceData); | 1029 ASSERT(sourceData); |
| 1025 | 1030 |
| 1026 String sheetText = m_parsedStyleSheet->text(); | 1031 String sheetText = m_parsedStyleSheet->text(); |
| 1027 sheetText.replace(sourceData->ruleHeaderRange.start, sourceData->ruleHeaderR
ange.length(), selector); | 1032 sheetText.replace(sourceData->ruleHeaderRange.start, sourceData->ruleHeaderR
ange.length(), selector); |
| 1028 updateText(sheetText); | 1033 updateText(sheetText); |
| 1029 onStyleSheetTextChanged(); | 1034 onStyleSheetTextChanged(); |
| 1030 return true; | 1035 return true; |
| 1031 } | 1036 } |
| 1032 | 1037 |
| 1033 String InspectorStyleSheet::mediaRuleText(const InspectorCSSId& id, ExceptionSta
te& exceptionState) | 1038 String InspectorStyleSheet::mediaRuleText(unsigned ruleIndex, ExceptionState& ex
ceptionState) |
| 1034 { | 1039 { |
| 1035 CSSMediaRule* rule = mediaRuleForId(id); | 1040 CSSMediaRule* rule = mediaRuleAt(ruleIndex); |
| 1036 if (!rule) { | 1041 if (!rule) { |
| 1037 exceptionState.throwDOMException(NotFoundError, "No media rule was found
for the given ID."); | 1042 exceptionState.throwDOMException(NotFoundError, "No media rule was found
for the given ID."); |
| 1038 return ""; | 1043 return ""; |
| 1039 } | 1044 } |
| 1040 return rule->media()->mediaText(); | 1045 return rule->media()->mediaText(); |
| 1041 } | 1046 } |
| 1042 | 1047 |
| 1043 bool InspectorStyleSheet::setMediaRuleText(const InspectorCSSId& id, const Strin
g& text, ExceptionState& exceptionState) | 1048 bool InspectorStyleSheet::setMediaRuleText(unsigned ruleIndex, const String& tex
t, ExceptionState& exceptionState) |
| 1044 { | 1049 { |
| 1045 CSSMediaRule* rule = mediaRuleForId(id); | 1050 CSSMediaRule* rule = mediaRuleAt(ruleIndex); |
| 1046 if (!rule) { | 1051 if (!rule) { |
| 1047 exceptionState.throwDOMException(NotFoundError, "No media rule was found
for the given ID."); | 1052 exceptionState.throwDOMException(NotFoundError, "No media rule was found
for the given ID."); |
| 1048 return false; | 1053 return false; |
| 1049 } | 1054 } |
| 1050 CSSStyleSheet* styleSheet = rule->parentStyleSheet(); | 1055 CSSStyleSheet* styleSheet = rule->parentStyleSheet(); |
| 1051 if (!styleSheet || !ensureParsedDataReady()) { | 1056 if (!styleSheet || !ensureParsedDataReady()) { |
| 1052 exceptionState.throwDOMException(NotFoundError, "No stylesheet could be
found in which to set the media text."); | 1057 exceptionState.throwDOMException(NotFoundError, "No stylesheet could be
found in which to set the media text."); |
| 1053 return false; | 1058 return false; |
| 1054 } | 1059 } |
| 1055 if (!verifyMediaText(text)) { | 1060 if (!verifyMediaText(text)) { |
| 1056 exceptionState.throwDOMException(SyntaxError, "Media text is not valid."
); | 1061 exceptionState.throwDOMException(SyntaxError, "Media text is not valid."
); |
| 1057 return false; | 1062 return false; |
| 1058 } | 1063 } |
| 1059 | 1064 |
| 1060 rule->media()->setMediaText(text); | 1065 rule->media()->setMediaText(text); |
| 1061 RefPtrWillBeRawPtr<CSSRuleSourceData> sourceData = ruleSourceDataAt(id.ordin
al()); | 1066 RefPtrWillBeRawPtr<CSSRuleSourceData> sourceData = ruleSourceDataAt(ruleInde
x); |
| 1062 ASSERT(sourceData && sourceData->mediaSourceData); | 1067 ASSERT(sourceData && sourceData->mediaSourceData); |
| 1063 | 1068 |
| 1064 String sheetText = m_parsedStyleSheet->text(); | 1069 String sheetText = m_parsedStyleSheet->text(); |
| 1065 sheetText.replace(sourceData->ruleHeaderRange.start, sourceData->ruleHeaderR
ange.length(), text); | 1070 sheetText.replace(sourceData->ruleHeaderRange.start, sourceData->ruleHeaderR
ange.length(), text); |
| 1066 updateText(sheetText); | 1071 updateText(sheetText); |
| 1067 onStyleSheetTextChanged(); | 1072 onStyleSheetTextChanged(); |
| 1068 return true; | 1073 return true; |
| 1069 } | 1074 } |
| 1070 | 1075 |
| 1071 unsigned InspectorStyleSheet::ruleIndexBySourceRange(const CSSMediaRule* parentM
ediaRule, const SourceRange& sourceRange) | 1076 unsigned InspectorStyleSheet::ruleIndexBySourceRange(const CSSMediaRule* parentM
ediaRule, const SourceRange& sourceRange) |
| (...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1257 | 1262 |
| 1258 text.insert(ruleText, location.start); | 1263 text.insert(ruleText, location.start); |
| 1259 | 1264 |
| 1260 updateText(text); | 1265 updateText(text); |
| 1261 m_flatRules.clear(); | 1266 m_flatRules.clear(); |
| 1262 | 1267 |
| 1263 onStyleSheetTextChanged(); | 1268 onStyleSheetTextChanged(); |
| 1264 return styleRule; | 1269 return styleRule; |
| 1265 } | 1270 } |
| 1266 | 1271 |
| 1267 bool InspectorStyleSheet::deleteRule(const InspectorCSSId& id, const String& old
Text, ExceptionState& exceptionState) | 1272 bool InspectorStyleSheet::deleteRule(unsigned ruleIndex, const String& oldText,
ExceptionState& exceptionState) |
| 1268 { | 1273 { |
| 1269 RefPtrWillBeRawPtr<CSSStyleRule> rule = ruleForId(id); | 1274 RefPtrWillBeRawPtr<CSSStyleRule> rule = ruleAt(ruleIndex); |
| 1270 if (!rule) { | 1275 if (!rule) { |
| 1271 exceptionState.throwDOMException(NotFoundError, "No style rule could be
found for the provided ID."); | 1276 exceptionState.throwDOMException(NotFoundError, "No style rule could be
found for the provided ID."); |
| 1272 return false; | 1277 return false; |
| 1273 } | 1278 } |
| 1274 CSSStyleSheet* styleSheet = rule->parentStyleSheet(); | 1279 CSSStyleSheet* styleSheet = rule->parentStyleSheet(); |
| 1275 if (!styleSheet || !ensureParsedDataReady()) { | 1280 if (!styleSheet || !ensureParsedDataReady()) { |
| 1276 exceptionState.throwDOMException(NotFoundError, "No parent stylesheet co
uld be found."); | 1281 exceptionState.throwDOMException(NotFoundError, "No parent stylesheet co
uld be found."); |
| 1277 return false; | 1282 return false; |
| 1278 } | 1283 } |
| 1279 | 1284 |
| 1280 RefPtrWillBeRawPtr<CSSRuleSourceData> sourceData = ruleSourceDataAt(id.ordin
al()); | 1285 RefPtrWillBeRawPtr<CSSRuleSourceData> sourceData = ruleSourceDataAt(ruleInde
x); |
| 1281 if (!sourceData) { | 1286 if (!sourceData) { |
| 1282 exceptionState.throwDOMException(NotFoundError, "No style rule could be
found for the provided ID."); | 1287 exceptionState.throwDOMException(NotFoundError, "No style rule could be
found for the provided ID."); |
| 1283 return false; | 1288 return false; |
| 1284 } | 1289 } |
| 1285 | 1290 |
| 1286 CSSRule* parentRule = rule->parentRule(); | 1291 CSSRule* parentRule = rule->parentRule(); |
| 1287 if (parentRule) { | 1292 if (parentRule) { |
| 1288 if (parentRule->type() != CSSRule::MEDIA_RULE) { | 1293 if (parentRule->type() != CSSRule::MEDIA_RULE) { |
| 1289 exceptionState.throwDOMException(NotFoundError, "Cannot remove rule
from non-media rule."); | 1294 exceptionState.throwDOMException(NotFoundError, "Cannot remove rule
from non-media rule."); |
| 1290 return false; | 1295 return false; |
| (...skipping 25 matching lines...) Expand all Loading... |
| 1316 void InspectorStyleSheet::updateText(const String& newText) | 1321 void InspectorStyleSheet::updateText(const String& newText) |
| 1317 { | 1322 { |
| 1318 Element* element = ownerStyleElement(); | 1323 Element* element = ownerStyleElement(); |
| 1319 if (element) | 1324 if (element) |
| 1320 m_cssAgent->addEditedStyleElement(DOMNodeIds::idForNode(element), newTex
t); | 1325 m_cssAgent->addEditedStyleElement(DOMNodeIds::idForNode(element), newTex
t); |
| 1321 else | 1326 else |
| 1322 m_cssAgent->addEditedStyleSheet(finalURL(), newText); | 1327 m_cssAgent->addEditedStyleSheet(finalURL(), newText); |
| 1323 m_parsedStyleSheet->setText(newText); | 1328 m_parsedStyleSheet->setText(newText); |
| 1324 } | 1329 } |
| 1325 | 1330 |
| 1326 CSSStyleRule* InspectorStyleSheet::ruleForId(const InspectorCSSId& id) const | 1331 CSSStyleRule* InspectorStyleSheet::ruleAt(unsigned ruleIndex) const |
| 1327 { | 1332 { |
| 1328 ASSERT(!id.isEmpty()); | 1333 ASSERT(!id().isEmpty()); |
| 1329 ensureFlatRules(); | 1334 ensureFlatRules(); |
| 1330 return InspectorCSSAgent::asCSSStyleRule(id.ordinal() >= m_flatRules.size()
? nullptr : m_flatRules.at(id.ordinal()).get()); | 1335 return InspectorCSSAgent::asCSSStyleRule(ruleIndex >= m_flatRules.size() ? n
ullptr : m_flatRules.at(ruleIndex).get()); |
| 1331 } | 1336 } |
| 1332 | 1337 |
| 1333 CSSMediaRule* InspectorStyleSheet::mediaRuleForId(const InspectorCSSId& id) cons
t | 1338 CSSMediaRule* InspectorStyleSheet::mediaRuleAt(unsigned ruleIndex) const |
| 1334 { | 1339 { |
| 1335 ASSERT(!id.isEmpty()); | 1340 ASSERT(!id().isEmpty()); |
| 1336 ensureFlatRules(); | 1341 ensureFlatRules(); |
| 1337 return InspectorCSSAgent::asCSSMediaRule(id.ordinal() >= m_flatRules.size()
? nullptr : m_flatRules.at(id.ordinal()).get()); | 1342 return InspectorCSSAgent::asCSSMediaRule(ruleIndex >= m_flatRules.size() ? n
ullptr : m_flatRules.at(ruleIndex).get()); |
| 1338 } | 1343 } |
| 1339 | 1344 |
| 1340 PassRefPtr<TypeBuilder::CSS::CSSStyleSheetHeader> InspectorStyleSheet::buildObje
ctForStyleSheetInfo() const | 1345 PassRefPtr<TypeBuilder::CSS::CSSStyleSheetHeader> InspectorStyleSheet::buildObje
ctForStyleSheetInfo() const |
| 1341 { | 1346 { |
| 1342 CSSStyleSheet* styleSheet = pageStyleSheet(); | 1347 CSSStyleSheet* styleSheet = pageStyleSheet(); |
| 1343 if (!styleSheet) | 1348 if (!styleSheet) |
| 1344 return nullptr; | 1349 return nullptr; |
| 1345 | 1350 |
| 1346 Document* document = styleSheet->ownerDocument(); | 1351 Document* document = styleSheet->ownerDocument(); |
| 1347 LocalFrame* frame = document ? document->frame() : nullptr; | 1352 LocalFrame* frame = document ? document->frame() : nullptr; |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1388 .setValue(selector.stripWhiteSpace()); | 1393 .setValue(selector.stripWhiteSpace()); |
| 1389 simpleSelector->setRange(buildSourceRangeObject(range, lineEndings())); | 1394 simpleSelector->setRange(buildSourceRangeObject(range, lineEndings())); |
| 1390 result->addItem(simpleSelector.release()); | 1395 result->addItem(simpleSelector.release()); |
| 1391 } | 1396 } |
| 1392 return result.release(); | 1397 return result.release(); |
| 1393 } | 1398 } |
| 1394 | 1399 |
| 1395 PassRefPtr<TypeBuilder::CSS::SelectorList> InspectorStyleSheet::buildObjectForSe
lectorList(CSSStyleRule* rule) | 1400 PassRefPtr<TypeBuilder::CSS::SelectorList> InspectorStyleSheet::buildObjectForSe
lectorList(CSSStyleRule* rule) |
| 1396 { | 1401 { |
| 1397 RefPtrWillBeRawPtr<CSSRuleSourceData> sourceData = nullptr; | 1402 RefPtrWillBeRawPtr<CSSRuleSourceData> sourceData = nullptr; |
| 1398 if (ensureParsedDataReady()) | 1403 unsigned ruleIndex = indexOf(rule->style()); |
| 1399 sourceData = ruleSourceDataAt(styleId(rule->style()).ordinal()); | 1404 if (ruleIndex != UINT_MAX && ensureParsedDataReady()) |
| 1405 sourceData = ruleSourceDataAt(ruleIndex); |
| 1400 RefPtr<TypeBuilder::Array<TypeBuilder::CSS::Selector> > selectors; | 1406 RefPtr<TypeBuilder::Array<TypeBuilder::CSS::Selector> > selectors; |
| 1401 | 1407 |
| 1402 // This intentionally does not rely on the source data to avoid catching the
trailing comments (before the declaration starting '{'). | 1408 // This intentionally does not rely on the source data to avoid catching the
trailing comments (before the declaration starting '{'). |
| 1403 String selectorText = rule->selectorText(); | 1409 String selectorText = rule->selectorText(); |
| 1404 | 1410 |
| 1405 if (sourceData) | 1411 if (sourceData) |
| 1406 selectors = selectorsFromSource(sourceData.get(), m_parsedStyleSheet->te
xt()); | 1412 selectors = selectorsFromSource(sourceData.get(), m_parsedStyleSheet->te
xt()); |
| 1407 else { | 1413 else { |
| 1408 selectors = TypeBuilder::Array<TypeBuilder::CSS::Selector>::create(); | 1414 selectors = TypeBuilder::Array<TypeBuilder::CSS::Selector>::create(); |
| 1409 const CSSSelectorList& selectorList = rule->styleRule()->selectorList(); | 1415 const CSSSelectorList& selectorList = rule->styleRule()->selectorList(); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 1427 CSSStyleSheet* styleSheet = pageStyleSheet(); | 1433 CSSStyleSheet* styleSheet = pageStyleSheet(); |
| 1428 if (!styleSheet) | 1434 if (!styleSheet) |
| 1429 return nullptr; | 1435 return nullptr; |
| 1430 | 1436 |
| 1431 RefPtr<TypeBuilder::CSS::CSSRule> result = TypeBuilder::CSS::CSSRule::create
() | 1437 RefPtr<TypeBuilder::CSS::CSSRule> result = TypeBuilder::CSS::CSSRule::create
() |
| 1432 .setSelectorList(buildObjectForSelectorList(rule)) | 1438 .setSelectorList(buildObjectForSelectorList(rule)) |
| 1433 .setOrigin(m_origin) | 1439 .setOrigin(m_origin) |
| 1434 .setStyle(buildObjectForStyle(rule->style())); | 1440 .setStyle(buildObjectForStyle(rule->style())); |
| 1435 | 1441 |
| 1436 if (canBind(m_origin)) { | 1442 if (canBind(m_origin)) { |
| 1437 InspectorCSSId id(ruleId(rule)); | 1443 if (!id().isEmpty()) |
| 1438 if (!id.isEmpty()) | 1444 result->setStyleSheetId(id()); |
| 1439 result->setStyleSheetId(id.styleSheetId()); | |
| 1440 } | 1445 } |
| 1441 | 1446 |
| 1442 if (mediaStack) | 1447 if (mediaStack) |
| 1443 result->setMedia(mediaStack); | 1448 result->setMedia(mediaStack); |
| 1444 | 1449 |
| 1445 return result.release(); | 1450 return result.release(); |
| 1446 } | 1451 } |
| 1447 | 1452 |
| 1448 bool InspectorStyleSheet::getText(String* result) const | 1453 bool InspectorStyleSheet::getText(String* result) const |
| 1449 { | 1454 { |
| 1450 if (!ensureText()) | 1455 if (!ensureText()) |
| 1451 return false; | 1456 return false; |
| 1452 *result = m_parsedStyleSheet->text(); | 1457 *result = m_parsedStyleSheet->text(); |
| 1453 return true; | 1458 return true; |
| 1454 } | 1459 } |
| 1455 | 1460 |
| 1456 CSSStyleDeclaration* InspectorStyleSheet::styleForId(const InspectorCSSId& id) c
onst | 1461 CSSStyleDeclaration* InspectorStyleSheet::styleAt(unsigned ruleIndex) const |
| 1457 { | 1462 { |
| 1458 CSSStyleRule* rule = ruleForId(id); | 1463 CSSStyleRule* rule = ruleAt(ruleIndex); |
| 1459 if (!rule) | 1464 if (!rule) |
| 1460 return nullptr; | 1465 return nullptr; |
| 1461 | 1466 |
| 1462 return rule->style(); | 1467 return rule->style(); |
| 1463 } | 1468 } |
| 1464 | 1469 |
| 1465 PassRefPtr<TypeBuilder::CSS::SourceRange> InspectorStyleSheet::ruleHeaderSourceR
ange(const CSSRule* rule) | 1470 PassRefPtr<TypeBuilder::CSS::SourceRange> InspectorStyleSheet::ruleHeaderSourceR
ange(const CSSRule* rule) |
| 1466 { | 1471 { |
| 1467 if (!ensureParsedDataReady()) | 1472 if (!ensureParsedDataReady()) |
| 1468 return nullptr; | 1473 return nullptr; |
| (...skipping 19 matching lines...) Expand all Loading... |
| 1488 return nullptr; | 1493 return nullptr; |
| 1489 RefPtrWillBeRawPtr<CSSRuleSourceData> sourceData = m_parsedStyleSheet->ruleS
ourceDataAt(static_cast<unsigned>(index)); | 1494 RefPtrWillBeRawPtr<CSSRuleSourceData> sourceData = m_parsedStyleSheet->ruleS
ourceDataAt(static_cast<unsigned>(index)); |
| 1490 if (!sourceData->mediaSourceData || mediaQueryIndex >= sourceData->mediaSour
ceData->queryData.size()) | 1495 if (!sourceData->mediaSourceData || mediaQueryIndex >= sourceData->mediaSour
ceData->queryData.size()) |
| 1491 return nullptr; | 1496 return nullptr; |
| 1492 RefPtrWillBeRawPtr<CSSMediaQuerySourceData> mediaQueryData = sourceData->med
iaSourceData->queryData.at(mediaQueryIndex); | 1497 RefPtrWillBeRawPtr<CSSMediaQuerySourceData> mediaQueryData = sourceData->med
iaSourceData->queryData.at(mediaQueryIndex); |
| 1493 if (mediaQueryExpIndex >= mediaQueryData->expData.size()) | 1498 if (mediaQueryExpIndex >= mediaQueryData->expData.size()) |
| 1494 return nullptr; | 1499 return nullptr; |
| 1495 return buildSourceRangeObject(mediaQueryData->expData.at(mediaQueryExpIndex)
.valueRange, lineEndings()); | 1500 return buildSourceRangeObject(mediaQueryData->expData.at(mediaQueryExpIndex)
.valueRange, lineEndings()); |
| 1496 } | 1501 } |
| 1497 | 1502 |
| 1498 PassRefPtrWillBeRawPtr<InspectorStyle> InspectorStyleSheet::inspectorStyleForId(
const InspectorCSSId& id) | 1503 PassRefPtrWillBeRawPtr<InspectorStyle> InspectorStyleSheet::inspectorStyleAt(uns
igned ruleIndex) |
| 1499 { | 1504 { |
| 1500 CSSStyleDeclaration* style = styleForId(id); | 1505 CSSStyleDeclaration* style = styleAt(ruleIndex); |
| 1501 if (!style) | 1506 if (!style) |
| 1502 return nullptr; | 1507 return nullptr; |
| 1503 | 1508 |
| 1504 return InspectorStyle::create(id, style, this); | 1509 return InspectorStyle::create(ruleIndex, style, this); |
| 1505 } | 1510 } |
| 1506 | 1511 |
| 1507 unsigned InspectorStyleSheet::ruleCount() | 1512 unsigned InspectorStyleSheet::ruleCount() |
| 1508 { | 1513 { |
| 1509 return m_parsedStyleSheet->ruleCount(); | 1514 return m_parsedStyleSheet->ruleCount(); |
| 1510 } | 1515 } |
| 1511 | 1516 |
| 1512 String InspectorStyleSheet::sourceURL() const | 1517 String InspectorStyleSheet::sourceURL() const |
| 1513 { | 1518 { |
| 1514 if (!m_sourceURL.isNull()) | 1519 if (!m_sourceURL.isNull()) |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1577 bool deprecated; | 1582 bool deprecated; |
| 1578 String commentValue = ContentSearchUtils::findSourceMapURL(styleSheetTex
t, ContentSearchUtils::CSSMagicComment, &deprecated); | 1583 String commentValue = ContentSearchUtils::findSourceMapURL(styleSheetTex
t, ContentSearchUtils::CSSMagicComment, &deprecated); |
| 1579 if (!commentValue.isEmpty()) { | 1584 if (!commentValue.isEmpty()) { |
| 1580 // FIXME: add deprecated console message here. | 1585 // FIXME: add deprecated console message here. |
| 1581 return commentValue; | 1586 return commentValue; |
| 1582 } | 1587 } |
| 1583 } | 1588 } |
| 1584 return m_pageStyleSheet->contents()->sourceMapURL(); | 1589 return m_pageStyleSheet->contents()->sourceMapURL(); |
| 1585 } | 1590 } |
| 1586 | 1591 |
| 1587 InspectorCSSId InspectorStyleSheet::styleId(CSSStyleDeclaration* style) const | 1592 unsigned InspectorStyleSheet::indexOf(CSSStyleDeclaration* style) const |
| 1588 { | 1593 { |
| 1589 unsigned index = ruleIndexByStyle(style); | 1594 ensureFlatRules(); |
| 1590 if (index != UINT_MAX) | 1595 for (unsigned i = 0, size = m_flatRules.size(); i < size; ++i) { |
| 1591 return InspectorCSSId(id(), index); | 1596 CSSStyleRule* styleRule = InspectorCSSAgent::asCSSStyleRule(m_flatRules.
at(i).get()); |
| 1592 return InspectorCSSId(); | 1597 if (styleRule && styleRule->style() == style) |
| 1598 return i; |
| 1599 } |
| 1600 return UINT_MAX; |
| 1593 } | 1601 } |
| 1594 | 1602 |
| 1595 bool InspectorStyleSheet::findRuleBySelectorRange(const SourceRange& sourceRange
, InspectorCSSId* ruleId) | 1603 bool InspectorStyleSheet::findRuleBySelectorRange(const SourceRange& sourceRange
, unsigned* ruleIndex) |
| 1596 { | 1604 { |
| 1597 if (!ensureParsedDataReady()) | 1605 if (!ensureParsedDataReady()) |
| 1598 return false; | 1606 return false; |
| 1599 for (size_t i = 0; i < ruleCount(); ++i) { | 1607 for (size_t i = 0; i < ruleCount(); ++i) { |
| 1600 RefPtrWillBeRawPtr<CSSRuleSourceData> ruleSourceData = ruleSourceDataAt(
i); | 1608 RefPtrWillBeRawPtr<CSSRuleSourceData> ruleSourceData = ruleSourceDataAt(
i); |
| 1601 if (!ruleSourceData->styleSourceData) | 1609 if (!ruleSourceData->styleSourceData) |
| 1602 continue; | 1610 continue; |
| 1603 if (ruleSourceData->ruleHeaderRange.start == sourceRange.start && ruleSo
urceData->ruleHeaderRange.end == sourceRange.end) { | 1611 if (ruleSourceData->ruleHeaderRange.start == sourceRange.start && ruleSo
urceData->ruleHeaderRange.end == sourceRange.end) { |
| 1604 *ruleId = InspectorCSSId(id(), i); | 1612 *ruleIndex = i; |
| 1605 return true; | 1613 return true; |
| 1606 } | 1614 } |
| 1607 } | 1615 } |
| 1608 return false; | 1616 return false; |
| 1609 } | 1617 } |
| 1610 | 1618 |
| 1611 bool InspectorStyleSheet::findMediaRuleByRange(const SourceRange& sourceRange, I
nspectorCSSId* ruleId) | 1619 bool InspectorStyleSheet::findMediaRuleByRange(const SourceRange& sourceRange, u
nsigned* ruleIndex) |
| 1612 { | 1620 { |
| 1613 if (!ensureParsedDataReady()) | 1621 if (!ensureParsedDataReady()) |
| 1614 return false; | 1622 return false; |
| 1615 for (size_t i = 0; i < ruleCount(); ++i) { | 1623 for (size_t i = 0; i < ruleCount(); ++i) { |
| 1616 RefPtrWillBeRawPtr<CSSRuleSourceData> ruleSourceData = ruleSourceDataAt(
i); | 1624 RefPtrWillBeRawPtr<CSSRuleSourceData> ruleSourceData = ruleSourceDataAt(
i); |
| 1617 if (!ruleSourceData->mediaSourceData) | 1625 if (!ruleSourceData->mediaSourceData) |
| 1618 continue; | 1626 continue; |
| 1619 if (ruleSourceData->ruleHeaderRange.start == sourceRange.start && ruleSo
urceData->ruleHeaderRange.end == sourceRange.end) { | 1627 if (ruleSourceData->ruleHeaderRange.start == sourceRange.start && ruleSo
urceData->ruleHeaderRange.end == sourceRange.end) { |
| 1620 *ruleId = InspectorCSSId(id(), i); | 1628 *ruleIndex = i; |
| 1621 return true; | 1629 return true; |
| 1622 } | 1630 } |
| 1623 } | 1631 } |
| 1624 return false; | 1632 return false; |
| 1625 } | 1633 } |
| 1626 | 1634 |
| 1627 const CSSRuleVector& InspectorStyleSheet::flatRules() | 1635 const CSSRuleVector& InspectorStyleSheet::flatRules() |
| 1628 { | 1636 { |
| 1629 ensureFlatRules(); | 1637 ensureFlatRules(); |
| 1630 return m_flatRules; | 1638 return m_flatRules; |
| 1631 } | 1639 } |
| 1632 | 1640 |
| 1633 Document* InspectorStyleSheet::ownerDocument() const | 1641 Document* InspectorStyleSheet::ownerDocument() const |
| 1634 { | 1642 { |
| 1635 return m_pageStyleSheet->ownerDocument(); | 1643 return m_pageStyleSheet->ownerDocument(); |
| 1636 } | 1644 } |
| 1637 | 1645 |
| 1638 PassRefPtrWillBeRawPtr<CSSRuleSourceData> InspectorStyleSheet::ruleSourceDataAt(
unsigned ruleIndex) const | 1646 PassRefPtrWillBeRawPtr<CSSRuleSourceData> InspectorStyleSheet::ruleSourceDataAt(
unsigned ruleIndex) const |
| 1639 { | 1647 { |
| 1640 return m_parsedStyleSheet->ruleSourceDataAt(ruleIndex); | 1648 return m_parsedStyleSheet->ruleSourceDataAt(ruleIndex); |
| 1641 } | 1649 } |
| 1642 | 1650 |
| 1643 unsigned InspectorStyleSheet::ruleIndexByStyle(CSSStyleDeclaration* pageStyle) c
onst | |
| 1644 { | |
| 1645 ensureFlatRules(); | |
| 1646 for (unsigned i = 0, size = m_flatRules.size(); i < size; ++i) { | |
| 1647 CSSStyleRule* styleRule = InspectorCSSAgent::asCSSStyleRule(m_flatRules.
at(i).get()); | |
| 1648 if (styleRule && styleRule->style() == pageStyle) | |
| 1649 return i; | |
| 1650 } | |
| 1651 return UINT_MAX; | |
| 1652 } | |
| 1653 | |
| 1654 bool InspectorStyleSheet::ensureParsedDataReady() | 1651 bool InspectorStyleSheet::ensureParsedDataReady() |
| 1655 { | 1652 { |
| 1656 return ensureText() && m_parsedStyleSheet->ensureSourceData(); | 1653 return ensureText() && m_parsedStyleSheet->ensureSourceData(); |
| 1657 } | 1654 } |
| 1658 | 1655 |
| 1659 bool InspectorStyleSheet::ensureText() const | 1656 bool InspectorStyleSheet::ensureText() const |
| 1660 { | 1657 { |
| 1661 if (m_parsedStyleSheet->hasText()) | 1658 if (m_parsedStyleSheet->hasText()) |
| 1662 return true; | 1659 return true; |
| 1663 | 1660 |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1701 } | 1698 } |
| 1702 } | 1699 } |
| 1703 | 1700 |
| 1704 void InspectorStyleSheet::ensureFlatRules() const | 1701 void InspectorStyleSheet::ensureFlatRules() const |
| 1705 { | 1702 { |
| 1706 // We are fine with redoing this for empty stylesheets as this will run fast
. | 1703 // We are fine with redoing this for empty stylesheets as this will run fast
. |
| 1707 if (m_flatRules.isEmpty()) | 1704 if (m_flatRules.isEmpty()) |
| 1708 collectFlatRules(pageStyleSheet(), &m_flatRules); | 1705 collectFlatRules(pageStyleSheet(), &m_flatRules); |
| 1709 } | 1706 } |
| 1710 | 1707 |
| 1711 bool InspectorStyleSheet::setStyleText(const InspectorCSSId& id, const String& t
ext) | 1708 bool InspectorStyleSheet::setStyleText(unsigned ruleIndex, const String& text) |
| 1712 { | 1709 { |
| 1713 CSSStyleDeclaration* style = styleForId(id); | 1710 CSSStyleDeclaration* style = styleAt(ruleIndex); |
| 1714 if (!style) | 1711 if (!style) |
| 1715 return false; | 1712 return false; |
| 1716 | 1713 |
| 1717 if (!ensureParsedDataReady()) | 1714 if (!ensureParsedDataReady()) |
| 1718 return false; | 1715 return false; |
| 1719 | 1716 |
| 1720 String patchedStyleSheetText; | 1717 String patchedStyleSheetText; |
| 1721 bool success = styleSheetTextWithChangedStyle(style, text, &patchedStyleShee
tText); | 1718 bool success = styleSheetTextWithChangedStyle(style, text, &patchedStyleShee
tText); |
| 1722 if (!success) | 1719 if (!success) |
| 1723 return false; | 1720 return false; |
| 1724 | 1721 |
| 1725 TrackExceptionState exceptionState; | 1722 TrackExceptionState exceptionState; |
| 1726 style->setCSSText(text, exceptionState); | 1723 style->setCSSText(text, exceptionState); |
| 1727 if (!exceptionState.hadException()) { | 1724 if (!exceptionState.hadException()) { |
| 1728 updateText(patchedStyleSheetText); | 1725 updateText(patchedStyleSheetText); |
| 1729 onStyleSheetTextChanged(); | 1726 onStyleSheetTextChanged(); |
| 1730 } | 1727 } |
| 1731 | 1728 |
| 1732 return !exceptionState.hadException(); | 1729 return !exceptionState.hadException(); |
| 1733 } | 1730 } |
| 1734 | 1731 |
| 1735 bool InspectorStyleSheet::styleSheetTextWithChangedStyle(CSSStyleDeclaration* st
yle, const String& newStyleText, String* result) | 1732 bool InspectorStyleSheet::styleSheetTextWithChangedStyle(CSSStyleDeclaration* st
yle, const String& newStyleText, String* result) |
| 1736 { | 1733 { |
| 1737 if (!style) | 1734 if (!style) |
| 1738 return false; | 1735 return false; |
| 1739 if (!ensureParsedDataReady()) | 1736 |
| 1737 unsigned ruleIndex = indexOf(style); |
| 1738 if (!ensureParsedDataReady() || ruleIndex == UINT_MAX) |
| 1740 return false; | 1739 return false; |
| 1741 | 1740 |
| 1742 RefPtrWillBeRawPtr<CSSRuleSourceData> sourceData = ruleSourceDataAt(styleId(
style).ordinal()); | 1741 RefPtrWillBeRawPtr<CSSRuleSourceData> sourceData = ruleSourceDataAt(ruleInde
x); |
| 1743 unsigned bodyStart = sourceData->ruleBodyRange.start; | 1742 unsigned bodyStart = sourceData->ruleBodyRange.start; |
| 1744 unsigned bodyEnd = sourceData->ruleBodyRange.end; | 1743 unsigned bodyEnd = sourceData->ruleBodyRange.end; |
| 1745 ASSERT(bodyStart <= bodyEnd); | 1744 ASSERT(bodyStart <= bodyEnd); |
| 1746 | 1745 |
| 1747 String text = m_parsedStyleSheet->text(); | 1746 String text = m_parsedStyleSheet->text(); |
| 1748 ASSERT_WITH_SECURITY_IMPLICATION(bodyEnd <= text.length()); // bodyEnd is ex
clusive | 1747 ASSERT_WITH_SECURITY_IMPLICATION(bodyEnd <= text.length()); // bodyEnd is ex
clusive |
| 1749 | 1748 |
| 1750 text.replace(bodyStart, bodyEnd - bodyStart, newStyleText); | 1749 text.replace(bodyStart, bodyEnd - bodyStart, newStyleText); |
| 1751 *result = text; | 1750 *result = text; |
| 1752 return true; | 1751 return true; |
| 1753 } | 1752 } |
| 1754 | 1753 |
| 1755 InspectorCSSId InspectorStyleSheet::ruleId(CSSStyleRule* rule) const | 1754 unsigned InspectorStyleSheet::indexOf(CSSStyleRule* rule) const |
| 1756 { | 1755 { |
| 1757 return styleId(rule->style()); | 1756 return indexOf(rule->style()); |
| 1758 } | 1757 } |
| 1759 | 1758 |
| 1760 bool InspectorStyleSheet::originalStyleSheetText(String* result) const | 1759 bool InspectorStyleSheet::originalStyleSheetText(String* result) const |
| 1761 { | 1760 { |
| 1762 bool success = inlineStyleSheetText(result); | 1761 bool success = inlineStyleSheetText(result); |
| 1763 if (!success) | 1762 if (!success) |
| 1764 success = resourceStyleSheetText(result); | 1763 success = resourceStyleSheetText(result); |
| 1765 return success; | 1764 return success; |
| 1766 } | 1765 } |
| 1767 | 1766 |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1810 return adoptRefWillBeNoop(new InspectorStyleSheetForInlineStyle(id, element,
listener)); | 1809 return adoptRefWillBeNoop(new InspectorStyleSheetForInlineStyle(id, element,
listener)); |
| 1811 } | 1810 } |
| 1812 | 1811 |
| 1813 InspectorStyleSheetForInlineStyle::InspectorStyleSheetForInlineStyle(const Strin
g& id, PassRefPtrWillBeRawPtr<Element> element, Listener* listener) | 1812 InspectorStyleSheetForInlineStyle::InspectorStyleSheetForInlineStyle(const Strin
g& id, PassRefPtrWillBeRawPtr<Element> element, Listener* listener) |
| 1814 : InspectorStyleSheetBase(id, listener) | 1813 : InspectorStyleSheetBase(id, listener) |
| 1815 , m_element(element) | 1814 , m_element(element) |
| 1816 , m_ruleSourceData(nullptr) | 1815 , m_ruleSourceData(nullptr) |
| 1817 , m_isStyleTextValid(false) | 1816 , m_isStyleTextValid(false) |
| 1818 { | 1817 { |
| 1819 ASSERT(m_element); | 1818 ASSERT(m_element); |
| 1820 m_inspectorStyle = InspectorStyle::create(InspectorCSSId(id, 0), inlineStyle
(), this); | 1819 m_inspectorStyle = InspectorStyle::create(0, inlineStyle(), this); |
| 1821 m_styleText = m_element->isStyledElement() ? m_element->getAttribute("style"
).string() : String(); | 1820 m_styleText = m_element->isStyledElement() ? m_element->getAttribute("style"
).string() : String(); |
| 1822 } | 1821 } |
| 1823 | 1822 |
| 1824 void InspectorStyleSheetForInlineStyle::didModifyElementAttribute() | 1823 void InspectorStyleSheetForInlineStyle::didModifyElementAttribute() |
| 1825 { | 1824 { |
| 1826 m_isStyleTextValid = false; | 1825 m_isStyleTextValid = false; |
| 1827 if (m_element->isStyledElement() && m_element->style() != m_inspectorStyle->
cssStyle()) | 1826 if (m_element->isStyledElement() && m_element->style() != m_inspectorStyle->
cssStyle()) |
| 1828 m_inspectorStyle = InspectorStyle::create(InspectorCSSId(id(), 0), inlin
eStyle(), this); | 1827 m_inspectorStyle = InspectorStyle::create(0, inlineStyle(), this); |
| 1829 m_ruleSourceData.clear(); | 1828 m_ruleSourceData.clear(); |
| 1830 } | 1829 } |
| 1831 | 1830 |
| 1832 bool InspectorStyleSheetForInlineStyle::setText(const String& text, ExceptionSta
te& exceptionState) | 1831 bool InspectorStyleSheetForInlineStyle::setText(const String& text, ExceptionSta
te& exceptionState) |
| 1833 { | 1832 { |
| 1834 bool success = setStyleText(InspectorCSSId(id(), 0), text); | 1833 bool success = setStyleText(0, text); |
| 1835 if (!success) | 1834 if (!success) |
| 1836 exceptionState.throwDOMException(SyntaxError, "Style sheet text is inval
id."); | 1835 exceptionState.throwDOMException(SyntaxError, "Style sheet text is inval
id."); |
| 1837 return success; | 1836 return success; |
| 1838 } | 1837 } |
| 1839 | 1838 |
| 1840 bool InspectorStyleSheetForInlineStyle::getText(String* result) const | 1839 bool InspectorStyleSheetForInlineStyle::getText(String* result) const |
| 1841 { | 1840 { |
| 1842 if (!m_isStyleTextValid) { | 1841 if (!m_isStyleTextValid) { |
| 1843 m_styleText = elementStyleText(); | 1842 m_styleText = elementStyleText(); |
| 1844 m_isStyleTextValid = true; | 1843 m_isStyleTextValid = true; |
| 1845 } | 1844 } |
| 1846 *result = m_styleText; | 1845 *result = m_styleText; |
| 1847 return true; | 1846 return true; |
| 1848 } | 1847 } |
| 1849 | 1848 |
| 1850 bool InspectorStyleSheetForInlineStyle::setStyleText(const InspectorCSSId& id, c
onst String& text) | 1849 bool InspectorStyleSheetForInlineStyle::setStyleText(unsigned ruleIndex, const S
tring& text) |
| 1851 { | 1850 { |
| 1852 CSSStyleDeclaration* style = styleForId(id); | 1851 CSSStyleDeclaration* style = styleAt(ruleIndex); |
| 1853 if (!style) | 1852 if (!style) |
| 1854 return false; | 1853 return false; |
| 1855 ASSERT_UNUSED(style, style == inlineStyle()); | 1854 ASSERT_UNUSED(style, style == inlineStyle()); |
| 1856 TrackExceptionState exceptionState; | 1855 TrackExceptionState exceptionState; |
| 1857 | 1856 |
| 1858 { | 1857 { |
| 1859 InspectorCSSAgent::InlineStyleOverrideScope overrideScope(m_element->own
erDocument()); | 1858 InspectorCSSAgent::InlineStyleOverrideScope overrideScope(m_element->own
erDocument()); |
| 1860 m_element->setAttribute("style", AtomicString(text), exceptionState); | 1859 m_element->setAttribute("style", AtomicString(text), exceptionState); |
| 1861 } | 1860 } |
| 1862 if (!exceptionState.hadException()) { | 1861 if (!exceptionState.hadException()) { |
| (...skipping 27 matching lines...) Expand all Loading... |
| 1890 | 1889 |
| 1891 bool success = !!m_ruleSourceData; | 1890 bool success = !!m_ruleSourceData; |
| 1892 if (!success) { | 1891 if (!success) { |
| 1893 m_ruleSourceData = CSSRuleSourceData::create(StyleRule::Style); | 1892 m_ruleSourceData = CSSRuleSourceData::create(StyleRule::Style); |
| 1894 return false; | 1893 return false; |
| 1895 } | 1894 } |
| 1896 | 1895 |
| 1897 return true; | 1896 return true; |
| 1898 } | 1897 } |
| 1899 | 1898 |
| 1900 PassRefPtrWillBeRawPtr<InspectorStyle> InspectorStyleSheetForInlineStyle::inspec
torStyleForId(const InspectorCSSId& id) | 1899 PassRefPtrWillBeRawPtr<InspectorStyle> InspectorStyleSheetForInlineStyle::inspec
torStyleAt(unsigned ruleIndex) |
| 1901 { | 1900 { |
| 1902 ASSERT_UNUSED(id, !id.ordinal()); | 1901 ASSERT_UNUSED(ruleIndex, !ruleIndex); |
| 1903 return m_inspectorStyle; | 1902 return m_inspectorStyle; |
| 1904 } | 1903 } |
| 1905 | 1904 |
| 1906 CSSStyleDeclaration* InspectorStyleSheetForInlineStyle::inlineStyle() const | 1905 CSSStyleDeclaration* InspectorStyleSheetForInlineStyle::inlineStyle() const |
| 1907 { | 1906 { |
| 1908 return m_element->style(); | 1907 return m_element->style(); |
| 1909 } | 1908 } |
| 1910 | 1909 |
| 1911 const String& InspectorStyleSheetForInlineStyle::elementStyleText() const | 1910 const String& InspectorStyleSheetForInlineStyle::elementStyleText() const |
| 1912 { | 1911 { |
| (...skipping 20 matching lines...) Expand all Loading... |
| 1933 | 1932 |
| 1934 DEFINE_TRACE(InspectorStyleSheetForInlineStyle) | 1933 DEFINE_TRACE(InspectorStyleSheetForInlineStyle) |
| 1935 { | 1934 { |
| 1936 visitor->trace(m_element); | 1935 visitor->trace(m_element); |
| 1937 visitor->trace(m_ruleSourceData); | 1936 visitor->trace(m_ruleSourceData); |
| 1938 visitor->trace(m_inspectorStyle); | 1937 visitor->trace(m_inspectorStyle); |
| 1939 InspectorStyleSheetBase::trace(visitor); | 1938 InspectorStyleSheetBase::trace(visitor); |
| 1940 } | 1939 } |
| 1941 | 1940 |
| 1942 } // namespace blink | 1941 } // namespace blink |
| OLD | NEW |