diff options
Diffstat (limited to 'Source/WebCore/css/CSSSelector.cpp')
-rw-r--r-- | Source/WebCore/css/CSSSelector.cpp | 197 |
1 files changed, 18 insertions, 179 deletions
diff --git a/Source/WebCore/css/CSSSelector.cpp b/Source/WebCore/css/CSSSelector.cpp index ca3814a..c804697 100644 --- a/Source/WebCore/css/CSSSelector.cpp +++ b/Source/WebCore/css/CSSSelector.cpp @@ -36,38 +36,15 @@ namespace WebCore { using namespace HTMLNames; - -class CSSSelectorBag { - WTF_MAKE_NONCOPYABLE(CSSSelectorBag); -public: - CSSSelectorBag() { } - ~CSSSelectorBag() - { - ASSERT(isEmpty()); - } - - bool isEmpty() const - { - return m_stack.isEmpty(); - } - - void add(PassOwnPtr<CSSSelector> selector) - { - if (selector) - m_stack.append(selector.leakPtr()); - } - - PassOwnPtr<CSSSelector> takeAny() - { - ASSERT(!isEmpty()); - OwnPtr<CSSSelector> selector = adoptPtr(m_stack.last()); - m_stack.removeLast(); - return selector.release(); - } - -private: - Vector<CSSSelector*, 16> m_stack; -}; + +void CSSSelector::createRareData() +{ + if (m_hasRareData) + return; + // Move the value to the rare data stucture. + m_data.m_rareData = new RareData(adoptRef(m_data.m_value)); + m_hasRareData = true; +} unsigned CSSSelector::specificity() const { @@ -161,40 +138,6 @@ PseudoId CSSSelector::pseudoId(PseudoType type) return SEARCH_RESULTS_DECORATION; case PseudoSearchResultsButton: return SEARCH_RESULTS_BUTTON; - case PseudoMediaControlsPanel: - return MEDIA_CONTROLS_PANEL; - case PseudoMediaControlsMuteButton: - return MEDIA_CONTROLS_MUTE_BUTTON; - case PseudoMediaControlsPlayButton: - return MEDIA_CONTROLS_PLAY_BUTTON; - case PseudoMediaControlsTimelineContainer: - return MEDIA_CONTROLS_TIMELINE_CONTAINER; - case PseudoMediaControlsVolumeSliderContainer: - return MEDIA_CONTROLS_VOLUME_SLIDER_CONTAINER; - case PseudoMediaControlsCurrentTimeDisplay: - return MEDIA_CONTROLS_CURRENT_TIME_DISPLAY; - case PseudoMediaControlsTimeRemainingDisplay: - return MEDIA_CONTROLS_TIME_REMAINING_DISPLAY; - case PseudoMediaControlsTimeline: - return MEDIA_CONTROLS_TIMELINE; - case PseudoMediaControlsVolumeSlider: - return MEDIA_CONTROLS_VOLUME_SLIDER; - case PseudoMediaControlsVolumeSliderMuteButton: - return MEDIA_CONTROLS_VOLUME_SLIDER_MUTE_BUTTON; - case PseudoMediaControlsSeekBackButton: - return MEDIA_CONTROLS_SEEK_BACK_BUTTON; - case PseudoMediaControlsSeekForwardButton: - return MEDIA_CONTROLS_SEEK_FORWARD_BUTTON; - case PseudoMediaControlsRewindButton: - return MEDIA_CONTROLS_REWIND_BUTTON; - case PseudoMediaControlsReturnToRealtimeButton: - return MEDIA_CONTROLS_RETURN_TO_REALTIME_BUTTON; - case PseudoMediaControlsToggleClosedCaptions: - return MEDIA_CONTROLS_TOGGLE_CLOSED_CAPTIONS_BUTTON; - case PseudoMediaControlsStatusDisplay: - return MEDIA_CONTROLS_STATUS_DISPLAY; - case PseudoMediaControlsFullscreenButton: - return MEDIA_CONTROLS_FULLSCREEN_BUTTON; case PseudoScrollbar: return SCROLLBAR; case PseudoScrollbarButton: @@ -213,14 +156,6 @@ PseudoId CSSSelector::pseudoId(PseudoType type) return INNER_SPIN_BUTTON; case PseudoOuterSpinButton: return OUTER_SPIN_BUTTON; - case PseudoProgressBarValue: -#if ENABLE(PROGRESS_TAG) - return PROGRESS_BAR_VALUE; -#else - ASSERT_NOT_REACHED(); - return NOPSEUDO; -#endif - #if ENABLE(METER_TAG) case PseudoMeterHorizontalBar: return METER_HORIZONTAL_BAR; @@ -369,32 +304,11 @@ static HashMap<AtomicStringImpl*, CSSSelector::PseudoType>* nameToPseudoTypeMap( DEFINE_STATIC_LOCAL(AtomicString, lastOfType, ("last-of-type")); DEFINE_STATIC_LOCAL(AtomicString, link, ("link")); DEFINE_STATIC_LOCAL(AtomicString, lang, ("lang(")); - DEFINE_STATIC_LOCAL(AtomicString, mediaControlsPanel, ("-webkit-media-controls-panel")); - DEFINE_STATIC_LOCAL(AtomicString, mediaControlsMuteButton, ("-webkit-media-controls-mute-button")); - DEFINE_STATIC_LOCAL(AtomicString, mediaControlsPlayButton, ("-webkit-media-controls-play-button")); - DEFINE_STATIC_LOCAL(AtomicString, mediaControlsTimeline, ("-webkit-media-controls-timeline")); - DEFINE_STATIC_LOCAL(AtomicString, mediaControlsVolumeSlider, ("-webkit-media-controls-volume-slider")); - DEFINE_STATIC_LOCAL(AtomicString, mediaControlsVolumeSliderMuteButton, ("-webkit-media-controls-volume-slider-mute-button")); - DEFINE_STATIC_LOCAL(AtomicString, mediaControlsSeekBackButton, ("-webkit-media-controls-seek-back-button")); - DEFINE_STATIC_LOCAL(AtomicString, mediaControlsSeekForwardButton, ("-webkit-media-controls-seek-forward-button")); - DEFINE_STATIC_LOCAL(AtomicString, mediaControlsRewindButton, ("-webkit-media-controls-rewind-button")); - DEFINE_STATIC_LOCAL(AtomicString, mediaControlsReturnToRealtimeButton, ("-webkit-media-controls-return-to-realtime-button")); - DEFINE_STATIC_LOCAL(AtomicString, mediaControlsToggleClosedCaptionsButton, ("-webkit-media-controls-toggle-closed-captions-button")); - DEFINE_STATIC_LOCAL(AtomicString, mediaControlsStatusDisplay, ("-webkit-media-controls-status-display")); - DEFINE_STATIC_LOCAL(AtomicString, mediaControlsFullscreenButton, ("-webkit-media-controls-fullscreen-button")); - DEFINE_STATIC_LOCAL(AtomicString, mediaControlsTimelineContainer, ("-webkit-media-controls-timeline-container")); - DEFINE_STATIC_LOCAL(AtomicString, mediaControlsVolumeSliderContainer, ("-webkit-media-controls-volume-slider-container")); - DEFINE_STATIC_LOCAL(AtomicString, mediaControlsCurrentTimeDisplay, ("-webkit-media-controls-current-time-display")); - DEFINE_STATIC_LOCAL(AtomicString, mediaControlsTimeRemainingDisplay, ("-webkit-media-controls-time-remaining-display")); DEFINE_STATIC_LOCAL(AtomicString, notStr, ("not(")); DEFINE_STATIC_LOCAL(AtomicString, onlyChild, ("only-child")); DEFINE_STATIC_LOCAL(AtomicString, onlyOfType, ("only-of-type")); DEFINE_STATIC_LOCAL(AtomicString, optional, ("optional")); DEFINE_STATIC_LOCAL(AtomicString, outerSpinButton, ("-webkit-outer-spin-button")); -#if ENABLE(PROGRESS_TAG) - DEFINE_STATIC_LOCAL(AtomicString, progressBarValue, ("-webkit-progress-bar-value")); -#endif - #if ENABLE(METER_TAG) DEFINE_STATIC_LOCAL(AtomicString, meterHorizontalBar, ("-webkit-meter-horizontal-bar")); DEFINE_STATIC_LOCAL(AtomicString, meterHorizontalOptimumValue, ("-webkit-meter-horizontal-optimum-value")); @@ -486,32 +400,12 @@ static HashMap<AtomicStringImpl*, CSSSelector::PseudoType>* nameToPseudoTypeMap( nameToPseudoType->set(innerSpinButton.impl(), CSSSelector::PseudoInnerSpinButton); nameToPseudoType->set(link.impl(), CSSSelector::PseudoLink); nameToPseudoType->set(lang.impl(), CSSSelector::PseudoLang); - nameToPseudoType->set(mediaControlsPanel.impl(), CSSSelector::PseudoMediaControlsPanel); - nameToPseudoType->set(mediaControlsMuteButton.impl(), CSSSelector::PseudoMediaControlsMuteButton); - nameToPseudoType->set(mediaControlsPlayButton.impl(), CSSSelector::PseudoMediaControlsPlayButton); - nameToPseudoType->set(mediaControlsCurrentTimeDisplay.impl(), CSSSelector::PseudoMediaControlsCurrentTimeDisplay); - nameToPseudoType->set(mediaControlsTimeRemainingDisplay.impl(), CSSSelector::PseudoMediaControlsTimeRemainingDisplay); - nameToPseudoType->set(mediaControlsTimeline.impl(), CSSSelector::PseudoMediaControlsTimeline); - nameToPseudoType->set(mediaControlsVolumeSlider.impl(), CSSSelector::PseudoMediaControlsVolumeSlider); - nameToPseudoType->set(mediaControlsVolumeSliderMuteButton.impl(), CSSSelector::PseudoMediaControlsVolumeSliderMuteButton); - nameToPseudoType->set(mediaControlsSeekBackButton.impl(), CSSSelector::PseudoMediaControlsSeekBackButton); - nameToPseudoType->set(mediaControlsSeekForwardButton.impl(), CSSSelector::PseudoMediaControlsSeekForwardButton); - nameToPseudoType->set(mediaControlsRewindButton.impl(), CSSSelector::PseudoMediaControlsRewindButton); - nameToPseudoType->set(mediaControlsReturnToRealtimeButton.impl(), CSSSelector::PseudoMediaControlsReturnToRealtimeButton); - nameToPseudoType->set(mediaControlsToggleClosedCaptionsButton.impl(), CSSSelector::PseudoMediaControlsToggleClosedCaptions); - nameToPseudoType->set(mediaControlsStatusDisplay.impl(), CSSSelector::PseudoMediaControlsStatusDisplay); - nameToPseudoType->set(mediaControlsFullscreenButton.impl(), CSSSelector::PseudoMediaControlsFullscreenButton); - nameToPseudoType->set(mediaControlsTimelineContainer.impl(), CSSSelector::PseudoMediaControlsTimelineContainer); - nameToPseudoType->set(mediaControlsVolumeSliderContainer.impl(), CSSSelector::PseudoMediaControlsVolumeSliderContainer); nameToPseudoType->set(notStr.impl(), CSSSelector::PseudoNot); nameToPseudoType->set(nthChild.impl(), CSSSelector::PseudoNthChild); nameToPseudoType->set(nthOfType.impl(), CSSSelector::PseudoNthOfType); nameToPseudoType->set(nthLastChild.impl(), CSSSelector::PseudoNthLastChild); nameToPseudoType->set(nthLastOfType.impl(), CSSSelector::PseudoNthLastOfType); nameToPseudoType->set(outerSpinButton.impl(), CSSSelector::PseudoOuterSpinButton); -#if ENABLE(PROGRESS_TAG) - nameToPseudoType->set(progressBarValue.impl(), CSSSelector::PseudoProgressBarValue); -#endif #if ENABLE(METER_TAG) nameToPseudoType->set(meterHorizontalBar.impl(), CSSSelector::PseudoMeterHorizontalBar); nameToPseudoType->set(meterHorizontalOptimumValue.impl(), CSSSelector::PseudoMeterHorizontalOptimum); @@ -577,7 +471,7 @@ void CSSSelector::extractPseudoType() const if (m_match != PseudoClass && m_match != PseudoElement && m_match != PagePseudoClass) return; - m_pseudoType = parsePseudoType(m_value); + m_pseudoType = parsePseudoType(value()); bool element = false; // pseudo-element bool compat = false; // single colon compatbility mode @@ -596,23 +490,6 @@ void CSSSelector::extractPseudoType() const case PseudoInputSpeechButton: #endif case PseudoInnerSpinButton: - case PseudoMediaControlsPanel: - case PseudoMediaControlsMuteButton: - case PseudoMediaControlsPlayButton: - case PseudoMediaControlsCurrentTimeDisplay: - case PseudoMediaControlsTimeRemainingDisplay: - case PseudoMediaControlsTimeline: - case PseudoMediaControlsVolumeSlider: - case PseudoMediaControlsVolumeSliderMuteButton: - case PseudoMediaControlsSeekBackButton: - case PseudoMediaControlsSeekForwardButton: - case PseudoMediaControlsRewindButton: - case PseudoMediaControlsReturnToRealtimeButton: - case PseudoMediaControlsToggleClosedCaptions: - case PseudoMediaControlsStatusDisplay: - case PseudoMediaControlsFullscreenButton: - case PseudoMediaControlsTimelineContainer: - case PseudoMediaControlsVolumeSliderContainer: case PseudoMeterHorizontalBar: case PseudoMeterHorizontalOptimum: case PseudoMeterHorizontalSuboptimal: @@ -622,7 +499,6 @@ void CSSSelector::extractPseudoType() const case PseudoMeterVerticalSuboptimal: case PseudoMeterVerticalEvenLessGood: case PseudoOuterSpinButton: - case PseudoProgressBarValue: case PseudoResizer: case PseudoScrollbar: case PseudoScrollbarCorner: @@ -721,7 +597,7 @@ bool CSSSelector::operator==(const CSSSelector& other) while (sel1 && sel2) { if (sel1->m_tag != sel2->m_tag || sel1->attribute() != sel2->attribute() || sel1->relation() != sel2->relation() || sel1->m_match != sel2->m_match || - sel1->m_value != sel2->m_value || + sel1->value() != sel2->value() || sel1->pseudoType() != sel2->pseudoType() || sel1->argument() != sel2->argument()) return false; @@ -755,13 +631,13 @@ String CSSSelector::selectorText() const while (true) { if (cs->m_match == CSSSelector::Id) { str += "#"; - serializeIdentifier(cs->m_value, str); + serializeIdentifier(cs->value(), str); } else if (cs->m_match == CSSSelector::Class) { str += "."; - serializeIdentifier(cs->m_value, str); + serializeIdentifier(cs->value(), str); } else if (cs->m_match == CSSSelector::PseudoClass || cs->m_match == CSSSelector::PagePseudoClass) { str += ":"; - str += cs->m_value; + str += cs->value(); if (cs->pseudoType() == PseudoNot) { if (CSSSelector* subSel = cs->simpleSelector()) str += subSel->selectorText(); @@ -776,7 +652,7 @@ String CSSSelector::selectorText() const } } else if (cs->m_match == CSSSelector::PseudoElement) { str += "::"; - str += cs->m_value; + str += cs->value(); } else if (cs->hasAttribute()) { str += "["; const AtomicString& prefix = cs->attribute().prefix(); @@ -812,7 +688,7 @@ String CSSSelector::selectorText() const break; } if (cs->m_match != CSSSelector::Set) { - serializeString(cs->m_value, str); + serializeString(cs->value(), str); str += "]"; } } @@ -836,14 +712,6 @@ String CSSSelector::selectorText() const return str; } - -void CSSSelector::setTagHistory(CSSSelector* tagHistory) -{ - if (m_hasRareData) - m_data.m_rareData->m_tagHistory.set(tagHistory); - else - m_data.m_tagHistory = tagHistory; -} const QualifiedName& CSSSelector::attribute() const { @@ -869,10 +737,10 @@ void CSSSelector::setArgument(const AtomicString& value) m_data.m_rareData->m_argument = value; } -void CSSSelector::setSimpleSelector(CSSSelector* value) +void CSSSelector::setSimpleSelector(PassOwnPtr<CSSSelector> value) { createRareData(); - m_data.m_rareData->m_simpleSelector.set(value); + m_data.m_rareData->m_simpleSelector = value; } bool CSSSelector::parseNth() @@ -975,33 +843,4 @@ bool CSSSelector::RareData::matchNth(int count) } } -inline void CSSSelector::releaseOwnedSelectorsToBag(CSSSelectorBag& bag) -{ - if (m_hasRareData) { - ASSERT(m_data.m_rareData); - bag.add(m_data.m_rareData->m_tagHistory.release()); - bag.add(m_data.m_rareData->m_simpleSelector.release()); - delete m_data.m_rareData; - // Clear the pointer so that a destructor of this selector will not - // traverse this chain. - m_data.m_rareData = 0; - } else { - bag.add(adoptPtr(m_data.m_tagHistory)); - // Clear the pointer for the same reason. - m_data.m_tagHistory = 0; - } -} - -void CSSSelector::deleteReachableSelectors() -{ - // Traverse the chain of selectors and delete each iteratively. - CSSSelectorBag selectorsToBeDeleted; - releaseOwnedSelectorsToBag(selectorsToBeDeleted); - while (!selectorsToBeDeleted.isEmpty()) { - OwnPtr<CSSSelector> selector(selectorsToBeDeleted.takeAny()); - ASSERT(selector); - selector->releaseOwnedSelectorsToBag(selectorsToBeDeleted); - } -} - } // namespace WebCore |