| 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..0895e1d6347fc570ad6759eef209dbfbec490e38 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.disconnect();
|
| + port = null;
|
| + }
|
| });
|
| + requestEvent.dispatch(request, sender, responseCallback);
|
| });
|
| }
|
| return;
|
|
|