Skip to content
This repository was archived by the owner on Jan 10, 2024. It is now read-only.

Commit d171a89

Browse files
committed
fix: build demo and unittest
1 parent 113e640 commit d171a89

File tree

6 files changed

+130
-20
lines changed

6 files changed

+130
-20
lines changed

demo/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33
"name": "hugo",
44
"id": "dk.nota.webviewdemo",
55
"tns-android": {
6-
"version": "6.4.1"
6+
"version": "6.5.0"
77
},
88
"tns-ios": {
9-
"version": "6.4.0"
9+
"version": "6.5.0"
1010
}
1111
},
1212
"dependencies": {

demo/tsconfig.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
{
22
"compilerOptions": {
3+
"skipLibCheck": true,
4+
"downlevelIteration": true,
35
"target": "es5",
46
"module": "commonjs",
57
"declaration": false,
@@ -44,4 +46,4 @@
4446
"platforms"
4547
],
4648
"compileOnSave": false
47-
}
49+
}

src/webview-ext-common.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1225,12 +1225,20 @@ export class WebViewExtBase extends ContainerView {
12251225
// Rejected promise.
12261226
if (err && typeof err === "object") {
12271227
// err is an object. Might be a serialized Error-object.
1228-
const error = new Error(err.message || err);
1228+
const error = new Error(err.message || err.name || err);
12291229
if (err.stack) {
12301230
// Add the web stack to the Error object.
12311231
(error as any).webStack = err.stack;
12321232
}
12331233

1234+
for (const [key, value] of Object.entries(err)) {
1235+
if (key in error) {
1236+
continue;
1237+
}
1238+
1239+
error[key] = value;
1240+
}
1241+
12341242
reject(error);
12351243

12361244
return;

unittest/tsconfig.json

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,46 @@
44
"downlevelIteration": true,
55
"target": "es5",
66
"module": "commonjs",
7+
"declaration": false,
8+
"removeComments": true,
9+
"noLib": false,
710
"emitDecoratorMetadata": true,
811
"experimentalDecorators": true,
912
"noEmitHelpers": true,
1013
"noEmitOnError": true,
11-
"lib": ["es6", "dom", "es2015.iterable", "es2017.object"],
14+
"lib": [
15+
"es6",
16+
"dom",
17+
"es2015.iterable",
18+
"es2017.object"
19+
],
20+
"pretty": true,
21+
"allowUnreachableCode": false,
22+
"allowUnusedLabels": false,
23+
"noImplicitAny": false,
24+
"noImplicitReturns": true,
25+
"noImplicitUseStrict": false,
26+
"noFallthroughCasesInSwitch": true,
1227
"baseUrl": ".",
1328
"paths": {
14-
"@nota/nativescript-webview-ext/*": ["../src/*"],
15-
"~/*": ["app/*"]
29+
"@nota/nativescript-webview-ext/*": [
30+
"../src/*"
31+
],
32+
"~/*": [
33+
"app/*"
34+
],
35+
"tns-core-modules/*": [
36+
"./node_modules/tns-core-modules/*"
37+
],
38+
"*": [
39+
"./node_modules/tns-core-modules/*",
40+
"./node_modules/*"
41+
]
1642
}
1743
},
18-
"exclude": ["node_modules", "platforms"]
44+
"exclude": [
45+
"node_modules",
46+
"platforms"
47+
],
48+
"compileOnSave": false
1949
}

www-src/ns-webview-bridge.ts

