Skip to content

Commit f2cf6e6

Browse files
committed
native crx binding support
1 parent 5c23357 commit f2cf6e6

14 files changed

+105
-178
lines changed

src/renderer/nw_extensions_renderer_hooks.cc

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@
2929
#include "extensions/common/extension.h"
3030
#include "extensions/common/manifest.h"
3131
#include "extensions/common/manifest_constants.h"
32+
#include "extensions/renderer/native_extension_bindings_system.h"
33+
#include "extensions/common/extension_features.h"
3234

3335
#include "extensions/grit/extensions_renderer_resources.h"
3436

@@ -451,7 +453,10 @@ void DocumentHook2(bool start, content::RenderFrame* frame, Dispatcher* dispatch
451453
// need require in m61 since the following CallModuleMethodSafe
452454
// won't load it anymore: fedbe848f3024dd690f93545a337a2a6fb2aa81f
453455
extensions::ModuleSystem::NativesEnabledScope natives_enabled(script_context->module_system());
454-
script_context->module_system()->Require("nw.Window");
456+
extensions::NativeExtensionBindingsSystem* binding_sys = (extensions::NativeExtensionBindingsSystem*)dispatcher->bindings_system();
457+
v8_context->Enter();
458+
binding_sys->GetAPIObjectForTesting(script_context, "nw.Window");
459+
v8_context->Exit();
455460
script_context->module_system()->CallModuleMethodSafe("nw.Window", "onDocumentStartEnd", &arguments);
456461
}
457462
}

src/resources/api_nw_app.js

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
var nw_binding = require('binding').Binding.create('nw.App');
21
var nwNatives = requireNative('nw_natives');
3-
var sendRequest = require('sendRequest');
42

53
var fullArgv = null;
64
var dataPath;
@@ -17,7 +15,7 @@ var filteredArgv = [
1715
/^--nwapp=/
1816
];
1917

