Title: [141383] trunk
Revision
141383
Author
[email protected]
Date
2013-01-31 00:12:20 -0800 (Thu, 31 Jan 2013)

Log Message

[V8] 'new MouseEvent("click", {relatedTarget: window}).window' should return window
https://bugs.webkit.org/show_bug.cgi?id=108432

Reviewed by Adam Barth.

In V8 'new MouseEvent("click", {relatedTarget: window}).window'
returns null. JSC returns window, which is a correct behavior.
V8 should also return window.

Source/WebCore:

The point is that we need to handle a DOMWindow wrapper specially
before converting it to an EventTarget object. A wrapper returned by
Dictionary::get("relatedTarget") is not an expected DOMWindow wrapper.
To get the expected DOMWindow wrapper, we need to look up a prototype
chain of the DOMWindow wrapper.

In JSC, this special handling is done by JSEventTargetCustom::toEventTarget().

Test: fast/events/constructors/mouse-event-constructor.html

* bindings/v8/Dictionary.cpp:
(WebCore::Dictionary::get):

LayoutTests:

* fast/events/constructors/mouse-event-constructor-expected.txt:
* fast/events/constructors/mouse-event-constructor.html:

Modified Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (141382 => 141383)


--- trunk/LayoutTests/ChangeLog	2013-01-31 08:05:11 UTC (rev 141382)
+++ trunk/LayoutTests/ChangeLog	2013-01-31 08:12:20 UTC (rev 141383)
@@ -1,3 +1,17 @@
+2013-01-31  Kentaro Hara  <[email protected]>
+
+        [V8] 'new MouseEvent("click", {relatedTarget: window}).window' should return window
+        https://bugs.webkit.org/show_bug.cgi?id=108432
+
+        Reviewed by Adam Barth.
+
+        In V8 'new MouseEvent("click", {relatedTarget: window}).window'
+        returns null. JSC returns window, which is a correct behavior.
+        V8 should also return window.
+
+        * fast/events/constructors/mouse-event-constructor-expected.txt:
+        * fast/events/constructors/mouse-event-constructor.html:
+
 2013-01-30 Hajime Morrita  <[email protected]>
 
         [Chromium] Unreviewed, rebaselining expectations.

Modified: trunk/LayoutTests/fast/events/constructors/mouse-event-constructor-expected.txt (141382 => 141383)


--- trunk/LayoutTests/fast/events/constructors/mouse-event-constructor-expected.txt	2013-01-31 08:05:11 UTC (rev 141382)
+++ trunk/LayoutTests/fast/events/constructors/mouse-event-constructor-expected.txt	2013-01-31 08:12:20 UTC (rev 141383)
@@ -165,6 +165,7 @@
 PASS new MouseEvent('eventType', { relatedTarget: testDiv }).relatedTarget is testDiv
 PASS new MouseEvent('eventType', { relatedTarget: document }).relatedTarget is document
 PASS new MouseEvent('eventType', { relatedTarget: xhr }).relatedTarget is xhr
+PASS new MouseEvent('eventType', { relatedTarget: window }).relatedTarget is window
 PASS new MouseEvent('eventType', { relatedTarget: testObject }).relatedTarget is null
 PASS new MouseEvent('eventType', { relatedTarget: undefined }).relatedTarget is null
 PASS new MouseEvent('eventType', { relatedTarget: null }).relatedTarget is null

Modified: trunk/LayoutTests/fast/events/constructors/mouse-event-constructor.html (141382 => 141383)


--- trunk/LayoutTests/fast/events/constructors/mouse-event-constructor.html	2013-01-31 08:05:11 UTC (rev 141382)
+++ trunk/LayoutTests/fast/events/constructors/mouse-event-constructor.html	2013-01-31 08:12:20 UTC (rev 141383)
@@ -123,6 +123,7 @@
 shouldBe("new MouseEvent('eventType', { relatedTarget: testDiv }).relatedTarget", "testDiv");
 shouldBe("new MouseEvent('eventType', { relatedTarget: document }).relatedTarget", "document");
 shouldBe("new MouseEvent('eventType', { relatedTarget: xhr }).relatedTarget", "xhr");
+shouldBe("new MouseEvent('eventType', { relatedTarget: window }).relatedTarget", "window");
 
 // Invalid objects.
 shouldBe("new MouseEvent('eventType', { relatedTarget: testObject }).relatedTarget", "null");

Modified: trunk/Source/WebCore/ChangeLog (141382 => 141383)


--- trunk/Source/WebCore/ChangeLog	2013-01-31 08:05:11 UTC (rev 141382)
+++ trunk/Source/WebCore/ChangeLog	2013-01-31 08:12:20 UTC (rev 141383)
@@ -1,3 +1,27 @@
+2013-01-31  Kentaro Hara  <[email protected]>
+
+        [V8] 'new MouseEvent("click", {relatedTarget: window}).window' should return window
+        https://bugs.webkit.org/show_bug.cgi?id=108432
+
+        Reviewed by Adam Barth.
+
+        In V8 'new MouseEvent("click", {relatedTarget: window}).window'
+        returns null. JSC returns window, which is a correct behavior.
+        V8 should also return window.
+
+        The point is that we need to handle a DOMWindow wrapper specially
+        before converting it to an EventTarget object. A wrapper returned by
+        Dictionary::get("relatedTarget") is not an expected DOMWindow wrapper.
+        To get the expected DOMWindow wrapper, we need to look up a prototype
+        chain of the DOMWindow wrapper.
+
+        In JSC, this special handling is done by JSEventTargetCustom::toEventTarget().
+
+        Test: fast/events/constructors/mouse-event-constructor.html
+
+        * bindings/v8/Dictionary.cpp:
+        (WebCore::Dictionary::get):
+
 2013-01-31  Mark Pilgrim  <[email protected]>
 
         [Chromium] Move MediaPlayerPrivateChromium to WebCore

Modified: trunk/Source/WebCore/bindings/v8/Dictionary.cpp (141382 => 141383)


--- trunk/Source/WebCore/bindings/v8/Dictionary.cpp	2013-01-31 08:05:11 UTC (rev 141382)
+++ trunk/Source/WebCore/bindings/v8/Dictionary.cpp	2013-01-31 08:12:20 UTC (rev 141383)
@@ -466,6 +466,17 @@
         return false;
 
     EventTarget* target = 0;
+    // We need to handle a DOMWindow specially, because a wrapper object of a DOMWindow
+    // exists on a prototype chain of v8Value.
+    if (v8Value->IsObject()) {
+        v8::Handle<v8::Object> wrapper = v8::Handle<v8::Object>::Cast(v8Value);
+        v8::Handle<v8::Object> window = wrapper->FindInstanceInPrototypeChain(V8DOMWindow::GetTemplate(m_isolate));
+        if (!window.IsEmpty()) {
+            value = toWrapperTypeInfo(window)->toEventTarget(window);
+            return true;
+        }
+    }
+
     if (V8DOMWrapper::isDOMWrapper(v8Value)) {
         v8::Handle<v8::Object> wrapper = v8::Handle<v8::Object>::Cast(v8Value);
         target = toWrapperTypeInfo(wrapper)->toEventTarget(wrapper);
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to