Title: [230613] trunk/Source/WebCore
Revision
230613
Author
cdu...@apple.com
Date
2018-04-12 16:55:02 -0700 (Thu, 12 Apr 2018)

Log Message

Introduce remote variants of Frame / DOMWindow classes
https://bugs.webkit.org/show_bug.cgi?id=184467
<rdar://problem/39011267>

Reviewed by Ryosuke Niwa.

Introduce remote variants of Frame / DOMWindow classes, for when these frames / windows
are hosted on another WebProcess. Those will be used in a follow-up patch.

The hierarchy is as follows (class naming will be improved in a follow-up patch to minimise
patch size):
- AbstractFrame: A frame that can be either local or remote (hosted on another WebProcess)
    - Frame: A local frame
    - RemoteFrame: A frame hosted on another WebProcess. A RemoteFrame's window is also remote.
- AbstractDOMWindow: A window that be either local or remote (hosted on another WebProcess)
    - DOMWindow: A local DOMWindow
    - RemoteDOMWindow: A window hosted on another WebProcess. A RemoteDOMWindow's frame is also
      remote. A RemoteDOMWindow is always cross-origin.

This patch introduces global identifiers (unique across all WebProcesses) for both Frames and
Windows. This is useful as we need to know which Frame / DOMWindow a particular RemoteFrame /
RemoteDOMWindow is pointing to.

Follow-up patch will add support for converting a local DOMWindow / Frame into a remote ones,
when a newly opened window (via window.open) is navigated cross-origin (Bug 184515).

Other things we'll need to implement in follow-ups:
- RemoteDOMWindow will need to know about its opener in order to support the window.opener
  API. Internally, the opener will be stored as a RemoteFrame so that window.opener always
  returns the current window in the opener frame (which changes upon navigation).
- Nullify a RemoteDOMWindow's frame whenever the window it is pointing to becomes frameless.
  A frameless window behaves very differently (e.g. very little API is exposed to the Web).
  This happens when either the newly opened window is either closed or navigated.

* Sources.txt:
* WebCore.xcodeproj/project.pbxproj:
* loader/ContentFilter.cpp:
(WebCore::ContentFilter::didDecide):
* page/AbstractDOMWindow.cpp: Added.
(WebCore::AbstractDOMWindow::AbstractDOMWindow):
(WebCore::AbstractDOMWindow::~AbstractDOMWindow):
* page/AbstractDOMWindow.h: Added.
(WebCore::AbstractDOMWindow::identifier const):
* page/AbstractFrame.cpp: Added.
(WebCore::AbstractFrame::AbstractFrame):
(WebCore::AbstractFrame::~AbstractFrame):
* page/AbstractFrame.h: Added.
(WebCore::AbstractFrame::window const):
* page/DOMWindow.cpp:
(WebCore::DOMWindow::DOMWindow):
* page/DOMWindow.h:
(isType):
* page/Frame.cpp:
(WebCore::Frame::window const):
(WebCore::Frame::virtualWindow const):
* page/Frame.h:
(isType):
* page/GlobalFrameIdentifier.h: Added.
(WebCore::GlobalFrameIdentifier::encode const):
(WebCore::GlobalFrameIdentifier::decode):
* page/GlobalWindowIdentifier.h: Added.
(WebCore::operator==):
(WebCore::GlobalWindowIdentifier::hash const):
(WebCore::GlobalWindowIdentifier::encode const):
(WebCore::GlobalWindowIdentifier::decode):
(WTF::GlobalWindowIdentifierHash::hash):
(WTF::GlobalWindowIdentifierHash::equal):
(WTF::HashTraits<WebCore::GlobalWindowIdentifier>::emptyValue):
(WTF::HashTraits<WebCore::GlobalWindowIdentifier>::constructDeletedValue):
(WTF::HashTraits<WebCore::GlobalWindowIdentifier>::isDeletedValue):

* page/RemoteDOMWindow.cpp: Added.
(WebCore::RemoteDOMWindow::RemoteDOMWindow):
(WebCore::RemoteDOMWindow::~RemoteDOMWindow):
(WebCore::RemoteDOMWindow::self const):
(WebCore::RemoteDOMWindow::location const):
(WebCore::RemoteDOMWindow::close):
(WebCore::RemoteDOMWindow::closed const):
(WebCore::RemoteDOMWindow::focus):
(WebCore::RemoteDOMWindow::blur):
(WebCore::RemoteDOMWindow::length const):
(WebCore::RemoteDOMWindow::top const):
(WebCore::RemoteDOMWindow::opener const):
(WebCore::RemoteDOMWindow::parent const):
(WebCore::RemoteDOMWindow::postMessage):
The DOM API exposed on RemoteDOMWindow is only the subset of the DOMWindow API that is exposed cross origin,
since remote DOMWindow are always from a different origin. The short-term plan is to implement these in a
follow-up by relying on IPC (synchronous when necessary) to fetch the information from the real window in
the WebProcess where it lives. Longer term, we should probably keep RemoteDOMWindow members in sync with the
DOMWindow they're pointing to, so we do not have to rely on synchronous IPC.

* page/RemoteDOMWindow.h: Added.
(isType):
* page/RemoteFrame.cpp: Added.
(WebCore::RemoteFrame::RemoteFrame):
(WebCore::RemoteFrame::~RemoteFrame):
(WebCore::RemoteFrame::virtualWindow const):
* page/RemoteFrame.h: Added.
(isType):

Modified Paths

Added Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (230612 => 230613)