20-
nw_binding.registerCustomHook(function(bindingsAPI) {
18+
apiBridge.registerCustomHook(function(bindingsAPI) {
2119
var apiFunctions = bindingsAPI.apiFunctions;
2220
apiFunctions.setHandleRequest('crashRenderer', function() {
2321
nwNatives.crashRenderer();
@@ -51,16 +49,16 @@ nw_binding.registerCustomHook(function(bindingsAPI) {
5149
return ret;
5250
});
5351
apiFunctions.setHandleRequest('getArgvSync', function() {
54-
return sendRequest.sendRequestSync('nw.App.getArgvSync', [], this.definition.parameters, {});
52+
return bindingUtil.sendRequestSync('nw.App.getArgvSync', [], undefined, undefined);
5553
});
5654
apiFunctions.setHandleRequest('setProxyConfig', function() {
57-
sendRequest.sendRequestSync('nw.App.setProxyConfig', arguments, this.definition.parameters, {});
55+
bindingUtil.sendRequestSync('nw.App.setProxyConfig', $Array.from(arguments), undefined, undefined);
5856
});
5957
apiFunctions.setHandleRequest('clearCache', function() {
60-
sendRequest.sendRequestSync('nw.App.clearCache', arguments, this.definition.parameters, {});
58+
bindingUtil.sendRequestSync('nw.App.clearCache', $Array.from(arguments), undefined, undefined);
6159
});
6260
apiFunctions.setHandleRequest('clearAppCache', function() {
63-
sendRequest.sendRequestSync('nw.App.clearAppCache', arguments, this.definition.parameters, {});
61+
bindingUtil.sendRequestSync('nw.App.clearAppCache', $Array.from(arguments), undefined, undefined);
6462
});
6563
apiFunctions.setHandleRequest('getProxyForURL', function() {
6664
return nwNatives.getProxyForURL.apply(this, arguments);
@@ -106,7 +104,7 @@ nw_binding.registerCustomHook(function(bindingsAPI) {
106104
}
107105
});
108106
apiFunctions.setHandleRequest('getDataPath', function() {
109-
return sendRequest.sendRequestSync('nw.App.getDataPath', [], this.definition.parameters, {})[0];
107+
return bindingUtil.sendRequestSync('nw.App.getDataPath', [], undefined, undefined)[0];
110108
});
111109
apiFunctions.setHandleRequest('getStartPath', function() {
112110
return nwNatives.getOldCwd();
@@ -128,5 +126,5 @@ nw_binding.registerCustomHook(function(bindingsAPI) {
128126

129127
});
130128

131-
exports.binding = nw_binding.generate();
129+
//exports.binding = nw_binding.generate();
132130

src/resources/api_nw_clipboard.js

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,22 @@
1-
var Binding = require('binding').Binding;
21
var forEach = require('utils').forEach;
3-
var nw_binding = require('binding').Binding.create('nw.Clipboard');
4-
var sendRequest = require('sendRequest');
2+
var nwClipboardBinding;
53

6-
nw_binding.registerCustomHook(function(bindingsAPI) {
4+
apiBridge.registerCustomHook(function(bindingsAPI) {
75
var apiFunctions = bindingsAPI.apiFunctions;
8-
6+
nwClipboardBinding = bindingsAPI.compiledApi;
97
['clearSync', 'setListSync'].forEach(function(nwSyncAPIName) {
108
apiFunctions.setHandleRequest(nwSyncAPIName, function() {
11-
return sendRequest.sendRequestSync(this.name, arguments, this.definition.parameters, {})[0];
9+
return bindingUtil.sendRequestSync('nw.Clipboard.' + nwSyncAPIName, $Array.from(arguments), undefined, undefined)[0];
1210
});
1311
});
1412

1513
['readAvailableTypes', 'getListSync'].forEach(function(nwSyncAPIName) {
1614
apiFunctions.setHandleRequest(nwSyncAPIName, function() {
17-
return sendRequest.sendRequestSync(this.name, arguments, this.definition.parameters, {});
15+
return bindingUtil.sendRequestSync('nw.Clipboard.' + nwSyncAPIName, $Array.from(arguments), undefined, undefined);
1816
});
1917
});
2018
});
2119

22-
var nwClipboardBinding = nw_binding.generate();
2320

2421
function NWClipboard() {
2522

@@ -73,5 +70,5 @@ NWClipboard.prototype.readAvailableTypes = function() {
7370
return nwClipboardBinding.readAvailableTypes();
7471
};
7572

76-
exports.binding = NWClipboard;
73+
nwClipboardBinding['get'] = NWClipboard['get'];
7774

src/resources/api_nw_menu.js

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
1-
var Binding = require('binding').Binding;
21
var forEach = require('utils').forEach;
3-
var nw_binding = require('binding').Binding.create('nw.Menu');
42
var nwNative = requireNative('nw_natives');
5-
var sendRequest = require('sendRequest');
63
var messagingNatives = requireNative('messaging_natives');
7-
var Event = require('event_bindings').Event;
84

95
function Menu (option) {
106
if (!(this instanceof Menu)) {
@@ -178,17 +174,18 @@ Menu.prototype.createMacBuiltin = function (app_name, options) {
178174
}
179175
}
180176

181-
nw_binding.registerCustomHook(function(bindingsAPI) {
177+
var nwMenuBinding;
178+
apiBridge.registerCustomHook(function(bindingsAPI) {
182179
var apiFunctions = bindingsAPI.apiFunctions;
180+
nwMenuBinding = bindingsAPI.compiledApi;
183181
apiFunctions.setHandleRequest('getNSStringWithFixup', function(msg) {
184-
return sendRequest.sendRequestSync(this.name, arguments, this.definition.parameters, {})[0];
182+
return bindingUtil.sendRequestSync('nw.Menu.getNSStringWithFixup', $Array.from(arguments), undefined, undefined)[0];
185183
});
186184
apiFunctions.setHandleRequest('getNSStringFWithFixup', function(msg, appName) {
187-
return sendRequest.sendRequestSync(this.name, arguments, this.definition.parameters, {})[0];
185+
return bindingUtil.sendRequestSync('nw.Menu.getNSStringFWithFixup', $Array.from(arguments), undefined, undefined)[0];
188186
});
189187
});
190188

191-
var nwMenuBinding = nw_binding.generate();
192189
Menu.getNSStringWithFixup = nwMenuBinding.getNSStringWithFixup;
193190
Menu.getNSStringFWithFixup = nwMenuBinding.getNSStringFWithFixup;
194191

src/resources/api_nw_menuitem.js

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,11 @@
1-
var Binding = require('binding').Binding;
21
var forEach = require('utils').forEach;
3-
var nw_binding = require('binding').Binding.create('nw.Menu');
42
var nwNative = requireNative('nw_natives');
5-
var sendRequest = require('sendRequest');
63
var messagingNatives = requireNative('messaging_natives');
7-
var Event = require('event_bindings').Event;
84
var util = nw.require('util');
95
var EventEmitter = nw.require('events').EventEmitter;
106

117
var menuItems = { objs : {}, clickEvent: {} };
12-
menuItems.clickEvent = new Event("NWObjectclick");
8+
menuItems.clickEvent = bindingUtil.createCustomEvent("NWObjectclick", undefined, false, false);
139
menuItems.clickEvent.addListener(function(id) {
1410
var obj = menuItems.objs[id];
1511
if (!obj)

src/resources/api_nw_newwin.js

Lines changed: 19 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,16 @@
1-
var Binding = require('binding').Binding;
2-
var nw_binding = require('binding').Binding.create('nw.Window');
31
var nwNatives = requireNative('nw_natives');
42
var forEach = require('utils').forEach;
5-
var Event = require('event_bindings').Event;
6-
var dispatchEvent = require('event_bindings').dispatchEvent;
7-
var dispatchEventNW = require('event_bindings').dispatchEventNW;
8-
var sendRequest = require('sendRequest');
93
var runtimeNatives = requireNative('runtime');
104
var renderFrameObserverNatives = requireNative('renderFrameObserverNatives');
115
var appWindowNatives = requireNative('app_window_natives');
126

137
var GetExtensionViews = runtimeNatives.GetExtensionViews;
148

159
var currentNWWindow = null;
10+
var currentNWWindowInternal = null;
1611
var currentRoutingID = nwNatives.getRoutingID();
1712
var currentWidgetRoutingID = nwNatives.getWidgetRoutingID();
1813

19-
var nw_internal = require('binding').Binding.create('nw.currentWindowInternal');
20-
2114
var bgPage = GetExtensionViews(-1, -1, 'BACKGROUND')[0];
2215

2316
var try_hidden = function (view) {
@@ -74,39 +67,6 @@ var wrapEventsMapNewWin = {
7467
'close': 'onRemoving'
7568
};
7669

77-
nw_internal.registerCustomHook(function(bindingsAPI) {
78-
var apiFunctions = bindingsAPI.apiFunctions;
79-
apiFunctions.setHandleRequest('getCurrent', function() {
80-
return sendRequest.sendRequestSync('nw.currentWindowInternal.getCurrent', arguments, this.definition.parameters, {})[0];
81-
});
82-
apiFunctions.setHandleRequest('getZoom', function() {
83-
return sendRequest.sendRequestSync('nw.currentWindowInternal.getZoom', arguments, this.definition.parameters, {})[0];
84-
});
85-
apiFunctions.setHandleRequest('setZoom', function() {
86-
return sendRequest.sendRequestSync('nw.currentWindowInternal.setZoom', arguments, this.definition.parameters, {});
87-
});
88-
apiFunctions.setHandleRequest('getTitleInternal', function() {
89-
return sendRequest.sendRequestSync('nw.currentWindowInternal.getTitleInternal', arguments, this.definition.parameters, {})[0];
90-
});
91-
apiFunctions.setHandleRequest('setTitleInternal', function() {
92-
return sendRequest.sendRequestSync('nw.currentWindowInternal.setTitleInternal', arguments, this.definition.parameters, {});
93-
});
94-
apiFunctions.setHandleRequest('isKioskInternal', function() {
95-
return sendRequest.sendRequestSync('nw.currentWindowInternal.isKioskInternal', arguments, this.definition.parameters, {})[0];
96-
});
97-
apiFunctions.setHandleRequest('getWinParamInternal', function() {
98-
return sendRequest.sendRequestSync('nw.currentWindowInternal.getWinParamInternal', arguments, this.definition.parameters, {})[0];
99-
});
100-
apiFunctions.setHandleRequest('setPrintSettingsInternal', function() {
101-
return sendRequest.sendRequestSync('nw.currentWindowInternal.setPrintSettingsInternal', arguments, this.definition.parameters, {})[0];
102-
});
103-
apiFunctions.setHandleRequest('setMenu', function() {
104-
return sendRequest.sendRequestSync('nw.currentWindowInternal.setMenu', arguments, this.definition.parameters, {})[0];
105-
});
106-
});
107-
108-
var currentNWWindowInternal = nw_internal.generate();
109-
11070
function NWWindow(cWindow) {
11171
var self = this;
11272
if (cWindow)
@@ -150,18 +110,18 @@ forEach(currentNWWindowInternal, function(key, value) {
150110
NWWindow.prototype[key] = value;
151111
});
152112

153-
NWWindow.prototype.onNewWinPolicy = new Event("nw.Window.onNewWinPolicy");
154-
NWWindow.prototype.onNavigation = new Event();
155-
NWWindow.prototype.LoadingStateChanged = new Event();
156-
NWWindow.prototype.onDocumentStart = new Event("nw.Window.onDocumentStart");
157-
NWWindow.prototype.onDocumentEnd = new Event("nw.Window.onDocumentEnd");
158-
NWWindow.prototype.onZoom = new Event();
159-
NWWindow.prototype.onClose = new Event("nw.Window.onClose", undefined, {supportsFilters: true});
160-
NWWindow.prototype.onMinimized = new Event();
161-
NWWindow.prototype.onMaximized = new Event();
162-
NWWindow.prototype.onFullscreen = new Event();
163-
NWWindow.prototype.onResized = new Event();
164-
NWWindow.prototype.onRestore = new Event();
113+
NWWindow.prototype.onNewWinPolicy = bindingUtil.createCustomEvent("nw.Window.onNewWinPolicy", undefined, false, false);
114+
NWWindow.prototype.onNavigation = bindingUtil.createCustomEvent("nw.Window.onNavigation", undefined, false, false);
115+
NWWindow.prototype.LoadingStateChanged = bindingUtil.createCustomEvent("nw.Window.LoadingStateChanged", undefined, false, false);
116+
NWWindow.prototype.onDocumentStart = bindingUtil.createCustomEvent("nw.Window.onDocumentStart", undefined, false, false);
117+
NWWindow.prototype.onDocumentEnd = bindingUtil.createCustomEvent("nw.Window.onDocumentEnd", undefined, false, false);
118+
NWWindow.prototype.onZoom = bindingUtil.createCustomEvent("nw.Window.onZoom", undefined, false, false);
119+
NWWindow.prototype.onClose = bindingUtil.createCustomEvent("nw.Window.onClose", undefined, true, false);
120+
NWWindow.prototype.onMinimized = bindingUtil.createCustomEvent("nw.Window.onMinimized", undefined, false, false);
121+
NWWindow.prototype.onMaximized = bindingUtil.createCustomEvent("nw.Window.onMaximized", undefined, false, false);
122+
NWWindow.prototype.onFullscreen = bindingUtil.createCustomEvent("nw.Window.onFullscreen", undefined, false, false);
123+
NWWindow.prototype.onResized = bindingUtil.createCustomEvent("nw.Window.onResized", undefined, false, false);
124+
NWWindow.prototype.onRestore = bindingUtil.createCustomEvent("nw.Window.onRestore", undefined, false, false);
165125

166126
NWWindow.prototype.close = function (force) {
167127
currentNWWindowInternal.close(force, this.cWindow.id);
@@ -652,8 +612,9 @@ Object.defineProperty(NWWindow.prototype, 'frameId', {
652612
}
653613
});
654614

655-
nw_binding.registerCustomHook(function(bindingsAPI) {
615+
apiBridge.registerCustomHook(function(bindingsAPI) {
656616
var apiFunctions = bindingsAPI.apiFunctions;
617+
currentNWWindowInternal = getInternalApi('nw.currentWindowInternal');
657618
apiFunctions.setHandleRequest('get', function(domWindow) {
658619
if (domWindow)
659620
return try_nw(domWindow.top).nw.Window.get();
@@ -745,7 +706,7 @@ function dispatchEventIfExists(target, name, varargs) {
745706

746707
function onNewWinPolicy(frame, url, policy) {
747708
//console.log("onNewWinPolicy called: " + url + ", " + policy);
748-
dispatchEventNW("nw.Window.onNewWinPolicy", [frame, url, policy]);
709+
dispatchEventIfExists(currentNWWindow, "onNewWinPolicy", [frame, url, policy]);
749710
}
750711

751712
function onNavigation(frame, url, policy, context) {
@@ -764,11 +725,10 @@ function onLoadingStateChanged(status) {
764725

765726
function onDocumentStartEnd(start, frame, top_routing_id) {
766727
if (start) {
767-
//could use the non-NW version?
768-
dispatchEventNW("nw.Window.onDocumentStart", [frame, top_routing_id]);
728+
dispatchEventIfExists(currentNWWindow, "onDocumentStart", [frame, top_routing_id]);
769729
}
770730
else
771-
dispatchEventNW("nw.Window.onDocumentEnd", [frame, top_routing_id]);
731+
dispatchEventIfExists(currentNWWindow, "onDocumentEnd", [frame, top_routing_id]);
772732
}
773733

774734
function updateAppWindowZoom(old_level, new_level) {
@@ -780,7 +740,7 @@ function updateAppWindowZoom(old_level, new_level) {
780740
function onClose(user_force) {
781741
if (!currentNWWindow)
782742
return;
783-
dispatchEventNW("nw.Window.onClose", [user_force], {instanceId: currentWidgetRoutingID});
743+
currentNWWindow.onClose.dispatchNW({instanceId: currentWidgetRoutingID}, user_force);
784744
}
785745

786746
function get_nw() {
@@ -794,7 +754,6 @@ function get_nw() {
794754
// renderFrameObserverNatives.OnDocumentElementCreated(currentRoutingID, get_nw);
795755
//}
796756

797-
exports.binding = nw_binding.generate();
798757
exports.onNewWinPolicy = onNewWinPolicy;
799758
exports.onNavigation = onNavigation;
800759
exports.LoadingStateChanged = onLoadingStateChanged;

src/resources/api_nw_object.js

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,28 @@
1-
var Binding = require('binding').Binding;
21
var forEach = require('utils').forEach;
3-
var nw_binding = require('binding').Binding.create('nw.Obj');
4-
var sendRequest = require('sendRequest');
52

6-
nw_binding.registerCustomHook(function(bindingsAPI) {
3+
apiBridge.registerCustomHook(function(bindingsAPI) {
74
var apiFunctions = bindingsAPI.apiFunctions;
85
apiFunctions.setHandleRequest('allocateId', function() {
9-
return sendRequest.sendRequestSync(this.name, arguments, this.definition.parameters, {})[0];
6+
return bindingUtil.sendRequestSync('nw.Obj.allocateId', $Array.from(arguments), undefined, undefined)[0];
107
});
118
apiFunctions.setHandleRequest('create', function() {
12-
return sendRequest.sendRequestSync(this.name, arguments, this.definition.parameters, {});
9+
return bindingUtil.sendRequestSync('nw.Obj.create', $Array.from(arguments), undefined, undefined);
1310
});
1411
apiFunctions.setHandleRequest('destroy', function() {
15-
return sendRequest.sendRequestSync(this.name, arguments, this.definition.parameters, {});
12+
return bindingUtil.sendRequestSync('nw.Obj.destroy', $Array.from(arguments), undefined, undefined);
1613
});
1714
apiFunctions.setHandleRequest('callObjectMethod', function() {
18-
return sendRequest.sendRequestSync(this.name, arguments, this.definition.parameters, {});
15+
return bindingUtil.sendRequestSync('nw.Obj.callObjectMethod', $Array.from(arguments), undefined, undefined);
1916
});
2017
// for some reason callObjectMethod is changed to sync behaviour when being ported from nw12
2118
// in order not to bring side effects before release when fix this for #4593, I introduce the
2219
// new method as a workaround. Please see removing it later.
2320
apiFunctions.setHandleRequest('callObjectMethodAsync', function() {
24-
return sendRequest.sendRequest(this.name, arguments, this.definition.parameters);
21+
return bindingUtil.sendRequest('nw.Obj.callObjectMethodAsync', $Array.from(arguments), undefined, undefined);
2522
});
2623
apiFunctions.setHandleRequest('callObjectMethodSync', function() {
27-
return sendRequest.sendRequestSync(this.name, arguments, this.definition.parameters, {})[0];
24+
return bindingUtil.sendRequestSync('nw.Obj.callObjectMethodSync', $Array.from(arguments), undefined, undefined)[0];
2825
});
2926
});
3027

31-
exports.binding = nw_binding.generate();
3228

src/resources/api_nw_screen.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,17 @@
1-
var nw_binding = require('binding').Binding.create('nw.Screen');
2-
var sendRequest = require('sendRequest');
31
var EventEmitter = nw.require('events').EventEmitter;
42

3+
var nwScreenBinding;
54
// Hook Sync API calls
6-
nw_binding.registerCustomHook(function(bindingsAPI) {
5+
apiBridge.registerCustomHook(function(bindingsAPI) {
76
var apiFunctions = bindingsAPI.apiFunctions;
7+
nwScreenBinding = bindingsAPI.compiledApi;
88
['getScreens', 'initEventListeners', 'startMonitor', 'stopMonitor', 'isMonitorStarted', 'registerStream'].forEach(function(nwSyncAPIName) {
99
apiFunctions.setHandleRequest(nwSyncAPIName, function() {
10-
return sendRequest.sendRequestSync(this.name, arguments, this.definition.parameters, {});
10+
return bindingUtil.sendRequestSync('nw.Screen.' + nwSyncAPIName, $Array.from(arguments), undefined, undefined);
1111
});
1212
});
1313
});
1414

15-
var nwScreenBinding = nw_binding.generate();
1615
var inited = false;
1716
var events = {
1817
onDisplayAdded: 'displayAdded',
@@ -76,4 +75,5 @@ Object.defineProperty(Screen.DesktopCaptureMonitor, 'started', {
7675
enumerable: true
7776
});
7877

79-
exports.binding = Screen;
78+
exports.$set('binding', Screen);
79+
//Object.keys(Screen).forEach(function(member) { nwScreenBinding[member] = Screen[member]; });

0 commit comments

Comments
 (0)