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

Side by Side Diff: extensions/renderer/resources/messaging.js

Issue 1136953017: Add fallback mechanism to release Extension ports if the JS context has been destroyed. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: comments Created 5 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 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // chrome.runtime.messaging API implementation. 5 // chrome.runtime.messaging API implementation.
6 6
7 // TODO(kalman): factor requiring chrome out of here. 7 // TODO(kalman): factor requiring chrome out of here.
8 var chrome = requireNative('chrome').GetChrome(); 8 var chrome = requireNative('chrome').GetChrome();
9 var lastError = require('lastError'); 9 var lastError = require('lastError');
10 var logActivity = requireNative('activityLogger'); 10 var logActivity = requireNative('activityLogger');
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
121 // We nulled out port when sending the response, and now the page 121 // We nulled out port when sending the response, and now the page
122 // is trying to send another response for the same request. 122 // is trying to send another response for the same request.
123 handleSendRequestError(isSendMessage, responseCallbackPreserved, 123 handleSendRequestError(isSendMessage, responseCallbackPreserved,
124 sourceExtensionId, targetExtensionId); 124 sourceExtensionId, targetExtensionId);
125 } 125 }
126 }; 126 };
127 // In case the extension never invokes the responseCallback, and also 127 // In case the extension never invokes the responseCallback, and also
128 // doesn't keep a reference to it, we need to clean up the port. Do 128 // doesn't keep a reference to it, we need to clean up the port. Do
129 // so by attaching to the garbage collection of the responseCallback 129 // so by attaching to the garbage collection of the responseCallback
130 // using some native hackery. 130 // using some native hackery.
131 //
132 // If the context is destroyed before this has a chance to execute,
133 // BindToGC knows to release |portId| (important for updating C++ state
134 // both in this renderer and on the other end). We don't need to clear
135 // any JavaScript state, as calling destroy_() would usually do - but
136 // the context has been destroyed, so there isn't any JS state to clear.
131 messagingNatives.BindToGC(responseCallback, function() { 137 messagingNatives.BindToGC(responseCallback, function() {
132 if (port) { 138 if (port) {
133 privates(port).impl.destroy_(); 139 privates(port).impl.destroy_();
134 port = null; 140 port = null;
135 } 141 }
136 }); 142 }, portId);
137 var rv = requestEvent.dispatch(request, sender, responseCallback); 143 var rv = requestEvent.dispatch(request, sender, responseCallback);
138 if (isSendMessage) { 144 if (isSendMessage) {
139 responseCallbackPreserved = 145 responseCallbackPreserved =
140 rv && rv.results && $Array.indexOf(rv.results, true) > -1; 146 rv && rv.results && $Array.indexOf(rv.results, true) > -1;
141 if (!responseCallbackPreserved && port) { 147 if (!responseCallbackPreserved && port) {
142 // If they didn't access the response callback, they're not 148 // If they didn't access the response callback, they're not
143 // going to send a response, so clean up the port immediately. 149 // going to send a response, so clean up the port immediately.
144 privates(port).impl.destroy_(); 150 privates(port).impl.destroy_();
145 port = null; 151 port = null;
146 } 152 }
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after
329 exports.kNativeMessageChannel = kNativeMessageChannel; 335 exports.kNativeMessageChannel = kNativeMessageChannel;
330 exports.createPort = createPort; 336 exports.createPort = createPort;
331 exports.sendMessageImpl = sendMessageImpl; 337 exports.sendMessageImpl = sendMessageImpl;
332 exports.sendMessageUpdateArguments = sendMessageUpdateArguments; 338 exports.sendMessageUpdateArguments = sendMessageUpdateArguments;
333 339
334 // For C++ code to call. 340 // For C++ code to call.
335 exports.hasPort = hasPort; 341 exports.hasPort = hasPort;
336 exports.dispatchOnConnect = dispatchOnConnect; 342 exports.dispatchOnConnect = dispatchOnConnect;
337 exports.dispatchOnDisconnect = dispatchOnDisconnect; 343 exports.dispatchOnDisconnect = dispatchOnDisconnect;
338 exports.dispatchOnMessage = dispatchOnMessage; 344 exports.dispatchOnMessage = dispatchOnMessage;
OLDNEW
« no previous file with comments | « extensions/renderer/resources/guest_view/web_view/web_view_action_requests.js ('k') | extensions/renderer/script_context.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698