@cordova-ohos/cordova-plugin-themeablebrowser 0.2.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +204 -0
- package/OAT.xml +79 -0
- package/README.md +105 -0
- package/package.json +29 -0
- package/plugin.xml +51 -0
- package/src/main/cpp/inappbrowser/ThemeableBrowser.cpp +444 -0
- package/src/main/cpp/inappbrowser/ThemeableBrowser.h +46 -0
- package/src/main/ets/components/InAppBrowser/BrowserAction.ets +383 -0
- package/www/themeablebrowser.js +119 -0
|
@@ -0,0 +1,383 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2025 Huawei Device, Inc. Ltd. and <马弓手>.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import {
|
|
18
|
+
ArkTsAttribute,
|
|
19
|
+
cordovaWebIdToWebviewGlobe, cordovaWebTagToObjectGlobe,
|
|
20
|
+
cordovaWebViewGlobe,
|
|
21
|
+
NativeAttribute } from '../PluginGlobal';
|
|
22
|
+
import { call } from '@kit.TelephonyKit';
|
|
23
|
+
import { BusinessError } from '@kit.BasicServicesKit';
|
|
24
|
+
import { common, Want } from '@kit.AbilityKit';
|
|
25
|
+
import { MainPage } from '../MainPage';
|
|
26
|
+
import { util } from '@kit.ArkTS';
|
|
27
|
+
import { CordovaWebView } from '../CordovaWebView';
|
|
28
|
+
import { webview } from '@kit.ArkWeb';
|
|
29
|
+
import cordova from 'libcordova.so';
|
|
30
|
+
import { NormalizeError } from '../NormalizeError';
|
|
31
|
+
|
|
32
|
+
export function openInAppBrowser(pageIndex:NativeAttribute):void {
|
|
33
|
+
interface UrlAttribute {
|
|
34
|
+
url: string;
|
|
35
|
+
title: string;
|
|
36
|
+
target: string;
|
|
37
|
+
args:string;
|
|
38
|
+
}
|
|
39
|
+
let urlInfo:UrlAttribute = JSON.parse(pageIndex.pageArgs) as UrlAttribute;
|
|
40
|
+
if(urlInfo.url.indexOf("tel:") == 0) {
|
|
41
|
+
let tel:string = urlInfo.url.replace("tel:", "").replace("//", "");
|
|
42
|
+
let isSupport = call.hasVoiceCapability();
|
|
43
|
+
if(isSupport && call.makeCall) {
|
|
44
|
+
call.makeCall(tel, (err: BusinessError) => {
|
|
45
|
+
if (!err) {
|
|
46
|
+
console.log("make call success.");
|
|
47
|
+
} else {
|
|
48
|
+
console.log("make call fail, err is:" + JSON.stringify(err));
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
if(urlInfo.url.indexOf("amapuri") >= 0) {
|
|
56
|
+
try {
|
|
57
|
+
if(!cordovaWebTagToObjectGlobe.hasKey(pageIndex.pageWebTag)) {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
let mainPage = cordovaWebTagToObjectGlobe.get(pageIndex.pageWebTag) as MainPage;
|
|
61
|
+
let context = mainPage.getUIContext().getHostContext() as common.UIAbilityContext;
|
|
62
|
+
let want: Want = {
|
|
63
|
+
uri: urlInfo.url
|
|
64
|
+
}
|
|
65
|
+
// this.context:一般是在 Component 组件里调用 getContext(this) as common.UIAbilityContext 获取到的 UIAbilityContext
|
|
66
|
+
context.startAbility(want, (err: BusinessError) => {
|
|
67
|
+
if (err.code) {
|
|
68
|
+
// 处理业务逻辑错误
|
|
69
|
+
console.error(`startAbility failed,code is ${err.code},message is ${err.message}`);
|
|
70
|
+
return
|
|
71
|
+
}
|
|
72
|
+
// 执行正常业务
|
|
73
|
+
console.info('startAbility succeed')
|
|
74
|
+
})
|
|
75
|
+
} catch (error) {
|
|
76
|
+
const cordovaError = NormalizeError(error);
|
|
77
|
+
console.error(`Failed to openInAppBrowser. Cause code: ${cordovaError.code}, message: ${cordovaError.message}`);
|
|
78
|
+
}
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
if(urlInfo.url.indexOf("baidumap") >= 0) {
|
|
83
|
+
try {
|
|
84
|
+
if(!cordovaWebTagToObjectGlobe.hasKey(pageIndex.pageWebTag)) {
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
let mainPage = cordovaWebTagToObjectGlobe.get(pageIndex.pageWebTag) as MainPage;
|
|
88
|
+
let context = mainPage.getUIContext().getHostContext() as common.UIAbilityContext;
|
|
89
|
+
let want: Want = {
|
|
90
|
+
uri: urlInfo.url
|
|
91
|
+
}
|
|
92
|
+
// this.context:一般是在 Component 组件里调用 getContext(this) as common.UIAbilityContext 获取到的 UIAbilityContext
|
|
93
|
+
context.startAbility(want, (err: BusinessError) => {
|
|
94
|
+
if (err.code) {
|
|
95
|
+
// 处理业务逻辑错误
|
|
96
|
+
console.error(`startAbility failed,code is ${err.code},message is ${err.message}`);
|
|
97
|
+
return
|
|
98
|
+
}
|
|
99
|
+
// 执行正常业务
|
|
100
|
+
console.info('startAbility succeed')
|
|
101
|
+
})
|
|
102
|
+
} catch (error) {
|
|
103
|
+
const cordovaError = NormalizeError(error);
|
|
104
|
+
console.error(`Failed to openInAppBrowser. Cause code: ${cordovaError.code}, message: ${cordovaError.message}`);
|
|
105
|
+
}
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
if(urlInfo.target == "_system") {
|
|
110
|
+
try {
|
|
111
|
+
if(!cordovaWebTagToObjectGlobe.hasKey(pageIndex.pageWebTag)) {
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
let mainPage = cordovaWebTagToObjectGlobe.get(pageIndex.pageWebTag) as MainPage;
|
|
115
|
+
let context = mainPage.getUIContext().getHostContext() as common.UIAbilityContext;
|
|
116
|
+
let wantInfo: Want = {
|
|
117
|
+
action: 'ohos.want.action.viewData',
|
|
118
|
+
entities: ['entity.system.browsable'],
|
|
119
|
+
uri: urlInfo.url
|
|
120
|
+
}
|
|
121
|
+
context.startAbility(wantInfo).then(() => {
|
|
122
|
+
console.log('[跳转至外部浏览器] - success')
|
|
123
|
+
}).catch((err: BusinessError) => {
|
|
124
|
+
console.error('[跳转至外部浏览器] - Failed to startAbility. Code: ' + err.code + 'message:' + err.message);
|
|
125
|
+
})
|
|
126
|
+
} catch (error) {
|
|
127
|
+
const cordovaError = NormalizeError(error);
|
|
128
|
+
console.error(`Failed to openInAppBrowser. Cause code: ${cordovaError.code}, message: ${cordovaError.message}`);
|
|
129
|
+
}
|
|
130
|
+
} else { //除了在外置浏览器打开,其他都在内置浏览器打开
|
|
131
|
+
try {
|
|
132
|
+
if(!cordovaWebTagToObjectGlobe.hasKey(pageIndex.pageWebTag)) {
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
let mainPage = cordovaWebTagToObjectGlobe.get(pageIndex.pageWebTag) as MainPage;
|
|
136
|
+
if(mainPage.inAppBrowserWebId != "") { //已经打开了,js侧重复打开
|
|
137
|
+
if(cordovaWebIdToWebviewGlobe.hasKey(mainPage.inAppBrowserWebId)) {
|
|
138
|
+
let webTag = cordovaWebIdToWebviewGlobe.get(mainPage.inAppBrowserWebId);
|
|
139
|
+
if(cordovaWebTagToObjectGlobe.hasKey(webTag)) {
|
|
140
|
+
let inAppBrowser:MainPage = cordovaWebTagToObjectGlobe.get(webTag) as MainPage;
|
|
141
|
+
inAppBrowser.indexPage = urlInfo.url;
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
if(mainPage.pageInfos) {
|
|
148
|
+
mainPage.inAppBrowserWebId = util.generateRandomUUID(false);
|
|
149
|
+
let paras:Array<string> = new Array<string>();
|
|
150
|
+
paras.push(pageIndex.pageArgs, mainPage.inAppBrowserWebId,pageIndex.pageWebTag,pageIndex.pageObject);
|
|
151
|
+
mainPage.pageInfos.pushDestinationByName('InAppBrowser', paras).catch((error: BusinessError) => {
|
|
152
|
+
console.error(`InAppBrowser error code = ${error.code}, error.message = ${error.message}.`);
|
|
153
|
+
}).then(() => {
|
|
154
|
+
console.info('InAppBrowser destination succeed.');
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
} catch (error) {
|
|
158
|
+
const cordovaError = NormalizeError(error);
|
|
159
|
+
console.error(`Failed to openInAppBrowser. Cause code: ${cordovaError.code}, message: ${cordovaError.message}`);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
export function closeInAppBrowser(pageIndex:NativeAttribute):void {
|
|
165
|
+
try {
|
|
166
|
+
if(!cordovaWebTagToObjectGlobe.hasKey(pageIndex.pageWebTag)) {
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
let mainPage = cordovaWebTagToObjectGlobe.get(pageIndex.pageWebTag) as MainPage;
|
|
170
|
+
if(mainPage.pageInfos) {
|
|
171
|
+
mainPage.pageInfos.removeByName("InAppBrowser");
|
|
172
|
+
mainPage.inAppBrowserWebId = "";
|
|
173
|
+
}
|
|
174
|
+
} catch (error) {
|
|
175
|
+
const cordovaError = NormalizeError(error);
|
|
176
|
+
console.error(`Failed to closeInAppBrowser. Cause code: ${cordovaError.code}, message: ${cordovaError.message}`);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
export function injectScriptCodeInAppBrowser(pageIndex:NativeAttribute):void {
|
|
181
|
+
interface InjectCode{
|
|
182
|
+
code:string;
|
|
183
|
+
callbackId:string;
|
|
184
|
+
cb:boolean;
|
|
185
|
+
}
|
|
186
|
+
try {
|
|
187
|
+
if(!cordovaWebTagToObjectGlobe.hasKey(pageIndex.pageWebTag)) {
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
let mainPage = cordovaWebTagToObjectGlobe.get(pageIndex.pageWebTag) as MainPage;
|
|
191
|
+
if(mainPage.inAppBrowserWebId && mainPage.inAppBrowserWebId != "") {
|
|
192
|
+
if(cordovaWebViewGlobe.hasKey(mainPage.inAppBrowserWebId)) {
|
|
193
|
+
let cordovaWebView:CordovaWebView = cordovaWebViewGlobe.get(mainPage.inAppBrowserWebId);
|
|
194
|
+
let controller:webview.WebviewController = cordovaWebView.getWebviewController();
|
|
195
|
+
let injectCode:InjectCode = JSON.parse(pageIndex.pageArgs) as InjectCode;
|
|
196
|
+
if(injectCode.cb) {
|
|
197
|
+
controller.runJavaScriptExt(injectCode.code, (error, result) => {
|
|
198
|
+
if(error) {
|
|
199
|
+
let res: ArkTsAttribute = {content:"callback", result:[injectCode.callbackId, JSON.stringify(error)]};
|
|
200
|
+
cordova.onArkTsResult(JSON.stringify(res), "InAppBrowser", pageIndex.pageWebTag);
|
|
201
|
+
}
|
|
202
|
+
if(result) {
|
|
203
|
+
let type = result.getType();
|
|
204
|
+
let ret: string = "";
|
|
205
|
+
switch (type) {
|
|
206
|
+
case webview.JsMessageType.STRING: {
|
|
207
|
+
ret = result.getString();
|
|
208
|
+
ret = ret.substring(1, ret.length-1);
|
|
209
|
+
break;
|
|
210
|
+
}
|
|
211
|
+
case webview.JsMessageType.NUMBER: {
|
|
212
|
+
ret = "" + result.getNumber();
|
|
213
|
+
break;
|
|
214
|
+
}
|
|
215
|
+
case webview.JsMessageType.BOOLEAN: {
|
|
216
|
+
ret = "" + ((result.getBoolean()));
|
|
217
|
+
break;
|
|
218
|
+
}
|
|
219
|
+
case webview.JsMessageType.ARRAY_BUFFER: {
|
|
220
|
+
let base64 = new util.Base64Helper();
|
|
221
|
+
ret = base64.encodeToStringSync(new Uint8Array(result.getArrayBuffer()));
|
|
222
|
+
break;
|
|
223
|
+
}
|
|
224
|
+
case webview.JsMessageType.ARRAY: {
|
|
225
|
+
ret = result.getArray().toString();
|
|
226
|
+
break;
|
|
227
|
+
}
|
|
228
|
+
default: {
|
|
229
|
+
break;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
let res: ArkTsAttribute = { content: "callback", result: [injectCode.callbackId, ret] };
|
|
233
|
+
cordova.onArkTsResult(JSON.stringify(res), "InAppBrowser", pageIndex.pageWebTag);
|
|
234
|
+
}
|
|
235
|
+
});
|
|
236
|
+
} else {
|
|
237
|
+
controller.runJavaScriptExt(injectCode.code).catch(() => {
|
|
238
|
+
console.error("InAppBrowser runJavaScriptExt");
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
} catch (error) {
|
|
244
|
+
const cordovaError = NormalizeError(error);
|
|
245
|
+
console.error(`Failed to injectScriptCodeInAppBrowser. Cause code: ${cordovaError.code}, message: ${cordovaError.message}`);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
export function injectScriptFileInAppBrowser(pageIndex:NativeAttribute):void {
|
|
250
|
+
interface InjectCode{
|
|
251
|
+
file:string;
|
|
252
|
+
callbackId:string;
|
|
253
|
+
cb:boolean;
|
|
254
|
+
}
|
|
255
|
+
try {
|
|
256
|
+
if(!cordovaWebTagToObjectGlobe.hasKey(pageIndex.pageWebTag)) {
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
let mainPage = cordovaWebTagToObjectGlobe.get(pageIndex.pageWebTag) as MainPage;
|
|
260
|
+
if(mainPage.inAppBrowserWebId && mainPage.inAppBrowserWebId != "") {
|
|
261
|
+
if(cordovaWebViewGlobe.hasKey(mainPage.inAppBrowserWebId)) {
|
|
262
|
+
let cordovaWebView:CordovaWebView = cordovaWebViewGlobe.get(mainPage.inAppBrowserWebId);
|
|
263
|
+
let controller:webview.WebviewController = cordovaWebView.getWebviewController();
|
|
264
|
+
let injectCode:InjectCode = JSON.parse(pageIndex.pageArgs) as InjectCode;
|
|
265
|
+
let code:string = "";
|
|
266
|
+
if(injectCode.cb) {//通过消息函数回调返回js侧
|
|
267
|
+
code = "(function() {var c = document.createElement('script'); c.src =\""+injectCode.file+"\";c.onload = function(){cordova_iab.postCallBack(\""+injectCode.callbackId+"\", '');}; document.body.appendChild(c);}())";
|
|
268
|
+
} else {
|
|
269
|
+
code = "(function() {var c = document.createElement('script'); c.src =\""+injectCode.file+"\"; document.body.appendChild(c);}())";
|
|
270
|
+
}
|
|
271
|
+
controller.runJavaScriptExt(code).catch(() => {
|
|
272
|
+
console.error("InAppBrowser runJavaScriptExt");
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
} catch (error) {
|
|
277
|
+
const cordovaError = NormalizeError(error);
|
|
278
|
+
console.error(`Failed to injectScriptFileInAppBrowser. Cause code: ${cordovaError.code}, message: ${cordovaError.message}`);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
export function injectStyleCodeInAppBrowser(pageIndex:NativeAttribute):void {
|
|
283
|
+
interface InjectCode{
|
|
284
|
+
code:string;
|
|
285
|
+
callbackId:string;
|
|
286
|
+
cb:boolean;
|
|
287
|
+
}
|
|
288
|
+
try {
|
|
289
|
+
if(!cordovaWebTagToObjectGlobe.hasKey(pageIndex.pageWebTag)) {
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
let mainPage = cordovaWebTagToObjectGlobe.get(pageIndex.pageWebTag) as MainPage;
|
|
293
|
+
if(mainPage.inAppBrowserWebId && mainPage.inAppBrowserWebId != "") {
|
|
294
|
+
if(cordovaWebViewGlobe.hasKey(mainPage.inAppBrowserWebId)) {
|
|
295
|
+
let cordovaWebView:CordovaWebView = cordovaWebViewGlobe.get(mainPage.inAppBrowserWebId);
|
|
296
|
+
let controller:webview.WebviewController = cordovaWebView.getWebviewController();
|
|
297
|
+
let injectCode:InjectCode = JSON.parse(pageIndex.pageArgs) as InjectCode;
|
|
298
|
+
let code:string = "(function() { var c = document.createElement('style'); c.innerHTML = \""+injectCode.code+"\"; document.body.appendChild(c); })()";
|
|
299
|
+
if(injectCode.cb) {
|
|
300
|
+
controller.runJavaScriptExt(code, (error, result) => {
|
|
301
|
+
if(error) {
|
|
302
|
+
let res: ArkTsAttribute = {content:"callback", result:[injectCode.callbackId, JSON.stringify(error)]};
|
|
303
|
+
cordova.onArkTsResult(JSON.stringify(res), "InAppBrowser", pageIndex.pageWebTag);
|
|
304
|
+
}
|
|
305
|
+
if(result) {
|
|
306
|
+
let type = result.getType();
|
|
307
|
+
let ret: string = "";
|
|
308
|
+
switch (type) {
|
|
309
|
+
case webview.JsMessageType.STRING: {
|
|
310
|
+
ret = result.getString();
|
|
311
|
+
ret = ret.substring(1, ret.length-1);
|
|
312
|
+
break;
|
|
313
|
+
}
|
|
314
|
+
case webview.JsMessageType.NUMBER: {
|
|
315
|
+
ret = "" + result.getNumber();
|
|
316
|
+
break;
|
|
317
|
+
}
|
|
318
|
+
case webview.JsMessageType.BOOLEAN: {
|
|
319
|
+
ret = "" + ((result.getBoolean()));
|
|
320
|
+
break;
|
|
321
|
+
}
|
|
322
|
+
case webview.JsMessageType.ARRAY_BUFFER: {
|
|
323
|
+
let base64 = new util.Base64Helper();
|
|
324
|
+
ret = base64.encodeToStringSync(new Uint8Array(result.getArrayBuffer()));
|
|
325
|
+
break;
|
|
326
|
+
}
|
|
327
|
+
case webview.JsMessageType.ARRAY: {
|
|
328
|
+
ret = result.getArray().toString();
|
|
329
|
+
break;
|
|
330
|
+
}
|
|
331
|
+
default: {
|
|
332
|
+
break;
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
let res: ArkTsAttribute = { content: "callback", result: [injectCode.callbackId, ret] };
|
|
336
|
+
cordova.onArkTsResult(JSON.stringify(res), "InAppBrowser", pageIndex.pageWebTag);
|
|
337
|
+
}
|
|
338
|
+
});
|
|
339
|
+
} else {
|
|
340
|
+
controller.runJavaScriptExt(code).catch(() => {
|
|
341
|
+
console.error("InAppBrowser runJavaScriptExt");
|
|
342
|
+
});
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
} catch (error) {
|
|
347
|
+
const cordovaError = NormalizeError(error);
|
|
348
|
+
console.error(`Failed to injectScriptFileInAppBrowser. Cause code: ${cordovaError.code}, message: ${cordovaError.message}`);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
export function injectStyleFileInAppBrowser(pageIndex:NativeAttribute):void {
|
|
353
|
+
interface InjectCode{
|
|
354
|
+
file:string;
|
|
355
|
+
callbackId:string;
|
|
356
|
+
cb:boolean;
|
|
357
|
+
}
|
|
358
|
+
try {
|
|
359
|
+
if(!cordovaWebTagToObjectGlobe.hasKey(pageIndex.pageWebTag)) {
|
|
360
|
+
return;
|
|
361
|
+
}
|
|
362
|
+
let mainPage = cordovaWebTagToObjectGlobe.get(pageIndex.pageWebTag) as MainPage;
|
|
363
|
+
if(mainPage.inAppBrowserWebId && mainPage.inAppBrowserWebId != "") {
|
|
364
|
+
if(cordovaWebViewGlobe.hasKey(mainPage.inAppBrowserWebId)) {
|
|
365
|
+
let cordovaWebView:CordovaWebView = cordovaWebViewGlobe.get(mainPage.inAppBrowserWebId);
|
|
366
|
+
let controller:webview.WebviewController = cordovaWebView.getWebviewController();
|
|
367
|
+
let injectCode:InjectCode = JSON.parse(pageIndex.pageArgs) as InjectCode;
|
|
368
|
+
let code:string = "";
|
|
369
|
+
if(injectCode.cb) {//通过消息函数回调返回js侧
|
|
370
|
+
code = "(function() {var c = document.createElement('link'); c.rel='stylesheet'; c.type='text/css'; c.href = \""+injectCode.file+"\"; c.onload=function(){cordova_iab.postCallBack(\""+injectCode.callbackId+"\",'');}; document.head.appendChild(c);})()";
|
|
371
|
+
} else {
|
|
372
|
+
code = "(function() {var c = document.createElement('link'); c.rel='stylesheet'; c.type='text/css'; c.href = \""+injectCode.file+"\"; document.head.appendChild(c);})()";
|
|
373
|
+
}
|
|
374
|
+
controller.runJavaScriptExt(code).catch(() => {
|
|
375
|
+
console.error("InAppBrowser runJavaScriptExt");
|
|
376
|
+
});
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
} catch (error) {
|
|
380
|
+
const cordovaError = NormalizeError(error);
|
|
381
|
+
console.error(`Failed to injectStyleFileInAppBrowser. Cause code: ${cordovaError.code}, message: ${cordovaError.message}`);
|
|
382
|
+
}
|
|
383
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/*
|
|
2
|
+
*
|
|
3
|
+
* Licensed to the Apache Software Foundation (ASF) under one
|
|
4
|
+
* or more contributor license agreements. See the NOTICE file
|
|
5
|
+
* distributed with this work for additional information
|
|
6
|
+
* regarding copyright ownership. The ASF licenses this file
|
|
7
|
+
* to you under the Apache License, Version 2.0 (the
|
|
8
|
+
* "License"); you may not use this file except in compliance
|
|
9
|
+
* with the License. You may obtain a copy of the License at
|
|
10
|
+
*
|
|
11
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
*
|
|
13
|
+
* Unless required by applicable law or agreed to in writing,
|
|
14
|
+
* software distributed under the License is distributed on an
|
|
15
|
+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
16
|
+
* KIND, either express or implied. See the License for the
|
|
17
|
+
* specific language governing permissions and limitations
|
|
18
|
+
* under the License.
|
|
19
|
+
*
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
var exec = require('cordova/exec');
|
|
23
|
+
var channel = require('cordova/channel');
|
|
24
|
+
var modulemapper = require('cordova/modulemapper');
|
|
25
|
+
var urlutil = require('cordova/urlutil');
|
|
26
|
+
|
|
27
|
+
function ThemeableBrowser() {
|
|
28
|
+
this.channels = {};
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
ThemeableBrowser.prototype = {
|
|
32
|
+
_eventHandler: function (event) {
|
|
33
|
+
if (event && (event.type in this.channels)) {
|
|
34
|
+
this.channels[event.type].fire(event);
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
close: function (eventname) {
|
|
38
|
+
exec(null, null, 'ThemeableBrowser', 'close', []);
|
|
39
|
+
return this;
|
|
40
|
+
},
|
|
41
|
+
show: function (eventname) {
|
|
42
|
+
exec(null, null, 'ThemeableBrowser', 'show', []);
|
|
43
|
+
return this;
|
|
44
|
+
},
|
|
45
|
+
reload: function (eventname) {
|
|
46
|
+
exec(null, null, 'ThemeableBrowser', 'reload', []);
|
|
47
|
+
return this;
|
|
48
|
+
},
|
|
49
|
+
addEventListener: function (eventname,f) {
|
|
50
|
+
if (!(eventname in this.channels)) {
|
|
51
|
+
this.channels[eventname] = channel.create(eventname);
|
|
52
|
+
}
|
|
53
|
+
this.channels[eventname].subscribe(f);
|
|
54
|
+
return this;
|
|
55
|
+
},
|
|
56
|
+
removeEventListener: function(eventname, f) {
|
|
57
|
+
if (eventname in this.channels) {
|
|
58
|
+
this.channels[eventname].unsubscribe(f);
|
|
59
|
+
}
|
|
60
|
+
return this;
|
|
61
|
+
},
|
|
62
|
+
|
|
63
|
+
executeScript: function(injectDetails, cb) {
|
|
64
|
+
if (injectDetails.code) {
|
|
65
|
+
exec(cb, null, 'ThemeableBrowser', 'injectScriptCode', [injectDetails.code, !!cb]);
|
|
66
|
+
} else if (injectDetails.file) {
|
|
67
|
+
exec(cb, null, 'ThemeableBrowser', 'injectScriptFile', [injectDetails.file, !!cb]);
|
|
68
|
+
} else {
|
|
69
|
+
throw new Error('executeScript requires exactly one of code or file to be specified');
|
|
70
|
+
}
|
|
71
|
+
return this;
|
|
72
|
+
},
|
|
73
|
+
|
|
74
|
+
insertCSS: function(injectDetails, cb) {
|
|
75
|
+
if (injectDetails.code) {
|
|
76
|
+
exec(cb, null, 'ThemeableBrowser', 'injectStyleCode', [injectDetails.code, !!cb]);
|
|
77
|
+
} else if (injectDetails.file) {
|
|
78
|
+
exec(cb, null, 'ThemeableBrowser', 'injectStyleFile', [injectDetails.file, !!cb]);
|
|
79
|
+
} else {
|
|
80
|
+
throw new Error('insertCSS requires exactly one of code or file to be specified');
|
|
81
|
+
}
|
|
82
|
+
return this;
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
exports.open = function(strUrl, strWindowName, strWindowFeatures, callbacks) {
|
|
87
|
+
// Don't catch calls that write to existing frames (e.g. named iframes).
|
|
88
|
+
if (window.frames && window.frames[strWindowName]) {
|
|
89
|
+
var origOpenFunc = modulemapper.getOriginalSymbol(window, 'open');
|
|
90
|
+
return origOpenFunc.apply(window, arguments);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
strUrl = urlutil.makeAbsolute(strUrl);
|
|
94
|
+
var iab = new ThemeableBrowser();
|
|
95
|
+
|
|
96
|
+
callbacks = callbacks || {};
|
|
97
|
+
for (var callbackName in callbacks) {
|
|
98
|
+
iab.addEventListener(callbackName, callbacks[callbackName]);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
var cb = function(eventname) {
|
|
102
|
+
iab._eventHandler(eventname);
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
strWindowFeatures = strWindowFeatures && JSON.stringify(strWindowFeatures);
|
|
106
|
+
// Slightly delay the actual native call to give the user a chance to
|
|
107
|
+
// register event listeners first, otherwise some warnings or errors may be missed.
|
|
108
|
+
setTimeout(function() {
|
|
109
|
+
exec(cb, cb, 'ThemeableBrowser', 'open', [strUrl, strWindowName, strWindowFeatures || '']);
|
|
110
|
+
}, 0);
|
|
111
|
+
return iab;
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
exports.EVT_ERR = 'ThemeableBrowserError';
|
|
115
|
+
exports.EVT_WRN = 'ThemeableBrowserWarning';
|
|
116
|
+
exports.ERR_CRITICAL = 'critical';
|
|
117
|
+
exports.ERR_LOADFAIL = 'loadfail';
|
|
118
|
+
exports.WRN_UNEXPECTED = 'unexpected';
|
|
119
|
+
exports.WRN_UNDEFINED = 'undefined';
|