Lines changed: 80 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,49 @@ declare const androidWebViewBridge: {
1313
interface WKWebViewMessageHandler {
1414
postMessage(message: string): void;
1515
}
16+
if (!Object.keys) {
17+
Object.keys = (function () {
18+
"use strict";
19+
var hasOwnProperty = Object.prototype.hasOwnProperty,
20+
hasDontEnumBug = !{ toString: null }.propertyIsEnumerable("toString"),
21+
dontEnums = ["toString", "toLocaleString", "valueOf", "hasOwnProperty", "isPrototypeOf", "propertyIsEnumerable", "constructor"],
22+
dontEnumsLength = dontEnums.length;
23+
24+
return function (obj) {
25+
if (typeof obj !== "function" && (typeof obj !== "object" || obj === null)) {
26+
throw new TypeError("Object.keys called on non-object");
27+
}
28+
29+
const result = new Array<any>();
30+
31+
for (const prop in obj) {
32+
if (hasOwnProperty.call(obj, prop)) {
33+
result.push(prop);
34+
}
35+
}
36+
37+
if (hasDontEnumBug) {
38+
for (let i = 0; i < dontEnumsLength; i++) {
39+
if (hasOwnProperty.call(obj, dontEnums[i])) {
40+
result.push(dontEnums[i]);
41+
}
42+
}
43+
}
44+
return result;
45+
};
46+
})();
47+
}
48+
49+
if (!Object.entries) {
50+
Object.entries = function (this: null, obj: any) {
51+
var ownProps = Object.keys(obj),
52+
i = ownProps.length,
53+
resArray = new Array(i); // preallocate the Array
54+
while (i--) resArray[i] = [ownProps[i], obj[ownProps[i]]];
55+
56+
return resArray;
57+
};
58+
}
1659

1760
/**
1861
* With WKWebView it's assumed the there is a WKScriptMessage named nsBridge
@@ -51,7 +94,7 @@ class NSWebViewBridge {
5194
}
5295

5396
for (const listener of events) {
54-
const res = listener && listener(data);
97+
const res = listener?.(data);
5598
// if any handler return false, not executing any further handlers for that event.
5699
if (res === false) {
57100
break;
@@ -183,9 +226,9 @@ class NSWebViewBridge {
183226
const scriptElement = document.createElement("script");
184227
scriptElement.async = true;
185228
scriptElement.setAttribute("id", elId);
186-
scriptElement.addEventListener("error", function (error) {
229+
scriptElement.addEventListener("error", (error) => {
187230
console.error(`Failed to load ${href} - error: ${error}`);
188-
reject(error);
231+
reject(this.serializeError(error));
189232

190233
if (scriptElement.parentElement) {
191234
scriptElement.parentElement.removeChild(scriptElement);
@@ -232,7 +275,7 @@ class NSWebViewBridge {
232275

233276
document.body.appendChild(scriptElement);
234277

235-
resolve();
278+
window.requestAnimationFrame(() => resolve());
236279
});
237280
}
238281

@@ -294,12 +337,17 @@ class NSWebViewBridge {
294337
styleElement.addEventListener("error", reject);
295338
styleElement.textContent = stylesheet;
296339
styleElement.setAttribute("id", elId);
297-
if (document.head) {
298-
if (insertBefore && document.head.childElementCount > 0) {
299-
document.head.insertBefore(styleElement, document.head.firstElementChild);
340+
341+
const parentElement = document.head ?? document.body;
342+
if (parentElement) {
343+
if (insertBefore && parentElement.childElementCount > 0) {
344+
document.head.insertBefore(styleElement, parentElement.firstElementChild);
300345
} else {
301346
document.head.appendChild(styleElement);
302347
}
348+
} else {
349+
reject(new Error(`Couldn't find parent element`));
350+
return;
303351
}
304352

305353
resolve();
@@ -329,10 +377,7 @@ class NSWebViewBridge {
329377
if (typeof err === "object" && err?.message) {
330378
// Error objects cannot be serialized
331379
this.emit(eventName, {
332-
err: {
333-
message: err.message,
334-
stack: err.stack,
335-
},
380+
err: this.serializeError(err),
336381
});
337382
} else {
338383
this.emit(eventName, {
@@ -344,6 +389,30 @@ class NSWebViewBridge {
344389
private elementIdFromHref(href: string) {
345390
return href.replace(/^[:]*:\/\//, "").replace(/[^a-z0-9]/g, "");
346391
}
392+
393+
/**
394+
* Error objects cannot be serialized properly.
395+
*/
396+
private serializeError(error: any) {
397+
const { name, message, stack } = error;
398+
const res = {
399+
name,
400+
message,
401+
stack,
402+
};
403+
404+
for (const [key, value] of Object.entries(error)) {
405+
if (value instanceof HTMLElement) {
406+
continue;
407+
}
408+
409+
if (!(key in res)) {
410+
res[key] = value;
411+
}
412+
}
413+
414+
return res;
415+
}
347416
}
348417

349418
interface WindowWithNSWebViewBridge {

www-src/tsconfig.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66
"module": "commonjs",
77
"lib": [
88
"dom",
9-
"es2015"
9+
"es2015",
10+
"ES2017.Object"
1011
],
1112
"removeComments": true,
1213
"downlevelIteration": true,

0 commit comments

Comments
 (0)