Commit 22000f6d authored by dglazkov@chromium.org's avatar dglazkov@chromium.org

2010-11-05 Dimitri Glazkov <dglazkov@chromium.org>

        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

        Added more test coverage around events crossing shadow DOM boundaries and tweaked existing tests.

        * fast/events/shadow-boundary-crossing-2-expected.txt: Added.
        * fast/events/shadow-boundary-crossing-2.html: Added.
        * fast/events/shadow-boundary-crossing.html: Tuned to better reflect its point:
            the event should indeed fire (it used to be swallowed), but its target
            should be a non-shadow node.
        * media/audio-delete-while-slider-thumb-clicked.html :  Tweaked to actually click on
            the scrubber thumb (it was off by 2 pixels).
2010-11-05  Dimitri Glazkov  <dglazkov@chromium.org>

        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

        Test: fast/events/shadow-boundary-crossing-2.html

        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::getEventAncestors): Renamed and 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.
        * dom/WindowEventContext.cpp: Added.
        * dom/WindowEventContext.h: Added.
        * inspector/InspectorDOMAgent.cpp:
        (WebCore::InspectorDOMAgent::getEventListenersForNode): Changed to use EventContexts.
        * page/EventHandler.cpp:
        (WebCore::EventHandler::updateMouseEventTargetNode): Removed code that's no longer necessary.
        * rendering/RenderTextControlMultiLine.cpp:
        (WebCore::RenderTextControlMultiLine::subtreeHasChanged): Removed event invocation that's
            no longer necessary.
        * rendering/ShadowElement.h: Made m_shadowParent a RefPtr to avoid stale references when parent
        is deleted.
        * rendering/TextControlInnerElements.cpp:
        (WebCore::TextControlInnerTextElement::defaultEventHandler): Flipped the condition back
            from where it was prior to r60418.
        * svg/SVGElement.cpp: Removed eventParentNode that's no longer needed.
        * svg/SVGElement.h: Ditto.

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@71934 268f45cc-cd09-0410-ab3c-d52691b4dbfc
parent 228ba220
2010-11-05 Dimitri Glazkov <dglazkov@chromium.org>
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
Added more test coverage around events crossing shadow DOM boundaries and tweaked existing tests.
* fast/events/shadow-boundary-crossing-2-expected.txt: Added.
* fast/events/shadow-boundary-crossing-2.html: Added.
* fast/events/shadow-boundary-crossing.html: Tuned to better reflect its point:
the event should indeed fire (it used to be swallowed), but its target
should be a non-shadow node.
* media/audio-delete-while-slider-thumb-clicked.html : Tweaked to actually click on
the scrubber thumb (it was off by 2 pixels).
2010-11-12 Mihai Parparita <mihaip@chromium.org>
Unreviewed Chromium expectations update.
Tests to ensure that shadow DOM boundary is not crossed during event propagation. Can only run within DRT.
See bug 46015 for details.
Mutation events should not propagate out of the shadow DOM: PASS
Other events should be retargeted: PASS
After event dispatch, the event object should not reveal shadow DOM: PASS
<html>
<head>
<script>
var logDiv;
function log(msg, success)
{
logDiv.appendChild(document.createElement('div')).textContent = msg + ': ' + (success ? 'PASS' : 'FAIL');
}
function clickOn(element)
{
if (!window.eventSender)
return;
var x = element.offsetLeft + element.offsetWidth / 2;
var y = element.offsetTop + element.offsetHeight / 2;
eventSender.mouseMoveTo(x, y);
eventSender.mouseDown();
eventSender.mouseUp();
}
var tests = {
mutationEventPropagation: function()
{
var textarea = document.body.appendChild(document.createElement('textarea'));
var mutationEventFired;
textarea.addEventListener('DOMSubtreeModified', function(e)
{
mutationEventFired = true;
}, false);
textarea.value = 'test';
// Trigger style recalc and sadly, the actual mutation of the textarea shadow DOM.
textarea.offsetHeight;
log('Mutation events should not propagate out of the shadow DOM', !mutationEventFired);
textarea.parentNode.removeChild(textarea);
},
eventInProgress: function()
{
var textInput = document.body.appendChild(document.createElement('input'));
textInput.addEventListener('click', function(e)
{
log('Other events should be retargeted', e.target == textInput);
}, false);
clickOn(textInput);
textInput.parentNode.removeChild(textInput);
},
finalEventObject: function()
{
var textInput = document.body.appendChild(document.createElement('input'));
var storedEvent;
textInput.addEventListener('click', function(e)
{
storedEvent = e;
}, false);
clickOn(textInput);
log('After event dispatch, the event object should not reveal shadow DOM', storedEvent && storedEvent.target == textInput);
textInput.parentNode.removeChild(textInput);
}
};
function runTest()
{
if (window.layoutTestController)
layoutTestController.dumpAsText();
logDiv = document.getElementById('log');
for(var testName in tests) {
tests[testName]();
}
}
</script>
</head>
<body onload="runTest()">
<p>Tests to ensure that shadow DOM boundary is not crossed during event propagation. Can only run within DRT.
<p>See <a href="https://bugs.webkit.org/show_bug.cgi?id=46015">bug 46015</a> for details.
<div id="log"></div>
</body>
</html>
\ No newline at end of file
......@@ -2,11 +2,12 @@
<head>
<title></title>
<script type="text/javascript">
var fired = false;
var success;
var target;
function selectStart(event)
{
fired = true;
success = event.target == target;
}
function test()
......@@ -15,7 +16,7 @@
return;
layoutTestController.dumpAsText();
var target = document.getElementById("target");
target = document.getElementById("target");
var x = target.offsetLeft + target.offsetWidth / 2;
var y = target.offsetTop + target.offsetHeight / 2;
......@@ -23,7 +24,7 @@
eventSender.mouseDown();
eventSender.mouseUp();
document.getElementById("result").innerText = fired ? "FAIL" : "PASS";
document.getElementById("result").innerText = !success ? "FAIL" : "PASS";
}
addEventListener("selectstart", selectStart, true);
......
......@@ -50,11 +50,11 @@
var audio = document.getElementById('audio');
var middle = audio.offsetLeft + (audio.offsetWidth / 2);
var bottom = audio.offsetTop + audio.offsetHeight;
var center = audio.offsetLeft + (audio.offsetWidth / 2);
var middle = audio.offsetTop + (audio.offsetHeight / 2);
var x = middle + 16 + 16 + 8;
var y = bottom - 8;
var x = center + 16 + 16 + 8;
var y = middle;
// drag slider, leave the mouse down
log("clicking in controller");
......
......@@ -132,6 +132,7 @@ LOCAL_SRC_FILES := $(LOCAL_SRC_FILES) \
dom/EntityReference.cpp \
dom/ErrorEvent.cpp \
dom/Event.cpp \
dom/EventContext.cpp \
dom/EventNames.cpp \
dom/EventTarget.cpp \
dom/ExceptionBase.cpp \
......@@ -192,6 +193,7 @@ LOCAL_SRC_FILES := $(LOCAL_SRC_FILES) \
dom/WebKitAnimationEvent.cpp \
dom/WebKitTransitionEvent.cpp \
dom/WheelEvent.cpp \
dom/WindowEventContext.cpp \
dom/XMLDocumentParser.cpp \
dom/XMLDocumentParserLibxml2.cpp \
dom/XMLDocumentParserScope.cpp \
......
......@@ -825,6 +825,7 @@ SET(WebCore_SOURCES
dom/EntityReference.cpp
dom/ErrorEvent.cpp
dom/Event.cpp
dom/EventContext.cpp
dom/EventNames.cpp
dom/EventTarget.cpp
dom/ExceptionBase.cpp
......@@ -882,6 +883,7 @@ SET(WebCore_SOURCES
dom/WebKitAnimationEvent.cpp
dom/WebKitTransitionEvent.cpp
dom/WheelEvent.cpp
dom/WindowEventContext.cpp
dom/XMLDocumentParser.cpp
dom/XMLDocumentParserLibxml2.cpp
dom/XMLDocumentParserScope.cpp
......
2010-11-05 Dimitri Glazkov <dglazkov@chromium.org>
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
Test: fast/events/shadow-boundary-crossing-2.html
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::getEventAncestors): Renamed and 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.
* dom/WindowEventContext.cpp: Added.
* dom/WindowEventContext.h: Added.
* inspector/InspectorDOMAgent.cpp:
(WebCore::InspectorDOMAgent::getEventListenersForNode): Changed to use EventContexts.
* page/EventHandler.cpp:
(WebCore::EventHandler::updateMouseEventTargetNode): Removed code that's no longer necessary.
* rendering/RenderTextControlMultiLine.cpp:
(WebCore::RenderTextControlMultiLine::subtreeHasChanged): Removed event invocation that's
no longer necessary.
* rendering/ShadowElement.h: Made m_shadowParent a RefPtr to avoid stale references when parent
is deleted.
* rendering/TextControlInnerElements.cpp:
(WebCore::TextControlInnerTextElement::defaultEventHandler): Flipped the condition back
from where it was prior to r60418.
* svg/SVGElement.cpp: Removed eventParentNode that's no longer needed.
* svg/SVGElement.h: Ditto.
2010-11-12 Ryuan Choi <ryuan.choi@samsung.com>
Reviewed by Martin Robinson.
......@@ -1135,8 +1135,10 @@ webcore_sources += \
WebCore/dom/ErrorEvent.cpp \
WebCore/dom/ErrorEvent.h \
WebCore/dom/Event.cpp \
WebCore/dom/EventException.h \
WebCore/dom/Event.h \
WebCore/dom/EventContext.cpp \
WebCore/dom/EventContext.h \
WebCore/dom/EventException.h \
WebCore/dom/EventListener.h \
WebCore/dom/EventNames.cpp \
WebCore/dom/EventNames.h \
......@@ -1264,6 +1266,8 @@ webcore_sources += \
WebCore/dom/WebKitTransitionEvent.h \
WebCore/dom/WheelEvent.cpp \
WebCore/dom/WheelEvent.h \
WebCore/dom/WindowEventContext.cpp \
WebCore/dom/WindowEventContext.h \
WebCore/dom/XMLDocumentParser.cpp \
WebCore/dom/XMLDocumentParser.h \
WebCore/dom/XMLDocumentParserLibxml2.cpp \
......
......@@ -1202,6 +1202,8 @@
'dom/ErrorEvent.h',
'dom/Event.cpp',
'dom/Event.h',
'dom/EventContext.cpp',
'dom/EventContext.h',
'dom/EventException.h',
'dom/EventListener.h',
'dom/EventNames.cpp',
......@@ -1337,6 +1339,8 @@
'dom/WebKitTransitionEvent.h',
'dom/WheelEvent.cpp',
'dom/WheelEvent.h',
'dom/WindowEventContext.cpp',
'dom/WindowEventContext.h',
'dom/XMLDocumentParser.cpp',
'dom/XMLDocumentParser.h',
'dom/XMLDocumentParserLibxml2.cpp',
......
......@@ -713,6 +713,7 @@ SOURCES += \
dom/EntityReference.cpp \
dom/ErrorEvent.cpp \
dom/Event.cpp \
dom/EventContext.cpp \
dom/EventNames.cpp \
dom/EventTarget.cpp \
dom/ExceptionBase.cpp \
......@@ -773,6 +774,7 @@ SOURCES += \
dom/WebKitAnimationEvent.cpp \
dom/WebKitTransitionEvent.cpp \
dom/WheelEvent.cpp \
dom/WindowEventContext.cpp \
dom/XMLDocumentParser.cpp \
dom/XMLDocumentParserQt.cpp \
dom/default/PlatformMessagePortChannel.cpp \
......
......@@ -42387,6 +42387,62 @@
RelativePath="..\dom\Event.h"
>
</File>
<File
RelativePath="..\dom\EventContext.cpp"
>
<FileConfiguration
Name="Debug|Win32"
ExcludedFromBuild="true"
>
<Tool
Name="VCCLCompilerTool"
/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32"
ExcludedFromBuild="true"
>
<Tool
Name="VCCLCompilerTool"
/>
</FileConfiguration>
<FileConfiguration
Name="Debug_Internal|Win32"
ExcludedFromBuild="true"
>
<Tool
Name="VCCLCompilerTool"
/>
</FileConfiguration>
<FileConfiguration
Name="Debug_Cairo|Win32"
ExcludedFromBuild="true"
>
<Tool
Name="VCCLCompilerTool"
/>
</FileConfiguration>
<FileConfiguration
Name="Release_Cairo|Win32"
ExcludedFromBuild="true"
>
<Tool
Name="VCCLCompilerTool"
/>
</FileConfiguration>
<FileConfiguration
Name="Debug_All|Win32"
ExcludedFromBuild="true"
>
<Tool
Name="VCCLCompilerTool"
/>
</FileConfiguration>
</File>
<File
RelativePath="..\dom\EventContext.h"
>
</File>
<File
RelativePath="..\dom\EventException.h"
>
......@@ -45475,6 +45531,62 @@
RelativePath="..\dom\WheelEvent.h"
>
</File>
<File
RelativePath="..\dom\WindowEventContext.cpp"
>
<FileConfiguration
Name="Debug|Win32"
ExcludedFromBuild="true"
>
<Tool
Name="VCCLCompilerTool"
/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32"
ExcludedFromBuild="true"
>
<Tool
Name="VCCLCompilerTool"
/>
</FileConfiguration>
<FileConfiguration
Name="Debug_Internal|Win32"
ExcludedFromBuild="true"
>
<Tool
Name="VCCLCompilerTool"
/>
</FileConfiguration>
<FileConfiguration
Name="Debug_Cairo|Win32"
ExcludedFromBuild="true"
>
<Tool
Name="VCCLCompilerTool"
/>
</FileConfiguration>
<FileConfiguration
Name="Release_Cairo|Win32"
ExcludedFromBuild="true"
>
<Tool
Name="VCCLCompilerTool"
/>
</FileConfiguration>
<FileConfiguration
Name="Debug_All|Win32"
ExcludedFromBuild="true"
>
<Tool
Name="VCCLCompilerTool"
/>
</FileConfiguration>
</File>
<File
RelativePath="..\dom\WindowEventContext.h"
>
</File>
<File
RelativePath="..\dom\XMLDocumentParser.cpp"
>
......@@ -902,7 +902,11 @@
410B7E721045FAB000D8224F /* JSMessageEventCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 410B7E711045FAB000D8224F /* JSMessageEventCustom.cpp */; };
411046410FA222A600BA436A /* ScriptEventListener.h in Headers */ = {isa = PBXBuildFile; fileRef = 4110463F0FA222A600BA436A /* ScriptEventListener.h */; };
411046420FA222A600BA436A /* ScriptEventListener.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 411046400FA222A600BA436A /* ScriptEventListener.cpp */; };
4123E569127B3041000FEEA7 /* WindowEventContext.h in Headers */ = {isa = PBXBuildFile; fileRef = 4123E567127B3041000FEEA7 /* WindowEventContext.h */; };
4123E56A127B3041000FEEA7 /* WindowEventContext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4123E568127B3041000FEEA7 /* WindowEventContext.cpp */; };
4127D5370F8AAB1D00E424F5 /* ScriptState.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4127D5360F8AAB1D00E424F5 /* ScriptState.cpp */; };
4138D3351244054800323D33 /* EventContext.h in Headers */ = {isa = PBXBuildFile; fileRef = 4138D3331244054800323D33 /* EventContext.h */; };
4138D3361244054800323D33 /* EventContext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4138D3341244054800323D33 /* EventContext.cpp */; };
4162A450101145AE00DFF3ED /* DedicatedWorkerContext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4162A44D101145AE00DFF3ED /* DedicatedWorkerContext.cpp */; };
4162A451101145AE00DFF3ED /* DedicatedWorkerContext.h in Headers */ = {isa = PBXBuildFile; fileRef = 4162A44E101145AE00DFF3ED /* DedicatedWorkerContext.h */; };
4162A454101145E300DFF3ED /* JSDedicatedWorkerContextCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4162A453101145E300DFF3ED /* JSDedicatedWorkerContextCustom.cpp */; };
......@@ -6997,7 +7001,11 @@
410B7E711045FAB000D8224F /* JSMessageEventCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSMessageEventCustom.cpp; sourceTree = "<group>"; };
4110463F0FA222A600BA436A /* ScriptEventListener.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScriptEventListener.h; sourceTree = "<group>"; };
411046400FA222A600BA436A /* ScriptEventListener.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ScriptEventListener.cpp; sourceTree = "<group>"; };
4123E567127B3041000FEEA7 /* WindowEventContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WindowEventContext.h; sourceTree = "<group>"; };
4123E568127B3041000FEEA7 /* WindowEventContext.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WindowEventContext.cpp; sourceTree = "<group>"; };
4127D5360F8AAB1D00E424F5 /* ScriptState.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ScriptState.cpp; sourceTree = "<group>"; };
4138D3331244054800323D33 /* EventContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EventContext.h; sourceTree = "<group>"; };
4138D3341244054800323D33 /* EventContext.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EventContext.cpp; sourceTree = "<group>"; };
4162A44D101145AE00DFF3ED /* DedicatedWorkerContext.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DedicatedWorkerContext.cpp; path = workers/DedicatedWorkerContext.cpp; sourceTree = "<group>"; };
4162A44E101145AE00DFF3ED /* DedicatedWorkerContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DedicatedWorkerContext.h; path = workers/DedicatedWorkerContext.h; sourceTree = "<group>"; };
4162A44F101145AE00DFF3ED /* DedicatedWorkerContext.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = DedicatedWorkerContext.idl; path = workers/DedicatedWorkerContext.idl; sourceTree = "<group>"; };
......@@ -18268,6 +18276,8 @@
85031B2B0A44EFC700F992E0 /* Event.cpp */,
85031B2C0A44EFC700F992E0 /* Event.h */,
14E836D209F8512000B85AE4 /* Event.idl */,
4138D3341244054800323D33 /* EventContext.cpp */,
4138D3331244054800323D33 /* EventContext.h */,
BC60D9090D2A17CE00B9918F /* EventException.h */,
BC60D90A0D2A17CE00B9918F /* EventException.idl */,
935FBC4409BA00B900E230B1 /* EventListener.h */,
......@@ -18428,6 +18438,8 @@
85031B3A0A44EFC700F992E0 /* WheelEvent.cpp */,
85031B3B0A44EFC700F992E0 /* WheelEvent.h */,
93EEC1F709C2877700C515D1 /* WheelEvent.idl */,
4123E568127B3041000FEEA7 /* WindowEventContext.cpp */,
4123E567127B3041000FEEA7 /* WindowEventContext.h */,
F523D30902DE4476018635CA /* XMLDocumentParser.cpp */,
F523D30A02DE4476018635CA /* XMLDocumentParser.h */,
54C50F7A0E801DF3009832A0 /* XMLDocumentParserLibxml2.cpp */,
......@@ -19594,6 +19606,7 @@
89878560122CA064003AABDA /* ErrorCallback.h in Headers */,
2ECF7AE210162B5800427DE7 /* ErrorEvent.h in Headers */,
85031B420A44EFC700F992E0 /* Event.h in Headers */,
4138D3351244054800323D33 /* EventContext.h in Headers */,
BC60D90C0D2A17CE00B9918F /* EventException.h in Headers */,
93C09A530B064DB3005ABD4D /* EventHandler.h in Headers */,
935FBC4509BA00B900E230B1 /* EventListener.h in Headers */,
......@@ -21274,6 +21287,7 @@
85031B510A44EFC700F992E0 /* WheelEvent.h in Headers */,
9380F47409A11AB4001FDB34 /* Widget.h in Headers */,
939B02EF0EA2DBC400C54570 /* WidthIterator.h in Headers */,
4123E569127B3041000FEEA7 /* WindowEventContext.h in Headers */,
BC8243E90D0CFD7500460C8F /* WindowFeatures.h in Headers */,
E1E1BF00115FF6FB006F52CA /* WindowsKeyboardCodes.h in Headers */,
08203AA00ED8C35300B8B61A /* WMLAccessElement.h in Headers */,
......@@ -22246,6 +22260,7 @@
893C480C1248BD3A002B3D86 /* EntrySync.cpp in Sources */,
2ECF7AE110162B5800427DE7 /* ErrorEvent.cpp in Sources */,
85031B410A44EFC700F992E0 /* Event.cpp in Sources */,
4138D3361244054800323D33 /* EventContext.cpp in Sources */,
93C09A810B064F00005ABD4D /* EventHandler.cpp in Sources */,
93C09A7F0B064EEF005ABD4D /* EventHandlerMac.mm in Sources */,
1CA19E050DC255950065A994 /* EventLoopMac.mm in Sources */,
......@@ -23853,6 +23868,7 @@
9380F47309A11AB4001FDB34 /* Widget.cpp in Sources */,
9380F47809A11ACC001FDB34 /* WidgetMac.mm in Sources */,
939B02EE0EA2DBC400C54570 /* WidthIterator.cpp in Sources */,
4123E56A127B3041000FEEA7 /* WindowEventContext.cpp in Sources */,
BC8243E80D0CFD7500460C8F /* WindowFeatures.cpp in Sources */,
08203A9F0ED8C35300B8B61A /* WMLAccessElement.cpp in Sources */,
088C97510ECB6E28000534BA /* WMLAElement.cpp in Sources */,
......@@ -1008,7 +1008,8 @@ static void notifyChildInserted(Node* child)
RefPtr<Node> c = child;
RefPtr<Document> document = child->document();
if (c->parentNode() && c->parentNode()->inDocument())
Node* parentOrHostNode = c->parentOrHostNode();
if (parentOrHostNode && parentOrHostNode->inDocument())
c->insertedIntoDocument();
else
c->insertedIntoTree(true);
......
......@@ -69,6 +69,7 @@
#include "EntityReference.cpp"
#include "ErrorEvent.cpp"
#include "Event.cpp"
#include "EventContext.cpp"
#include "EventNames.cpp"
#include "EventTarget.cpp"
#include "ExceptionBase.cpp"
......@@ -126,5 +127,6 @@
#include "WebKitAnimationEvent.cpp"
#include "WebKitTransitionEvent.cpp"
#include "WheelEvent.cpp"
#include "WindowEventContext.cpp"
#include "XMLDocumentParser.cpp"
#include "XMLDocumentParserScope.cpp"
/*
* Copyright (C) 2010 Google Inc. All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
#include "config.h"
#include "EventContext.h"
#include "DOMWindow.h"
#include "Document.h"
#include "Event.h"
#include "Node.h"
namespace WebCore {
EventContext::EventContext(PassRefPtr<Node> node, PassRefPtr<EventTarget> currentTarget, PassRefPtr<EventTarget> target)
: m_node(node)
, m_currentTarget(currentTarget)
, m_target(target)
{
}
void EventContext::handleLocalEvents(Event* event) const
{
event->setTarget(m_target.get());
event->setCurrentTarget(m_currentTarget.get());
m_node->handleLocalEvents(event);
}
}
/*
* Copyright (C) 2010 Google Inc. All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
#ifndef EventContext_h
#define EventContext_h
#include <wtf/RefPtr.h>
namespace WebCore {
class EventTarget;
class Event;
class Node;
class EventContext {
public:
// FIXME: Use ContainerNode instead of Node.
EventContext(PassRefPtr<Node>, PassRefPtr<EventTarget> currentTarget, PassRefPtr<EventTarget> target);
Node* node() const;
EventTarget* target() const;
void handleLocalEvents(Event*) const;
private:
RefPtr<Node> m_node;
RefPtr<EventTarget> m_currentTarget;
RefPtr<EventTarget> m_target;
};
inline Node* EventContext::node() const