Chromium Code Reviews| Index: third_party/WebKit/Source/modules/broadcastchannel/BroadcastChannelConnection.h | 
| diff --git a/third_party/WebKit/Source/modules/broadcastchannel/BroadcastChannelConnection.h b/third_party/WebKit/Source/modules/broadcastchannel/BroadcastChannelConnection.h | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..a8027a33654de1e88e220da79b4207087e899129 | 
| --- /dev/null | 
| +++ b/third_party/WebKit/Source/modules/broadcastchannel/BroadcastChannelConnection.h | 
| @@ -0,0 +1,79 @@ | 
| +// Copyright 2016 The Chromium Authors. All rights reserved. | 
| +// Use of this source code is governed by a BSD-style license that can be | 
| +// found in the LICENSE file. | 
| + | 
| +#ifndef BroadcastChannelConnection_h | 
| +#define BroadcastChannelConnection_h | 
| + | 
| +#include "components/webmessaging/public/interfaces/broadcast_channel.mojom-blink.h" | 
| +#include "mojo/public/cpp/bindings/associated_binding.h" | 
| +#include "platform/heap/GarbageCollected.h" | 
| +#include "platform/heap/HeapAllocator.h" | 
| +#include "platform/weborigin/SecurityOriginHash.h" | 
| +#include "wtf/text/StringHash.h" | 
| + | 
| +namespace blink { | 
| + | 
| +// To ensure proper message ordering, all BroadcastChannel instances on the same | 
| +// thread share a single mojo connection. This class represents such a | 
| +// connection. BroadcastChannel instances register themselves with the correct | 
| +// connection, and use the connection to broadcast messages. | 
| +class BroadcastChannelConnection final | 
| + : public GarbageCollectedFinalized<BroadcastChannelConnection> | 
| + , public webmessaging::mojom::blink::BroadcastChannelClient { | 
| 
 
haraken
2016/06/06 02:05:48
Just to confirm: No one is keeping a reference to
 
Marijn Kruisselbrink
2016/06/06 20:05:30
m_binding obviously is, to be able to call methods
 
Marijn Kruisselbrink
2016/06/07 01:18:39
I'm still curious about this though. It sounds lik
 
haraken
2016/06/07 01:29:55
Can we use the same pattern as m_paymentProvider?
 
Marijn Kruisselbrink
2016/06/07 17:41:39
m_clientBinding in PaymentRequest has the same iss
 
 | 
| + WTF_MAKE_NONCOPYABLE(BroadcastChannelConnection); | 
| +public: | 
| + class Client : public GarbageCollectedMixin { | 
| + public: | 
| + virtual String name() const = 0; | 
| + virtual SecurityOrigin* origin() const = 0; | 
| + | 
| + // Called when a message is received for this channel. Not called for | 
| + // messages send by this client to the channel. | 
| 
 
haraken
2016/06/06 02:05:47
sent by
 
Marijn Kruisselbrink
2016/06/06 20:05:30
fixed
 
 | 
| + virtual void onMessage(const String& message) = 0; | 
| + | 
| + // Called when the connection this client is registered with closes. | 
| + // After onError is called a client should not try to do anything with | 
| + // the connection anymore. | 
| + virtual void onError() = 0; | 
| + }; | 
| + | 
| + // Returns the BroadcastChannelConnection instance to use for the channel | 
| + // identified by the particular origin and name. When called with the same | 
| + // parameters on the same thread this will always return the same instance, | 
| + // except if for some reason the mojo connection got severed. | 
| + // | 
| + // If all clients using this particular connection get closed, the | 
| + // connection itself might also be closed, in which case the next time the | 
| + // method is called a new connection is created. | 
| + static BroadcastChannelConnection* getForChannel(const RefPtr<SecurityOrigin>&, const String& name); | 
| + ~BroadcastChannelConnection(); | 
| + | 
| + // Register a new client that uses this connection. | 
| + void registerClient(Client*); | 
| + void unregisterClient(Client*); | 
| + | 
| + // Broadcasts a message to the channel this connection is for. The message | 
| + // will be delivered to all clients except the client that send the message. | 
| + void broadcast(Client*, const String& message); | 
| + | 
| + DECLARE_TRACE(); | 
| + | 
| +private: | 
| + BroadcastChannelConnection(const String& name, const RefPtr<SecurityOrigin>&, webmessaging::mojom::blink::BroadcastChannelClientAssociatedPtrInfo*, mojo::AssociatedGroup*); | 
| + | 
| + // webmessaging::mojom::blink::BroadcastChannelClient: | 
| + void OnMessage(const String& message) override; | 
| + | 
| + // Called when the mojo binding disconnects. | 
| + void onError(); | 
| + | 
| + String m_name; | 
| + RefPtr<SecurityOrigin> m_origin; | 
| + HeapLinkedHashSet<WeakMember<Client>> m_clients; | 
| + mojo::AssociatedBinding<webmessaging::mojom::blink::BroadcastChannelClient> m_binding; | 
| +}; | 
| + | 
| +} // namespace blink | 
| + | 
| +#endif // BroadcastChannelConnection_h |