--- trunk/Source/WebCore/ChangeLog	2018-04-12 23:41:41 UTC (rev 230612)
+++ trunk/Source/WebCore/ChangeLog	2018-04-12 23:55:02 UTC (rev 230613)
@@ -1,3 +1,105 @@
+2018-04-12  Chris Dumez  <cdu...@apple.com>
+
+        Introduce remote variants of Frame / DOMWindow classes
+        https://bugs.webkit.org/show_bug.cgi?id=184467
+        <rdar://problem/39011267>
+
+        Reviewed by Ryosuke Niwa.
+
+        Introduce remote variants of Frame / DOMWindow classes, for when these frames / windows
+        are hosted on another WebProcess. Those will be used in a follow-up patch.
+
+        The hierarchy is as follows (class naming will be improved in a follow-up patch to minimise
+        patch size):
+        - AbstractFrame: A frame that can be either local or remote (hosted on another WebProcess)
+            - Frame: A local frame
+            - RemoteFrame: A frame hosted on another WebProcess. A RemoteFrame's window is also remote.
+        - AbstractDOMWindow: A window that be either local or remote (hosted on another WebProcess)
+            - DOMWindow: A local DOMWindow
+            - RemoteDOMWindow: A window hosted on another WebProcess. A RemoteDOMWindow's frame is also
+              remote. A RemoteDOMWindow is always cross-origin.
+
+        This patch introduces global identifiers (unique across all WebProcesses) for both Frames and
+        Windows. This is useful as we need to know which Frame / DOMWindow a particular RemoteFrame /
+        RemoteDOMWindow is pointing to.
+
+        Follow-up patch will add support for converting a local DOMWindow / Frame into a remote ones,
+        when a newly opened window (via window.open) is navigated cross-origin (Bug 184515).
+
+        Other things we'll need to implement in follow-ups:
+        - RemoteDOMWindow will need to know about its opener in order to support the window.opener
+          API. Internally, the opener will be stored as a RemoteFrame so that window.opener always
+          returns the current window in the opener frame (which changes upon navigation).
+        - Nullify a RemoteDOMWindow's frame whenever the window it is pointing to becomes frameless.
+          A frameless window behaves very differently (e.g. very little API is exposed to the Web).
+          This happens when either the newly opened window is either closed or navigated.
+
+        * Sources.txt:
+        * WebCore.xcodeproj/project.pbxproj:
+        * loader/ContentFilter.cpp:
+        (WebCore::ContentFilter::didDecide):
+        * page/AbstractDOMWindow.cpp: Added.
+        (WebCore::AbstractDOMWindow::AbstractDOMWindow):
+        (WebCore::AbstractDOMWindow::~AbstractDOMWindow):
+        * page/AbstractDOMWindow.h: Added.
+        (WebCore::AbstractDOMWindow::identifier const):
+        * page/AbstractFrame.cpp: Added.
+        (WebCore::AbstractFrame::AbstractFrame):
+        (WebCore::AbstractFrame::~AbstractFrame):
+        * page/AbstractFrame.h: Added.
+        (WebCore::AbstractFrame::window const):
+        * page/DOMWindow.cpp:
+        (WebCore::DOMWindow::DOMWindow):
+        * page/DOMWindow.h:
+        (isType):
+        * page/Frame.cpp:
+        (WebCore::Frame::window const):
+        (WebCore::Frame::virtualWindow const):
+        * page/Frame.h:
+        (isType):
+        * page/GlobalFrameIdentifier.h: Added.
+        (WebCore::GlobalFrameIdentifier::encode const):
+        (WebCore::GlobalFrameIdentifier::decode):
+        * page/GlobalWindowIdentifier.h: Added.
+        (WebCore::operator==):
+        (WebCore::GlobalWindowIdentifier::hash const):
+        (WebCore::GlobalWindowIdentifier::encode const):
+        (WebCore::GlobalWindowIdentifier::decode):
+        (WTF::GlobalWindowIdentifierHash::hash):
+        (WTF::GlobalWindowIdentifierHash::equal):
+        (WTF::HashTraits<WebCore::GlobalWindowIdentifier>::emptyValue):
+        (WTF::HashTraits<WebCore::GlobalWindowIdentifier>::constructDeletedValue):
+        (WTF::HashTraits<WebCore::GlobalWindowIdentifier>::isDeletedValue):
+
+        * page/RemoteDOMWindow.cpp: Added.
+        (WebCore::RemoteDOMWindow::RemoteDOMWindow):
+        (WebCore::RemoteDOMWindow::~RemoteDOMWindow):
+        (WebCore::RemoteDOMWindow::self const):
+        (WebCore::RemoteDOMWindow::location const):
+        (WebCore::RemoteDOMWindow::close):
+        (WebCore::RemoteDOMWindow::closed const):
+        (WebCore::RemoteDOMWindow::focus):
+        (WebCore::RemoteDOMWindow::blur):
+        (WebCore::RemoteDOMWindow::length const):
+        (WebCore::RemoteDOMWindow::top const):
+        (WebCore::RemoteDOMWindow::opener const):
+        (WebCore::RemoteDOMWindow::parent const):
+        (WebCore::RemoteDOMWindow::postMessage):
+        The DOM API exposed on RemoteDOMWindow is only the subset of the DOMWindow API that is exposed cross origin,
+        since remote DOMWindow are always from a different origin. The short-term plan is to implement these in a
+        follow-up by relying on IPC (synchronous when necessary) to fetch the information from the real window in
+        the WebProcess where it lives. Longer term, we should probably keep RemoteDOMWindow members in sync with the
+        DOMWindow they're pointing to, so we do not have to rely on synchronous IPC.
+
+        * page/RemoteDOMWindow.h: Added.
+        (isType):
+        * page/RemoteFrame.cpp: Added.
+        (WebCore::RemoteFrame::RemoteFrame):
+        (WebCore::RemoteFrame::~RemoteFrame):
+        (WebCore::RemoteFrame::virtualWindow const):
+        * page/RemoteFrame.h: Added.
+        (isType):
+
 2018-04-12  Daniel Bates  <daba...@apple.com>
 
         Content-Type not enforced for <script> allows for XSS

Modified: trunk/Source/WebCore/Sources.txt (230612 => 230613)


--- trunk/Source/WebCore/Sources.txt	2018-04-12 23:41:41 UTC (rev 230612)
+++ trunk/Source/WebCore/Sources.txt	2018-04-12 23:55:02 UTC (rev 230613)
@@ -1311,6 +1311,8 @@
 mathml/MathMLUnderOverElement.cpp
 mathml/MathMLUnknownElement.cpp
 
+page/AbstractDOMWindow.cpp
+page/AbstractFrame.cpp
 page/AutoscrollController.cpp
 page/BarProp.cpp
 page/Base64Utilities.cpp
@@ -1370,6 +1372,8 @@
 page/PerformanceUserTiming.cpp
 page/PointerLockController.cpp
 page/PrintContext.cpp
+page/RemoteDOMWindow.cpp
+page/RemoteFrame.cpp
 page/ResourceUsageData.cpp
 page/ResourceUsageOverlay.cpp
 page/ResourceUsageThread.cpp

Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (230612 => 230613)


