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

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

Issue 1178273004: Move Extension messaging port release functionality from JS to C++. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: cleanup Created 5 years, 6 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 | « extensions/renderer/messaging_bindings.cc ('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');
11 var logActivity = requireNative('activityLogger'); 11 var logActivity = requireNative('activityLogger');
12 var logging = requireNative('logging'); 12 var logging = requireNative('logging');
13 var messagingNatives = requireNative('messaging_natives'); 13 var messagingNatives = requireNative('messaging_natives');
14 var processNatives = requireNative('process'); 14 var processNatives = requireNative('process');
15 var unloadEvent = require('unload_event');
16 var utils = require('utils'); 15 var utils = require('utils');
17 var messagingUtils = require('messaging_utils'); 16 var messagingUtils = require('messaging_utils');
18 17
19 // The reserved channel name for the sendRequest/send(Native)Message APIs. 18 // The reserved channel name for the sendRequest/send(Native)Message APIs.
20 // Note: sendRequest is deprecated. 19 // Note: sendRequest is deprecated.
21 var kRequestChannel = "chrome.extension.sendRequest"; 20 var kRequestChannel = "chrome.extension.sendRequest";
22 var kMessageChannel = "chrome.runtime.sendMessage"; 21 var kMessageChannel = "chrome.runtime.sendMessage";
23 var kNativeMessageChannel = "chrome.runtime.sendNativeMessage"; 22 var kNativeMessageChannel = "chrome.runtime.sendNativeMessage";
24 23
25 // Map of port IDs to port object. 24 // Map of port IDs to port object.
26 var ports = {}; 25 var ports = {};
27 26
28 // Map of port IDs to unloadEvent listeners. Keep track of these to free the
29 // unloadEvent listeners when ports are closed.
30 var portReleasers = {};
31
32 // Change even to odd and vice versa, to get the other side of a given 27 // Change even to odd and vice versa, to get the other side of a given
33 // channel. 28 // channel.
34 function getOppositePortId(portId) { return portId ^ 1; } 29 function getOppositePortId(portId) { return portId ^ 1; }
35 30
36 // Port object. Represents a connection to another script context through 31 // Port object. Represents a connection to another script context through
37 // which messages can be passed. 32 // which messages can be passed.
38 function PortImpl(portId, opt_name) { 33 function PortImpl(portId, opt_name) {
39 this.portId_ = portId; 34 this.portId_ = portId;
40 this.name = opt_name; 35 this.name = opt_name;
41 36
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
78 73
79 PortImpl.prototype.destroy_ = function() { 74 PortImpl.prototype.destroy_ = function() {
80 var portId = this.portId_; 75 var portId = this.portId_;
81 76
82 if (this.onDestroy_) 77 if (this.onDestroy_)
83 this.onDestroy_(); 78 this.onDestroy_();
84 privates(this.onDisconnect).impl.destroy_(); 79 privates(this.onDisconnect).impl.destroy_();
85 privates(this.onMessage).impl.destroy_(); 80 privates(this.onMessage).impl.destroy_();
86 81
87 messagingNatives.PortRelease(portId); 82 messagingNatives.PortRelease(portId);
88 unloadEvent.removeListener(portReleasers[portId]);
89
90 delete ports[portId]; 83 delete ports[portId];
91 delete portReleasers[portId];
92 }; 84 };
93 85
94 // Returns true if the specified port id is in this context. This is used by 86 // Returns true if the specified port id is in this context. This is used by
95 // the C++ to avoid creating the javascript message for all the contexts that 87 // the C++ to avoid creating the javascript message for all the contexts that
96 // don't care about a particular message. 88 // don't care about a particular message.
97 function hasPort(portId) { 89 function hasPort(portId) {
98 return portId in ports; 90 return portId in ports;
99 }; 91 };
100 92
101 // Hidden port creation function. We don't want to expose an API that lets 93 // Hidden port creation function. We don't want to expose an API that lets
102 // people add arbitrary port IDs to the port list. 94 // people add arbitrary port IDs to the port list.
103 function createPort(portId, opt_name) { 95 function createPort(portId, opt_name) {
104 if (ports[portId]) 96 if (ports[portId])
105 throw new Error("Port '" + portId + "' already exists."); 97 throw new Error("Port '" + portId + "' already exists.");
106 var port = new Port(portId, opt_name); 98 var port = new Port(portId, opt_name);
107 ports[portId] = port; 99 ports[portId] = port;
108 portReleasers[portId] = $Function.bind(messagingNatives.PortRelease,
109 this,
110 portId);
111 unloadEvent.addListener(portReleasers[portId]);
112 messagingNatives.PortAddRef(portId); 100 messagingNatives.PortAddRef(portId);
113 return port; 101 return port;
114 }; 102 };
115 103
116 // Helper function for dispatchOnRequest. 104 // Helper function for dispatchOnRequest.
117 function handleSendRequestError(isSendMessage, 105 function handleSendRequestError(isSendMessage,
118 responseCallbackPreserved, 106 responseCallbackPreserved,
119 sourceExtensionId, 107 sourceExtensionId,
120 targetExtensionId, 108 targetExtensionId,
121 sourceUrl) { 109 sourceUrl) {
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after
395 exports.Port = Port; 383 exports.Port = Port;
396 exports.createPort = createPort; 384 exports.createPort = createPort;
397 exports.sendMessageImpl = sendMessageImpl; 385 exports.sendMessageImpl = sendMessageImpl;
398 exports.sendMessageUpdateArguments = sendMessageUpdateArguments; 386 exports.sendMessageUpdateArguments = sendMessageUpdateArguments;
399 387
400 // For C++ code to call. 388 // For C++ code to call.
401 exports.hasPort = hasPort; 389 exports.hasPort = hasPort;
402 exports.dispatchOnConnect = dispatchOnConnect; 390 exports.dispatchOnConnect = dispatchOnConnect;
403 exports.dispatchOnDisconnect = dispatchOnDisconnect; 391 exports.dispatchOnDisconnect = dispatchOnDisconnect;
404 exports.dispatchOnMessage = dispatchOnMessage; 392 exports.dispatchOnMessage = dispatchOnMessage;
OLDNEW
« no previous file with comments | « extensions/renderer/messaging_bindings.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698