Changeset 291589 in webkit
- Timestamp:
- Mar 21, 2022, 4:46:48 PM (4 years ago)
- Location:
- trunk
- Files:
-
- 3 added
- 19 edited
-
LayoutTests/imported/w3c/ChangeLog (modified) (1 diff)
-
LayoutTests/imported/w3c/web-platform-tests/webmessaging/broadcastchannel/opaque-origin-expected.txt (added)
-
LayoutTests/imported/w3c/web-platform-tests/webmessaging/broadcastchannel/opaque-origin.html (added)
-
LayoutTests/imported/w3c/web-platform-tests/webmessaging/broadcastchannel/w3c-import.log (modified) (1 diff)
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/Headers.cmake (modified) (1 diff)
-
Source/WebCore/WebCore.xcodeproj/project.pbxproj (modified) (4 diffs)
-
Source/WebCore/dom/BroadcastChannel.cpp (modified) (5 diffs)
-
Source/WebCore/dom/BroadcastChannelRegistry.h (modified) (1 diff)
-
Source/WebCore/loader/EmptyClients.cpp (modified) (1 diff)
-
Source/WebCore/page/PartitionedSecurityOrigin.h (added)
-
Source/WebKit/ChangeLog (modified) (1 diff)
-
Source/WebKit/NetworkProcess/NetworkBroadcastChannelRegistry.cpp (modified) (5 diffs)
-
Source/WebKit/NetworkProcess/NetworkBroadcastChannelRegistry.h (modified) (2 diffs)
-
Source/WebKit/NetworkProcess/NetworkProcess.cpp (modified) (1 diff)
-
Source/WebKit/NetworkProcess/NetworkProcess.h (modified) (1 diff)
-
Source/WebKit/NetworkProcess/NetworkSession.cpp (modified) (1 diff)
-
Source/WebKit/WebProcess/WebCoreSupport/WebBroadcastChannelRegistry.cpp (modified) (6 diffs)
-
Source/WebKit/WebProcess/WebCoreSupport/WebBroadcastChannelRegistry.h (modified) (3 diffs)
-
Source/WebKitLegacy/ChangeLog (modified) (1 diff)
-
Source/WebKitLegacy/WebCoreSupport/WebBroadcastChannelRegistry.cpp (modified) (3 diffs)
-
Source/WebKitLegacy/WebCoreSupport/WebBroadcastChannelRegistry.h (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/imported/w3c/ChangeLog
r291555 r291589 1 2022-03-21 Chris Dumez <cdumez@apple.com> 2 3 BroadcastChannel instances in distinct opaque origins can communicate 4 https://bugs.webkit.org/show_bug.cgi?id=238090 5 <rdar://problem/90511155> 6 7 Reviewed by Alex Christensen. 8 9 Import web-platform-tests test coverage. 10 11 * web-platform-tests/webmessaging/broadcastchannel/opaque-origin-expected.txt: Added. 12 * web-platform-tests/webmessaging/broadcastchannel/opaque-origin.html: Added. 13 * web-platform-tests/webmessaging/broadcastchannel/w3c-import.log: 14 1 15 2022-03-21 Ziran Sun <zsun@igalia.com> 2 16 -
trunk/LayoutTests/imported/w3c/web-platform-tests/webmessaging/broadcastchannel/w3c-import.log
r285503 r291589 20 20 /LayoutTests/imported/w3c/web-platform-tests/webmessaging/broadcastchannel/detached-iframe.html 21 21 /LayoutTests/imported/w3c/web-platform-tests/webmessaging/broadcastchannel/interface.any.js 22 /LayoutTests/imported/w3c/web-platform-tests/webmessaging/broadcastchannel/opaque-origin.html 22 23 /LayoutTests/imported/w3c/web-platform-tests/webmessaging/broadcastchannel/ordering.html 23 24 /LayoutTests/imported/w3c/web-platform-tests/webmessaging/broadcastchannel/origin.window.js -
trunk/Source/WebCore/ChangeLog
r291588 r291589 1 2022-03-21 Chris Dumez <cdumez@apple.com> 2 3 BroadcastChannel instances in distinct opaque origins can communicate 4 https://bugs.webkit.org/show_bug.cgi?id=238090 5 <rdar://problem/90511155> 6 7 Reviewed by Alex Christensen. 8 9 The issue is that we would use a ClientOrigin to distinguish origins for BroadcastChannel, 10 which relies on SecurityOriginData internally. A unique/opaque SecurityOrigin becomes an empty 11 SecurityOriginData upon conversion. As a result, when comparing ClientOrigin objects from 12 unique SecurityOrigins, they would compare as equal. 13 14 To address the issue, I introduced a new PartitionedSecurityOrigin type which is similar 15 to ClientOrigin but stores SecurityOrigin objects internally, instead of SecurityOriginData 16 objects. PartitionedSecurityOrigin's operator==() is such that different SecurityOrigins 17 would not be equal but the same unique SecurityOrigin would be. I then used this new 18 PartitionedSecurityOrigin type as key in our HashMap on the WebProcess side instead of 19 ClientOrigin. This allows communication between several BroadcastChannels from the same 20 unique origin, while preventing communication between distinct opaque origins. 21 22 When the PartitionedSecurityOrigin contains an opaque security origin, we don't involve 23 the Network Process at all since the destination can only be in the same WebProcess. 24 25 Test: imported/w3c/web-platform-tests/webmessaging/broadcastchannel/opaque-origin.html 26 27 * Headers.cmake: 28 * WebCore.xcodeproj/project.pbxproj: 29 * dom/BroadcastChannel.cpp: 30 (WebCore::shouldPartitionOrigin): 31 (WebCore::BroadcastChannel::MainThreadBridge::registerChannel): 32 (WebCore::BroadcastChannel::MainThreadBridge::unregisterChannel): 33 (WebCore::BroadcastChannel::MainThreadBridge::postMessage): 34 * dom/BroadcastChannelRegistry.h: 35 * loader/EmptyClients.cpp: 36 * page/PartitionedSecurityOrigin.h: Added. 37 (WebCore::PartitionedSecurityOrigin::PartitionedSecurityOrigin): 38 (WebCore::PartitionedSecurityOrigin::isHashTableDeletedValue const): 39 (WebCore::PartitionedSecurityOrigin::isHashTableEmptyValue const): 40 (WebCore::operator==): 41 (WTF::add): 42 (WTF::PartitionedSecurityOriginHash::hash): 43 (WTF::PartitionedSecurityOriginHash::equal): 44 (WTF::HashTraits<WebCore::PartitionedSecurityOrigin>::emptyValue): 45 (WTF::HashTraits<WebCore::PartitionedSecurityOrigin>::constructEmptyValue): 46 (WTF::HashTraits<WebCore::PartitionedSecurityOrigin>::isEmptyValue): 47 (WTF::HashTraits<WebCore::PartitionedSecurityOrigin>::peek): 48 (WTF::HashTraits<WebCore::PartitionedSecurityOrigin>::take): 49 1 50 2022-03-21 Kate Cheney <katherine_cheney@apple.com> 2 51 -
trunk/Source/WebCore/Headers.cmake
r291548 r291589 1142 1142 page/PageOverlayController.h 1143 1143 page/PagePasteboardContext.h 1144 page/PartitionedSecurityOrigin.h 1144 1145 page/PerformanceLogging.h 1145 1146 page/PerformanceLoggingClient.h -
trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj
r291564 r291589 1358 1358 4688E98027B6B45000567CD2 /* CoreLocationGeolocationProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = 4688E97F27B6B44400567CD2 /* CoreLocationGeolocationProvider.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1359 1359 4688EE3C26DD2610002AF5C4 /* CrossOriginMode.h in Headers */ = {isa = PBXBuildFile; fileRef = 4688EE3A26DD260C002AF5C4 /* CrossOriginMode.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1360 46893B8427E8D74C002CC13D /* PartitionedSecurityOrigin.h in Headers */ = {isa = PBXBuildFile; fileRef = 46893B8327E8D716002CC13D /* PartitionedSecurityOrigin.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1360 1361 46943DC92763F817004B610E /* SharedWorkerObjectIdentifier.h in Headers */ = {isa = PBXBuildFile; fileRef = 46943DC72763F80E004B610E /* SharedWorkerObjectIdentifier.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1361 1362 46985F2327A4A6AD0097A32B /* SharedWorkerKey.h in Headers */ = {isa = PBXBuildFile; fileRef = 46985F2227A4A6860097A32B /* SharedWorkerKey.h */; settings = {ATTRIBUTES = (Private, ); }; }; … … 9289 9290 4688E97F27B6B44400567CD2 /* CoreLocationGeolocationProvider.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CoreLocationGeolocationProvider.h; sourceTree = "<group>"; }; 9290 9291 4688EE3A26DD260C002AF5C4 /* CrossOriginMode.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CrossOriginMode.h; sourceTree = "<group>"; }; 9292 46893B8327E8D716002CC13D /* PartitionedSecurityOrigin.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PartitionedSecurityOrigin.h; sourceTree = "<group>"; }; 9291 9293 468B8BDE25CC849300F67822 /* JSBaseAudioContextCustom.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = JSBaseAudioContextCustom.cpp; sourceTree = "<group>"; }; 9292 9294 46943DC72763F80E004B610E /* SharedWorkerObjectIdentifier.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SharedWorkerObjectIdentifier.h; sourceTree = "<group>"; }; … … 24263 24265 371E65CD13661EED00BEEDB0 /* PageSerializer.cpp */, 24264 24266 371E65CB13661EDC00BEEDB0 /* PageSerializer.h */, 24267 46893B8327E8D716002CC13D /* PartitionedSecurityOrigin.h */, 24265 24268 BC4A53282560563B0028C592 /* PDFImageCachingPolicy.h */, 24266 24269 7C72471E2516758800C363CD /* Performance+NavigationTiming.idl */, … … 36603 36606 5C4A0FDA25C3449A00D9EE97 /* ParsedRequestRange.h in Headers */, 36604 36607 536D5A23193E8E0C00CE4CAB /* ParsingUtilities.h in Headers */, 36608 46893B8427E8D74C002CC13D /* PartitionedSecurityOrigin.h in Headers */, 36605 36609 F55B3DCA1251F12D003EF269 /* PasswordInputType.h in Headers */, 36606 36610 4B2708C70AF19EE40065127F /* Pasteboard.h in Headers */, -
trunk/Source/WebCore/dom/BroadcastChannel.cpp
r290566 r291589 31 31 #include "MessageEvent.h" 32 32 #include "Page.h" 33 #include "PartitionedSecurityOrigin.h" 33 34 #include "SecurityOrigin.h" 34 35 #include "SerializedScriptValue.h" … … 87 88 const BroadcastChannelIdentifier m_identifier; 88 89 const String m_name; // Main thread only. 89 ClientOriginm_origin; // Main thread only.90 std::optional<PartitionedSecurityOrigin> m_origin; // Main thread only. 90 91 }; 91 92 … … 121 122 { 122 123 ensureOnMainThread([this, contextIdentifier = m_broadcastChannel->scriptExecutionContext()->identifier()](auto& document) { 123 m_origin = { shouldPartitionOrigin(document) ? document.topOrigin().data() : document.securityOrigin().data(), document.securityOrigin().data() };124 m_origin = PartitionedSecurityOrigin { shouldPartitionOrigin(document) ? document.topOrigin() : document.securityOrigin(), document.securityOrigin() }; 124 125 if (auto* page = document.page()) 125 page->broadcastChannelRegistry().registerChannel( m_origin, m_name, m_identifier);126 page->broadcastChannelRegistry().registerChannel(*m_origin, m_name, m_identifier); 126 127 channelToContextIdentifier().add(m_identifier, contextIdentifier); 127 128 }); … … 132 133 ensureOnMainThread([this](auto& document) { 133 134 if (auto* page = document.page()) 134 page->broadcastChannelRegistry().unregisterChannel( m_origin, m_name, m_identifier);135 page->broadcastChannelRegistry().unregisterChannel(*m_origin, m_name, m_identifier); 135 136 channelToContextIdentifier().remove(m_identifier); 136 137 }); … … 145 146 146 147 auto blobHandles = message->blobHandles(); 147 page->broadcastChannelRegistry().postMessage( m_origin, m_name, m_identifier, WTFMove(message), [blobHandles = WTFMove(blobHandles)] {148 page->broadcastChannelRegistry().postMessage(*m_origin, m_name, m_identifier, WTFMove(message), [blobHandles = WTFMove(blobHandles)] { 148 149 // Keeps Blob data inside messageData alive until the message has been delivered. 149 150 }); -
trunk/Source/WebCore/dom/BroadcastChannelRegistry.h
r282105 r291589 32 32 namespace WebCore { 33 33 34 struct PartitionedSecurityOrigin; 34 35 class SerializedScriptValue; 35 struct ClientOrigin;36 36 37 37 class BroadcastChannelRegistry : public RefCounted<BroadcastChannelRegistry> { 38 38 public: 39 39 virtual ~BroadcastChannelRegistry() { } 40 virtual void registerChannel(const ClientOrigin&, const String& name, BroadcastChannelIdentifier) = 0;41 virtual void unregisterChannel(const ClientOrigin&, const String& name, BroadcastChannelIdentifier) = 0;42 virtual void postMessage(const ClientOrigin&, const String& name, BroadcastChannelIdentifier source, Ref<SerializedScriptValue>&&, CompletionHandler<void()>&&) = 0;40 virtual void registerChannel(const PartitionedSecurityOrigin&, const String& name, BroadcastChannelIdentifier) = 0; 41 virtual void unregisterChannel(const PartitionedSecurityOrigin&, const String& name, BroadcastChannelIdentifier) = 0; 42 virtual void postMessage(const PartitionedSecurityOrigin&, const String& name, BroadcastChannelIdentifier source, Ref<SerializedScriptValue>&&, CompletionHandler<void()>&&) = 0; 43 43 }; 44 44 -
trunk/Source/WebCore/loader/EmptyClients.cpp
r290849 r291589 1189 1189 EmptyBroadcastChannelRegistry() = default; 1190 1190 1191 void registerChannel(const ClientOrigin&, const String&, BroadcastChannelIdentifier) final { }1192 void unregisterChannel(const ClientOrigin&, const String&, BroadcastChannelIdentifier) final { }1193 void postMessage(const ClientOrigin&, const String&, BroadcastChannelIdentifier, Ref<SerializedScriptValue>&&, CompletionHandler<void()>&&) final { }1191 void registerChannel(const PartitionedSecurityOrigin&, const String&, BroadcastChannelIdentifier) final { } 1192 void unregisterChannel(const PartitionedSecurityOrigin&, const String&, BroadcastChannelIdentifier) final { } 1193 void postMessage(const PartitionedSecurityOrigin&, const String&, BroadcastChannelIdentifier, Ref<SerializedScriptValue>&&, CompletionHandler<void()>&&) final { } 1194 1194 }; 1195 1195 -
trunk/Source/WebKit/ChangeLog
r291579 r291589 1 2022-03-21 Chris Dumez <cdumez@apple.com> 2 3 BroadcastChannel instances in distinct opaque origins can communicate 4 https://bugs.webkit.org/show_bug.cgi?id=238090 5 <rdar://problem/90511155> 6 7 Reviewed by Alex Christensen. 8 9 The issue is that we would use a ClientOrigin to distinguish origins for BroadcastChannel, 10 which relies on SecurityOriginData internally. A unique/opaque SecurityOrigin becomes an empty 11 SecurityOriginData upon conversion. As a result, when comparing ClientOrigin objects from 12 unique SecurityOrigins, they would compare as equal. 13 14 To address the issue, I introduced a new PartitionedSecurityOrigin type which is similar 15 to ClientOrigin but stores SecurityOrigin objects internally, instead of SecurityOriginData 16 objects. PartitionedSecurityOrigin's operator==() is such that different SecurityOrigins 17 would not be equal but the same unique SecurityOrigin would be. I then used this new 18 PartitionedSecurityOrigin type as key in our HashMap on the WebProcess side instead of 19 ClientOrigin. This allows communication between several BroadcastChannels from the same 20 unique origin, while preventing communication between distinct opaque origins. 21 22 When the PartitionedSecurityOrigin contains an opaque security origin, we don't involve 23 the Network Process at all since the destination can only be in the same WebProcess. 24 25 * WebProcess/WebCoreSupport/WebBroadcastChannelRegistry.cpp: 26 (WebKit::toClientOrigin): 27 (WebKit::WebBroadcastChannelRegistry::registerChannel): 28 (WebKit::WebBroadcastChannelRegistry::unregisterChannel): 29 (WebKit::WebBroadcastChannelRegistry::postMessage): 30 (WebKit::WebBroadcastChannelRegistry::postMessageLocally): 31 (WebKit::WebBroadcastChannelRegistry::postMessageToRemote): 32 (WebKit::WebBroadcastChannelRegistry::networkProcessCrashed): 33 * WebProcess/WebCoreSupport/WebBroadcastChannelRegistry.h: 34 1 35 2022-03-21 Brent Fulgham <bfulgham@apple.com> 2 36 -
trunk/Source/WebKit/NetworkProcess/NetworkBroadcastChannelRegistry.cpp
r282377 r291589 27 27 #include "NetworkBroadcastChannelRegistry.h" 28 28 29 #include "NetworkProcessProxyMessages.h" 29 30 #include "WebBroadcastChannelRegistryMessages.h" 30 31 #include <WebCore/MessageWithMessagePorts.h> … … 33 34 namespace WebKit { 34 35 35 NetworkBroadcastChannelRegistry::NetworkBroadcastChannelRegistry() = default; 36 #define REGISTRY_MESSAGE_CHECK(assertion) REGISTRY_MESSAGE_CHECK_COMPLETION(assertion, (void)0) 37 #define REGISTRY_MESSAGE_CHECK_COMPLETION(assertion, completion) do { \ 38 ASSERT(assertion); \ 39 if (UNLIKELY(!(assertion))) { \ 40 if (auto webProcessIdentifier = m_networkProcess->webProcessIdentifierForConnection(connection)) \ 41 m_networkProcess->parentProcessConnection()->send(Messages::NetworkProcessProxy::TerminateWebProcess(webProcessIdentifier), 0); \ 42 { completion; } \ 43 return; \ 44 } \ 45 } while (0) 46 47 static bool isValidClientOrigin(const WebCore::ClientOrigin& clientOrigin) 48 { 49 return !clientOrigin.topOrigin.isEmpty() && !clientOrigin.clientOrigin.isEmpty(); 50 } 51 52 NetworkBroadcastChannelRegistry::NetworkBroadcastChannelRegistry(NetworkProcess& networkProcess) 53 : m_networkProcess(networkProcess) 54 { 55 } 36 56 37 57 void NetworkBroadcastChannelRegistry::registerChannel(IPC::Connection& connection, const WebCore::ClientOrigin& origin, const String& name) 38 58 { 59 REGISTRY_MESSAGE_CHECK(isValidClientOrigin(origin)); 60 39 61 auto& channelsForOrigin = m_broadcastChannels.ensure(origin, [] { return NameToConnectionIdentifiersMap { }; }).iterator->value; 40 62 auto& connectionIdentifiersForName = channelsForOrigin.ensure(name, [] { return Vector<IPC::Connection::UniqueID> { }; }).iterator->value; … … 45 67 void NetworkBroadcastChannelRegistry::unregisterChannel(IPC::Connection& connection, const WebCore::ClientOrigin& origin, const String& name) 46 68 { 69 REGISTRY_MESSAGE_CHECK(isValidClientOrigin(origin)); 70 47 71 auto channelsForOriginIterator = m_broadcastChannels.find(origin); 48 72 ASSERT(channelsForOriginIterator != m_broadcastChannels.end()); … … 60 84 void NetworkBroadcastChannelRegistry::postMessage(IPC::Connection& connection, const WebCore::ClientOrigin& origin, const String& name, WebCore::MessageWithMessagePorts&& message, CompletionHandler<void()>&& completionHandler) 61 85 { 86 REGISTRY_MESSAGE_CHECK_COMPLETION(isValidClientOrigin(origin), completionHandler()); 87 62 88 auto channelsForOriginIterator = m_broadcastChannels.find(origin); 63 89 ASSERT(channelsForOriginIterator != m_broadcastChannels.end()); … … 102 128 } 103 129 130 #undef REGISTRY_MESSAGE_CHECK 131 #undef REGISTRY_MESSAGE_CHECK_COMPLETION 132 104 133 } // namespace WebKit -
trunk/Source/WebKit/NetworkProcess/NetworkBroadcastChannelRegistry.h
r282377 r291589 37 37 namespace WebKit { 38 38 39 class NetworkProcess; 40 39 41 class NetworkBroadcastChannelRegistry { 40 42 WTF_MAKE_FAST_ALLOCATED; 41 43 public: 42 NetworkBroadcastChannelRegistry();44 explicit NetworkBroadcastChannelRegistry(NetworkProcess&); 43 45 44 46 void removeConnection(IPC::Connection&); … … 51 53 52 54 private: 55 Ref<NetworkProcess> m_networkProcess; 53 56 using NameToConnectionIdentifiersMap = HashMap<String, Vector<IPC::Connection::UniqueID>>; 54 57 HashMap<WebCore::ClientOrigin, NameToConnectionIdentifiersMap> m_broadcastChannels; -
trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp
r291492 r291589 2553 2553 } 2554 2554 2555 WebCore::ProcessIdentifier NetworkProcess::webProcessIdentifierForConnection(IPC::Connection& connection) const 2556 { 2557 for (auto& [processIdentifier, webConnection] : m_webProcessConnections) { 2558 if (&webConnection->connection() == &connection) 2559 return processIdentifier; 2560 } 2561 return { }; 2562 } 2563 2555 2564 NetworkConnectionToWebProcess* NetworkProcess::webProcessConnection(ProcessIdentifier identifier) const 2556 2565 { -
trunk/Source/WebKit/NetworkProcess/NetworkProcess.h
r291492 r291589 333 333 334 334 NetworkConnectionToWebProcess* webProcessConnection(WebCore::ProcessIdentifier) const; 335 WebCore::ProcessIdentifier webProcessIdentifierForConnection(IPC::Connection&) const; 335 336 WebCore::MessagePortChannelRegistry& messagePortChannelRegistry() { return m_messagePortChannelRegistry; } 336 337 -
trunk/Source/WebKit/NetworkProcess/NetworkSession.cpp
r291003 r291589 139 139 , m_privateClickMeasurement(managerOrProxy(*this, networkProcess, parameters)) 140 140 , m_privateClickMeasurementDebugModeEnabled(parameters.enablePrivateClickMeasurementDebugMode) 141 , m_broadcastChannelRegistry(makeUniqueRef<NetworkBroadcastChannelRegistry>( ))141 , m_broadcastChannelRegistry(makeUniqueRef<NetworkBroadcastChannelRegistry>(networkProcess)) 142 142 , m_testSpeedMultiplier(parameters.testSpeedMultiplier) 143 143 , m_allowsServerPreconnect(parameters.allowsServerPreconnect) -
trunk/Source/WebKit/WebProcess/WebCoreSupport/WebBroadcastChannelRegistry.cpp
r282483 r291589 41 41 } 42 42 43 void WebBroadcastChannelRegistry::registerChannel(const WebCore::ClientOrigin& origin, const String& name, WebCore::BroadcastChannelIdentifier identifier) 43 // Unique origins are only stored in process in m_channelsPerOrigin and never sent to the NetworkProcess as a ClientOrigin. 44 // The identity of unique origins wouldn't be preserved when serializing them as a SecurityOriginData (via ClientOrigin). 45 // Since BroadcastChannels from a unique origin can only communicate with other BroadcastChannels from the same unique origin, 46 // the destination channels have to be within the same WebProcess anyway. 47 static std::optional<WebCore::ClientOrigin> toClientOrigin(const WebCore::PartitionedSecurityOrigin& origin) 48 { 49 if (origin.topOrigin->isUnique() || origin.clientOrigin->isUnique()) 50 return std::nullopt; 51 return WebCore::ClientOrigin { origin.topOrigin->data(), origin.clientOrigin->data() }; 52 } 53 54 void WebBroadcastChannelRegistry::registerChannel(const WebCore::PartitionedSecurityOrigin& origin, const String& name, WebCore::BroadcastChannelIdentifier identifier) 44 55 { 45 56 auto& channelsForOrigin = m_channelsPerOrigin.ensure(origin, [] { return HashMap<String, Vector<WebCore::BroadcastChannelIdentifier>> { }; }).iterator->value; … … 47 58 channelsForName.append(identifier); 48 59 49 if (channelsForName.size() == 1) 50 networkProcessConnection().send(Messages::NetworkBroadcastChannelRegistry::RegisterChannel { origin, name }, 0); 60 if (channelsForName.size() == 1) { 61 if (auto clientOrigin = toClientOrigin(origin)) 62 networkProcessConnection().send(Messages::NetworkBroadcastChannelRegistry::RegisterChannel { *clientOrigin, name }, 0); 63 } 51 64 } 52 65 53 void WebBroadcastChannelRegistry::unregisterChannel(const WebCore:: ClientOrigin& origin, const String& name, WebCore::BroadcastChannelIdentifier identifier)66 void WebBroadcastChannelRegistry::unregisterChannel(const WebCore::PartitionedSecurityOrigin& origin, const String& name, WebCore::BroadcastChannelIdentifier identifier) 54 67 { 55 68 auto channelsPerOriginIterator = m_channelsPerOrigin.find(origin); … … 69 82 70 83 channelsForOrigin.remove(channelsForOriginIterator); 71 networkProcessConnection().send(Messages::NetworkBroadcastChannelRegistry::UnregisterChannel { origin, name }, 0); 84 if (auto clientOrigin = toClientOrigin(origin)) 85 networkProcessConnection().send(Messages::NetworkBroadcastChannelRegistry::UnregisterChannel { *clientOrigin, name }, 0); 72 86 73 87 if (channelsForOrigin.isEmpty()) … … 75 89 } 76 90 77 void WebBroadcastChannelRegistry::postMessage(const WebCore:: ClientOrigin& origin, const String& name, WebCore::BroadcastChannelIdentifier source, Ref<WebCore::SerializedScriptValue>&& message, CompletionHandler<void()>&& completionHandler)91 void WebBroadcastChannelRegistry::postMessage(const WebCore::PartitionedSecurityOrigin& origin, const String& name, WebCore::BroadcastChannelIdentifier source, Ref<WebCore::SerializedScriptValue>&& message, CompletionHandler<void()>&& completionHandler) 78 92 { 79 93 auto callbackAggregator = CallbackAggregator::create(WTFMove(completionHandler)); 80 94 postMessageLocally(origin, name, source, message.copyRef(), callbackAggregator.copyRef()); 81 networkProcessConnection().sendWithAsyncReply(Messages::NetworkBroadcastChannelRegistry::PostMessage { origin, name, WebCore::MessageWithMessagePorts { WTFMove(message), { } } }, [callbackAggregator] { }, 0); 95 if (auto clientOrigin = toClientOrigin(origin)) 96 networkProcessConnection().sendWithAsyncReply(Messages::NetworkBroadcastChannelRegistry::PostMessage { *clientOrigin, name, WebCore::MessageWithMessagePorts { WTFMove(message), { } } }, [callbackAggregator] { }, 0); 82 97 } 83 98 84 void WebBroadcastChannelRegistry::postMessageLocally(const WebCore:: ClientOrigin& origin, const String& name, std::optional<WebCore::BroadcastChannelIdentifier> sourceInProcess, Ref<WebCore::SerializedScriptValue>&& message, Ref<WTF::CallbackAggregator>&& callbackAggregator)99 void WebBroadcastChannelRegistry::postMessageLocally(const WebCore::PartitionedSecurityOrigin& origin, const String& name, std::optional<WebCore::BroadcastChannelIdentifier> sourceInProcess, Ref<WebCore::SerializedScriptValue>&& message, Ref<WTF::CallbackAggregator>&& callbackAggregator) 85 100 { 86 101 auto channelsPerOriginIterator = m_channelsPerOrigin.find(origin); … … 101 116 } 102 117 103 void WebBroadcastChannelRegistry::postMessageToRemote(const WebCore::ClientOrigin& origin, const String& name, WebCore::MessageWithMessagePorts&& message, CompletionHandler<void()>&& completionHandler)118 void WebBroadcastChannelRegistry::postMessageToRemote(const WebCore::ClientOrigin& clientOrigin, const String& name, WebCore::MessageWithMessagePorts&& message, CompletionHandler<void()>&& completionHandler) 104 119 { 105 120 auto callbackAggregator = CallbackAggregator::create(WTFMove(completionHandler)); 121 WebCore::PartitionedSecurityOrigin origin { clientOrigin.topOrigin.securityOrigin(), clientOrigin.clientOrigin.securityOrigin() }; 106 122 postMessageLocally(origin, name, std::nullopt, *message.message, callbackAggregator.copyRef()); 107 123 } … … 110 126 { 111 127 for (auto& [origin, channelsForOrigin] : m_channelsPerOrigin) { 128 auto clientOrigin = toClientOrigin(origin); 129 if (!clientOrigin) 130 continue; 112 131 for (auto& name : channelsForOrigin.keys()) 113 networkProcessConnection().send(Messages::NetworkBroadcastChannelRegistry::RegisterChannel { origin, name }, 0);132 networkProcessConnection().send(Messages::NetworkBroadcastChannelRegistry::RegisterChannel { *clientOrigin, name }, 0); 114 133 } 115 134 } -
trunk/Source/WebKit/WebProcess/WebCoreSupport/WebBroadcastChannelRegistry.h
r282483 r291589 29 29 #include <WebCore/BroadcastChannelRegistry.h> 30 30 #include <WebCore/ClientOrigin.h> 31 #include <WebCore/PartitionedSecurityOrigin.h> 32 #include <WebCore/SecurityOrigin.h> 31 33 #include <wtf/HashMap.h> 32 34 #include <wtf/Vector.h> … … 49 51 } 50 52 51 void registerChannel(const WebCore:: ClientOrigin&, const String& name, WebCore::BroadcastChannelIdentifier) final;52 void unregisterChannel(const WebCore:: ClientOrigin&, const String& name, WebCore::BroadcastChannelIdentifier) final;53 void postMessage(const WebCore:: ClientOrigin&, const String& name, WebCore::BroadcastChannelIdentifier source, Ref<WebCore::SerializedScriptValue>&&, CompletionHandler<void()>&&) final;53 void registerChannel(const WebCore::PartitionedSecurityOrigin&, const String& name, WebCore::BroadcastChannelIdentifier) final; 54 void unregisterChannel(const WebCore::PartitionedSecurityOrigin&, const String& name, WebCore::BroadcastChannelIdentifier) final; 55 void postMessage(const WebCore::PartitionedSecurityOrigin&, const String& name, WebCore::BroadcastChannelIdentifier source, Ref<WebCore::SerializedScriptValue>&&, CompletionHandler<void()>&&) final; 54 56 55 57 void networkProcessCrashed(); … … 61 63 62 64 void postMessageToRemote(const WebCore::ClientOrigin&, const String& name, WebCore::MessageWithMessagePorts&&, CompletionHandler<void()>&&); 63 void postMessageLocally(const WebCore:: ClientOrigin&, const String& name, std::optional<WebCore::BroadcastChannelIdentifier> sourceInProcess, Ref<WebCore::SerializedScriptValue>&&, Ref<WTF::CallbackAggregator>&&);65 void postMessageLocally(const WebCore::PartitionedSecurityOrigin&, const String& name, std::optional<WebCore::BroadcastChannelIdentifier> sourceInProcess, Ref<WebCore::SerializedScriptValue>&&, Ref<WTF::CallbackAggregator>&&); 64 66 65 HashMap<WebCore:: ClientOrigin, HashMap<String, Vector<WebCore::BroadcastChannelIdentifier>>> m_channelsPerOrigin;67 HashMap<WebCore::PartitionedSecurityOrigin, HashMap<String, Vector<WebCore::BroadcastChannelIdentifier>>> m_channelsPerOrigin; 66 68 }; 67 69 -
trunk/Source/WebKitLegacy/ChangeLog
r291562 r291589 7 7 8 8 * PlatformMac.cmake: 9 10 2022-03-21 Chris Dumez <cdumez@apple.com> 11 12 BroadcastChannel instances in distinct opaque origins can communicate 13 https://bugs.webkit.org/show_bug.cgi?id=238090 14 <rdar://problem/90511155> 15 16 Reviewed by Alex Christensen. 17 18 * WebCoreSupport/WebBroadcastChannelRegistry.cpp: 19 (WebBroadcastChannelRegistry::registerChannel): 20 (WebBroadcastChannelRegistry::unregisterChannel): 21 (WebBroadcastChannelRegistry::postMessage): 22 * WebCoreSupport/WebBroadcastChannelRegistry.h: 9 23 10 24 2022-03-08 Chris Dumez <cdumez@apple.com> -
trunk/Source/WebKitLegacy/WebCoreSupport/WebBroadcastChannelRegistry.cpp
r284142 r291589 45 45 } 46 46 47 void WebBroadcastChannelRegistry::registerChannel(const WebCore:: ClientOrigin& origin, const String& name, WebCore::BroadcastChannelIdentifier identifier)47 void WebBroadcastChannelRegistry::registerChannel(const WebCore::PartitionedSecurityOrigin& origin, const String& name, WebCore::BroadcastChannelIdentifier identifier) 48 48 { 49 49 ASSERT(isMainThread()); … … 54 54 } 55 55 56 void WebBroadcastChannelRegistry::unregisterChannel(const WebCore:: ClientOrigin& origin, const String& name, WebCore::BroadcastChannelIdentifier identifier)56 void WebBroadcastChannelRegistry::unregisterChannel(const WebCore::PartitionedSecurityOrigin& origin, const String& name, WebCore::BroadcastChannelIdentifier identifier) 57 57 { 58 58 ASSERT(isMainThread()); … … 67 67 } 68 68 69 void WebBroadcastChannelRegistry::postMessage(const WebCore:: ClientOrigin& origin, const String& name, WebCore::BroadcastChannelIdentifier source, Ref<WebCore::SerializedScriptValue>&& message, CompletionHandler<void()>&& completionHandler)69 void WebBroadcastChannelRegistry::postMessage(const WebCore::PartitionedSecurityOrigin& origin, const String& name, WebCore::BroadcastChannelIdentifier source, Ref<WebCore::SerializedScriptValue>&& message, CompletionHandler<void()>&& completionHandler) 70 70 { 71 71 ASSERT(isMainThread()); -
trunk/Source/WebKitLegacy/WebCoreSupport/WebBroadcastChannelRegistry.h
r282105 r291589 25 25 26 26 #include <WebCore/BroadcastChannelRegistry.h> 27 #include <WebCore/ ClientOrigin.h>27 #include <WebCore/PartitionedSecurityOrigin.h> 28 28 #include <wtf/Forward.h> 29 29 #include <wtf/WeakPtr.h> … … 35 35 static Ref<WebBroadcastChannelRegistry> getOrCreate(bool privateSession); 36 36 37 void registerChannel(const WebCore:: ClientOrigin&, const String& name, WebCore::BroadcastChannelIdentifier) final;38 void unregisterChannel(const WebCore:: ClientOrigin&, const String& name, WebCore::BroadcastChannelIdentifier) final;39 void postMessage(const WebCore:: ClientOrigin&, const String& name, WebCore::BroadcastChannelIdentifier source, Ref<WebCore::SerializedScriptValue>&&, CompletionHandler<void()>&&) final;37 void registerChannel(const WebCore::PartitionedSecurityOrigin&, const String& name, WebCore::BroadcastChannelIdentifier) final; 38 void unregisterChannel(const WebCore::PartitionedSecurityOrigin&, const String& name, WebCore::BroadcastChannelIdentifier) final; 39 void postMessage(const WebCore::PartitionedSecurityOrigin&, const String& name, WebCore::BroadcastChannelIdentifier source, Ref<WebCore::SerializedScriptValue>&&, CompletionHandler<void()>&&) final; 40 40 41 41 private: … … 43 43 44 44 using NameToChannelIdentifiersMap = HashMap<String, Vector<WebCore::BroadcastChannelIdentifier>>; 45 HashMap<WebCore:: ClientOrigin, NameToChannelIdentifiersMap> m_channels;45 HashMap<WebCore::PartitionedSecurityOrigin, NameToChannelIdentifiersMap> m_channels; 46 46 };
Note:
See TracChangeset
for help on using the changeset viewer.