Changeset 71244 in webkit


Ignore:
Timestamp:
Nov 3, 2010 10:02:40 AM (13 years ago)
Author:
Dimitri Glazkov
Message:

2010-11-03 Dimitri Glazkov <Dimitri Glazkov>

Reviewed by Darin Adler.

Implement shadow DOM-aware event targeting and introduce EventContext to track the context of each event dispatch.
https://bugs.webkit.org/show_bug.cgi?id=46015

Tuned shadow-boundary-crossing.html to better reflect its point: the event should indeed fire (it used to be swallowed),
but its target should be a non-shadow node.

Tweaked audio-delete-while-slider-thumb-clicked.html to actually click on
the scrubber thumb (it was off by 2 pixels).

  • fast/events/shadow-boundary-crossing.html: Modified the test.
  • media/audio-delete-while-slider-thumb-clicked.html : Ditto.

2010-11-03 Dimitri Glazkov <Dimitri Glazkov>

Reviewed by Darin Adler.

Implement shadow DOM-aware event targeting and introduce EventContext to track the context of each event dispatch.
https://bugs.webkit.org/show_bug.cgi?id=46015

This patch adds the notion of EventContext (and a very similar-acting WindowEventContext, specifically
for DOMWindow), an abstraction that carries information around dispatching an event for any given Node.

This abstraction is necessary to ensure that events, fired from shadow DOM nodes are properly retargeted to
appear as if they are coming from their host, thus never exposing the shadow DOM nodes to the world outside.

  • Android.mk: Added EventContext, WindowEventContext files.
  • CMakeLists.txt: Ditto.
  • GNUmakefile.am: Ditto.
  • WebCore.gypi: Ditto.
  • WebCore.pro: Ditto.
  • WebCore.xcodeproj/project.pbxproj: Ditto.
  • WebCore.vcproj/WebCore.vcproj: Ditto.
  • dom/ContainerNode.cpp: (WebCore::notifyChildInserted): Changed to be shadow DOM-aware.
  • dom/EventContext.cpp: Added.
  • dom/EventContext.h: Added.
  • dom/Node.cpp: (WebCore::Node::markAncestorsWithChildNeedsStyleRecalc): Changed to be shadow DOM-aware. (WebCore::Node::createRendererIfNeeded): Ditto. (WebCore::Node::parentOrHostNode): Added new helper method. (WebCore::Node::enclosingLinkEventParentOrSelf): Changed to be shadow DOM-aware. (WebCore::eventTargetRespectingSVGTargetRules): Collapsed two helper methods into one. (WebCore::Node::eventAncestors): Refactored to collect a vector of EventContexts. (WebCore::Node::topEventContext): Added. (WebCore::eventHasListeners): Changed to use EventContexts. (WebCore::Node::dispatchGenericEvent): Ditto.
  • dom/Node.h: Removed eventParentNode that's no longer needed, added parentOrHostNode decl,

and changed signature of eventAncestors to use EventContexts.

  • dom/Text.cpp: (WebCore::Text::createRenderer): Changed to be shadow DOM-aware.
  • inspector/InspectorDOMAgent.cpp: (WebCore::InspectorDOMAgent::getEventListenersForNode): Changed to use EventContexts.
  • page/EventHandler.cpp: (WebCore::EventHandler::updateMouseEventTargetNode): Removed code that's no longer necessary.
  • rendering/ShadowElement.h: Made m_shadowParent a RefPtr to avoid stale references when parent is deleted.
  • svg/SVGElement.cpp: Removed eventParentNode that's no longer needed.
  • svg/SVGElement.h: Ditto.
  • dom/WindowEventContext.cpp: Added.
  • dom/WindowEventContext.h: Added.
