Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(279)

Side by Side Diff: third_party/WebKit/Source/core/dom/MessagePort.cpp

Issue 1922923003: Have MessagePort use Oilpan-based weak pointers. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2008 Apple Inc. All Rights Reserved. 2 * Copyright (C) 2008 Apple Inc. All Rights Reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 1. Redistributions of source code must retain the above copyright 7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright 9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
48 MessagePort* port = new MessagePort(executionContext); 48 MessagePort* port = new MessagePort(executionContext);
49 port->suspendIfNeeded(); 49 port->suspendIfNeeded();
50 return port; 50 return port;
51 } 51 }
52 52
53 MessagePort::MessagePort(ExecutionContext& executionContext) 53 MessagePort::MessagePort(ExecutionContext& executionContext)
54 : ActiveScriptWrappable(this) 54 : ActiveScriptWrappable(this)
55 , ActiveDOMObject(&executionContext) 55 , ActiveDOMObject(&executionContext)
56 , m_started(false) 56 , m_started(false)
57 , m_closed(false) 57 , m_closed(false)
58 , m_weakFactory(this)
59 { 58 {
60 } 59 }
61 60
62 MessagePort::~MessagePort() 61 MessagePort::~MessagePort()
63 { 62 {
64 close(); 63 close();
65 if (m_scriptStateForConversion) 64 if (m_scriptStateForConversion)
66 m_scriptStateForConversion->disposePerContextData(); 65 m_scriptStateForConversion->disposePerContextData();
67 } 66 }
68 67
69 void MessagePort::postMessage(ExecutionContext* context, PassRefPtr<SerializedSc riptValue> message, const MessagePortArray& ports, ExceptionState& exceptionStat e) 68 void MessagePort::postMessage(ExecutionContext* context, PassRefPtr<SerializedSc riptValue> message, const MessagePortArray& ports, ExceptionState& exceptionStat e)
70 { 69 {
71 if (!isEntangled()) 70 if (!isEntangled())
72 return; 71 return;
73 DCHECK(getExecutionContext()); 72 DCHECK(getExecutionContext());
74 DCHECK(m_entangledChannel); 73 DCHECK(m_entangledChannel);
75 74
76 OwnPtr<MessagePortChannelArray> channels;
77 // Make sure we aren't connected to any of the passed-in ports. 75 // Make sure we aren't connected to any of the passed-in ports.
78 for (unsigned i = 0; i < ports.size(); ++i) { 76 for (unsigned i = 0; i < ports.size(); ++i) {
79 if (ports[i] == this) { 77 if (ports[i] == this) {
80 exceptionState.throwDOMException(DataCloneError, "Port at index " + String::number(i) + " contains the source port."); 78 exceptionState.throwDOMException(DataCloneError, "Port at index " + String::number(i) + " contains the source port.");
81 return; 79 return;
82 } 80 }
83 } 81 }
84 channels = MessagePort::disentanglePorts(context, ports, exceptionState); 82 OwnPtr<MessagePortChannelArray> channels = MessagePort::disentanglePorts(con text, ports, exceptionState);
85 if (exceptionState.hadException()) 83 if (exceptionState.hadException())
86 return; 84 return;
87 85
88 if (message->containsTransferableArrayBuffer()) 86 if (message->containsTransferableArrayBuffer())
89 getExecutionContext()->addConsoleMessage(ConsoleMessage::create(JSMessag eSource, WarningMessageLevel, "MessagePort cannot send an ArrayBuffer as a trans ferable object yet. See http://crbug.com/334408")); 87 getExecutionContext()->addConsoleMessage(ConsoleMessage::create(JSMessag eSource, WarningMessageLevel, "MessagePort cannot send an ArrayBuffer as a trans ferable object yet. See http://crbug.com/334408"));
90 88
91 WebString messageString = message->toWireString(); 89 WebString messageString = message->toWireString();
92 OwnPtr<WebMessagePortChannelArray> webChannels = toWebMessagePortChannelArra y(channels.release()); 90 OwnPtr<WebMessagePortChannelArray> webChannels = toWebMessagePortChannelArra y(channels.release());
93 m_entangledChannel->postMessage(messageString, webChannels.leakPtr()); 91 m_entangledChannel->postMessage(messageString, webChannels.leakPtr());
94 } 92 }
(...skipping 24 matching lines...) Expand all
119 DCHECK(m_entangledChannel); 117 DCHECK(m_entangledChannel);
120 m_entangledChannel->setClient(0); 118 m_entangledChannel->setClient(0);
121 return m_entangledChannel.release(); 119 return m_entangledChannel.release();
122 } 120 }
123 121
124 // Invoked to notify us that there are messages available for this port. 122 // Invoked to notify us that there are messages available for this port.
125 // This code may be called from another thread, and so should not call any non-t hreadsafe APIs (i.e. should not call into the entangled channel or access mutabl e variables). 123 // This code may be called from another thread, and so should not call any non-t hreadsafe APIs (i.e. should not call into the entangled channel or access mutabl e variables).
126 void MessagePort::messageAvailable() 124 void MessagePort::messageAvailable()
127 { 125 {
128 DCHECK(getExecutionContext()); 126 DCHECK(getExecutionContext());
129 getExecutionContext()->postTask(BLINK_FROM_HERE, createCrossThreadTask(&Mess agePort::dispatchMessages, m_weakFactory.createWeakPtr())); 127 getExecutionContext()->postTask(BLINK_FROM_HERE, createCrossThreadTask(&Mess agePort::dispatchMessages, CrossThreadWeakPersistentThisPointer<MessagePort>(thi s)));
130 } 128 }
131 129
132 void MessagePort::start() 130 void MessagePort::start()
133 { 131 {
134 // Do nothing if we've been cloned or closed. 132 // Do nothing if we've been cloned or closed.
135 if (!isEntangled()) 133 if (!isEntangled())
136 return; 134 return;
137 135
138 DCHECK(getExecutionContext()); 136 DCHECK(getExecutionContext());
139 if (m_started) 137 if (m_started)
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
285 { 283 {
286 DCHECK(getExecutionContext()); 284 DCHECK(getExecutionContext());
287 if (!m_scriptStateForConversion) { 285 if (!m_scriptStateForConversion) {
288 v8::Isolate* isolate = scriptIsolate(); 286 v8::Isolate* isolate = scriptIsolate();
289 m_scriptStateForConversion = ScriptState::create(v8::Context::New(isolat e), DOMWrapperWorld::create(isolate)); 287 m_scriptStateForConversion = ScriptState::create(v8::Context::New(isolat e), DOMWrapperWorld::create(isolate));
290 } 288 }
291 return m_scriptStateForConversion->context(); 289 return m_scriptStateForConversion->context();
292 } 290 }
293 291
294 } // namespace blink 292 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698