Changeset 141383 in webkit


Ignore:
Timestamp:
Jan 31, 2013 12:12:20 AM (11 years ago)
Author:
haraken@chromium.org
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:
Location:
trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r141380 r141383  
     12013-01-31  Kentaro Hara  <haraken@chromium.org>
     2
     3        [V8] 'new MouseEvent("click", {relatedTarget: window}).window' should return window
     4        https://bugs.webkit.org/show_bug.cgi?id=108432
     5
     6        Reviewed by Adam Barth.
     7
     8        In V8 'new MouseEvent("click", {relatedTarget: window}).window'
     9        returns null. JSC returns window, which is a correct behavior.
     10        V8 should also return window.
     11
     12        * fast/events/constructors/mouse-event-constructor-expected.txt:
     13        * fast/events/constructors/mouse-event-constructor.html:
     14
    1152013-01-30 Hajime Morrita  <morrita@google.com>
    216
  • trunk/LayoutTests/fast/events/constructors/mouse-event-constructor-expected.txt

    r140657 r141383  
    166166PASS new MouseEvent('eventType', { relatedTarget: document }).relatedTarget is document
    167167PASS new MouseEvent('eventType', { relatedTarget: xhr }).relatedTarget is xhr
     168PASS new MouseEvent('eventType', { relatedTarget: window }).relatedTarget is window
    168169PASS new MouseEvent('eventType', { relatedTarget: testObject }).relatedTarget is null
    169170PASS new MouseEvent('eventType', { relatedTarget: undefined }).relatedTarget is null
  • trunk/LayoutTests/fast/events/constructors/mouse-event-constructor.html

    r140657 r141383  
    124124shouldBe("new MouseEvent('eventType', { relatedTarget: document }).relatedTarget", "document");
    125125shouldBe("new MouseEvent('eventType', { relatedTarget: xhr }).relatedTarget", "xhr");
     126shouldBe("new MouseEvent('eventType', { relatedTarget: window }).relatedTarget", "window");
    126127
    127128// Invalid objects.
  • trunk/Source/WebCore/ChangeLog

    r141382 r141383  
     12013-01-31  Kentaro Hara  <haraken@chromium.org>
     2
     3        [V8] 'new MouseEvent("click", {relatedTarget: window}).window' should return window
     4        https://bugs.webkit.org/show_bug.cgi?id=108432
     5
     6        Reviewed by Adam Barth.
     7
     8        In V8 'new MouseEvent("click", {relatedTarget: window}).window'
     9        returns null. JSC returns window, which is a correct behavior.
     10        V8 should also return window.
     11
     12        The point is that we need to handle a DOMWindow wrapper specially
     13        before converting it to an EventTarget object. A wrapper returned by
     14        Dictionary::get("relatedTarget") is not an expected DOMWindow wrapper.
     15        To get the expected DOMWindow wrapper, we need to look up a prototype
     16        chain of the DOMWindow wrapper.
     17
     18        In JSC, this special handling is done by JSEventTargetCustom::toEventTarget().
     19
     20        Test: fast/events/constructors/mouse-event-constructor.html
     21
     22        * bindings/v8/Dictionary.cpp:
     23        (WebCore::Dictionary::get):
     24
    1252013-01-31  Mark Pilgrim  <pilgrim@chromium.org>
    226
  • trunk/Source/WebCore/bindings/v8/Dictionary.cpp

    r140729 r141383  
    467467
    468468    EventTarget* target = 0;
     469    // We need to handle a DOMWindow specially, because a wrapper object of a DOMWindow
     470    // exists on a prototype chain of v8Value.
     471    if (v8Value->IsObject()) {
     472        v8::Handle<v8::Object> wrapper = v8::Handle<v8::Object>::Cast(v8Value);
     473        v8::Handle<v8::Object> window = wrapper->FindInstanceInPrototypeChain(V8DOMWindow::GetTemplate(m_isolate));
     474        if (!window.IsEmpty()) {
     475            value = toWrapperTypeInfo(window)->toEventTarget(window);
     476            return true;
     477        }
     478    }
     479
    469480    if (V8DOMWrapper::isDOMWrapper(v8Value)) {
    470481        v8::Handle<v8::Object> wrapper = v8::Handle<v8::Object>::Cast(v8Value);
Note: See TracChangeset for help on using the changeset viewer.