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

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

Issue 1567423002: Ensure that sendMessage's callback is called. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 11 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
« no previous file with comments | « chrome/test/data/extensions/api_test/messaging/connect_crash/test.js ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 Event = require('event_bindings').Event; 9 var Event = require('event_bindings').Event;
10 var lastError = require('lastError'); 10 var lastError = require('lastError');
(...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after
328 328
329 if (port.name == kMessageChannel && !responseCallback) { 329 if (port.name == kMessageChannel && !responseCallback) {
330 // TODO(mpcomplete): Do this for the old sendRequest API too, after 330 // TODO(mpcomplete): Do this for the old sendRequest API too, after
331 // verifying it doesn't break anything. 331 // verifying it doesn't break anything.
332 // Go ahead and disconnect immediately if the sender is not expecting 332 // Go ahead and disconnect immediately if the sender is not expecting
333 // a response. 333 // a response.
334 port.disconnect(); 334 port.disconnect();
335 return; 335 return;
336 } 336 }
337 337
338 // Ensure the callback exists for the older sendRequest API. 338 function sendResponseIfNeeded(response) {
339 if (!responseCallback) 339 var sendResponse = responseCallback;
Devlin 2016/01/08 17:42:28 Why the copy?
robwu 2016/01/08 17:53:20 This is a bit defensive, to make sure that the cal
Devlin 2016/01/08 18:04:25 That makes sense. I think if that's the intention
robwu 2016/01/08 18:14:24 Added a comment.
340 responseCallback = function() {}; 340 if (sendResponse) {
341 responseCallback = null;
342 sendResponse(response);
343 }
344 }
345
341 346
342 // Note: make sure to manually remove the onMessage/onDisconnect listeners 347 // Note: make sure to manually remove the onMessage/onDisconnect listeners
343 // that we added before destroying the Port, a workaround to a bug in Port 348 // that we added before destroying the Port, a workaround to a bug in Port
344 // where any onMessage/onDisconnect listeners added but not removed will 349 // where any onMessage/onDisconnect listeners added but not removed will
345 // be leaked when the Port is destroyed. 350 // be leaked when the Port is destroyed.
346 // http://crbug.com/320723 tracks a sustainable fix. 351 // http://crbug.com/320723 tracks a sustainable fix.
347 352
348 function disconnectListener() { 353 function disconnectListener() {
349 // For onDisconnects, we only notify the callback if there was an error. 354 if (lastError.hasError(chrome)) {
350 if (chrome.runtime && chrome.runtime.lastError) 355 sendResponseIfNeeded();
351 responseCallback(); 356 } else {
357 lastError.set(
358 port.name, 'The message port closed before a reponse was received.',
Devlin 2016/01/08 17:42:28 I must be missing something - where is this listen
robwu 2016/01/08 17:53:20 Are you referring to the existing comment above? I
Devlin 2016/01/08 18:04:25 onDisconnect is called when the port is disconnect
robwu 2016/01/08 18:14:24 Good point. Fixed!
359 null, chrome);
360 try {
361 sendResponseIfNeeded();
362 } finally {
363 lastError.clear(chrome);
364 }
365 }
352 } 366 }
353 367
354 function messageListener(response) { 368 function messageListener(response) {
355 try { 369 try {
356 responseCallback(response); 370 sendResponseIfNeeded(response);
357 } finally { 371 } finally {
358 port.disconnect(); 372 port.disconnect();
359 } 373 }
360 } 374 }
361 375
362 privates(port).impl.onDestroy_ = function() { 376 privates(port).impl.onDestroy_ = function() {
363 port.onDisconnect.removeListener(disconnectListener); 377 port.onDisconnect.removeListener(disconnectListener);
364 port.onMessage.removeListener(messageListener); 378 port.onMessage.removeListener(messageListener);
365 }; 379 };
366 port.onDisconnect.addListener(disconnectListener); 380 port.onDisconnect.addListener(disconnectListener);
(...skipping 26 matching lines...) Expand all
393 exports.$set('Port', Port); 407 exports.$set('Port', Port);
394 exports.$set('createPort', createPort); 408 exports.$set('createPort', createPort);
395 exports.$set('sendMessageImpl', sendMessageImpl); 409 exports.$set('sendMessageImpl', sendMessageImpl);
396 exports.$set('sendMessageUpdateArguments', sendMessageUpdateArguments); 410 exports.$set('sendMessageUpdateArguments', sendMessageUpdateArguments);
397 411
398 // For C++ code to call. 412 // For C++ code to call.
399 exports.$set('hasPort', hasPort); 413 exports.$set('hasPort', hasPort);
400 exports.$set('dispatchOnConnect', dispatchOnConnect); 414 exports.$set('dispatchOnConnect', dispatchOnConnect);
401 exports.$set('dispatchOnDisconnect', dispatchOnDisconnect); 415 exports.$set('dispatchOnDisconnect', dispatchOnDisconnect);
402 exports.$set('dispatchOnMessage', dispatchOnMessage); 416 exports.$set('dispatchOnMessage', dispatchOnMessage);
OLDNEW
« no previous file with comments | « chrome/test/data/extensions/api_test/messaging/connect_crash/test.js ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698