Make someWindow.frames, .self, .window always return someWindow
authorcdumez@apple.com <cdumez@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 30 Mar 2019 00:21:31 +0000 (00:21 +0000)
committercdumez@apple.com <cdumez@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 30 Mar 2019 00:21:31 +0000 (00:21 +0000)
https://bugs.webkit.org/show_bug.cgi?id=195406

Reviewed by Alex Christensen.

LayoutTests/imported/w3c:

Rebaseline WPT test now that all its checks are passing.

* web-platform-tests/html/browsers/the-window-object/self-et-al.window-expected.txt:

Source/WebCore:

Make someWindow.frames, .self, .window always return someWindow. Previously, they
would return null when the window would lose its browsing context.

This aligns our behavior with Firefox and the HTML specification:
- https://github.com/whatwg/html/pull/4410

Chrome has also recently aligned with Firefox and the HTML specification here so
it makes sense for WebKit to follow.

No new tests, rebaselined existing tests.

* bindings/js/JSDOMWindowCustom.cpp:
(WebCore::JSDOMWindow::self const):
(WebCore::JSDOMWindow::window const):
(WebCore::JSDOMWindow::frames const):
* page/DOMWindow.cpp:
(WebCore::DOMWindow::focus):
* page/DOMWindow.h:
* page/DOMWindow.idl:

LayoutTests:

Update / rebaseline existing test to reflect behavior change.

* fast/frames/detached-frame-property-expected.txt:
* fast/frames/detached-frame-property.html:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@243669 268f45cc-cd09-0410-ab3c-d52691b4dbfc

LayoutTests/ChangeLog
LayoutTests/fast/frames/detached-frame-property-expected.txt
LayoutTests/fast/frames/detached-frame-property.html
LayoutTests/imported/w3c/ChangeLog
LayoutTests/imported/w3c/web-platform-tests/html/browsers/the-window-object/self-et-al.window-expected.txt
Source/WebCore/ChangeLog
Source/WebCore/bindings/js/JSDOMWindowCustom.cpp
Source/WebCore/page/DOMWindow.cpp
Source/WebCore/page/DOMWindow.h
Source/WebCore/page/DOMWindow.idl
Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMDOMWindow.cpp

index a2ddd93..7932e59 100644 (file)
@@ -1,3 +1,15 @@
+2019-03-29  Chris Dumez  <cdumez@apple.com>
+
+        Make someWindow.frames, .self, .window always return someWindow
+        https://bugs.webkit.org/show_bug.cgi?id=195406
+
+        Reviewed by Alex Christensen.
+
+        Update / rebaseline existing test to reflect behavior change.
+
+        * fast/frames/detached-frame-property-expected.txt:
+        * fast/frames/detached-frame-property.html:
+
 2019-03-29  Myles C. Maxfield  <mmaxfield@apple.com>
 
         Delete WebMetal implementation in favor of WebGPU
index ff243f8..b23bb26 100644 (file)
@@ -15,9 +15,9 @@ PASS detachedWindow.top is null
 PASS detachedWindow.opener is null
 PASS detachedWindow.parent is null
 PASS detachedWindow.frameElement is null
-PASS detachedWindow.window is null
-PASS detachedWindow.frames is null
-PASS detachedWindow.self is null
+PASS detachedWindow.window is detachedWindow
+PASS detachedWindow.frames is detachedWindow
+PASS detachedWindow.self is detachedWindow
 PASS !detachedWindow.localStorage is true
 PASS !!detachedWindow.document is true
 PASS !!detachedWindow.XMLHttpRequest is true
index e696e34..6e959c3 100644 (file)
@@ -19,10 +19,9 @@ onload = function()
     shouldBeNull("detachedWindow.opener");
     shouldBeNull("detachedWindow.parent");
     shouldBeNull("detachedWindow.frameElement"); // Technically, Chrome returns undefined here, not null.
-    // Chrome agrees with us but Firefox returns the detachedWindow.
-    shouldBeNull("detachedWindow.window");
-    shouldBeNull("detachedWindow.frames");
-    shouldBeNull("detachedWindow.self");
+    shouldBe("detachedWindow.window", "detachedWindow");
+    shouldBe("detachedWindow.frames", "detachedWindow");
+    shouldBe("detachedWindow.self", "detachedWindow");
 
     // Chrome returns undefined but Firefox has a valid object.
     shouldBeTrue("!detachedWindow.localStorage");
