|
1 | 1 | src = """
|
2 | 2 | window.pywebview = {
|
3 | 3 | token: '%s',
|
| 4 | + _rpc_id_prefix: Math.random().toString(36).substring(2,6)+'.', |
| 5 | + _rpc_id_sequence: 0, |
4 | 6 | _createApi: function(funcList) {
|
5 | 7 | for (var i = 0; i < funcList.length; i++) {
|
6 | 8 | window.pywebview.api[funcList[i]] = (function (funcName) {
|
7 |
| - return function(params) { |
8 |
| - var promise = new Promise(function(resolve, reject) { |
9 |
| - window.pywebview._checkValue(funcName, resolve); |
| 9 | + return function() { |
| 10 | + var rpc_id = window.pywebview._rpc_id_prefix+( |
| 11 | + ++window.pywebview._rpc_id_sequence); |
| 12 | + var rpc_request = {name:funcName, rpc_id:rpc_id, args:Array.from(arguments)} |
| 13 | + window.pywebview._bridge.call(rpc_request); |
| 14 | + return new Promise(function(resolve, reject) { |
| 15 | + function on_rpc_settle(ev){ |
| 16 | + if (ev.detail.rpc_id == rpc_request.rpc_id){ |
| 17 | + window.removeEventListener('rpc_settle', on_rpc_settle); |
| 18 | + if (ev.detail.success) |
| 19 | + resolve(ev.detail.value); |
| 20 | + else |
| 21 | + reject(ev.detail.value); |
| 22 | + } |
| 23 | + } |
| 24 | + window.addEventListener('rpc_settle', on_rpc_settle); |
10 | 25 | });
|
11 |
| - window.pywebview._bridge.call(funcName, JSON.stringify(params)); |
12 |
| - return promise; |
13 | 26 | }
|
14 | 27 | })(funcList[i])
|
15 |
| -
|
16 |
| - window.pywebview._returnValues[funcList[i]] = { |
17 |
| - isSet: false, |
18 |
| - value: undefined, |
19 |
| - } |
20 | 28 | }
|
21 | 29 | },
|
22 | 30 | _bridge: {
|
23 |
| - call: function (funcName, params) { |
| 31 | + call: function (rpc_request) { |
24 | 32 | switch(window.pywebview.platform) {
|
25 | 33 | case 'mshtml':
|
26 | 34 | case 'cef':
|
|
29 | 37 | case 'edgehtml':
|
30 | 38 | return window.external.notify(JSON.stringify([funcName, params]));
|
31 | 39 | case 'cocoa':
|
32 |
| - return window.webkit.messageHandlers.jsBridge.postMessage(JSON.stringify([funcName, params])); |
| 40 | + return window.webkit.messageHandlers.jsBridge.postMessage( |
| 41 | + JSON.stringify(rpc_request)); |
33 | 42 | case 'qtwebengine':
|
34 | 43 | new QWebChannel(qt.webChannelTransport, function(channel) {
|
35 | 44 | channel.objects.external.call(funcName, params);
|
|
38 | 47 | }
|
39 | 48 | }
|
40 | 49 | },
|
41 |
| -
|
42 |
| - _checkValue: function(funcName, resolve) { |
43 |
| - var check = setInterval(function () { |
44 |
| - var returnObj = window.pywebview._returnValues[funcName]; |
45 |
| - if (returnObj.isSet) { |
46 |
| - returnObj.isSet = false; |
47 |
| - try { |
48 |
| - resolve(JSON.parse(returnObj.value)); |
49 |
| - } catch(e) { |
50 |
| - resolve(returnObj.value); |
51 |
| - } |
52 |
| -
|
53 |
| - clearInterval(check); |
54 |
| - } |
55 |
| - }, 100) |
| 50 | + _rpcSettle: function(rpc_id, success, value){ |
| 51 | + window.dispatchEvent( |
| 52 | + new CustomEvent('rpc_settle', {detail:{rpc_id:rpc_id, success:success, value:value}} ) |
| 53 | + ); |
56 | 54 | },
|
57 | 55 | platform: '%s',
|
58 | 56 | api: {},
|
59 |
| - _returnValues: {} |
60 | 57 | }
|
61 | 58 |
|
62 | 59 | window.pywebview._createApi(%s);
|
|
0 commit comments