Title: [171486] trunk/Source/WebCore
Revision
171486
Author
achristen...@apple.com
Date
2014-07-23 13:19:37 -0700 (Wed, 23 Jul 2014)

Log Message

Compile window-inactive and fullscreen pseudoclasses in css selectors.
https://bugs.webkit.org/show_bug.cgi?id=135200

Reviewed by Benjamin Poulain.

* css/SelectorChecker.cpp:
(WebCore::SelectorChecker::checkOne):
Removed the check of context.hasSelectionPseudo for a window-inactive pseudoclass.
Moved logic to SelectorCheckerTestFunctions.h to share with the selector compiler.
* css/SelectorCheckerTestFunctions.h:
(WebCore::isWindowInactive):
(WebCore::matchesFullScreenAnimatingFullScreenTransitionPseudoClass):
(WebCore::matchesFullScreenAncestorPseudoClass):
(WebCore::matchesFullScreenDocumentPseudoClass):
Added from SelectorChecker.cpp.
* cssjit/SelectorCompiler.cpp:
(WebCore::SelectorCompiler::addPseudoClassType):
Added unoptimized pseudoclass cases for window-inactive and fullscreen pseudoclasses.
Explicitly listed uncompiled pseudoclasses for future work instead of using a default.

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (171485 => 171486)


--- trunk/Source/WebCore/ChangeLog	2014-07-23 20:18:47 UTC (rev 171485)
+++ trunk/Source/WebCore/ChangeLog	2014-07-23 20:19:37 UTC (rev 171486)
@@ -1,3 +1,25 @@
+2014-07-23  Alex Christensen  <achristen...@webkit.org>
+
+        Compile window-inactive and fullscreen pseudoclasses in css selectors.
+        https://bugs.webkit.org/show_bug.cgi?id=135200
+
+        Reviewed by Benjamin Poulain.
+
+        * css/SelectorChecker.cpp:
+        (WebCore::SelectorChecker::checkOne):
+        Removed the check of context.hasSelectionPseudo for a window-inactive pseudoclass.
+        Moved logic to SelectorCheckerTestFunctions.h to share with the selector compiler.
+        * css/SelectorCheckerTestFunctions.h:
+        (WebCore::isWindowInactive):
+        (WebCore::matchesFullScreenAnimatingFullScreenTransitionPseudoClass):
+        (WebCore::matchesFullScreenAncestorPseudoClass):
+        (WebCore::matchesFullScreenDocumentPseudoClass):
+        Added from SelectorChecker.cpp.
+        * cssjit/SelectorCompiler.cpp:
+        (WebCore::SelectorCompiler::addPseudoClassType):
+        Added unoptimized pseudoclass cases for window-inactive and fullscreen pseudoclasses.
+        Explicitly listed uncompiled pseudoclasses for future work instead of using a default.
+
 2014-07-23  Brent Fulgham  <bfulg...@apple.com>
 
         [Win] Use NO_RETURN_DUE_TO_CRASH on Windows.

Modified: trunk/Source/WebCore/css/SelectorChecker.cpp (171485 => 171486)


--- trunk/Source/WebCore/css/SelectorChecker.cpp	2014-07-23 20:18:47 UTC (rev 171485)
+++ trunk/Source/WebCore/css/SelectorChecker.cpp	2014-07-23 20:19:37 UTC (rev 171486)
@@ -32,7 +32,6 @@
 #include "CSSSelectorList.h"
 #include "Document.h"
 #include "ElementTraversal.h"
-#include "FocusController.h"
 #include "Frame.h"
 #include "FrameSelection.h"
 #include "HTMLAnchorElement.h"
@@ -481,9 +480,6 @@
             // CSS scrollbars match a specific subset of pseudo classes, and they have specialized rules for each
             // (since there are no elements involved).
             return checkScrollbarPseudoClass(context, &element->document(), selector);
-        } else if (context.hasSelectionPseudo) {
-            if (selector->pseudoClassType() == CSSSelector::PseudoClassWindowInactive)
-                return !element->document().page()->focusController().isActive();
         }
 
         // Normal element pseudo class checking.
@@ -745,17 +741,11 @@
         case CSSSelector::PseudoClassFullScreen:
             return matchesFullScreenPseudoClass(element);
         case CSSSelector::PseudoClassAnimatingFullScreenTransition:
-            if (element != element->document().webkitCurrentFullScreenElement())
-                return false;
-            return element->document().isAnimatingFullScreen();
+            return matchesFullScreenAnimatingFullScreenTransitionPseudoClass(element);
         case CSSSelector::PseudoClassFullScreenAncestor:
-            return element->containsFullScreenElement();
+            return matchesFullScreenAncestorPseudoClass(element);
         case CSSSelector::PseudoClassFullScreenDocument:
-            // While a Document is in the fullscreen state, the 'full-screen-document' pseudoclass applies
-            // to all elements of that Document.
-            if (!element->document().webkitIsFullScreen())
-                return false;
-            return true;
+            return matchesFullScreenDocumentPseudoClass(element);
 #endif
         case CSSSelector::PseudoClassInRange:
             return isInRange(element);
@@ -777,7 +767,7 @@
             }
 
         case CSSSelector::PseudoClassWindowInactive:
-            return !element->document().page()->focusController().isActive();
+            return isWindowInactive(element);
 
         case CSSSelector::PseudoClassHorizontal:
         case CSSSelector::PseudoClassVertical:

Modified: trunk/Source/WebCore/css/SelectorCheckerTestFunctions.h (171485 => 171486)


--- trunk/Source/WebCore/css/SelectorCheckerTestFunctions.h	2014-07-23 20:18:47 UTC (rev 171485)
+++ trunk/Source/WebCore/css/SelectorCheckerTestFunctions.h	2014-07-23 20:19:37 UTC (rev 171486)
@@ -26,6 +26,7 @@
 #ifndef SelectorCheckerTestFunctions_h
 #define SelectorCheckerTestFunctions_h
 