index 04b9aca..e176253 100644 (file)
@@ -1,3 +1,14 @@
+2019-03-29  Chris Dumez  <cdumez@apple.com>
+
+        Make someWindow.frames, .self, .window always return someWindow
+        https://bugs.webkit.org/show_bug.cgi?id=195406
+
+        Reviewed by Alex Christensen.
+
+        Rebaseline WPT test now that all its checks are passing.
+
+        * web-platform-tests/html/browsers/the-window-object/self-et-al.window-expected.txt:
+
 2019-03-29  Javier Fernandez  <jfernandez@igalia.com>
 
         Update the CSS Text WPT test suite
index 93aa75e..8139c2d 100644 (file)
@@ -1,10 +1,10 @@
 
-FAIL iframeWindow.frames before and after removal assert_equals: frames got cleared after browsing context removal expected object "[object Window]" but got null
-FAIL popupWindow.frames before, after closing, and after discarding assert_equals: frames got cleared after browsing context removal expected object "[object Window]" but got null
+PASS iframeWindow.frames before and after removal 
+PASS popupWindow.frames before, after closing, and after discarding 
 PASS iframeWindow.globalThis before and after removal 
 PASS popupWindow.globalThis before, after closing, and after discarding 
-FAIL iframeWindow.self before and after removal assert_equals: self got cleared after browsing context removal expected object "[object Window]" but got null
-FAIL popupWindow.self before, after closing, and after discarding assert_equals: self got cleared after browsing context removal expected object "[object Window]" but got null
-FAIL iframeWindow.window before and after removal assert_equals: window got cleared after browsing context removal expected object "[object Window]" but got null
-FAIL popupWindow.window before, after closing, and after discarding assert_equals: window got cleared after browsing context removal expected object "[object Window]" but got null
+PASS iframeWindow.self before and after removal 
+PASS popupWindow.self before, after closing, and after discarding 
+PASS iframeWindow.window before and after removal 
+PASS popupWindow.window before, after closing, and after discarding 
 
index 9bf7c8e..e517021 100644 (file)
@@ -1,3 +1,30 @@
+2019-03-29  Chris Dumez  <cdumez@apple.com>
+
+        Make someWindow.frames, .self, .window always return someWindow
+        https://bugs.webkit.org/show_bug.cgi?id=195406
+
+        Reviewed by Alex Christensen.
+
+        Make someWindow.frames, .self, .window always return someWindow. Previously, they
+        would return null when the window would lose its browsing context.
+
+        This aligns our behavior with Firefox and the HTML specification:
+        - https://github.com/whatwg/html/pull/4410
+
+        Chrome has also recently aligned with Firefox and the HTML specification here so
+        it makes sense for WebKit to follow.
+
+        No new tests, rebaselined existing tests.
+
+        * bindings/js/JSDOMWindowCustom.cpp:
+        (WebCore::JSDOMWindow::self const):
+        (WebCore::JSDOMWindow::window const):
+        (WebCore::JSDOMWindow::frames const):
+        * page/DOMWindow.cpp:
+        (WebCore::DOMWindow::focus):
+        * page/DOMWindow.h:
+        * page/DOMWindow.idl:
+
 2019-03-29  Myles C. Maxfield  <mmaxfield@apple.com>
 
         Delete WebMetal implementation in favor of WebGPU
index 4f72c57..c774e67 100644 (file)
@@ -548,4 +548,19 @@ void JSDOMWindow::setOpener(JSC::ExecState& state, JSC::JSValue value)
     replaceStaticPropertySlot(state.vm(), this, Identifier::fromString(&state.vm(), "opener"), value);
 }
 
+JSValue JSDOMWindow::self(JSC::ExecState&) const
+{
+    return globalThis();
+}
+
+JSValue JSDOMWindow::window(JSC::ExecState&) const
+{
+    return globalThis();
+}
+
+JSValue JSDOMWindow::frames(JSC::ExecState&) const
+{
+    return globalThis();
+}
+
 } // namespace WebCore
index ac71b97..4c044dc 100644 (file)
@@ -940,8 +940,9 @@ Element* DOMWindow::frameElement() const
 
 void DOMWindow::focus(DOMWindow& incumbentWindow)
 {
-    auto* opener = this->opener();
-    focus(opener && opener != self() && incumbentWindow.self() == opener);
+    auto* frame = this->frame();
+    auto* openerFrame = frame ? frame->loader().opener() : nullptr;
+    focus(openerFrame && openerFrame != frame && incumbentWindow.frame() == openerFrame);
 }
 
 void DOMWindow::focus(bool allowFocus)
@@ -1380,15 +1381,6 @@ void DOMWindow::setDefaultStatus(const String& string)
     page->chrome().setStatusbarText(*frame, m_defaultStatus);
 }
 
