summaryrefslogtreecommitdiffstats
path: root/WebCore/css/CSSSelector.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/css/CSSSelector.cpp')
-rw-r--r--WebCore/css/CSSSelector.cpp600
1 files changed, 376 insertions, 224 deletions
diff --git a/WebCore/css/CSSSelector.cpp b/WebCore/css/CSSSelector.cpp
index 9ae9b9f..23a89f6 100644
--- a/WebCore/css/CSSSelector.cpp
+++ b/WebCore/css/CSSSelector.cpp
@@ -28,6 +28,7 @@
#include "wtf/Assertions.h"
#include "HTMLNames.h"
+#include <wtf/HashMap.h>
#include <wtf/StdLibExtras.h>
namespace WebCore {
@@ -65,11 +66,148 @@ unsigned int CSSSelector::specificity()
return s & 0xffffff;
}
-void CSSSelector::extractPseudoType() const
+PseudoId CSSSelector::pseudoId(PseudoType type)
{
- if (m_match != PseudoClass && m_match != PseudoElement)
- return;
+ switch (type) {
+ case PseudoFirstLine:
+ return FIRST_LINE;
+ case PseudoFirstLetter:
+ return FIRST_LETTER;
+ case PseudoSelection:
+ return SELECTION;
+ case PseudoBefore:
+ return BEFORE;
+ case PseudoAfter:
+ return AFTER;
+ case PseudoFileUploadButton:
+ return FILE_UPLOAD_BUTTON;
+ case PseudoInputPlaceholder:
+ return INPUT_PLACEHOLDER;
+ case PseudoSliderThumb:
+ return SLIDER_THUMB;
+ case PseudoSearchCancelButton:
+ return SEARCH_CANCEL_BUTTON;
+ case PseudoSearchDecoration:
+ return SEARCH_DECORATION;
+ case PseudoSearchResultsDecoration:
+ 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 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:
+ return SCROLLBAR_BUTTON;
+ case PseudoScrollbarCorner:
+ return SCROLLBAR_CORNER;
+ case PseudoScrollbarThumb:
+ return SCROLLBAR_THUMB;
+ case PseudoScrollbarTrack:
+ return SCROLLBAR_TRACK;
+ case PseudoScrollbarTrackPiece:
+ return SCROLLBAR_TRACK_PIECE;
+ case PseudoResizer:
+ return RESIZER;
+ case PseudoInnerSpinButton:
+ return INNER_SPIN_BUTTON;
+ case PseudoOuterSpinButton:
+ return OUTER_SPIN_BUTTON;
+ case PseudoInputListButton:
+#if ENABLE(DATALIST)
+ return INPUT_LIST_BUTTON;
+#endif
+ case PseudoUnknown:
+ case PseudoEmpty:
+ case PseudoFirstChild:
+ case PseudoFirstOfType:
+ case PseudoLastChild:
+ case PseudoLastOfType:
+ case PseudoOnlyChild:
+ case PseudoOnlyOfType:
+ case PseudoNthChild:
+ case PseudoNthOfType:
+ case PseudoNthLastChild:
+ case PseudoNthLastOfType:
+ case PseudoLink:
+ case PseudoVisited:
+ case PseudoAnyLink:
+ case PseudoAutofill:
+ case PseudoHover:
+ case PseudoDrag:
+ case PseudoFocus:
+ case PseudoActive:
+ case PseudoChecked:
+ case PseudoEnabled:
+ case PseudoFullPageMedia:
+ case PseudoDefault:
+ case PseudoDisabled:
+ case PseudoOptional:
+ case PseudoRequired:
+ case PseudoReadOnly:
+ case PseudoReadWrite:
+ case PseudoValid:
+ case PseudoInvalid:
+ case PseudoIndeterminate:
+ case PseudoTarget:
+ case PseudoLang:
+ case PseudoNot:
+ case PseudoRoot:
+ case PseudoScrollbarBack:
+ case PseudoScrollbarForward:
+ case PseudoWindowInactive:
+ case PseudoCornerPresent:
+ case PseudoDecrement:
+ case PseudoIncrement:
+ case PseudoHorizontal:
+ case PseudoVertical:
+ case PseudoStart:
+ case PseudoEnd:
+ case PseudoDoubleButton:
+ case PseudoSingleButton:
+ case PseudoNoButton:
+ return NOPSEUDO;
+ case PseudoNotParsed:
+ ASSERT_NOT_REACHED();
+ return NOPSEUDO;
+ }
+
+ ASSERT_NOT_REACHED();
+ return NOPSEUDO;
+}
+static HashMap<AtomicStringImpl*, CSSSelector::PseudoType>* nameToPseudoTypeMap()
+{
DEFINE_STATIC_LOCAL(AtomicString, active, ("active"));
DEFINE_STATIC_LOCAL(AtomicString, after, ("after"));
DEFINE_STATIC_LOCAL(AtomicString, anyLink, ("-webkit-any-link"));
@@ -129,6 +267,9 @@ void CSSSelector::extractPseudoType() const
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_BAR)
+ DEFINE_STATIC_LOCAL(AtomicString, progressBar, ("-webkit-progress-bar"));
+#endif
DEFINE_STATIC_LOCAL(AtomicString, required, ("required"));
DEFINE_STATIC_LOCAL(AtomicString, resizer, ("-webkit-resizer"));
DEFINE_STATIC_LOCAL(AtomicString, root, ("root"));
@@ -158,232 +299,218 @@ void CSSSelector::extractPseudoType() const
DEFINE_STATIC_LOCAL(AtomicString, noButton, ("no-button"));
DEFINE_STATIC_LOCAL(AtomicString, cornerPresent, ("corner-present"));
+ static HashMap<AtomicStringImpl*, CSSSelector::PseudoType>* nameToPseudoType = 0;
+ if (!nameToPseudoType) {
+ nameToPseudoType = new HashMap<AtomicStringImpl*, CSSSelector::PseudoType>;
+ nameToPseudoType->set(active.impl(), CSSSelector::PseudoActive);
+ nameToPseudoType->set(after.impl(), CSSSelector::PseudoAfter);
+ nameToPseudoType->set(anyLink.impl(), CSSSelector::PseudoAnyLink);
+ nameToPseudoType->set(autofill.impl(), CSSSelector::PseudoAutofill);
+ nameToPseudoType->set(before.impl(), CSSSelector::PseudoBefore);
+ nameToPseudoType->set(checked.impl(), CSSSelector::PseudoChecked);
+ nameToPseudoType->set(fileUploadButton.impl(), CSSSelector::PseudoFileUploadButton);
+ nameToPseudoType->set(defaultString.impl(), CSSSelector::PseudoDefault);
+ nameToPseudoType->set(disabled.impl(), CSSSelector::PseudoDisabled);
+ nameToPseudoType->set(readOnly.impl(), CSSSelector::PseudoReadOnly);
+ nameToPseudoType->set(readWrite.impl(), CSSSelector::PseudoReadWrite);
+ nameToPseudoType->set(valid.impl(), CSSSelector::PseudoValid);
+ nameToPseudoType->set(invalid.impl(), CSSSelector::PseudoInvalid);
+ nameToPseudoType->set(drag.impl(), CSSSelector::PseudoDrag);
+ nameToPseudoType->set(dragAlias.impl(), CSSSelector::PseudoDrag);
+ nameToPseudoType->set(enabled.impl(), CSSSelector::PseudoEnabled);
+ nameToPseudoType->set(empty.impl(), CSSSelector::PseudoEmpty);
+ nameToPseudoType->set(firstChild.impl(), CSSSelector::PseudoFirstChild);
+ nameToPseudoType->set(fullPageMedia.impl(), CSSSelector::PseudoFullPageMedia);
+#if ENABLE(DATALIST)
+ nameToPseudoType->set(inputListButton.impl(), CSSSelector::PseudoInputListButton);
+#endif
+ nameToPseudoType->set(inputPlaceholder.impl(), CSSSelector::PseudoInputPlaceholder);
+ nameToPseudoType->set(lastChild.impl(), CSSSelector::PseudoLastChild);
+ nameToPseudoType->set(lastOfType.impl(), CSSSelector::PseudoLastOfType);
+ nameToPseudoType->set(onlyChild.impl(), CSSSelector::PseudoOnlyChild);
+ nameToPseudoType->set(onlyOfType.impl(), CSSSelector::PseudoOnlyOfType);
+ nameToPseudoType->set(firstLetter.impl(), CSSSelector::PseudoFirstLetter);
+ nameToPseudoType->set(firstLine.impl(), CSSSelector::PseudoFirstLine);
+ nameToPseudoType->set(firstOfType.impl(), CSSSelector::PseudoFirstOfType);
+ nameToPseudoType->set(focus.impl(), CSSSelector::PseudoFocus);
+ nameToPseudoType->set(hover.impl(), CSSSelector::PseudoHover);
+ nameToPseudoType->set(indeterminate.impl(), CSSSelector::PseudoIndeterminate);
+ 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(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);
+ nameToPseudoType->set(root.impl(), CSSSelector::PseudoRoot);
+ nameToPseudoType->set(windowInactive.impl(), CSSSelector::PseudoWindowInactive);
+ nameToPseudoType->set(decrement.impl(), CSSSelector::PseudoDecrement);
+ nameToPseudoType->set(increment.impl(), CSSSelector::PseudoIncrement);
+ nameToPseudoType->set(start.impl(), CSSSelector::PseudoStart);
+ nameToPseudoType->set(end.impl(), CSSSelector::PseudoEnd);
+ nameToPseudoType->set(horizontal.impl(), CSSSelector::PseudoHorizontal);
+ nameToPseudoType->set(vertical.impl(), CSSSelector::PseudoVertical);
+ nameToPseudoType->set(doubleButton.impl(), CSSSelector::PseudoDoubleButton);
+ nameToPseudoType->set(singleButton.impl(), CSSSelector::PseudoSingleButton);
+ nameToPseudoType->set(noButton.impl(), CSSSelector::PseudoNoButton);
+ nameToPseudoType->set(optional.impl(), CSSSelector::PseudoOptional);
+ nameToPseudoType->set(required.impl(), CSSSelector::PseudoRequired);
+ nameToPseudoType->set(resizer.impl(), CSSSelector::PseudoResizer);
+ nameToPseudoType->set(scrollbar.impl(), CSSSelector::PseudoScrollbar);
+ nameToPseudoType->set(scrollbarButton.impl(), CSSSelector::PseudoScrollbarButton);
+ nameToPseudoType->set(scrollbarCorner.impl(), CSSSelector::PseudoScrollbarCorner);
+ nameToPseudoType->set(scrollbarThumb.impl(), CSSSelector::PseudoScrollbarThumb);
+ nameToPseudoType->set(scrollbarTrack.impl(), CSSSelector::PseudoScrollbarTrack);
+ nameToPseudoType->set(scrollbarTrackPiece.impl(), CSSSelector::PseudoScrollbarTrackPiece);
+ nameToPseudoType->set(cornerPresent.impl(), CSSSelector::PseudoCornerPresent);
+ nameToPseudoType->set(searchCancelButton.impl(), CSSSelector::PseudoSearchCancelButton);
+ nameToPseudoType->set(searchDecoration.impl(), CSSSelector::PseudoSearchDecoration);
+ nameToPseudoType->set(searchResultsDecoration.impl(), CSSSelector::PseudoSearchResultsDecoration);
+ nameToPseudoType->set(searchResultsButton.impl(), CSSSelector::PseudoSearchResultsButton);
+ nameToPseudoType->set(selection.impl(), CSSSelector::PseudoSelection);
+ nameToPseudoType->set(sliderThumb.impl(), CSSSelector::PseudoSliderThumb);
+ nameToPseudoType->set(target.impl(), CSSSelector::PseudoTarget);
+ nameToPseudoType->set(visited.impl(), CSSSelector::PseudoVisited);
+ }
+ return nameToPseudoType;
+}
+
+CSSSelector::PseudoType CSSSelector::parsePseudoType(const AtomicString& name)
+{
+ if (name.isNull())
+ return PseudoUnknown;
+ HashMap<AtomicStringImpl*, CSSSelector::PseudoType>* nameToPseudoType = nameToPseudoTypeMap();
+ HashMap<AtomicStringImpl*, CSSSelector::PseudoType>::iterator slot = nameToPseudoType->find(name.impl());
+ return slot == nameToPseudoType->end() ? PseudoUnknown : slot->second;
+}
+
+void CSSSelector::extractPseudoType() const
+{
+ if (m_match != PseudoClass && m_match != PseudoElement)
+ return;
+
+ m_pseudoType = parsePseudoType(m_value);
+
bool element = false; // pseudo-element
bool compat = false; // single colon compatbility mode
- m_pseudoType = PseudoUnknown;
- if (m_value == active)
- m_pseudoType = PseudoActive;
- else if (m_value == after) {
- m_pseudoType = PseudoAfter;
- element = true;
- compat = true;
- } else if (m_value == anyLink)
- m_pseudoType = PseudoAnyLink;
- else if (m_value == autofill)
- m_pseudoType = PseudoAutofill;
- else if (m_value == before) {
- m_pseudoType = PseudoBefore;
- element = true;
- compat = true;
- } else if (m_value == checked)
- m_pseudoType = PseudoChecked;
- else if (m_value == fileUploadButton) {
- m_pseudoType = PseudoFileUploadButton;
- element = true;
- } else if (m_value == defaultString)
- m_pseudoType = PseudoDefault;
- else if (m_value == disabled)
- m_pseudoType = PseudoDisabled;
- else if (m_value == readOnly)
- m_pseudoType = PseudoReadOnly;
- else if (m_value == readWrite)
- m_pseudoType = PseudoReadWrite;
- else if (m_value == valid)
- m_pseudoType = PseudoValid;
- else if (m_value == invalid)
- m_pseudoType = PseudoInvalid;
- else if (m_value == drag || m_value == dragAlias)
- m_pseudoType = PseudoDrag;
- else if (m_value == enabled)
- m_pseudoType = PseudoEnabled;
- else if (m_value == empty)
- m_pseudoType = PseudoEmpty;
- else if (m_value == firstChild)
- m_pseudoType = PseudoFirstChild;
- else if (m_value == fullPageMedia)
- m_pseudoType = PseudoFullPageMedia;
- else
-#if ENABLE(DATALIST)
- if (m_value == inputListButton) {
- m_pseudoType = PseudoInputListButton;
- element = true;
- } else
-#endif
- if (m_value == inputPlaceholder) {
- m_pseudoType = PseudoInputPlaceholder;
- element = true;
- } else if (m_value == lastChild)
- m_pseudoType = PseudoLastChild;
- else if (m_value == lastOfType)
- m_pseudoType = PseudoLastOfType;
- else if (m_value == onlyChild)
- m_pseudoType = PseudoOnlyChild;
- else if (m_value == onlyOfType)
- m_pseudoType = PseudoOnlyOfType;
- else if (m_value == firstLetter) {
- m_pseudoType = PseudoFirstLetter;
- element = true;
- compat = true;
- } else if (m_value == firstLine) {
- m_pseudoType = PseudoFirstLine;
- element = true;
+ switch (m_pseudoType) {
+ case PseudoAfter:
+ case PseudoBefore:
+ case PseudoFirstLetter:
+ case PseudoFirstLine:
compat = true;
- } else if (m_value == firstOfType)
- m_pseudoType = PseudoFirstOfType;
- else if (m_value == focus)
- m_pseudoType = PseudoFocus;
- else if (m_value == hover)
- m_pseudoType = PseudoHover;
- else if (m_value == indeterminate)
- m_pseudoType = PseudoIndeterminate;
- else if (m_value == innerSpinButton) {
- m_pseudoType = PseudoInnerSpinButton;
- element = true;
- } else if (m_value == link)
- m_pseudoType = PseudoLink;
- else if (m_value == lang)
- m_pseudoType = PseudoLang;
- else if (m_value == mediaControlsPanel) {
- m_pseudoType = PseudoMediaControlsPanel;
- element = true;
- } else if (m_value == mediaControlsMuteButton) {
- m_pseudoType = PseudoMediaControlsMuteButton;
- element = true;
- } else if (m_value == mediaControlsPlayButton) {
- m_pseudoType = PseudoMediaControlsPlayButton;
- element = true;
- } else if (m_value == mediaControlsCurrentTimeDisplay) {
- m_pseudoType = PseudoMediaControlsCurrentTimeDisplay;
- element = true;
- } else if (m_value == mediaControlsTimeRemainingDisplay) {
- m_pseudoType = PseudoMediaControlsTimeRemainingDisplay;
- element = true;
- } else if (m_value == mediaControlsTimeline) {
- m_pseudoType = PseudoMediaControlsTimeline;
- element = true;
- } else if (m_value == mediaControlsVolumeSlider) {
- m_pseudoType = PseudoMediaControlsVolumeSlider;
- element = true;
- } else if (m_value == mediaControlsSeekBackButton) {
- m_pseudoType = PseudoMediaControlsSeekBackButton;
- element = true;
- } else if (m_value == mediaControlsSeekForwardButton) {
- m_pseudoType = PseudoMediaControlsSeekForwardButton;
- element = true;
- } else if (m_value == mediaControlsRewindButton) {
- m_pseudoType = PseudoMediaControlsRewindButton;
- element = true;
- } else if (m_value == mediaControlsReturnToRealtimeButton) {
- m_pseudoType = PseudoMediaControlsReturnToRealtimeButton;
- element = true;
- } else if (m_value == mediaControlsToggleClosedCaptionsButton) {
- m_pseudoType = PseudoMediaControlsToggleClosedCaptions;
- element = true;
- } else if (m_value == mediaControlsStatusDisplay) {
- m_pseudoType = PseudoMediaControlsStatusDisplay;
- element = true;
- } else if (m_value == mediaControlsFullscreenButton) {
- m_pseudoType = PseudoMediaControlsFullscreenButton;
- element = true;
- } else if (m_value == mediaControlsTimelineContainer) {
- m_pseudoType = PseudoMediaControlsTimelineContainer;
- element = true;
- } else if (m_value == mediaControlsVolumeSliderContainer) {
- m_pseudoType = PseudoMediaControlsVolumeSliderContainer;
- element = true;
- } else if (m_value == notStr)
- m_pseudoType = PseudoNot;
- else if (m_value == nthChild)
- m_pseudoType = PseudoNthChild;
- else if (m_value == nthOfType)
- m_pseudoType = PseudoNthOfType;
- else if (m_value == nthLastChild)
- m_pseudoType = PseudoNthLastChild;
- else if (m_value == nthLastOfType)
- m_pseudoType = PseudoNthLastOfType;
- else if (m_value == outerSpinButton) {
- m_pseudoType = PseudoOuterSpinButton;
- element = true;
- } else if (m_value == root)
- m_pseudoType = PseudoRoot;
- else if (m_value == windowInactive)
- m_pseudoType = PseudoWindowInactive;
- else if (m_value == decrement)
- m_pseudoType = PseudoDecrement;
- else if (m_value == increment)
- m_pseudoType = PseudoIncrement;
- else if (m_value == start)
- m_pseudoType = PseudoStart;
- else if (m_value == end)
- m_pseudoType = PseudoEnd;
- else if (m_value == horizontal)
- m_pseudoType = PseudoHorizontal;
- else if (m_value == vertical)
- m_pseudoType = PseudoVertical;
- else if (m_value == doubleButton)
- m_pseudoType = PseudoDoubleButton;
- else if (m_value == singleButton)
- m_pseudoType = PseudoSingleButton;
- else if (m_value == noButton)
- m_pseudoType = PseudoNoButton;
- else if (m_value == optional)
- m_pseudoType = PseudoOptional;
- else if (m_value == required)
- m_pseudoType = PseudoRequired;
- else if (m_value == scrollbarCorner) {
- element = true;
- m_pseudoType = PseudoScrollbarCorner;
- } else if (m_value == resizer) {
- element = true;
- m_pseudoType = PseudoResizer;
- } else if (m_value == scrollbar) {
- element = true;
- m_pseudoType = PseudoScrollbar;
- } else if (m_value == scrollbarButton) {
- element = true;
- m_pseudoType = PseudoScrollbarButton;
- } else if (m_value == scrollbarCorner) {
- element = true;
- m_pseudoType = PseudoScrollbarCorner;
- } else if (m_value == scrollbarThumb) {
- element = true;
- m_pseudoType = PseudoScrollbarThumb;
- } else if (m_value == scrollbarTrack) {
- element = true;
- m_pseudoType = PseudoScrollbarTrack;
- } else if (m_value == scrollbarTrackPiece) {
- element = true;
- m_pseudoType = PseudoScrollbarTrackPiece;
- } else if (m_value == cornerPresent)
- m_pseudoType = PseudoCornerPresent;
- else if (m_value == searchCancelButton) {
- m_pseudoType = PseudoSearchCancelButton;
- element = true;
- } else if (m_value == searchDecoration) {
- m_pseudoType = PseudoSearchDecoration;
- element = true;
- } else if (m_value == searchResultsDecoration) {
- m_pseudoType = PseudoSearchResultsDecoration;
- element = true;
- } else if (m_value == searchResultsButton) {
- m_pseudoType = PseudoSearchResultsButton;
- element = true;
- } else if (m_value == selection) {
- m_pseudoType = PseudoSelection;
- element = true;
- } else if (m_value == sliderThumb) {
- m_pseudoType = PseudoSliderThumb;
- element = true;
- } else if (m_value == target)
- m_pseudoType = PseudoTarget;
- else if (m_value == visited)
- m_pseudoType = PseudoVisited;
+ case PseudoFileUploadButton:
+ case PseudoInputListButton:
+ case PseudoInputPlaceholder:
+ case PseudoInnerSpinButton:
+ case PseudoMediaControlsPanel:
+ case PseudoMediaControlsMuteButton:
+ case PseudoMediaControlsPlayButton:
+ case PseudoMediaControlsCurrentTimeDisplay:
+ case PseudoMediaControlsTimeRemainingDisplay:
+ case PseudoMediaControlsTimeline:
+ case PseudoMediaControlsVolumeSlider:
+ case PseudoMediaControlsSeekBackButton:
+ case PseudoMediaControlsSeekForwardButton:
+ case PseudoMediaControlsRewindButton:
+ case PseudoMediaControlsReturnToRealtimeButton:
+ case PseudoMediaControlsToggleClosedCaptions:
+ case PseudoMediaControlsStatusDisplay:
+ case PseudoMediaControlsFullscreenButton:
+ case PseudoMediaControlsTimelineContainer:
+ case PseudoMediaControlsVolumeSliderContainer:
+ case PseudoOuterSpinButton:
+ case PseudoResizer:
+ case PseudoScrollbar:
+ case PseudoScrollbarCorner:
+ case PseudoScrollbarButton:
+ case PseudoScrollbarThumb:
+ case PseudoScrollbarTrack:
+ case PseudoScrollbarTrackPiece:
+ case PseudoSearchCancelButton:
+ case PseudoSearchDecoration:
+ case PseudoSearchResultsDecoration:
+ case PseudoSearchResultsButton:
+ case PseudoSelection:
+ case PseudoSliderThumb:
+ element = true;
+ break;
+ case PseudoUnknown:
+ case PseudoEmpty:
+ case PseudoFirstChild:
+ case PseudoFirstOfType:
+ case PseudoLastChild:
+ case PseudoLastOfType:
+ case PseudoOnlyChild:
+ case PseudoOnlyOfType:
+ case PseudoNthChild:
+ case PseudoNthOfType:
+ case PseudoNthLastChild:
+ case PseudoNthLastOfType:
+ case PseudoLink:
+ case PseudoVisited:
+ case PseudoAnyLink:
+ case PseudoAutofill:
+ case PseudoHover:
+ case PseudoDrag:
+ case PseudoFocus:
+ case PseudoActive:
+ case PseudoChecked:
+ case PseudoEnabled:
+ case PseudoFullPageMedia:
+ case PseudoDefault:
+ case PseudoDisabled:
+ case PseudoOptional:
+ case PseudoRequired:
+ case PseudoReadOnly:
+ case PseudoReadWrite:
+ case PseudoValid:
+ case PseudoInvalid:
+ case PseudoIndeterminate:
+ case PseudoTarget:
+ case PseudoLang:
+ case PseudoNot:
+ case PseudoRoot:
+ case PseudoScrollbarBack:
+ case PseudoScrollbarForward:
+ case PseudoWindowInactive:
+ case PseudoCornerPresent:
+ case PseudoDecrement:
+ case PseudoIncrement:
+ case PseudoHorizontal:
+ case PseudoVertical:
+ case PseudoStart:
+ case PseudoEnd:
+ case PseudoDoubleButton:
+ case PseudoSingleButton:
+ case PseudoNoButton:
+ case PseudoNotParsed:
+ break;
+ }
if (m_match == PseudoClass && element) {
- if (!compat)
+ if (!compat)
m_pseudoType = PseudoUnknown;
- else
+ else
m_match = PseudoElement;
} else if (m_match == PseudoElement && !element)
m_pseudoType = PseudoUnknown;
@@ -563,10 +690,35 @@ bool CSSSelector::matchNth(int count)
return m_data.m_rareData->matchNth(count);
}
+bool CSSSelector::isSimple() const
+{
+ if (simpleSelector() || tagHistory() || matchesPseudoElement())
+ return false;
+
+ int numConditions = 0;
+
+ // hasTag() cannot be be used here because namespace may not be nullAtom.
+ // Example:
+ // @namespace "http://www.w3.org/2000/svg";
+ // svg:not(:root) { ...
+ if (m_tag != starAtom)
+ numConditions++;
+
+ if (m_match == Id || m_match == Class || m_match == PseudoClass)
+ numConditions++;
+
+ if (m_hasRareData && m_data.m_rareData->m_attribute != anyQName())
+ numConditions++;
+
+ // numConditions is 0 for a universal selector.
+ // numConditions is 1 for other simple selectors.
+ return numConditions <= 1;
+}
+
// a helper function for parsing nth-arguments
bool CSSSelector::RareData::parseNth()
-{
- const String& argument = m_argument;
+{
+ String argument = m_argument.lower();
if (argument.isEmpty())
return false;