+#include "FocusController.h"
 #include "HTMLInputElement.h"
 #include "HTMLOptionElement.h"
 #include <wtf/Compiler.h>
@@ -111,6 +112,11 @@
     return element->willValidate() && element->isValidFormControlElement();
 }
 
+ALWAYS_INLINE bool isWindowInactive(const Element* element)
+{
+    return !element->document().page()->focusController().isActive();
+}
+    
 inline bool matchesLangPseudoClass(const Element* element, AtomicStringImpl* filter)
 {
     AtomicString value;
@@ -163,6 +169,27 @@
         return false;
     return element == element->document().webkitCurrentFullScreenElement();
 }
+
+ALWAYS_INLINE bool matchesFullScreenAnimatingFullScreenTransitionPseudoClass(const Element* element)
+{
+    if (element != element->document().webkitCurrentFullScreenElement())
+        return false;
+    return element->document().isAnimatingFullScreen();
+}
+
+ALWAYS_INLINE bool matchesFullScreenAncestorPseudoClass(const Element* element)
+{
+    return element->containsFullScreenElement();
+}
+
+ALWAYS_INLINE bool matchesFullScreenDocumentPseudoClass(const Element* element)
+{
+    // While a Document is in the fullscreen state, the 'full-screen-document' pseudoclass applies
+    // to all elements of that Document.
+    if (!element->document().webkitIsFullScreen())
+        return false;
+    return true;
+}
 #endif
 
 #if ENABLE(VIDEO_TRACK)

Modified: trunk/Source/WebCore/cssjit/SelectorCompiler.cpp (171485 => 171486)


--- trunk/Source/WebCore/cssjit/SelectorCompiler.cpp	2014-07-23 20:18:47 UTC (rev 171485)
+++ trunk/Source/WebCore/cssjit/SelectorCompiler.cpp	2014-07-23 20:19:37 UTC (rev 171486)
@@ -396,10 +396,23 @@
     case CSSSelector::PseudoClassValid:
         fragment.unoptimizedPseudoClasses.append(JSC::FunctionPtr(isValid));
         return FunctionType::SimpleSelectorChecker;
+    case CSSSelector::PseudoClassWindowInactive:
+        fragment.unoptimizedPseudoClasses.append(JSC::FunctionPtr(isWindowInactive));
+        return FunctionType::SimpleSelectorChecker;
+            
 #if ENABLE(FULLSCREEN_API)
     case CSSSelector::PseudoClassFullScreen:
         fragment.unoptimizedPseudoClasses.append(JSC::FunctionPtr(matchesFullScreenPseudoClass));
         return FunctionType::SimpleSelectorChecker;
+    case CSSSelector::PseudoClassFullScreenDocument:
+        fragment.unoptimizedPseudoClasses.append(JSC::FunctionPtr(matchesFullScreenDocumentPseudoClass));
+        return FunctionType::SimpleSelectorChecker;
+    case CSSSelector::PseudoClassFullScreenAncestor:
+        fragment.unoptimizedPseudoClasses.append(JSC::FunctionPtr(matchesFullScreenAncestorPseudoClass));
+        return FunctionType::SimpleSelectorChecker;
+    case CSSSelector::PseudoClassAnimatingFullScreenTransition:
+        fragment.unoptimizedPseudoClasses.append(JSC::FunctionPtr(matchesFullScreenAnimatingFullScreenTransitionPseudoClass));
+        return FunctionType::SimpleSelectorChecker;
 #endif
 #if ENABLE(VIDEO_TRACK)
     case CSSSelector::PseudoClassFuture:
@@ -410,6 +423,30 @@
         return FunctionType::SimpleSelectorChecker;
 #endif
 
+    // FIXME: Compile these pseudoclasses, too!
+    case CSSSelector::PseudoClassEmpty:
+    case CSSSelector::PseudoClassFirstOfType:
+    case CSSSelector::PseudoClassLastOfType:
+    case CSSSelector::PseudoClassOnlyOfType:
+    case CSSSelector::PseudoClassNthOfType:
+    case CSSSelector::PseudoClassNthLastChild:
+    case CSSSelector::PseudoClassNthLastOfType:
+    case CSSSelector::PseudoClassVisited:
+    case CSSSelector::PseudoClassDrag:
+    case CSSSelector::PseudoClassFullPageMedia:
+    case CSSSelector::PseudoClassScope:
+    case CSSSelector::PseudoClassCornerPresent:
+    case CSSSelector::PseudoClassDecrement:
+    case CSSSelector::PseudoClassIncrement:
+    case CSSSelector::PseudoClassHorizontal:
+    case CSSSelector::PseudoClassVertical:
+    case CSSSelector::PseudoClassStart:
+    case CSSSelector::PseudoClassEnd:
+    case CSSSelector::PseudoClassDoubleButton:
+    case CSSSelector::PseudoClassSingleButton:
+    case CSSSelector::PseudoClassNoButton:
+        return FunctionType::CannotCompile;
+
     // Optimized pseudo selectors.
     case CSSSelector::PseudoClassAnyLink:
         fragment.pseudoClasses.add(CSSSelector::PseudoClassLink);
@@ -533,10 +570,13 @@
             }
             return FunctionType::SimpleSelectorChecker;
         }
-
-    default:
-        break;
+            
+    case CSSSelector::PseudoClassUnknown:
+        ASSERT_NOT_REACHED();
+        return FunctionType::CannotMatchAnything;
     }
+    
+    ASSERT_NOT_REACHED();
     return FunctionType::CannotCompile;
 }
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to