--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2018-04-12 23:41:41 UTC (rev 230612)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2018-04-12 23:55:02 UTC (rev 230613)
@@ -1201,6 +1201,12 @@
 		468344E01EDDFAAA00B7795B /* DOMRectList.h in Headers */ = {isa = PBXBuildFile; fileRef = 468344DE1EDDFA5F00B7795B /* DOMRectList.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		4689F1AF1267BAE100E8D380 /* FileMetadata.h in Headers */ = {isa = PBXBuildFile; fileRef = 4689F1AE1267BAE100E8D380 /* FileMetadata.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		46B63F6C1C6E8D19002E914B /* JSEventTargetCustom.h in Headers */ = {isa = PBXBuildFile; fileRef = 46B63F6B1C6E8CDF002E914B /* JSEventTargetCustom.h */; settings = {ATTRIBUTES = (Private, ); }; };
+		46B95195207D633400A7D2DD /* AbstractDOMWindow.h in Headers */ = {isa = PBXBuildFile; fileRef = 46B9518A207D632800A7D2DD /* AbstractDOMWindow.h */; settings = {ATTRIBUTES = (Private, ); }; };
+		46B95196207D633A00A7D2DD /* AbstractFrame.h in Headers */ = {isa = PBXBuildFile; fileRef = 46B9518F207D632B00A7D2DD /* AbstractFrame.h */; settings = {ATTRIBUTES = (Private, ); }; };
+		46B95197207D634000A7D2DD /* GlobalWindowIdentifier.h in Headers */ = {isa = PBXBuildFile; fileRef = 46B95190207D632C00A7D2DD /* GlobalWindowIdentifier.h */; settings = {ATTRIBUTES = (Private, ); }; };
+		46B95198207D634700A7D2DD /* GlobalFrameIdentifier.h in Headers */ = {isa = PBXBuildFile; fileRef = 46B95191207D632D00A7D2DD /* GlobalFrameIdentifier.h */; settings = {ATTRIBUTES = (Private, ); }; };
+		46B95199207D634D00A7D2DD /* RemoteDOMWindow.h in Headers */ = {isa = PBXBuildFile; fileRef = 46B9518E207D632A00A7D2DD /* RemoteDOMWindow.h */; settings = {ATTRIBUTES = (Private, ); }; };
+		46B9519A207D635400A7D2DD /* RemoteFrame.h in Headers */ = {isa = PBXBuildFile; fileRef = 46B95192207D632E00A7D2DD /* RemoteFrame.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		46C696CB1E7205F700597937 /* CPUMonitor.h in Headers */ = {isa = PBXBuildFile; fileRef = 46C696C91E7205E400597937 /* CPUMonitor.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		46C696CC1E7205FC00597937 /* CPUMonitor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 46C696CA1E7205E400597937 /* CPUMonitor.cpp */; };
 		46C83EFE1A9BBE2900A79A41 /* GeoNotifier.h in Headers */ = {isa = PBXBuildFile; fileRef = 46C83EFC1A9BBE2900A79A41 /* GeoNotifier.h */; settings = {ATTRIBUTES = (Private, ); }; };
@@ -7435,6 +7441,16 @@
 		468344DE1EDDFA5F00B7795B /* DOMRectList.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DOMRectList.h; sourceTree = "<group>"; };
 		4689F1AE1267BAE100E8D380 /* FileMetadata.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FileMetadata.h; sourceTree = "<group>"; };
 		46B63F6B1C6E8CDF002E914B /* JSEventTargetCustom.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSEventTargetCustom.h; sourceTree = "<group>"; };
+		46B9518A207D632800A7D2DD /* AbstractDOMWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AbstractDOMWindow.h; sourceTree = "<group>"; };
+		46B9518C207D632900A7D2DD /* RemoteFrame.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RemoteFrame.cpp; sourceTree = "<group>"; };
+		46B9518D207D632A00A7D2DD /* RemoteDOMWindow.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RemoteDOMWindow.cpp; sourceTree = "<group>"; };
+		46B9518E207D632A00A7D2DD /* RemoteDOMWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RemoteDOMWindow.h; sourceTree = "<group>"; };
+		46B9518F207D632B00A7D2DD /* AbstractFrame.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AbstractFrame.h; sourceTree = "<group>"; };
+		46B95190207D632C00A7D2DD /* GlobalWindowIdentifier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GlobalWindowIdentifier.h; sourceTree = "<group>"; };
+		46B95191207D632D00A7D2DD /* GlobalFrameIdentifier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GlobalFrameIdentifier.h; sourceTree = "<group>"; };
+		46B95192207D632E00A7D2DD /* RemoteFrame.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RemoteFrame.h; sourceTree = "<group>"; };
+		46B95193207D632F00A7D2DD /* AbstractDOMWindow.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AbstractDOMWindow.cpp; sourceTree = "<group>"; };
+		46B95194207D633000A7D2DD /* AbstractFrame.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AbstractFrame.cpp; sourceTree = "<group>"; };
 		46C696C91E7205E400597937 /* CPUMonitor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPUMonitor.h; sourceTree = "<group>"; };
 		46C696CA1E7205E400597937 /* CPUMonitor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CPUMonitor.cpp; sourceTree = "<group>"; };
 		46C83EFB1A9BBE2900A79A41 /* GeoNotifier.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GeoNotifier.cpp; sourceTree = "<group>"; };
@@ -18948,6 +18964,10 @@
 				18A6CD6F0D8F2025001DC3CE /* ios */,
 				93C09A820B064F05005ABD4D /* mac */,
 				1AF62EE114DA22A70041556C /* scrolling */,
+				46B95193207D632F00A7D2DD /* AbstractDOMWindow.cpp */,
+				46B9518A207D632800A7D2DD /* AbstractDOMWindow.h */,
+				46B95194207D633000A7D2DD /* AbstractFrame.cpp */,
+				46B9518F207D632B00A7D2DD /* AbstractFrame.h */,
 				724EE54E1DC7F25B00A91FFB /* ActivityState.h */,
 				724EE54F1DC7F25B00A91FFB /* ActivityStateChangeObserver.h */,
 				BCF48CE61370D114004E87D6 /* AdjustViewSizeOrNot.h */,
@@ -19029,7 +19049,9 @@
 				65CBFEF70974F607001DAC25 /* FrameView.cpp */,
 				65CBFEF80974F607001DAC25 /* FrameView.h */,
 				574D42791D594FF6002CF50E /* GlobalCrypto.idl */,
+				46B95191207D632D00A7D2DD /* GlobalFrameIdentifier.h */,
 				7C9892451F5A07650091DC70 /* GlobalPerformance.idl */,
+				46B95190207D632C00A7D2DD /* GlobalWindowIdentifier.h */,
 				BC94D1500C275C8B006BC617 /* History.cpp */,
 				BC94D1510C275C8B006BC617 /* History.h */,
 				BC94D1520C275C8B006BC617 /* History.idl */,
@@ -19122,6 +19144,10 @@
 				3772B09516535856000A49CA /* PopupOpeningObserver.h */,
 				B776D43C1104527500BEB0EC /* PrintContext.cpp */,
 				B776D43A1104525D00BEB0EC /* PrintContext.h */,
+				46B9518D207D632A00A7D2DD /* RemoteDOMWindow.cpp */,
+				46B9518E207D632A00A7D2DD /* RemoteDOMWindow.h */,
+				46B9518C207D632900A7D2DD /* RemoteFrame.cpp */,
+				46B95192207D632E00A7D2DD /* RemoteFrame.h */,
 				A5071E8A1C56FAFA009951BE /* ResourceUsageData.cpp */,
 				A5071E821C56D079009951BE /* ResourceUsageData.h */,
 				ADBAD6EC1BCDD95000381325 /* ResourceUsageOverlay.cpp */,
@@ -26683,6 +26709,8 @@
 			files = (
 				7CD0E2B81F80A4820016A4CE /* AbortController.h in Headers */,
 				7CD0E2BF1F80A56E0016A4CE /* AbortSignal.h in Headers */,
+				46B95195207D633400A7D2DD /* AbstractDOMWindow.h in Headers */,
+				46B95196207D633A00A7D2DD /* AbstractFrame.h in Headers */,
 				F48223131E386E240066FC79 /* AbstractPasteboard.h in Headers */,
 				41E1B1D10FF5986900576B3B /* AbstractWorker.h in Headers */,
 				29A8122E0FBB9C1D00510293 /* AccessibilityARIAGridCell.h in Headers */,
@@ -27671,6 +27699,8 @@
 				0FB6252F18DE1B1500A07C05 /* GeometryUtilities.h in Headers */,
 				46C83EFE1A9BBE2900A79A41 /* GeoNotifier.h in Headers */,
 				9746AF2A14F4DDE6003E7A70 /* Geoposition.h in Headers */,
+				46B95198207D634700A7D2DD /* GlobalFrameIdentifier.h in Headers */,
+				46B95197207D634000A7D2DD /* GlobalWindowIdentifier.h in Headers */,
 				086BBD0F136039C2008B15D8 /* Glyph.h in Headers */,
 				B2C3DA6C0D006CD600EF6F26 /* GlyphBuffer.h in Headers */,
 				C5D4AA7A116BAFB60069CA93 /* GlyphMetricsMap.h in Headers */,
@@ -29437,6 +29467,8 @@
 				A578F43F1DE0B630003DFC6A /* RejectedPromiseTracker.h in Headers */,
 				CDFC360618CA61C20026E56F /* RemoteCommandListener.h in Headers */,
 				CD8ACA891D237AA200ECC59E /* RemoteCommandListenerMac.h in Headers */,
+				46B95199207D634D00A7D2DD /* RemoteDOMWindow.h in Headers */,
+				46B9519A207D635400A7D2DD /* RemoteFrame.h in Headers */,
 				D06C0D8F0CFD11460065F43F /* RemoveFormatCommand.h in Headers */,
 				93309E05099E64920056E581 /* RemoveNodeCommand.h in Headers */,
 				93309E07099E64920056E581 /* RemoveNodePreservingChildrenCommand.h in Headers */,

Modified: trunk/Source/WebCore/loader/ContentFilter.cpp (230612 => 230613)


--- trunk/Source/WebCore/loader/ContentFilter.cpp	2018-04-12 23:41:41 UTC (rev 230612)
+++ trunk/Source/WebCore/loader/ContentFilter.cpp	2018-04-12 23:55:02 UTC (rev 230613)
@@ -231,7 +231,7 @@
     RefPtr<Frame> frame { m_documentLoader.frame() };
     String unblockRequestDeniedScript { m_blockingContentFilter->unblockRequestDeniedScript() };
     if (!unblockRequestDeniedScript.isEmpty() && frame) {
-        static_assert(std::is_base_of<ThreadSafeRefCounted<Frame>, Frame>::value, "Frame must be ThreadSafeRefCounted.");
+        static_assert(std::is_base_of<ThreadSafeRefCounted<AbstractFrame>, Frame>::value, "AbstractFrame must be ThreadSafeRefCounted.");
         unblockHandler.wrapWithDecisionHandler([frame = WTFMove(frame), script = unblockRequestDeniedScript.isolatedCopy()](bool unblocked) {
             if (!unblocked)
                 frame->script().executeScript(script);

Added: trunk/Source/WebCore/page/AbstractDOMWindow.cpp (0 => 230613)


--- trunk/Source/WebCore/page/AbstractDOMWindow.cpp	                        (rev 0)
+++ trunk/Source/WebCore/page/AbstractDOMWindow.cpp	2018-04-12 23:55:02 UTC (rev 230613)
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2018 Apple 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 INC. AND ITS CONTRIBUTORS ``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 INC. OR ITS 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 "AbstractDOMWindow.h"
+
+#include <wtf/NeverDestroyed.h>
+
+namespace WebCore {
+
+HashMap<GlobalWindowIdentifier, AbstractDOMWindow*>& AbstractDOMWindow::allWindows()
+{
+    ASSERT(isMainThread());
+    static NeverDestroyed<HashMap<GlobalWindowIdentifier, AbstractDOMWindow*>> map;
+    return map;
+}
+
+AbstractDOMWindow::AbstractDOMWindow(GlobalWindowIdentifier&& identifier)
+    : m_identifier(WTFMove(identifier))
+{
+    ASSERT(!allWindows().contains(identifier));
+    allWindows().add(identifier, this);
+}
+
+AbstractDOMWindow::~AbstractDOMWindow()
+{
+    ASSERT(allWindows().contains(identifier()));
+    allWindows().remove(identifier());
+}
+
+} // namespace WebCore

Added: trunk/Source/WebCore/page/AbstractDOMWindow.h (0 => 230613)


--- trunk/Source/WebCore/page/AbstractDOMWindow.h	                        (rev 0)
+++ trunk/Source/WebCore/page/AbstractDOMWindow.h	2018-04-12 23:55:02 UTC (rev 230613)
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2018 Apple 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 INC. AND ITS CONTRIBUTORS ``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 INC. OR ITS 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.
+ */
+
+#pragma once
+
+#include "Base64Utilities.h"
+#include "EventTarget.h"
+#include "GlobalWindowIdentifier.h"
+#include <wtf/HashMap.h>
+#include <wtf/RefCounted.h>
+
+namespace WebCore {
+
+class AbstractFrame;
+
+// FIXME: Rename DOMWindow to LocalWindow and AbstractDOMWindow to DOMWindow.
+class AbstractDOMWindow : public RefCounted<AbstractDOMWindow>, public EventTargetWithInlineData {
+public:
+    virtual ~AbstractDOMWindow();
+
+    static HashMap<GlobalWindowIdentifier, AbstractDOMWindow*>& allWindows();
+
+    const GlobalWindowIdentifier& identifier() const { return m_identifier; }
+
+    virtual AbstractFrame* frame() const = 0;
+
+    virtual bool isLocalDOMWindow() const = 0;
+    virtual bool isRemoteDOMWindow() const = 0;
+
+    using RefCounted::ref;
+    using RefCounted::deref;
+
+protected:
+    explicit AbstractDOMWindow(GlobalWindowIdentifier&&);
+
+    EventTargetInterface eventTargetInterface() const final { return DOMWindowEventTargetInterfaceType; }
+    void refEventTarget() final { ref(); }
+    void derefEventTarget() final { deref(); }
+
+private:
+    GlobalWindowIdentifier m_identifier;
+};
+
+} // namespace WebCore

Added: trunk/Source/WebCore/page/AbstractFrame.cpp (0 => 230613)


--- trunk/Source/WebCore/page/AbstractFrame.cpp	                        (rev 0)
+++ trunk/Source/WebCore/page/AbstractFrame.cpp	2018-04-12 23:55:02 UTC (rev 230613)
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2018 Apple 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 INC. AND ITS CONTRIBUTORS ``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 INC. OR ITS 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 "AbstractFrame.h"
+
+namespace WebCore {
+
+AbstractFrame::AbstractFrame()
+{
+}
+
+AbstractFrame::~AbstractFrame()
+{
+}
+
+} // namespace WebCore

Added: trunk/Source/WebCore/page/AbstractFrame.h (0 => 230613)


--- trunk/Source/WebCore/page/AbstractFrame.h	                        (rev 0)
+++ trunk/Source/WebCore/page/AbstractFrame.h	2018-04-12 23:55:02 UTC (rev 230613)
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2018 Apple 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 INC. AND ITS CONTRIBUTORS ``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 INC. OR ITS 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.
+ */
+
+#pragma once
+
+#include <wtf/ThreadSafeRefCounted.h>
+#include <wtf/UniqueRef.h>
+
+namespace WebCore {
+
+class AbstractDOMWindow;
+class WindowProxyController;
+
+// FIXME: Rename Frame to LocalFrame and AbstractFrame to Frame.
+class AbstractFrame : public ThreadSafeRefCounted<AbstractFrame> {
+public:
+    virtual ~AbstractFrame();
+
+    virtual bool isLocalFrame() const = 0;
+    virtual bool isRemoteFrame() const = 0;
+
+    AbstractDOMWindow* window() const { return virtualWindow(); }
+
+protected:
+    AbstractFrame();
+
+private:
+    virtual AbstractDOMWindow* virtualWindow() const = 0;
+};
+
+} // namespace WebCore

Modified: trunk/Source/WebCore/page/DOMWindow.cpp (230612 => 230613)


--- trunk/Source/WebCore/page/DOMWindow.cpp	2018-04-12 23:41:41 UTC (rev 230612)
+++ trunk/Source/WebCore/page/DOMWindow.cpp	2018-04-12 23:55:02 UTC (rev 230613)
@@ -401,7 +401,8 @@
 }
 
 DOMWindow::DOMWindow(Document& document)
-    : ContextDestructionObserver(&document)
+    : AbstractDOMWindow(GlobalWindowIdentifier { Process::identifier(), generateObjectIdentifier<WindowIdentifierType>() })
+    , ContextDestructionObserver(&document)
     , FrameDestructionObserver(document.frame())
 {
     ASSERT(frame());

Modified: trunk/Source/WebCore/page/DOMWindow.h (230612 => 230613)


--- trunk/Source/WebCore/page/DOMWindow.h	2018-04-12 23:41:41 UTC (rev 230612)
+++ trunk/Source/WebCore/page/DOMWindow.h	2018-04-12 23:55:02 UTC (rev 230613)
@@ -26,10 +26,11 @@
 
 #pragma once
 
+#include "AbstractDOMWindow.h"
 #include "Base64Utilities.h"
 #include "ContextDestructionObserver.h"
-#include "EventTarget.h"
 #include "ExceptionOr.h"
+#include "Frame.h"
 #include "FrameDestructionObserver.h"
 #include "ImageBitmap.h"
 #include "ScrollToOptions.h"
@@ -87,9 +88,9 @@
 enum SetLocationLocking { LockHistoryBasedOnGestureState, LockHistoryAndBackForwardList };
 
 // FIXME: DOMWindow shouldn't subclass FrameDestructionObserver and instead should get to Frame via its Document.
+// FIXME: Rename DOMWindow to LocalWindow and AbstractDOMWindow to DOMWindow.
 class DOMWindow final
-    : public RefCounted<DOMWindow>
-    , public EventTargetWithInlineData
+    : public AbstractDOMWindow
     , public ContextDestructionObserver
     , public FrameDestructionObserver
     , public Base64Utilities
@@ -198,6 +199,8 @@
     DOMWindow* parent() const;
     DOMWindow* top() const;
 
+    Frame* frame() const final { return FrameDestructionObserver::frame(); }
+
     String origin() const;
 
     // DOM Level 2 AbstractView Interface
@@ -276,9 +279,6 @@
 
     void finishedLoading();
 
-    using RefCounted::ref;
-    using RefCounted::deref;
-
     // HTML 5 key/value storage
     ExceptionOr<Storage*> sessionStorage() const;
     ExceptionOr<Storage*> localStorage() const;
@@ -338,9 +338,11 @@
 private:
     explicit DOMWindow(Document&);
 
-    EventTargetInterface eventTargetInterface() const final { return DOMWindowEventTargetInterfaceType; }
     ScriptExecutionContext* scriptExecutionContext() const final { return ContextDestructionObserver::scriptExecutionContext(); }
 
+    bool isLocalDOMWindow() const final { return true; }
+    bool isRemoteDOMWindow() const final { return false; }
+
     Page* page();
     bool allowedToChangeWindowGeometry() const;
 
@@ -347,9 +349,6 @@
     void frameDestroyed() final;
     void willDetachPage() final;
 
-    void refEventTarget() final { ref(); }
-    void derefEventTarget() final { deref(); }
-
     static RefPtr<Frame> createWindow(const String& urlString, const AtomicString& frameName, const WindowFeatures&, DOMWindow& activeWindow, Frame& firstFrame, Frame& openerFrame, const WTF::Function<void(DOMWindow&)>& prepareDialogFunction = nullptr);
     bool isInsecureScriptAccess(DOMWindow& activeWindow, const String& urlString);
 
@@ -432,5 +431,6 @@
 } // namespace WebCore
 
 SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::DOMWindow)
+    static bool isType(const WebCore::AbstractDOMWindow& window) { return window.isLocalDOMWindow(); }
     static bool isType(const WebCore::EventTarget& target) { return target.eventTargetInterface() == WebCore::DOMWindowEventTargetInterfaceType; }
 SPECIALIZE_TYPE_TRAITS_END()

Modified: trunk/Source/WebCore/page/Frame.cpp (230612 => 230613)


--- trunk/Source/WebCore/page/Frame.cpp	2018-04-12 23:41:41 UTC (rev 230612)
+++ trunk/Source/WebCore/page/Frame.cpp	2018-04-12 23:55:02 UTC (rev 230613)
@@ -943,6 +943,16 @@
         view()->setCanHaveScrollbars(owner->scrollingMode() != ScrollbarAlwaysOff);
 }
 
+DOMWindow* Frame::window() const
+{
+    return document() ? document()->domWindow() : nullptr;
+}
+
+AbstractDOMWindow* Frame::virtualWindow() const
+{
+    return window();
+}
+
 String Frame::layerTreeAsText(LayerTreeFlags flags) const
 {
     document()->updateLayout();

Modified: trunk/Source/WebCore/page/Frame.h (230612 => 230613)


--- trunk/Source/WebCore/page/Frame.h	2018-04-12 23:41:41 UTC (rev 230612)
+++ trunk/Source/WebCore/page/Frame.h	2018-04-12 23:55:02 UTC (rev 230613)
@@ -27,12 +27,12 @@
 
 #pragma once
 
+#include "AbstractFrame.h"
 #include "AdjustViewSizeOrNot.h"
 #include "FrameTree.h"
 #include "ScrollTypes.h"
 #include "UserScriptTypes.h"
 #include <wtf/HashSet.h>
-#include <wtf/ThreadSafeRefCounted.h>
 #include <wtf/UniqueRef.h>
 
 #if PLATFORM(IOS)
@@ -61,6 +61,7 @@
 
 class CSSAnimationController;
 class Color;
+class DOMWindow;
 class Document;
 class Editor;
 class Element;
@@ -117,7 +118,8 @@
 };
 typedef unsigned LayerTreeFlags;
 
-class Frame final : public ThreadSafeRefCounted<Frame> {
+// FIXME: Rename Frame to LocalFrame and AbstractFrame to Frame.
+class Frame final : public AbstractFrame {
 public:
     WEBCORE_EXPORT static Ref<Frame> create(Page*, HTMLFrameOwnerElement*, FrameLoaderClient*);
 
@@ -134,6 +136,8 @@
 
     WEBCORE_EXPORT ~Frame();
 
+    DOMWindow* window() const;
+
     void addDestructionObserver(FrameDestructionObserver*);
     void removeDestructionObserver(FrameDestructionObserver*);
 
@@ -291,6 +295,11 @@
 
     void dropChildren();
 
+    bool isLocalFrame() const final { return true; }
+    bool isRemoteFrame() const final { return false; }
+
+    AbstractDOMWindow* virtualWindow() const final;
+
     HashSet<FrameDestructionObserver*> m_destructionObservers;
 
     Frame& m_mainFrame;
@@ -390,3 +399,7 @@
 }
 
 } // namespace WebCore
+
+SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::Frame)
+    static bool isType(const WebCore::AbstractFrame& frame) { return frame.isLocalFrame(); }
+SPECIALIZE_TYPE_TRAITS_END()

Added: trunk/Source/WebCore/page/GlobalFrameIdentifier.h (0 => 230613)


--- trunk/Source/WebCore/page/GlobalFrameIdentifier.h	                        (rev 0)
+++ trunk/Source/WebCore/page/GlobalFrameIdentifier.h	2018-04-12 23:55:02 UTC (rev 230613)
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2018 Apple 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 INC. AND ITS CONTRIBUTORS ``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 INC. OR ITS 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.
+ */
+
+#pragma once
+
+#include <wtf/Optional.h>
+
+namespace WebCore {
+
+// Frame identifier that is unique across all WebContent processes.
+struct GlobalFrameIdentifier {
+    uint64_t pageID;
+    uint64_t frameID;
+
+    template<class Encoder> void encode(Encoder&) const;
+    template<class Decoder> static std::optional<GlobalFrameIdentifier> decode(Decoder&);
+};
+
+template<class Encoder>
+void GlobalFrameIdentifier::encode(Encoder& encoder) const
+{
+    encoder << pageID << frameID;
+}
+
+template<class Decoder>
+std::optional<GlobalFrameIdentifier> GlobalFrameIdentifier::decode(Decoder& decoder)
+{
+    std::optional<uint64_t> pageID;
+    decoder >> pageID;
+    if (!pageID)
+        return std::nullopt;
+
+    std::optional<uint64_t> frameID;
+    decoder >> frameID;
+    if (!frameID)
+        return std::nullopt;
+
+    return { { WTFMove(*pageID), WTFMove(*frameID) } };
+}
+
+} // namespace WebCore

Added: trunk/Source/WebCore/page/GlobalWindowIdentifier.h (0 => 230613)


--- trunk/Source/WebCore/page/GlobalWindowIdentifier.h	                        (rev 0)
+++ trunk/Source/WebCore/page/GlobalWindowIdentifier.h	2018-04-12 23:55:02 UTC (rev 230613)
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2018 Apple 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 INC. AND ITS CONTRIBUTORS ``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 INC. OR ITS 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.
+ */
+
+#pragma once
+
+#include "Process.h"
+#include <wtf/HashTraits.h>
+#include <wtf/ObjectIdentifier.h>
+
+namespace WebCore {
+
+enum WindowIdentifierType { };
+using WindowIdentifier = ObjectIdentifier<WindowIdentifierType>;
+
+// Window identifier that is unique across all WebContent processes.
+struct GlobalWindowIdentifier {
+    ProcessIdentifier processIdentifier;
+    WindowIdentifier windowIdentifier;
+
+    unsigned hash() const;
+
+    template<class Encoder> void encode(Encoder&) const;
+    template<class Decoder> static std::optional<GlobalWindowIdentifier> decode(Decoder&);
+};
+
+inline bool operator==(const GlobalWindowIdentifier& a, const GlobalWindowIdentifier& b)
+{
+    return a.processIdentifier == b.processIdentifier &&  a.windowIdentifier == b.windowIdentifier;
+}
+
+inline unsigned GlobalWindowIdentifier::hash() const
+{
+    uint64_t identifiers[2];
+    identifiers[0] = processIdentifier.toUInt64();
+    identifiers[1] = windowIdentifier.toUInt64();
+
+    return StringHasher::hashMemory(identifiers, sizeof(identifiers));
+}
+
+template<class Encoder>
+void GlobalWindowIdentifier::encode(Encoder& encoder) const
+{
+    encoder << processIdentifier << windowIdentifier;
+}
+
+template<class Decoder>
+std::optional<GlobalWindowIdentifier> GlobalWindowIdentifier::decode(Decoder& decoder)
+{
+    std::optional<ProcessIdentifier> processIdentifier;
+    decoder >> processIdentifier;
+    if (!processIdentifier)
+        return std::nullopt;
+
+    std::optional<WindowIdentifier> windowIdentifier;
+    decoder >> windowIdentifier;
+    if (!windowIdentifier)
+        return std::nullopt;
+
+    return { { WTFMove(*processIdentifier), WTFMove(*windowIdentifier) } };
+}
+
+} // namespace WebCore
+
+namespace WTF {
+
+struct GlobalWindowIdentifierHash {
+    static unsigned hash(const WebCore::GlobalWindowIdentifier& key) { return key.hash(); }
+    static bool equal(const WebCore::GlobalWindowIdentifier& a, const WebCore::GlobalWindowIdentifier& b) { return a == b; }
+    static const bool safeToCompareToEmptyOrDeleted = true;
+};
+
+template<> struct HashTraits<WebCore::GlobalWindowIdentifier> : GenericHashTraits<WebCore::GlobalWindowIdentifier> {
+    static WebCore::GlobalWindowIdentifier emptyValue() { return { }; }
+
+    static void constructDeletedValue(WebCore::GlobalWindowIdentifier& slot) { slot.windowIdentifier = makeObjectIdentifier<WebCore::WindowIdentifierType>(std::numeric_limits<uint64_t>::max()); }
+    static bool isDeletedValue(const WebCore::GlobalWindowIdentifier& slot) { return slot.windowIdentifier.toUInt64() == std::numeric_limits<uint64_t>::max(); }
+};
+
+template<> struct DefaultHash<WebCore::GlobalWindowIdentifier> {
+    typedef GlobalWindowIdentifierHash Hash;
+};
+
+} // namespace WTF

Added: trunk/Source/WebCore/page/RemoteDOMWindow.cpp (0 => 230613)


--- trunk/Source/WebCore/page/RemoteDOMWindow.cpp	                        (rev 0)
+++ trunk/Source/WebCore/page/RemoteDOMWindow.cpp	2018-04-12 23:55:02 UTC (rev 230613)
@@ -0,0 +1,122 @@
+/*
+ * Copyright (C) 2018 Apple 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 INC. AND ITS CONTRIBUTORS ``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 INC. OR ITS 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 "RemoteDOMWindow.h"
+
+#include "RemoteFrame.h"
+#include <_javascript_Core/JSCJSValue.h>
+#include <_javascript_Core/JSCJSValueInlines.h>
+
+namespace WebCore {
+
+RemoteDOMWindow::RemoteDOMWindow(Ref<RemoteFrame>&& frame, GlobalWindowIdentifier&& identifier)
+    : AbstractDOMWindow(WTFMove(identifier))
+    , m_frame(WTFMove(frame))
+{
+    m_frame->setWindow(this);
+}
+
+RemoteDOMWindow::~RemoteDOMWindow()
+{
+    if (m_frame)
+        m_frame->setWindow(nullptr);
+}
+
+RemoteDOMWindow* RemoteDOMWindow::self() const
+{
+    if (!m_frame)
+        return nullptr;
+    return const_cast<RemoteDOMWindow*>(this);
+}
+
+Location* RemoteDOMWindow::location() const
+{
+    // FIXME: Implemented this.
+    return nullptr;
+}
+
+void RemoteDOMWindow::close(Document&)
+{
+    // FIXME: Implemented this.
+}
+
+bool RemoteDOMWindow::closed() const
+{
+    return !m_frame;
+}
+
+void RemoteDOMWindow::focus(DOMWindow& incumbentWindow)
+{
+    UNUSED_PARAM(incumbentWindow);
+    // FIXME: Implemented this.
+}
+
+void RemoteDOMWindow::blur()
+{
+    // FIXME: Implemented this.
+}
+
+unsigned RemoteDOMWindow::length() const
+{
+    // FIXME: Implemented this.
+    return 0;
+}
+
+RemoteDOMWindow* RemoteDOMWindow::top() const
+{
+    if (!m_frame)
+        return nullptr;
+
+    // FIXME: Implemented this.
+    return const_cast<RemoteDOMWindow*>(this);
+}
+
+DOMWindow* RemoteDOMWindow::opener() const
+{
+    // FIXME: Implemented this.
+    return nullptr;
+}
+
+RemoteDOMWindow* RemoteDOMWindow::parent() const
+{
+    if (!m_frame)
+        return nullptr;
+
+    // FIXME: Implemented this.
+    return const_cast<RemoteDOMWindow*>(this);
+}
+
+ExceptionOr<void> RemoteDOMWindow::postMessage(JSC::ExecState&, DOMWindow& incumbentWindow, JSC::JSValue message, const String& targetOrigin, Vector<JSC::Strong<JSC::JSObject>>&&)
+{
+    UNUSED_PARAM(incumbentWindow);
+    UNUSED_PARAM(message);
+    UNUSED_PARAM(targetOrigin);
+
+    // FIXME: Implemented this.
+    return Exception { NotSupportedError };
+}
+
+} // namespace WebCore

Added: trunk/Source/WebCore/page/RemoteDOMWindow.h (0 => 230613)


--- trunk/Source/WebCore/page/RemoteDOMWindow.h	                        (rev 0)
+++ trunk/Source/WebCore/page/RemoteDOMWindow.h	2018-04-12 23:55:02 UTC (rev 230613)
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2018 Apple 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 INC. AND ITS CONTRIBUTORS ``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 INC. OR ITS 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.
+ */
+
+#pragma once
+
+#include "AbstractDOMWindow.h"
+#include "RemoteFrame.h"
+#include <wtf/TypeCasts.h>
+
+namespace JSC {
+class ExecState;
+class JSObject;
+class JSValue;
+template<typename> class Strong;
+}
+
+namespace WebCore {
+
+class DOMWindow;
+class Document;
+class Location;
+
+class RemoteDOMWindow final : public AbstractDOMWindow {
+public:
+    static Ref<RemoteDOMWindow> create(Ref<RemoteFrame>&& frame, GlobalWindowIdentifier&& identifier)
+    {
+        return adoptRef(*new RemoteDOMWindow(WTFMove(frame), WTFMove(identifier)));
+    }
+
+    ~RemoteDOMWindow() final;
+
+    RemoteFrame* frame() const final { return m_frame.get(); }
+    ScriptExecutionContext* scriptExecutionContext() const final { return nullptr; }
+
+    // DOM API exposed cross-origin.
+    RemoteDOMWindow* self() const;
+    Location* location() const;
+    void close(Document&);
+    bool closed() const;
+    void focus(DOMWindow& incumbentWindow);
+    void blur();
+    unsigned length() const;
+    RemoteDOMWindow* top() const;
+    DOMWindow* opener() const;
+    RemoteDOMWindow* parent() const;
+    ExceptionOr<void> postMessage(JSC::ExecState&, DOMWindow& incumbentWindow, JSC::JSValue message, const String& targetOrigin, Vector<JSC::Strong<JSC::JSObject>>&&);
+
+private:
+    WEBCORE_EXPORT RemoteDOMWindow(Ref<RemoteFrame>&&, GlobalWindowIdentifier&&);
+
+    bool isRemoteDOMWindow() const final { return true; }
+    bool isLocalDOMWindow() const final { return false; }
+
+    RefPtr<RemoteFrame> m_frame;
+};
+
+} // namespace WebCore
+
+SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::RemoteDOMWindow)
+    static bool isType(const WebCore::AbstractDOMWindow& window) { return window.isRemoteDOMWindow(); }
+SPECIALIZE_TYPE_TRAITS_END()

Added: trunk/Source/WebCore/page/RemoteFrame.cpp (0 => 230613)


--- trunk/Source/WebCore/page/RemoteFrame.cpp	                        (rev 0)
+++ trunk/Source/WebCore/page/RemoteFrame.cpp	2018-04-12 23:55:02 UTC (rev 230613)
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2018 Apple 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 INC. AND ITS CONTRIBUTORS ``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 INC. OR ITS 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 "RemoteFrame.h"
+
+#include "RemoteDOMWindow.h"
+
+namespace WebCore {
+
+RemoteFrame::RemoteFrame(GlobalFrameIdentifier&& frameIdentifier)
+    : m_identifier(WTFMove(frameIdentifier))
+{
+}
+
+RemoteFrame::~RemoteFrame()
+{
+}
+
+AbstractDOMWindow* RemoteFrame::virtualWindow() const
+{
+    return window();
+}
+
+} // namespace WebCore

Added: trunk/Source/WebCore/page/RemoteFrame.h (0 => 230613)


--- trunk/Source/WebCore/page/RemoteFrame.h	                        (rev 0)
+++ trunk/Source/WebCore/page/RemoteFrame.h	2018-04-12 23:55:02 UTC (rev 230613)
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2018 Apple 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 INC. AND ITS CONTRIBUTORS ``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 INC. OR ITS 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.
+ */
+
+#pragma once
+
+#include "AbstractFrame.h"
+#include "GlobalFrameIdentifier.h"
+#include <wtf/Ref.h>
+#include <wtf/TypeCasts.h>
+
+namespace WebCore {
+
+class RemoteDOMWindow;
+
+class RemoteFrame final : public AbstractFrame {
+public:
+    static Ref<RemoteFrame> create(GlobalFrameIdentifier&& frameIdentifier)
+    {
+        return adoptRef(* new RemoteFrame(WTFMove(frameIdentifier)));
+    }
+    ~RemoteFrame();
+
+    const GlobalFrameIdentifier& identifier() const { return m_identifier; }
+
+    void setWindow(RemoteDOMWindow* window) { m_window = window; }
+    RemoteDOMWindow* window() const { return m_window; }
+
+private:
+    WEBCORE_EXPORT explicit RemoteFrame(GlobalFrameIdentifier&&);
+
+    bool isRemoteFrame() const final { return true; }
+    bool isLocalFrame() const final { return false; }
+
+    AbstractDOMWindow* virtualWindow() const final;
+
+    GlobalFrameIdentifier m_identifier;
+    RemoteDOMWindow* m_window { nullptr };
+};
+
+} // namespace WebCore
+
+SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::RemoteFrame)
+    static bool isType(const WebCore::AbstractFrame& frame) { return frame.isRemoteFrame(); }
+SPECIALIZE_TYPE_TRAITS_END()
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to