Changeset 171486 in webkit


Ignore:
Timestamp:
Jul 23, 2014 1:19:37 PM (10 years ago)
Author:
achristensen@apple.com
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.

Location:
trunk/Source/WebCore
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r171482 r171486  
     12014-07-23  Alex Christensen  <achristensen@webkit.org>
     2
     3        Compile window-inactive and fullscreen pseudoclasses in css selectors.
     4        https://bugs.webkit.org/show_bug.cgi?id=135200
     5
     6        Reviewed by Benjamin Poulain.
     7
     8        * css/SelectorChecker.cpp:
     9        (WebCore::SelectorChecker::checkOne):
     10        Removed the check of context.hasSelectionPseudo for a window-inactive pseudoclass.
     11        Moved logic to SelectorCheckerTestFunctions.h to share with the selector compiler.
     12        * css/SelectorCheckerTestFunctions.h:
     13        (WebCore::isWindowInactive):
     14        (WebCore::matchesFullScreenAnimatingFullScreenTransitionPseudoClass):
     15        (WebCore::matchesFullScreenAncestorPseudoClass):
     16        (WebCore::matchesFullScreenDocumentPseudoClass):
     17        Added from SelectorChecker.cpp.
     18        * cssjit/SelectorCompiler.cpp:
     19        (WebCore::SelectorCompiler::addPseudoClassType):
     20        Added unoptimized pseudoclass cases for window-inactive and fullscreen pseudoclasses.
     21        Explicitly listed uncompiled pseudoclasses for future work instead of using a default.
     22
    1232014-07-23  Brent Fulgham  <bfulgham@apple.com>
    224
  • trunk/Source/WebCore/css/SelectorChecker.cpp

    r171378 r171486  
    3333#include "Document.h"
    3434#include "ElementTraversal.h"
    35 #include "FocusController.h"
    3635#include "Frame.h"
    3736#include "FrameSelection.h"
     
    482481            // (since there are no elements involved).
    483482            return checkScrollbarPseudoClass(context, &element->document(), selector);
    484         } else if (context.hasSelectionPseudo) {
    485             if (selector->pseudoClassType() == CSSSelector::PseudoClassWindowInactive)
    486                 return !element->document().page()->focusController().isActive();
    487483        }
    488484
     
    746742            return matchesFullScreenPseudoClass(element);
    747743        case CSSSelector::PseudoClassAnimatingFullScreenTransition:
    748             if (element != element->document().webkitCurrentFullScreenElement())
    749                 return false;
    750             return element->document().isAnimatingFullScreen();
     744            return matchesFullScreenAnimatingFullScreenTransitionPseudoClass(element);
    751745        case CSSSelector::PseudoClassFullScreenAncestor:
    752             return element->containsFullScreenElement();
     746            return matchesFullScreenAncestorPseudoClass(element);
    753747        case CSSSelector::PseudoClassFullScreenDocument:
    754             // While a Document is in the fullscreen state, the 'full-screen-document' pseudoclass applies
    755             // to all elements of that Document.
    756             if (!element->document().webkitIsFullScreen())
    757                 return false;
    758             return true;
     748            return matchesFullScreenDocumentPseudoClass(element);
    759749#endif
    760750        case CSSSelector::PseudoClassInRange:
     
    778768
    779769        case CSSSelector::PseudoClassWindowInactive:
    780             return !element->document().page()->focusController().isActive();
     770            return isWindowInactive(element);
    781771
    782772        case CSSSelector::PseudoClassHorizontal:
  • trunk/Source/WebCore/css/SelectorCheckerTestFunctions.h

    r170822 r171486  
    2727#define SelectorCheckerTestFunctions_h
    2828
     29#include "FocusController.h"
    2930#include "HTMLInputElement.h"
    3031#include "HTMLOptionElement.h"
     
    112113}
    113114
     115ALWAYS_INLINE bool isWindowInactive(const Element* element)
     116{
     117    return !element->document().page()->focusController().isActive();
     118}
     119   
    114120inline bool matchesLangPseudoClass(const Element* element, AtomicStringImpl* filter)
    115121{
     
    164170    return element == element->document().webkitCurrentFullScreenElement();
    165171}
     172
     173ALWAYS_INLINE bool matchesFullScreenAnimatingFullScreenTransitionPseudoClass(const Element* element)
     174{
     175    if (element != element->document().webkitCurrentFullScreenElement())
     176        return false;
     177    return element->document().isAnimatingFullScreen();
     178}
     179
     180ALWAYS_INLINE bool matchesFullScreenAncestorPseudoClass(const Element* element)
     181{
     182    return element->containsFullScreenElement();
     183}
     184
     185ALWAYS_INLINE bool matchesFullScreenDocumentPseudoClass(const Element* element)
     186{
     187    // While a Document is in the fullscreen state, the 'full-screen-document' pseudoclass applies
     188    // to all elements of that Document.
     189    if (!element->document().webkitIsFullScreen())
     190        return false;
     191    return true;
     192}
    166193#endif
    167194
  • trunk/Source/WebCore/cssjit/SelectorCompiler.cpp

    r171177 r171486  
    397397        fragment.unoptimizedPseudoClasses.append(JSC::FunctionPtr(isValid));
    398398        return FunctionType::SimpleSelectorChecker;
     399    case CSSSelector::PseudoClassWindowInactive:
     400        fragment.unoptimizedPseudoClasses.append(JSC::FunctionPtr(isWindowInactive));
     401        return FunctionType::SimpleSelectorChecker;
     402           
    399403#if ENABLE(FULLSCREEN_API)
    400404    case CSSSelector::PseudoClassFullScreen:
    401405        fragment.unoptimizedPseudoClasses.append(JSC::FunctionPtr(matchesFullScreenPseudoClass));
     406        return FunctionType::SimpleSelectorChecker;
     407    case CSSSelector::PseudoClassFullScreenDocument:
     408        fragment.unoptimizedPseudoClasses.append(JSC::FunctionPtr(matchesFullScreenDocumentPseudoClass));
     409        return FunctionType::SimpleSelectorChecker;
     410    case CSSSelector::PseudoClassFullScreenAncestor:
     411        fragment.unoptimizedPseudoClasses.append(JSC::FunctionPtr(matchesFullScreenAncestorPseudoClass));
     412        return FunctionType::SimpleSelectorChecker;
     413    case CSSSelector::PseudoClassAnimatingFullScreenTransition:
     414        fragment.unoptimizedPseudoClasses.append(JSC::FunctionPtr(matchesFullScreenAnimatingFullScreenTransitionPseudoClass));
    402415        return FunctionType::SimpleSelectorChecker;
    403416#endif
     
    410423        return FunctionType::SimpleSelectorChecker;
    411424#endif
     425
     426    // FIXME: Compile these pseudoclasses, too!
     427    case CSSSelector::PseudoClassEmpty:
     428    case CSSSelector::PseudoClassFirstOfType:
     429    case CSSSelector::PseudoClassLastOfType:
     430    case CSSSelector::PseudoClassOnlyOfType:
     431    case CSSSelector::PseudoClassNthOfType:
     432    case CSSSelector::PseudoClassNthLastChild:
     433    case CSSSelector::PseudoClassNthLastOfType:
     434    case CSSSelector::PseudoClassVisited:
     435    case CSSSelector::PseudoClassDrag:
     436    case CSSSelector::PseudoClassFullPageMedia:
     437    case CSSSelector::PseudoClassScope:
     438    case CSSSelector::PseudoClassCornerPresent:
     439    case CSSSelector::PseudoClassDecrement:
     440    case CSSSelector::PseudoClassIncrement:
     441    case CSSSelector::PseudoClassHorizontal:
     442    case CSSSelector::PseudoClassVertical:
     443    case CSSSelector::PseudoClassStart:
     444    case CSSSelector::PseudoClassEnd:
     445    case CSSSelector::PseudoClassDoubleButton:
     446    case CSSSelector::PseudoClassSingleButton:
     447    case CSSSelector::PseudoClassNoButton:
     448        return FunctionType::CannotCompile;
    412449
    413450    // Optimized pseudo selectors.
     
    534571            return FunctionType::SimpleSelectorChecker;
    535572        }
    536 
    537     default:
    538         break;
    539     }
     573           
     574    case CSSSelector::PseudoClassUnknown:
     575        ASSERT_NOT_REACHED();
     576        return FunctionType::CannotMatchAnything;
     577    }
     578   
     579    ASSERT_NOT_REACHED();
    540580    return FunctionType::CannotCompile;
    541581}
Note: See TracChangeset for help on using the changeset viewer.