Commit 669a0ae6 authored by tkent@chromium.org's avatar tkent@chromium.org

Oilpan: Reduce RefPtr to WorkerGlobalScope.

This CL reduces the number of required Heap::collectGarbage calls in
Heap::collectAllGarbage on Worker termination.

 - Make Event::m_target Member<>.
 - Make MessageEvent::m_source Member<>.
  MessageEvent is used to communicate between the main thread and workers.
  For consistency, this CL adjusts MessagePort argument/return types.

They reduce RefPtr to WorkerGlobalScope, which implements EventTarget.

BUG=375671

Review URL: https://codereview.chromium.org/304353004

git-svn-id: svn://svn.chromium.org/blink/trunk@175201 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent c31658cf
......@@ -42,7 +42,7 @@
namespace WebCore {
PassRefPtr<MessagePort> MessagePort::create(ExecutionContext& executionContext)
PassRefPtrWillBeRawPtr<MessagePort> MessagePort::create(ExecutionContext& executionContext)
{
RefPtrWillBeRawPtr<MessagePort> port = adoptRefWillBeRefCountedGarbageCollected(new MessagePort(executionContext));
port->suspendIfNeeded();
......
......@@ -64,7 +64,7 @@ class MessagePort FINAL : public RefCountedWillBeRefCountedGarbageCollected<Mess
REFCOUNTED_EVENT_TARGET(MessagePort);
WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(MessagePort);
public:
static PassRefPtr<MessagePort> create(ExecutionContext&);
static PassRefPtrWillBeRawPtr<MessagePort> create(ExecutionContext&);
virtual ~MessagePort();
void postMessage(PassRefPtr<SerializedScriptValue> message, const MessagePortArray*, ExceptionState&);
......
......@@ -26,7 +26,8 @@
*/
[
ActiveDOMObject
ActiveDOMObject,
WillBeGarbageCollected
] interface MessagePort : EventTarget {
[Custom, RaisesException] void postMessage(any message, optional MessagePort[] messagePorts);
......
......@@ -235,6 +235,7 @@ PassRefPtrWillBeRawPtr<NodeList> Event::path() const
void Event::trace(Visitor* visitor)
{
visitor->trace(m_target);
visitor->trace(m_underlyingEvent);
visitor->trace(m_eventPath);
}
......
......@@ -204,7 +204,7 @@ private:
unsigned short m_eventPhase;
EventTarget* m_currentTarget;
RefPtr<EventTarget> m_target;
RefPtrWillBeMember<EventTarget> m_target;
DOMTimeStamp m_createTime;
RefPtrWillBeMember<Event> m_underlyingEvent;
OwnPtrWillBeMember<EventPath> m_eventPath;
......
......@@ -60,7 +60,7 @@ MessageEvent::MessageEvent(const AtomicString& type, const MessageEventInit& ini
ASSERT(isValidSource(m_source.get()));
}
MessageEvent::MessageEvent(const String& origin, const String& lastEventId, PassRefPtr<EventTarget> source, PassOwnPtr<MessagePortArray> ports)
MessageEvent::MessageEvent(const String& origin, const String& lastEventId, PassRefPtrWillBeRawPtr<EventTarget> source, PassOwnPtr<MessagePortArray> ports)
: Event(EventTypeNames::message, false, false)
, m_dataType(DataTypeScriptValue)
, m_origin(origin)
......@@ -72,7 +72,7 @@ MessageEvent::MessageEvent(const String& origin, const String& lastEventId, Pass
ASSERT(isValidSource(m_source.get()));
}
MessageEvent::MessageEvent(PassRefPtr<SerializedScriptValue> data, const String& origin, const String& lastEventId, PassRefPtr<EventTarget> source, PassOwnPtr<MessagePortArray> ports)
MessageEvent::MessageEvent(PassRefPtr<SerializedScriptValue> data, const String& origin, const String& lastEventId, PassRefPtrWillBeRawPtr<EventTarget> source, PassOwnPtr<MessagePortArray> ports)
: Event(EventTypeNames::message, false, false)
, m_dataType(DataTypeSerializedScriptValue)
, m_dataAsSerializedScriptValue(data)
......@@ -87,7 +87,7 @@ MessageEvent::MessageEvent(PassRefPtr<SerializedScriptValue> data, const String&
ASSERT(isValidSource(m_source.get()));
}
MessageEvent::MessageEvent(PassRefPtr<SerializedScriptValue> data, const String& origin, const String& lastEventId, PassRefPtr<EventTarget> source, PassOwnPtr<MessagePortChannelArray> channels)
MessageEvent::MessageEvent(PassRefPtr<SerializedScriptValue> data, const String& origin, const String& lastEventId, PassRefPtrWillBeRawPtr<EventTarget> source, PassOwnPtr<MessagePortChannelArray> channels)
: Event(EventTypeNames::message, false, false)
, m_dataType(DataTypeSerializedScriptValue)
, m_dataAsSerializedScriptValue(data)
......@@ -187,6 +187,7 @@ void MessageEvent::entangleMessagePorts(ExecutionContext* context)
void MessageEvent::trace(Visitor* visitor)
{
visitor->trace(m_dataAsBlob);
visitor->trace(m_source);
Event::trace(visitor);
}
......
......@@ -53,15 +53,15 @@ public:
{
return adoptRefWillBeNoop(new MessageEvent);
}
static PassRefPtrWillBeRawPtr<MessageEvent> create(PassOwnPtr<MessagePortArray> ports, const String& origin = String(), const String& lastEventId = String(), PassRefPtr<EventTarget> source = nullptr)
static PassRefPtrWillBeRawPtr<MessageEvent> create(PassOwnPtr<MessagePortArray> ports, const String& origin = String(), const String& lastEventId = String(), PassRefPtrWillBeRawPtr<EventTarget> source = nullptr)
{
return adoptRefWillBeNoop(new MessageEvent(origin, lastEventId, source, ports));
}
static PassRefPtrWillBeRawPtr<MessageEvent> create(PassOwnPtr<MessagePortArray> ports, PassRefPtr<SerializedScriptValue> data, const String& origin = String(), const String& lastEventId = String(), PassRefPtr<EventTarget> source = nullptr)
static PassRefPtrWillBeRawPtr<MessageEvent> create(PassOwnPtr<MessagePortArray> ports, PassRefPtr<SerializedScriptValue> data, const String& origin = String(), const String& lastEventId = String(), PassRefPtrWillBeRawPtr<EventTarget> source = nullptr)
{
return adoptRefWillBeNoop(new MessageEvent(data, origin, lastEventId, source, ports));
}
static PassRefPtrWillBeRawPtr<MessageEvent> create(PassOwnPtr<MessagePortChannelArray> channels, PassRefPtr<SerializedScriptValue> data, const String& origin = String(), const String& lastEventId = String(), PassRefPtr<EventTarget> source = nullptr)
static PassRefPtrWillBeRawPtr<MessageEvent> create(PassOwnPtr<MessagePortChannelArray> channels, PassRefPtr<SerializedScriptValue> data, const String& origin = String(), const String& lastEventId = String(), PassRefPtrWillBeRawPtr<EventTarget> source = nullptr)
{
return adoptRefWillBeNoop(new MessageEvent(data, origin, lastEventId, source, channels));
}
......@@ -118,13 +118,13 @@ public:
private:
MessageEvent();
MessageEvent(const AtomicString&, const MessageEventInit&);
MessageEvent(const String& origin, const String& lastEventId, PassRefPtr<EventTarget> source, PassOwnPtr<MessagePortArray>);
MessageEvent(PassRefPtr<SerializedScriptValue> data, const String& origin, const String& lastEventId, PassRefPtr<EventTarget> source, PassOwnPtr<MessagePortArray>);
MessageEvent(PassRefPtr<SerializedScriptValue> data, const String& origin, const String& lastEventId, PassRefPtr<EventTarget> source, PassOwnPtr<MessagePortChannelArray>);
MessageEvent(const String& origin, const String& lastEventId, PassRefPtrWillBeRawPtr<EventTarget> source, PassOwnPtr<MessagePortArray>);
MessageEvent(PassRefPtr<SerializedScriptValue> data, const String& origin, const String& lastEventId, PassRefPtrWillBeRawPtr<EventTarget> source, PassOwnPtr<MessagePortArray>);
MessageEvent(PassRefPtr<SerializedScriptValue> data, const String& origin, const String& lastEventId, PassRefPtrWillBeRawPtr<EventTarget> source, PassOwnPtr<MessagePortChannelArray>);
explicit MessageEvent(const String& data, const String& origin);
explicit MessageEvent(PassRefPtrWillBeRawPtr<Blob> data, const String& origin);
explicit MessageEvent(PassRefPtr<ArrayBuffer> data, const String& origin);
MessageEvent(const String& data, const String& origin);
MessageEvent(PassRefPtrWillBeRawPtr<Blob> data, const String& origin);
MessageEvent(PassRefPtr<ArrayBuffer> data, const String& origin);
DataType m_dataType;
RefPtr<SerializedScriptValue> m_dataAsSerializedScriptValue;
......@@ -133,7 +133,7 @@ private:
RefPtr<ArrayBuffer> m_dataAsArrayBuffer;
String m_origin;
String m_lastEventId;
RefPtr<EventTarget> m_source;
RefPtrWillBeMember<EventTarget> m_source;
// m_ports are the MessagePorts in an engtangled state, and m_channels are
// the MessageChannels in a disentangled state. Only one of them can be
// non-empty at a time. entangleMessagePorts() moves between the states.
......
......@@ -41,9 +41,9 @@
namespace WebCore {
PassRefPtrWillBeRawPtr<MessageEvent> createConnectEvent(PassRefPtr<MessagePort> prpPort)
PassRefPtrWillBeRawPtr<MessageEvent> createConnectEvent(PassRefPtrWillBeRawPtr<MessagePort> prpPort)
{
RefPtr<MessagePort> port = prpPort;
RefPtrWillBeRawPtr<MessagePort> port = prpPort;
RefPtrWillBeRawPtr<MessageEvent> event = MessageEvent::create(adoptPtr(new MessagePortArray(1, port)), String(), String(), port);
event->initEvent(EventTypeNames::connect, false, false);
return event.release();
......
......@@ -67,7 +67,7 @@ namespace WebCore {
String m_name;
};
PassRefPtrWillBeRawPtr<MessageEvent> createConnectEvent(PassRefPtr<MessagePort>);
PassRefPtrWillBeRawPtr<MessageEvent> createConnectEvent(PassRefPtrWillBeRawPtr<MessagePort>);
} // namespace WebCore
......
......@@ -311,11 +311,11 @@ void WebSharedWorkerImpl::connect(WebMessagePortChannel* webChannel)
void WebSharedWorkerImpl::connectTask(ExecutionContext* context, PassOwnPtr<WebMessagePortChannel> channel)
{
// Wrap the passed-in channel in a MessagePort, and send it off via a connect event.
RefPtr<MessagePort> port = MessagePort::create(*context);
RefPtrWillBeRawPtr<MessagePort> port = MessagePort::create(*context);
port->entangle(channel);
WorkerGlobalScope* workerGlobalScope = toWorkerGlobalScope(context);
ASSERT_WITH_SECURITY_IMPLICATION(workerGlobalScope->isSharedWorkerGlobalScope());
workerGlobalScope->dispatchEvent(createConnectEvent(port));
workerGlobalScope->dispatchEvent(createConnectEvent(port.release()));
}
void WebSharedWorkerImpl::startWorkerContext(const WebURL& url, const WebString& name, const WebString& contentSecurityPolicy, WebContentSecurityPolicyType policyType)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment