OLD | NEW |
| (Empty) |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 // Custom binding for the extension API. | |
6 | |
7 var binding = require('binding').Binding.create('extension'); | |
8 | |
9 var messaging = require('messaging'); | |
10 var runtimeNatives = requireNative('runtime'); | |
11 var GetExtensionViews = runtimeNatives.GetExtensionViews; | |
12 var OpenChannelToExtension = runtimeNatives.OpenChannelToExtension; | |
13 var OpenChannelToNativeApp = runtimeNatives.OpenChannelToNativeApp; | |
14 var chrome = requireNative('chrome').GetChrome(); | |
15 | |
16 var inIncognitoContext = requireNative('process').InIncognitoContext(); | |
17 var sendRequestIsDisabled = requireNative('process').IsSendRequestDisabled(); | |
18 var contextType = requireNative('process').GetContextType(); | |
19 var manifestVersion = requireNative('process').GetManifestVersion(); | |
20 | |
21 // This should match chrome.windows.WINDOW_ID_NONE. | |
22 // | |
23 // We can't use chrome.windows.WINDOW_ID_NONE directly because the | |
24 // chrome.windows API won't exist unless this extension has permission for it; | |
25 // which may not be the case. | |
26 var WINDOW_ID_NONE = -1; | |
27 | |
28 binding.registerCustomHook(function(bindingsAPI, extensionId) { | |
29 var extension = bindingsAPI.compiledApi; | |
30 if (manifestVersion < 2) { | |
31 chrome.self = extension; | |
32 extension.inIncognitoTab = inIncognitoContext; | |
33 } | |
34 extension.inIncognitoContext = inIncognitoContext; | |
35 | |
36 var apiFunctions = bindingsAPI.apiFunctions; | |
37 | |
38 apiFunctions.setHandleRequest('getViews', function(properties) { | |
39 var windowId = WINDOW_ID_NONE; | |
40 var type = 'ALL'; | |
41 if (properties) { | |
42 if (properties.type != null) { | |
43 type = properties.type; | |
44 } | |
45 if (properties.windowId != null) { | |
46 windowId = properties.windowId; | |
47 } | |
48 } | |
49 return GetExtensionViews(windowId, type); | |
50 }); | |
51 | |
52 apiFunctions.setHandleRequest('getBackgroundPage', function() { | |
53 return GetExtensionViews(-1, 'BACKGROUND')[0] || null; | |
54 }); | |
55 | |
56 apiFunctions.setHandleRequest('getExtensionTabs', function(windowId) { | |
57 if (windowId == null) | |
58 windowId = WINDOW_ID_NONE; | |
59 return GetExtensionViews(windowId, 'TAB'); | |
60 }); | |
61 | |
62 apiFunctions.setHandleRequest('getURL', function(path) { | |
63 path = String(path); | |
64 if (!path.length || path[0] != '/') | |
65 path = '/' + path; | |
66 return 'chrome-extension://' + extensionId + path; | |
67 }); | |
68 | |
69 // Alias several messaging deprecated APIs to their runtime counterparts. | |
70 var mayNeedAlias = [ | |
71 // Types | |
72 'Port', | |
73 // Functions | |
74 'connect', 'sendMessage', 'connectNative', 'sendNativeMessage', | |
75 // Events | |
76 'onConnect', 'onConnectExternal', 'onMessage', 'onMessageExternal' | |
77 ]; | |
78 $Array.forEach(mayNeedAlias, function(alias) { | |
79 // Checking existence isn't enough since some functions are disabled via | |
80 // getters that throw exceptions. Assume that any getter is such a function. | |
81 if (chrome.runtime && | |
82 $Object.hasOwnProperty(chrome.runtime, alias) && | |
83 chrome.runtime.__lookupGetter__(alias) === undefined) { | |
84 extension[alias] = chrome.runtime[alias]; | |
85 } | |
86 }); | |
87 | |
88 apiFunctions.setUpdateArgumentsPreValidate('sendRequest', | |
89 $Function.bind(messaging.sendMessageUpdateArguments, | |
90 null, 'sendRequest', false /* hasOptionsArgument */)); | |
91 | |
92 apiFunctions.setHandleRequest('sendRequest', | |
93 function(targetId, request, responseCallback) { | |
94 if (sendRequestIsDisabled) | |
95 throw new Error(sendRequestIsDisabled); | |
96 var port = chrome.runtime.connect(targetId || extensionId, | |
97 {name: messaging.kRequestChannel}); | |
98 messaging.sendMessageImpl(port, request, responseCallback); | |
99 }); | |
100 | |
101 if (sendRequestIsDisabled) { | |
102 extension.onRequest.addListener = function() { | |
103 throw new Error(sendRequestIsDisabled); | |
104 }; | |
105 if (contextType == 'BLESSED_EXTENSION') { | |
106 extension.onRequestExternal.addListener = function() { | |
107 throw new Error(sendRequestIsDisabled); | |
108 }; | |
109 } | |
110 } | |
111 }); | |
112 | |
113 exports.binding = binding.generate(); | |
OLD | NEW |