Chromium Code Reviews| Index: chrome/renderer/resources/extensions/miscellaneous_bindings.js |
| diff --git a/chrome/renderer/resources/extensions/miscellaneous_bindings.js b/chrome/renderer/resources/extensions/miscellaneous_bindings.js |
| index 6bcfc1128d3c446b8e2262f2c1cb88085b9c5cf2..bf20cd73b9518d2883a049cf52d1d43a7b1d2bd7 100644 |
| --- a/chrome/renderer/resources/extensions/miscellaneous_bindings.js |
| +++ b/chrome/renderer/resources/extensions/miscellaneous_bindings.js |
| @@ -15,6 +15,7 @@ var chrome = chrome || {}; |
| native function PostMessage(portId, msg); |
| native function GetChromeHidden(); |
| native function Print(); |
| + native function BindToGC(); |
| var chromeHidden = GetChromeHidden(); |
| var manifestVersion; |
| @@ -123,7 +124,7 @@ var chrome = chrome || {}; |
| if (requestEvent.hasListeners()) { |
| var port = chromeHidden.Port.createPort(portId, channelName); |
| port.onMessage.addListener(function(request) { |
| - requestEvent.dispatch(request, sender, function(response) { |
| + var responseCallback = function(response) { |
| if (port) { |
| port.postMessage(response); |
| port = null; |
| @@ -141,7 +142,18 @@ var chrome = chrome || {}; |
| chrome.extension.lastError = {"message": errorMsg}; |
| console.error("Could not send response: " + errorMsg); |
| } |
| + }; |
| + // In case the extension never invokes the responseCallback, and also |
| + // doesn't keep a reference to it, we need to clean up the port. Do |
| + // so by attaching to the garbage collection of the responseCallback |
| + // using some native hackery. |
| + BindToGC(responseCallback, function() { |
| + if (port) { |
| + port.postMessage(null); |
|
Matt Perry
2012/03/13 19:54:39
Change this to port.disconnect(); We shouldn't sen
|
| + port = null; |
| + } |
| }); |
| + requestEvent.dispatch(request, sender, responseCallback); |
| }); |
| } |
| return; |