-WindowProxy* DOMWindow::self() const
-{
-    auto* frame = this->frame();
-    if (!frame)
-        return nullptr;
-
-    return &frame->windowProxy();
-}
-
 WindowProxy* DOMWindow::opener() const
 {
     auto* frame = this->frame();
index e7f476e..ef852eb 100644 (file)
@@ -210,8 +210,6 @@ public:
     String defaultStatus() const;
     void setDefaultStatus(const String&);
 
-    WindowProxy* self() const;
-
     WindowProxy* opener() const;
     void disownOpener();
     WindowProxy* parent() const;
index a717451..443e656 100644 (file)
@@ -50,8 +50,8 @@ typedef USVString CSSOMString;
     PrimaryGlobal,
 ] interface DOMWindow : EventTarget {
     // The current browsing context.
-    [DoNotCheckSecurity, Unforgeable, ImplementedAs=self] readonly attribute WindowProxy window;
-    [Replaceable, DoNotCheckSecurityOnGetter] readonly attribute WindowProxy self;
+    [DoNotCheckSecurity, Unforgeable, CustomGetter] readonly attribute WindowProxy window;
+    [Replaceable, DoNotCheckSecurityOnGetter, CustomGetter] readonly attribute WindowProxy self;
     [Unforgeable] readonly attribute Document document;
     attribute DOMString name;
     [DoNotCheckSecurity, PutForwards=href, Unforgeable] readonly attribute Location location;
@@ -71,7 +71,7 @@ typedef USVString CSSOMString;
     [DoNotCheckSecurity, ForwardDeclareInHeader] void blur();
 
     // Other browsing contexts.
-    [Replaceable, DoNotCheckSecurityOnGetter, ImplementedAs=self] readonly attribute WindowProxy frames;
+    [Replaceable, DoNotCheckSecurityOnGetter, CustomGetter] readonly attribute WindowProxy frames;
     [Replaceable, DoNotCheckSecurityOnGetter] readonly attribute unsigned long length;
     [DoNotCheckSecurityOnGetter, Unforgeable] readonly attribute WindowProxy? top;
     [DoNotCheckSecurityOnGetter, CustomSetter] attribute WindowProxy? opener;
index 09e0c6d..dcb6165 100644 (file)
@@ -970,9 +970,7 @@ WebKitDOMDOMWindow* webkit_dom_dom_window_get_self(WebKitDOMDOMWindow* self)
     WebCore::JSMainThreadNullState state;
     g_return_val_if_fail(WEBKIT_DOM_IS_DOM_WINDOW(self), 0);
     WebCore::DOMWindow* item = WebKit::core(self);
-    auto* selfWindowProxy = item->self();
-    RefPtr<WebCore::DOMWindow> gobjectResult = downcast<WebCore::DOMWindow>(selfWindowProxy->window());
-    return WebKit::kit(gobjectResult.get());
+    return WebKit::kit(item);
 }
 
 WebKitDOMDOMWindow* webkit_dom_dom_window_get_window(WebKitDOMDOMWindow* self)
@@ -980,9 +978,7 @@ WebKitDOMDOMWindow* webkit_dom_dom_window_get_window(WebKitDOMDOMWindow* self)
     WebCore::JSMainThreadNullState state;
     g_return_val_if_fail(WEBKIT_DOM_IS_DOM_WINDOW(self), 0);
     WebCore::DOMWindow* item = WebKit::core(self);
-    auto* selfWindowProxy = item->self();
-    RefPtr<WebCore::DOMWindow> gobjectResult = downcast<WebCore::DOMWindow>(selfWindowProxy->window());
-    return WebKit::kit(gobjectResult.get());
+    return WebKit::kit(item);
 }
 
 WebKitDOMDOMWindow* webkit_dom_dom_window_get_frames(WebKitDOMDOMWindow* self)
@@ -990,9 +986,7 @@ WebKitDOMDOMWindow* webkit_dom_dom_window_get_frames(WebKitDOMDOMWindow* self)
     WebCore::JSMainThreadNullState state;
     g_return_val_if_fail(WEBKIT_DOM_IS_DOM_WINDOW(self), 0);
     WebCore::DOMWindow* item = WebKit::core(self);
-    auto* selfWindowProxy = item->self();
-    RefPtr<WebCore::DOMWindow> gobjectResult = downcast<WebCore::DOMWindow>(selfWindowProxy->window());
-    return WebKit::kit(gobjectResult.get());
+    return WebKit::kit(item);
 }
 
 WebKitDOMDOMWindow* webkit_dom_dom_window_get_opener(WebKitDOMDOMWindow* self)