Location:
trunk
Files:
4 added
22 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r71240 r71244  
     12010-11-03  Dimitri Glazkov  <dglazkov@chromium.org>
     2
     3        Reviewed by Darin Adler.
     4
     5        Implement shadow DOM-aware event targeting and introduce EventContext to track the context of each event dispatch.
     6        https://bugs.webkit.org/show_bug.cgi?id=46015
     7
     8        Tuned shadow-boundary-crossing.html to better reflect its point: the event should indeed fire (it used to be swallowed),
     9        but its target should be a non-shadow node.
     10
     11        Tweaked audio-delete-while-slider-thumb-clicked.html to actually click on
     12        the scrubber thumb (it was off by 2 pixels).
     13
     14        * fast/events/shadow-boundary-crossing.html: Modified the test.
     15        * media/audio-delete-while-slider-thumb-clicked.html : Ditto.
     16
    1172010-11-03  Nikolas Zimmermann  <nzimmermann@rim.com>
    218
  • trunk/LayoutTests/fast/events/shadow-boundary-crossing.html

    r70985 r71244  
    33    <title></title>
    44    <script type="text/javascript">
    5         var fired = false;
     5        var success;
     6        var target;
    67
    78        function selectStart(event)
    89        {
    9             fired = true;
     10            success = event.target == target;
    1011        }
    1112
     
    1617            layoutTestController.dumpAsText();
    1718
    18             var target = document.getElementById("target");
     19            target = document.getElementById("target");
    1920            var x = target.offsetLeft + target.offsetWidth / 2;
    2021            var y = target.offsetTop + target.offsetHeight / 2;
     
    2425            eventSender.mouseUp();
    2526
    26             document.getElementById("result").innerText = fired ? "FAIL" : "PASS";
     27            document.getElementById("result").innerText = !success ? "FAIL" : "PASS";
    2728        }
    2829
  • trunk/LayoutTests/media/audio-delete-while-slider-thumb-clicked.html

    r63684 r71244  
    5151                var audio = document.getElementById('audio');
    5252
    53                 var middle = audio.offsetLeft + (audio.offsetWidth / 2);
    54                 var bottom = audio.offsetTop + audio.offsetHeight;
     53                var center = audio.offsetLeft + (audio.offsetWidth / 2);
     54                var middle = audio.offsetTop + (audio.offsetHeight / 2);
    5555               
    56                 var x = middle + 16 + 16 + 8;
    57                 var y = bottom - 8;
     56                var x = center + 16 + 16 + 8;
     57                var y = middle;
    5858
    5959                // drag slider, leave the mouse down
  • trunk/WebCore/Android.mk

    r70985 r71244  
    133133        dom/ErrorEvent.cpp \
    134134        dom/Event.cpp \
     135        dom/EventContext.cpp \
    135136        dom/EventNames.cpp \
    136137        dom/EventTarget.cpp \
     
    193194        dom/WebKitTransitionEvent.cpp \
    194195        dom/WheelEvent.cpp \
     196        dom/WindowEventContext.cpp \
    195197        dom/XMLDocumentParser.cpp \
    196198        dom/XMLDocumentParserLibxml2.cpp \
  • trunk/WebCore/CMakeLists.txt

    r71035 r71244  
    825825    dom/ErrorEvent.cpp
    826826    dom/Event.cpp
     827    dom/EventContext.cpp
    827828    dom/EventNames.cpp
    828829    dom/EventTarget.cpp
     
    882883    dom/WebKitTransitionEvent.cpp
    883884    dom/WheelEvent.cpp
     885    dom/WindowEventContext.cpp
    884886    dom/XMLDocumentParser.cpp
    885887    dom/XMLDocumentParserLibxml2.cpp
  • trunk/WebCore/ChangeLog

    r71242 r71244  
     12010-11-03  Dimitri Glazkov  <dglazkov@chromium.org>
     2
     3        Reviewed by Darin Adler.
     4
     5        Implement shadow DOM-aware event targeting and introduce EventContext to track the context of each event dispatch.
     6        https://bugs.webkit.org/show_bug.cgi?id=46015
     7
     8        This patch adds the notion of EventContext (and a very similar-acting WindowEventContext, specifically
     9        for DOMWindow), an abstraction that carries information around dispatching an event for any given Node.
     10
     11        This abstraction is necessary to ensure that events, fired from shadow DOM nodes are properly retargeted to
     12        appear as if they are coming from their host, thus never exposing the shadow DOM nodes to the world outside.
     13
     14        * Android.mk: Added EventContext, WindowEventContext files.
     15        * CMakeLists.txt: Ditto.
     16        * GNUmakefile.am: Ditto.
     17        * WebCore.gypi: Ditto.
     18        * WebCore.pro: Ditto.
     19        * WebCore.xcodeproj/project.pbxproj: Ditto.
     20        * WebCore.vcproj/WebCore.vcproj: Ditto.
     21        * dom/ContainerNode.cpp:
     22        (WebCore::notifyChildInserted): Changed to be shadow DOM-aware.
     23        * dom/EventContext.cpp: Added.
     24        * dom/EventContext.h: Added.
     25        * dom/Node.cpp:
     26        (WebCore::Node::markAncestorsWithChildNeedsStyleRecalc): Changed to be shadow DOM-aware.
     27        (WebCore::Node::createRendererIfNeeded): Ditto.
     28        (WebCore::Node::parentOrHostNode): Added new helper method.
     29        (WebCore::Node::enclosingLinkEventParentOrSelf): Changed to be shadow DOM-aware.
     30        (WebCore::eventTargetRespectingSVGTargetRules): Collapsed two helper methods into one.
     31        (WebCore::Node::eventAncestors): Refactored to collect a vector of EventContexts.
     32        (WebCore::Node::topEventContext): Added.
     33        (WebCore::eventHasListeners): Changed to use EventContexts.
     34        (WebCore::Node::dispatchGenericEvent): Ditto.
     35        * dom/Node.h: Removed eventParentNode that's no longer needed, added parentOrHostNode decl,
     36            and changed signature of eventAncestors to use EventContexts.
     37        * dom/Text.cpp:
     38        (WebCore::Text::createRenderer): Changed to be shadow DOM-aware.
     39        * inspector/InspectorDOMAgent.cpp:
     40        (WebCore::InspectorDOMAgent::getEventListenersForNode): Changed to use EventContexts.
     41        * page/EventHandler.cpp:
     42        (WebCore::EventHandler::updateMouseEventTargetNode): Removed code that's no longer necessary.
     43        * rendering/ShadowElement.h: Made m_shadowParent a RefPtr to avoid stale references when parent
     44        is deleted.
     45        * svg/SVGElement.cpp: Removed eventParentNode that's no longer needed.
     46        * svg/SVGElement.h: Ditto.
     47        * dom/WindowEventContext.cpp: Added.
     48        * dom/WindowEventContext.h: Added.
     49
    1502010-11-02  Mikhail Naganov  <mnaganov@chromium.org>
    251
  • trunk/WebCore/GNUmakefile.am

    r71227 r71244  
    11331133        WebCore/dom/ErrorEvent.h \
    11341134        WebCore/dom/Event.cpp \
     1135        WebCore/dom/Event.h \
     1136        WebCore/dom/EventContext.cpp \
     1137        WebCore/dom/EventContext.h \
    11351138        WebCore/dom/EventException.h \
    1136         WebCore/dom/Event.h \
    11371139        WebCore/dom/EventListener.h \
    11381140        WebCore/dom/EventNames.cpp \
     
    12621264        WebCore/dom/WheelEvent.cpp \
    12631265        WebCore/dom/WheelEvent.h \
     1266        WebCore/dom/WindowEventContext.cpp \
     1267        WebCore/dom/WindowEventContext.h \
    12641268        WebCore/dom/XMLDocumentParser.cpp \
    12651269        WebCore/dom/XMLDocumentParser.h \
  • trunk/WebCore/WebCore.gypi

    r71227 r71244  
    12051205            'dom/Event.cpp',
    12061206            'dom/Event.h',
     1207            'dom/EventContext.cpp',
     1208            'dom/EventContext.h',
    12071209            'dom/EventException.h',
    12081210            'dom/EventListener.h',
     
    13401342            'dom/WheelEvent.cpp',
    13411343            'dom/WheelEvent.h',
     1344            'dom/WindowEventContext.cpp',
     1345            'dom/WindowEventContext.h',
    13421346            'dom/XMLDocumentParser.cpp',
    13431347            'dom/XMLDocumentParser.h',
  • trunk/WebCore/WebCore.pro

    r71227 r71244  
    714714    dom/ErrorEvent.cpp \
    715715    dom/Event.cpp \
     716    dom/EventContext.cpp \
    716717    dom/EventNames.cpp \
    717718    dom/EventTarget.cpp \
     
    774775    dom/WebKitTransitionEvent.cpp \
    775776    dom/WheelEvent.cpp \
     777    dom/WindowEventContext.cpp \
    776778    dom/XMLDocumentParser.cpp \
    777779    dom/XMLDocumentParserQt.cpp \
  • trunk/WebCore/WebCore.vcproj/WebCore.vcproj

    r71227 r71244  
    4225342253                        </File>
    4225442254                        <File
     42255                                RelativePath="..\dom\EventContext.cpp"
     42256                                >
     42257                                <FileConfiguration
     42258                                        Name="Debug|Win32"
     42259                                        ExcludedFromBuild="true"
     42260                                        >
     42261                                        <Tool
     42262                                                Name="VCCLCompilerTool"
     42263                                        />
     42264                                </FileConfiguration>
     42265                                <FileConfiguration
     42266                                        Name="Release|Win32"
     42267                                        ExcludedFromBuild="true"
     42268                                        >
     42269                                        <Tool
     42270                                                Name="VCCLCompilerTool"
     42271                                        />
     42272                                </FileConfiguration>
     42273                                <FileConfiguration
     42274                                        Name="Debug_Internal|Win32"
     42275                                        ExcludedFromBuild="true"
     42276                                        >
     42277                                        <Tool
     42278                                                Name="VCCLCompilerTool"
     42279                                        />
     42280                                </FileConfiguration>
     42281                                <FileConfiguration
     42282                                        Name="Debug_Cairo|Win32"
     42283                                        ExcludedFromBuild="true"
     42284                                        >
     42285                                        <Tool
     42286                                                Name="VCCLCompilerTool"
     42287                                        />
     42288                                </FileConfiguration>
     42289                                <FileConfiguration
     42290                                        Name="Release_Cairo|Win32"
     42291                                        ExcludedFromBuild="true"
     42292                                        >
     42293                                        <Tool
     42294                                                Name="VCCLCompilerTool"
     42295                                        />
     42296                                </FileConfiguration>
     42297                                <FileConfiguration
     42298                                        Name="Debug_All|Win32"
     42299                                        ExcludedFromBuild="true"
     42300                                        >
     42301                                        <Tool
     42302                                                Name="VCCLCompilerTool"
     42303                                        />
     42304                                </FileConfiguration>
     42305                        </File>
     42306                        <File
     42307                                RelativePath="..\dom\EventContext.h"
     42308                                >
     42309                        </File>
     42310                        <File
    4225542311                                RelativePath="..\dom\EventException.h"
    4225642312                                >
     
    4533845394                        <File
    4533945395                                RelativePath="..\dom\WheelEvent.h"
     45396                                >
     45397                        </File>
     45398                        <File
     45399                                RelativePath="..\dom\WindowEventContext.cpp"
     45400                                >
     45401                                <FileConfiguration
     45402                                        Name="Debug|Win32"
     45403                                        ExcludedFromBuild="true"
     45404                                        >
     45405                                        <Tool
     45406                                                Name="VCCLCompilerTool"
     45407                                        />
     45408                                </FileConfiguration>
     45409                                <FileConfiguration
     45410                                        Name="Release|Win32"
     45411                                        ExcludedFromBuild="true"
     45412                                        >
     45413                                        <Tool
     45414                                                Name="VCCLCompilerTool"
     45415                                        />
     45416                                </FileConfiguration>
     45417                                <FileConfiguration
     45418                                        Name="Debug_Internal|Win32"
     45419                                        ExcludedFromBuild="true"
     45420                                        >
     45421                                        <Tool
     45422                                                Name="VCCLCompilerTool"
     45423                                        />
     45424                                </FileConfiguration>
     45425                                <FileConfiguration
     45426                                        Name="Debug_Cairo|Win32"
     45427                                        ExcludedFromBuild="true"
     45428                                        >
     45429                                        <Tool
     45430                                                Name="VCCLCompilerTool"
     45431                                        />
     45432                                </FileConfiguration>
     45433                                <FileConfiguration
     45434                                        Name="Release_Cairo|Win32"
     45435                                        ExcludedFromBuild="true"
     45436                                        >
     45437                                        <Tool
     45438                                                Name="VCCLCompilerTool"
     45439                                        />
     45440                                </FileConfiguration>
     45441                                <FileConfiguration
     45442                                        Name="Debug_All|Win32"
     45443                                        ExcludedFromBuild="true"
     45444                                        >
     45445                                        <Tool
     45446                                                Name="VCCLCompilerTool"
     45447                                        />
     45448                                </FileConfiguration>
     45449                        </File>
     45450                        <File
     45451                                RelativePath="..\dom\WindowEventContext.h"
    4534045452                                >
    4534145453                        </File>
  • trunk/WebCore/WebCore.xcodeproj/project.pbxproj

    r71227 r71244  
    895895                411046410FA222A600BA436A /* ScriptEventListener.h in Headers */ = {isa = PBXBuildFile; fileRef = 4110463F0FA222A600BA436A /* ScriptEventListener.h */; };
    896896                411046420FA222A600BA436A /* ScriptEventListener.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 411046400FA222A600BA436A /* ScriptEventListener.cpp */; };
     897                4123E569127B3041000FEEA7 /* WindowEventContext.h in Headers */ = {isa = PBXBuildFile; fileRef = 4123E567127B3041000FEEA7 /* WindowEventContext.h */; };
     898                4123E56A127B3041000FEEA7 /* WindowEventContext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4123E568127B3041000FEEA7 /* WindowEventContext.cpp */; };
    897899                4127D5370F8AAB1D00E424F5 /* ScriptState.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4127D5360F8AAB1D00E424F5 /* ScriptState.cpp */; };
     900                4138D3351244054800323D33 /* EventContext.h in Headers */ = {isa = PBXBuildFile; fileRef = 4138D3331244054800323D33 /* EventContext.h */; };
     901                4138D3361244054800323D33 /* EventContext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4138D3341244054800323D33 /* EventContext.cpp */; };
    898902                4162A450101145AE00DFF3ED /* DedicatedWorkerContext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4162A44D101145AE00DFF3ED /* DedicatedWorkerContext.cpp */; };
    899903                4162A451101145AE00DFF3ED /* DedicatedWorkerContext.h in Headers */ = {isa = PBXBuildFile; fileRef = 4162A44E101145AE00DFF3ED /* DedicatedWorkerContext.h */; };
     
    69626966                4110463F0FA222A600BA436A /* ScriptEventListener.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScriptEventListener.h; sourceTree = "<group>"; };
    69636967                411046400FA222A600BA436A /* ScriptEventListener.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ScriptEventListener.cpp; sourceTree = "<group>"; };
     6968                4123E567127B3041000FEEA7 /* WindowEventContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WindowEventContext.h; sourceTree = "<group>"; };
     6969                4123E568127B3041000FEEA7 /* WindowEventContext.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WindowEventContext.cpp; sourceTree = "<group>"; };
    69646970                4127D5360F8AAB1D00E424F5 /* ScriptState.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ScriptState.cpp; sourceTree = "<group>"; };
     6971                4138D3331244054800323D33 /* EventContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EventContext.h; sourceTree = "<group>"; };
     6972                4138D3341244054800323D33 /* EventContext.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EventContext.cpp; sourceTree = "<group>"; };
    69656973                4162A44D101145AE00DFF3ED /* DedicatedWorkerContext.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DedicatedWorkerContext.cpp; path = workers/DedicatedWorkerContext.cpp; sourceTree = "<group>"; };
    69666974                4162A44E101145AE00DFF3ED /* DedicatedWorkerContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DedicatedWorkerContext.h; path = workers/DedicatedWorkerContext.h; sourceTree = "<group>"; };
     
    1817318181                                85031B2C0A44EFC700F992E0 /* Event.h */,
    1817418182                                14E836D209F8512000B85AE4 /* Event.idl */,
     18183                                4138D3341244054800323D33 /* EventContext.cpp */,
     18184                                4138D3331244054800323D33 /* EventContext.h */,
    1817518185                                BC60D9090D2A17CE00B9918F /* EventException.h */,
    1817618186                                BC60D90A0D2A17CE00B9918F /* EventException.idl */,
     
    1833318343                                85031B3B0A44EFC700F992E0 /* WheelEvent.h */,
    1833418344                                93EEC1F709C2877700C515D1 /* WheelEvent.idl */,
     18345                                4123E568127B3041000FEEA7 /* WindowEventContext.cpp */,
     18346                                4123E567127B3041000FEEA7 /* WindowEventContext.h */,
    1833518347                                F523D30902DE4476018635CA /* XMLDocumentParser.cpp */,
    1833618348                                F523D30A02DE4476018635CA /* XMLDocumentParser.h */,
     
    1949619508                                2ECF7AE210162B5800427DE7 /* ErrorEvent.h in Headers */,
    1949719509                                85031B420A44EFC700F992E0 /* Event.h in Headers */,
     19510                                4138D3351244054800323D33 /* EventContext.h in Headers */,
    1949819511                                BC60D90C0D2A17CE00B9918F /* EventException.h in Headers */,
    1949919512                                93C09A530B064DB3005ABD4D /* EventHandler.h in Headers */,
     
    2116021173                                9380F47409A11AB4001FDB34 /* Widget.h in Headers */,
    2116121174                                939B02EF0EA2DBC400C54570 /* WidthIterator.h in Headers */,
     21175                                4123E569127B3041000FEEA7 /* WindowEventContext.h in Headers */,
    2116221176                                BC8243E90D0CFD7500460C8F /* WindowFeatures.h in Headers */,
    2116321177                                E1E1BF00115FF6FB006F52CA /* WindowsKeyboardCodes.h in Headers */,
     
    2212922143                                2ECF7AE110162B5800427DE7 /* ErrorEvent.cpp in Sources */,
    2213022144                                85031B410A44EFC700F992E0 /* Event.cpp in Sources */,
     22145                                4138D3361244054800323D33 /* EventContext.cpp in Sources */,
    2213122146                                93C09A810B064F00005ABD4D /* EventHandler.cpp in Sources */,
    2213222147                                93C09A7F0B064EEF005ABD4D /* EventHandlerMac.mm in Sources */,
     
    2372823743                                9380F47809A11ACC001FDB34 /* WidgetMac.mm in Sources */,
    2372923744                                939B02EE0EA2DBC400C54570 /* WidthIterator.cpp in Sources */,
     23745                                4123E56A127B3041000FEEA7 /* WindowEventContext.cpp in Sources */,
    2373023746                                BC8243E80D0CFD7500460C8F /* WindowFeatures.cpp in Sources */,
    2373123747                                08203A9F0ED8C35300B8B61A /* WMLAccessElement.cpp in Sources */,
  • trunk/WebCore/dom/ContainerNode.cpp

    r70985 r71244  
    10061006    RefPtr<Document> document = child->document();
    10071007
    1008     if (c->parentNode() && c->parentNode()->inDocument())
     1008    Node* parentOrHostNode = c->parentOrHostNode();
     1009    if (parentOrHostNode && parentOrHostNode->inDocument())
    10091010        c->insertedIntoDocument();
    10101011    else
  • trunk/WebCore/dom/Node.cpp

    r70985 r71244  
    4646#include "Element.h"
    4747#include "Event.h"
     48#include "EventContext.h"
    4849#include "EventException.h"
    4950#include "EventHandler.h"
     
    8182#include "WebKitTransitionEvent.h"
    8283#include "WheelEvent.h"
     84#include "WindowEventContext.h"
    8385#include "XMLNames.h"
    8486#include "htmlediting.h"
     
    735737inline void Node::markAncestorsWithChildNeedsStyleRecalc()
    736738{
    737     for (ContainerNode* p = parentNode(); p && !p->childNeedsStyleRecalc(); p = p->parentNode())
     739    for (ContainerNode* p = parentOrHostNode(); p && !p->childNeedsStyleRecalc(); p = p->parentOrHostNode())
    738740        p->setChildNeedsStyleRecalc();
    739    
     741
    740742    if (document()->childNeedsStyleRecalc())
    741743        document()->scheduleStyleRecalc();
     
    13221324    ASSERT(!renderer());
    13231325   
    1324     ContainerNode* parent = parentNode();   
     1326    ContainerNode* parent = parentOrHostNode();
    13251327    ASSERT(parent);
    13261328   
     
    22402242}
    22412243
    2242 ContainerNode* Node::eventParentNode()
    2243 {
    2244     return parentNode();
    2245 }
    2246 
    22472244Node* Node::enclosingLinkEventParentOrSelf()
    22482245{
    2249     for (Node* node = this; node; node = node->eventParentNode()) {
     2246    for (Node* node = this; node; node = node->parentOrHostNode()) {
    22502247        // For imagemaps, the enclosing link node is the associated area element not the image itself.
    22512248        // So we don't let images be the enclosingLinkNode, even though isLink sometimes returns true
     
    24852482}
    24862483
     2484static inline EventTarget* eventTargetRespectingSVGTargetRules(Node* referenceNode)
     2485{
     2486    ASSERT(referenceNode);
     2487
    24872488#if ENABLE(SVG)
    2488 static inline SVGElementInstance* eventTargetAsSVGElementInstance(Node* referenceNode)
    2489 {
    2490     ASSERT(referenceNode);
    24912489    if (!referenceNode->isSVGElement())
    2492         return 0;
     2490        return referenceNode;
    24932491
    24942492    // Spec: The event handling for the non-exposed tree works as if the referenced element had been textually included
     
    25042502            return instance;
    25052503    }
    2506 
    2507     return 0;
    2508 }
    25092504#endif
    25102505
    2511 static inline EventTarget* eventTargetRespectingSVGTargetRules(Node* referenceNode)
    2512 {
    2513     ASSERT(referenceNode);
     2506    return referenceNode;
     2507}
     2508
     2509void Node::getEventAncestors(Vector<EventContext>& ancestors, EventTarget* originalTarget)
     2510{
     2511    if (!inDocument())
     2512        return;
     2513
     2514    EventTarget* target = originalTarget;
     2515    Node* ancestor = this;
     2516    bool shouldSkipNextAncestor = false;
     2517    while (true) {
     2518        if (ancestor->isShadowNode()) {
     2519            ancestor = ancestor->shadowParentNode();
     2520            if (!shouldSkipNextAncestor)
     2521                target = ancestor;
     2522        } else
     2523            ancestor = ancestor->parentNode();
     2524
     2525        if (!ancestor)
     2526            return;
    25142527
    25152528#if ENABLE(SVG)
    2516     if (SVGElementInstance* instance = eventTargetAsSVGElementInstance(referenceNode)) {
    2517         ASSERT(instance->shadowTreeElement() == referenceNode);
    2518         return instance;
    2519     }
     2529        // Skip SVGShadowTreeRootElement.
     2530        shouldSkipNextAncestor = ancestor->isSVGElement() && ancestor->isShadowNode();
     2531        if (shouldSkipNextAncestor)
     2532            continue;
    25202533#endif
    2521 
    2522     return referenceNode;
    2523 }
    2524 
    2525 void Node::eventAncestors(Vector<RefPtr<ContainerNode> > &ancestors)
    2526 {
    2527     if (inDocument()) {
    2528         for (ContainerNode* ancestor = eventParentNode(); ancestor; ancestor = ancestor->eventParentNode()) {
    2529 #if ENABLE(SVG)
    2530             // Skip <use> shadow tree elements.
    2531             if (ancestor->isSVGElement() && ancestor->isShadowNode())
    2532                 continue;
    2533 #endif
    2534             ancestors.append(ancestor);
    2535         }
     2534        // FIXME: Unroll the extra loop inside eventTargetRespectingSVGTargetRules into this loop.
     2535        ancestors.append(EventContext(ancestor, eventTargetRespectingSVGTargetRules(ancestor), target));
     2536
    25362537    }
    25372538}
     
    25462547    RefPtr<FrameView> view = document()->view();
    25472548    return dispatchGenericEvent(event.release());
     2549}
     2550
     2551static const EventContext* topEventContext(const Vector<EventContext>& ancestors)
     2552{
     2553    return ancestors.isEmpty() ? 0 : &(ancestors.last());
    25482554}
    25492555
     
    25602566    // Be sure to ref all of nodes since event handlers could result in the last reference going away.
    25612567    RefPtr<Node> thisNode(this);
    2562     Vector<RefPtr<ContainerNode> > ancestors;
    2563     eventAncestors(ancestors);
    2564 
    2565     // Set up a pointer to indicate whether / where to dispatch window events.
    2566     // We don't dispatch load events to the window. That quirk was originally
    2567     // added because Mozilla doesn't propagate load events to the window object.
    2568     DOMWindow* targetForWindowEvents = 0;
    2569     if (event->type() != eventNames().loadEvent) {
    2570         Node* topLevelContainer = ancestors.isEmpty() ? this : ancestors.last().get();
    2571         if (topLevelContainer->isDocumentNode())
    2572             targetForWindowEvents = static_cast<Document*>(topLevelContainer)->domWindow();
    2573     }
    2574 
    2575     InspectorInstrumentationCookie cookie = InspectorInstrumentation::willDispatchEvent(document(), *event, targetForWindowEvents, this, ancestors);
     2568    RefPtr<EventTarget> originalTarget = event->target();
     2569    Vector<EventContext> ancestors;
     2570    getEventAncestors(ancestors, originalTarget.get());
     2571
     2572    WindowEventContext windowContext(event.get(), this, topEventContext(ancestors));
     2573
     2574    InspectorInstrumentationCookie cookie = InspectorInstrumentation::willDispatchEvent(document(), *event, windowContext.window(), this, ancestors);
    25762575
    25772576    // Give the target node a chance to do some work before DOM event handlers get a crack.
     
    25832582    event->setEventPhase(Event::CAPTURING_PHASE);
    25842583
    2585     if (targetForWindowEvents) {
    2586         event->setCurrentTarget(targetForWindowEvents);
    2587         targetForWindowEvents->fireEventListeners(event.get());
     2584    if (windowContext.handleLocalEvents(event.get()) && event->propagationStopped())
     2585        goto doneDispatching;
     2586
     2587    for (size_t i = ancestors.size(); i; --i) {
     2588        ancestors[i - 1].handleLocalEvents(event.get());
    25882589        if (event->propagationStopped())
    25892590            goto doneDispatching;
    25902591    }
    2591     for (size_t i = ancestors.size(); i; --i) {
    2592         ContainerNode* ancestor = ancestors[i - 1].get();
    2593         event->setCurrentTarget(eventTargetRespectingSVGTargetRules(ancestor));
    2594         ancestor->handleLocalEvents(event.get());
    2595         if (event->propagationStopped())
    2596             goto doneDispatching;
    2597     }
    25982592
    25992593    event->setEventPhase(Event::AT_TARGET);
    2600 
     2594    event->setTarget(originalTarget.get());
    26012595    event->setCurrentTarget(eventTargetRespectingSVGTargetRules(this));
    26022596    handleLocalEvents(event.get());
     
    26102604        size_t size = ancestors.size();
    26112605        for (size_t i = 0; i < size; ++i) {
    2612             ContainerNode* ancestor = ancestors[i].get();
    2613             event->setCurrentTarget(eventTargetRespectingSVGTargetRules(ancestor));
    2614             ancestor->handleLocalEvents(event.get());
     2606            ancestors[i].handleLocalEvents(event.get());
    26152607            if (event->propagationStopped() || event->cancelBubble())
    26162608                goto doneDispatching;
    26172609        }
    2618         if (targetForWindowEvents) {
    2619             event->setCurrentTarget(targetForWindowEvents);
    2620             targetForWindowEvents->fireEventListeners(event.get());
    2621             if (event->propagationStopped() || event->cancelBubble())
    2622                 goto doneDispatching;
    2623         }
     2610        windowContext.handleLocalEvents(event.get());
    26242611    }
    26252612
    26262613doneDispatching:
     2614    event->setTarget(originalTarget.get());
    26272615    event->setCurrentTarget(0);
    26282616    event->setEventPhase(0);
     
    26452633            size_t size = ancestors.size();
    26462634            for (size_t i = 0; i < size; ++i) {
    2647                 ContainerNode* ancestor = ancestors[i].get();
    2648                 ancestor->defaultEventHandler(event.get());
     2635                ancestors[i].node()->defaultEventHandler(event.get());
    26492636                ASSERT(!event->defaultPrevented());
    26502637                if (event->defaultHandled())
  • trunk/WebCore/dom/Node.h

    r70985 r71244  
    5050class Element;
    5151class Event;
     52class EventContext;
    5253class EventListener;
    5354class FloatPoint;
     
    205206    Node* shadowTreeRootNode();
    206207    bool isInShadowTree();
    207 
    208     // The node's parent for the purpose of event capture and bubbling.
    209     virtual ContainerNode* eventParentNode();
     208    // Node's parent or shadow tree host.
     209    ContainerNode* parentOrHostNode();
    210210
    211211    // Returns the enclosing event parent node (or self) that, when clicked, would trigger a navigation.
     
    213213
    214214    // Node ancestors when concerned about event flow.
    215     // FIXME: Should be named getEventAncestors.
    216     void eventAncestors(Vector<RefPtr<ContainerNode> > &ancestors);
     215    void getEventAncestors(Vector<EventContext>& ancestors, EventTarget*);
    217216
    218217    bool isBlockFlow() const;
     
    694693}
    695694
     695inline ContainerNode* Node::parentOrHostNode()
     696{
     697    if (ContainerNode* parent = parentNode())
     698        return parent;
     699    return shadowParentNode();
     700}
     701
    696702} //namespace
    697703
  • trunk/WebCore/dom/Text.cpp

    r70985 r71244  
    240240RenderObject* Text::createRenderer(RenderArena* arena, RenderStyle*)
    241241{
     242    Node* parentOrHost = parentOrHostNode();
    242243#if ENABLE(SVG)
    243     if (parentNode()->isSVGElement()
     244    if (parentOrHost->isSVGElement()
    244245#if ENABLE(SVG_FOREIGN_OBJECT)
    245         && !parentNode()->hasTagName(SVGNames::foreignObjectTag)
     246        && !parentOrHost->hasTagName(SVGNames::foreignObjectTag)
    246247#endif
    247248    )
  • trunk/WebCore/inspector/InspectorDOMAgent.cpp

    r70985 r71244  
    5252#include "DocumentType.h"
    5353#include "Event.h"
     54#include "EventContext.h"
    5455#include "EventListener.h"
    5556#include "EventNames.h"
     
    608609
    609610    // The Node's Event Ancestors (not including self)
    610     Vector<RefPtr<ContainerNode> > ancestors;
    611     node->eventAncestors(ancestors);
     611    Vector<EventContext> ancestors;
     612    node->getEventAncestors(ancestors, node);
    612613
    613614    // Nodes and their Listeners for the concerned event types (order is top to bottom)
    614615    Vector<EventListenerInfo> eventInformation;
    615616    for (size_t i = ancestors.size(); i; --i) {
    616         ContainerNode* ancestor = ancestors[i - 1].get();
     617        Node* ancestor = ancestors[i - 1].node();
    617618        for (size_t j = 0; j < eventTypesLength; ++j) {
    618619            AtomicString& type = eventTypes[j];
  • trunk/WebCore/inspector/InspectorInstrumentation.cpp

    r70985 r71244  
    3636#include "DOMWindow.h"
    3737#include "Event.h"
     38#include "EventContext.h"
    3839#include "InspectorController.h"
    3940#include "InspectorDOMAgent.h"
     
    5455int InspectorInstrumentation::s_frontendCounter = 0;
    5556
    56 static bool eventHasListeners(const AtomicString& eventType, DOMWindow* window, Node* node, const Vector<RefPtr<ContainerNode> >& ancestors)
     57static bool eventHasListeners(const AtomicString& eventType, DOMWindow* window, Node* node, const Vector<EventContext>& ancestors)
    5758{
    5859    if (window && window->hasEventListeners(eventType))
     
    6364
    6465    for (size_t i = 0; i < ancestors.size(); i++) {
    65         ContainerNode* ancestor = ancestors[i].get();
     66        Node* ancestor = ancestors[i].node();
    6667        if (ancestor->hasEventListeners(eventType))
    6768            return true;
     
    139140        domAgent->characterDataModified(characterData);
    140141}
    141 
    142142
    143143void InspectorInstrumentation::willSendXMLHttpRequestImpl(InspectorController* inspectorController, const String& url)
     
    214214}
    215215
    216 InspectorInstrumentationCookie InspectorInstrumentation::willDispatchEventImpl(InspectorController* inspectorController, const Event& event, DOMWindow* window, Node* node, const Vector<RefPtr<ContainerNode> >& ancestors)
     216InspectorInstrumentationCookie InspectorInstrumentation::willDispatchEventImpl(InspectorController* inspectorController, const Event& event, DOMWindow* window, Node* node, const Vector<EventContext>& ancestors)
    217217{
    218218    pauseOnNativeEventIfNeeded(inspectorController, listenerEventCategoryType, event.type(), false);
  • trunk/WebCore/inspector/InspectorInstrumentation.h

    r70985 r71244  
    4141class CharacterData;
    4242class Element;
     43class EventContext;
    4344class InspectorController;
    4445class InspectorTimelineAgent;
     
    7475    static InspectorInstrumentationCookie willChangeXHRReadyState(ScriptExecutionContext*, XMLHttpRequest* request);
    7576    static void didChangeXHRReadyState(const InspectorInstrumentationCookie&);
    76     static InspectorInstrumentationCookie willDispatchEvent(Document*, const Event& event, DOMWindow* window, Node* node, const Vector<RefPtr<ContainerNode> >& ancestors);
     77    static InspectorInstrumentationCookie willDispatchEvent(Document*, const Event& event, DOMWindow* window, Node* node, const Vector<EventContext>& ancestors);
    7778    static void didDispatchEvent(const InspectorInstrumentationCookie&);
    7879    static InspectorInstrumentationCookie willDispatchEventOnWindow(Frame*, const Event& event, DOMWindow* window);
     
    131132    static InspectorInstrumentationCookie willChangeXHRReadyStateImpl(InspectorController*, XMLHttpRequest* request);
    132133    static void didChangeXHRReadyStateImpl(const InspectorInstrumentationCookie&);
    133     static InspectorInstrumentationCookie willDispatchEventImpl(InspectorController*, const Event& event, DOMWindow* window, Node* node, const Vector<RefPtr<ContainerNode> >& ancestors);
     134    static InspectorInstrumentationCookie willDispatchEventImpl(InspectorController*, const Event& event, DOMWindow* window, Node* node, const Vector<EventContext>& ancestors);
    134135    static void didDispatchEventImpl(const InspectorInstrumentationCookie&);
    135136    static InspectorInstrumentationCookie willDispatchEventOnWindowImpl(InspectorController*, const Event& event, DOMWindow* window);
     
    226227}
    227228
    228 
    229229inline void InspectorInstrumentation::willSendXMLHttpRequest(ScriptExecutionContext* context, const String& url)
    230230{
     
    294294}
    295295
    296 inline InspectorInstrumentationCookie InspectorInstrumentation::willDispatchEvent(Document* document, const Event& event, DOMWindow* window, Node* node, const Vector<RefPtr<ContainerNode> >& ancestors)
     296inline InspectorInstrumentationCookie InspectorInstrumentation::willDispatchEvent(Document* document, const Event& event, DOMWindow* window, Node* node, const Vector<EventContext>& ancestors)
    297297{
    298298#if ENABLE(INSPECTOR)
  • trunk/WebCore/page/EventHandler.cpp

    r70985 r71244  
    17671767        if (result && result->isTextNode())
    17681768            result = result->parentNode();
    1769         if (result)
    1770             result = result->shadowAncestorNode();
    17711769    }
    17721770    m_nodeUnderMouse = result;
  • trunk/WebCore/rendering/ShadowElement.h

    r65852 r71244  
    4444    }
    4545
    46     HTMLElement* shadowParent() const { return m_shadowParent; }
     46    HTMLElement* shadowParent() const { return m_shadowParent.get(); }
    4747
    4848private:
    4949    virtual bool isShadowNode() const { return true; }
    50     virtual ContainerNode* shadowParentNode() { return m_shadowParent; }
     50    virtual ContainerNode* shadowParentNode() { return m_shadowParent.get(); }
    5151
    52     HTMLElement* m_shadowParent;
     52    RefPtr<HTMLElement> m_shadowParent;
    5353};
    5454
  • trunk/WebCore/svg/SVGElement.cpp

    r70985 r71244  
    348348}
    349349
    350 ContainerNode* SVGElement::eventParentNode()
    351 {
    352     if (ContainerNode* shadowParent = shadowParentNode())
    353         return shadowParent;
    354     return StyledElement::eventParentNode();
    355 }
    356 
    357350}
    358351
  • trunk/WebCore/svg/SVGElement.h

    r70985 r71244  
    100100        virtual bool isSupported(StringImpl* feature, StringImpl* version) const;
    101101
    102         virtual ContainerNode* eventParentNode();
    103 
    104102        virtual bool needsPendingResourceHandling() const { return true; }
    105103        virtual void buildPendingResource() { }
Note: See TracChangeset for help on using the changeset viewer.