@alicloud/console-os-browser-vm 1.4.33 → 1.4.35

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/es/index.js ADDED
@@ -0,0 +1,82 @@
1
+ import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
2
+ import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
3
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
4
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
5
+ import _regeneratorRuntime from "@babel/runtime/regenerator";
6
+ /**
7
+ * index.js
8
+ * @lastModified 2019085
9
+ * @forwardCompatibleTo 2019085
10
+ * @createAt 2019085
11
+ */
12
+
13
+ import './Elements';
14
+ import Context from './Context';
15
+ export var createContext = /*#__PURE__*/function () {
16
+ var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
17
+ var conf,
18
+ _args = arguments;
19
+ return _regeneratorRuntime.wrap(function _callee$(_context) {
20
+ while (1) switch (_context.prev = _context.next) {
21
+ case 0:
22
+ conf = _args.length > 0 && _args[0] !== undefined ? _args[0] : {};
23
+ _context.next = 3;
24
+ return Context.create(conf);
25
+ case 3:
26
+ return _context.abrupt("return", _context.sent);
27
+ case 4:
28
+ case "end":
29
+ return _context.stop();
30
+ }
31
+ }, _callee);
32
+ }));
33
+ return function createContext() {
34
+ return _ref.apply(this, arguments);
35
+ };
36
+ }();
37
+ export var removeContext = /*#__PURE__*/function () {
38
+ var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(context) {
39
+ return _regeneratorRuntime.wrap(function _callee2$(_context2) {
40
+ while (1) switch (_context2.prev = _context2.next) {
41
+ case 0:
42
+ _context2.next = 2;
43
+ return Context.remove(context);
44
+ case 2:
45
+ return _context2.abrupt("return", _context2.sent);
46
+ case 3:
47
+ case "end":
48
+ return _context2.stop();
49
+ }
50
+ }, _callee2);
51
+ }));
52
+ return function removeContext(_x) {
53
+ return _ref2.apply(this, arguments);
54
+ };
55
+ }();
56
+ export var evalScripts = /*#__PURE__*/function () {
57
+ var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3(code) {
58
+ var conf,
59
+ ctx,
60
+ resolver,
61
+ _args3 = arguments;
62
+ return _regeneratorRuntime.wrap(function _callee3$(_context3) {
63
+ while (1) switch (_context3.prev = _context3.next) {
64
+ case 0:
65
+ conf = _args3.length > 1 && _args3[1] !== undefined ? _args3[1] : {};
66
+ _context3.next = 3;
67
+ return Context.create(conf);
68
+ case 3:
69
+ ctx = _context3.sent;
70
+ // eslint-disable-next-line no-new-func
71
+ resolver = new Function("\n return function({window, location, history, document}){ \n with(window.__CONSOLE_OS_GLOBAL_VARS_) { \n ".concat(code, "\n }\n }//@sourceURL=").concat(conf.name));
72
+ return _context3.abrupt("return", resolver(_objectSpread({}, ctx)));
73
+ case 6:
74
+ case "end":
75
+ return _context3.stop();
76
+ }
77
+ }, _callee3);
78
+ }));
79
+ return function evalScripts(_x2) {
80
+ return _ref3.apply(this, arguments);
81
+ };
82
+ }();
@@ -0,0 +1,43 @@
1
+ import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
2
+ export var addEventListener = function addEventListener(el, originEvent) {
3
+ return function (type, listener, options) {
4
+ var listeners = el._listenerMap.get(type) || [];
5
+ el._listenerMap.set(type, [].concat(_toConsumableArray(listeners), [listener]));
6
+ return originEvent.apply(el, [type, listener, options]);
7
+ };
8
+ };
9
+ export var removeEventListener = function removeEventListener(el, originEvent) {
10
+ return function (type, listener, options) {
11
+ var storedTypeListeners = el._listenerMap.get(type);
12
+ if (storedTypeListeners && storedTypeListeners.length && storedTypeListeners.indexOf(listener) !== -1) {
13
+ storedTypeListeners.splice(storedTypeListeners.indexOf(listener), 1);
14
+ }
15
+ return originEvent.apply(el, [type, listener, options]);
16
+ };
17
+ };
18
+ var elProperties = ['innerHTML', 'text', 'innerText'];
19
+ export var injectHTMLScriptElement = function injectHTMLScriptElement(el) {
20
+ el._listenerMap = new Map();
21
+ el.addEventListener = addEventListener(el, el.addEventListener);
22
+ el.removeEventListener = removeEventListener(el, el.removeEventListener);
23
+
24
+ // do not redefine property in sandbox
25
+ if (!el._evalScriptInSandbox) {
26
+ elProperties.forEach(function (property) {
27
+ Object.defineProperty(el, property, {
28
+ get: function get() {
29
+ return this.scriptText || '';
30
+ },
31
+ set: function set(value) {
32
+ this.scriptText = value;
33
+ // 如果是已经插入到 dom 树里面,则直接执行
34
+ if (el.parentNode) {
35
+ this.ownerContext.evalScript && el.ownerContext.evalScript(value.toString());
36
+ }
37
+ },
38
+ enumerable: false
39
+ });
40
+ });
41
+ el._evalScriptInSandbox = true;
42
+ }
43
+ };
@@ -0,0 +1,9 @@
1
+ export function isConstructable(fn) {
2
+ var classRegex = /^class\b/;
3
+ var constructable = fn.prototype && fn.prototype.constructor === fn && Object.getOwnPropertyNames(fn.prototype).length > 1 || classRegex.test(fn.toString());
4
+ return constructable;
5
+ }
6
+ export function isBoundedFunction(fn) {
7
+ var bounded = fn.name.indexOf('bound ') === 0 && !fn.hasOwnProperty('prototype');
8
+ return bounded;
9
+ }
@@ -0,0 +1,28 @@
1
+ function isSameOriginUrl(str, origin) {
2
+ try {
3
+ // str 的格式可以被解析成 url
4
+ var url = new URL(str);
5
+ return url.origin === origin;
6
+ } catch (e) {/**/}
7
+ try {
8
+ // str 是相对路径或绝对路径,无法被解析成 url
9
+ var _url = new URL(str, origin);
10
+ return _url.origin === origin;
11
+ } catch (e) {
12
+ return false;
13
+ }
14
+ }
15
+
16
+ // 某些情况下,请求静态资源需要带 cookie
17
+ export var getFetchCredentials = function getFetchCredentials(url) {
18
+ // 兼容历史逻辑
19
+ if (url.includes('console.aliyun.com') || url.includes('console.alibabacloud.com')) {
20
+ return 'include';
21
+ }
22
+
23
+ // 同域请求
24
+ if (isSameOriginUrl(url, location && location.origin)) {
25
+ return 'include';
26
+ }
27
+ return 'omit';
28
+ };
@@ -0,0 +1,30 @@
1
+ export var getJsonCallback = function getJsonCallback(src) {
2
+ var u;
3
+ try {
4
+ u = new URL(src);
5
+ } catch (error) {
6
+ return;
7
+ }
8
+ var sp = u.searchParams;
9
+ if (!sp) {
10
+ return null;
11
+ }
12
+ return sp.get('callback') || sp.get('cb');
13
+ };
14
+ var injectScriptCallBack = function injectScriptCallBack(scriptEl) {
15
+ setTimeout(function () {
16
+ if (!scriptEl.src) {
17
+ return;
18
+ }
19
+ var appWindow = scriptEl.ownerContext.window;
20
+ var callbackName = getJsonCallback(scriptEl.src);
21
+ if (callbackName && typeof appWindow[callbackName] === 'function') {
22
+ window[callbackName] = function () {
23
+ var result = appWindow[callbackName].apply(appWindow, arguments);
24
+ window[callbackName] = null;
25
+ return result;
26
+ };
27
+ }
28
+ }, 0);
29
+ };
30
+ export default injectScriptCallBack;
@@ -0,0 +1,3 @@
1
+ export var isSSR = function isSSR() {
2
+ return typeof document === 'undefined';
3
+ };
@@ -0,0 +1,3 @@
1
+ export default (function (nameForErrorMessage) {
2
+ console.error("Not implemented: ".concat(nameForErrorMessage));
3
+ });
package/lib/Context.js ADDED
@@ -0,0 +1,155 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = void 0;
8
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
9
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
10
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
12
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
13
+ var _Window = _interopRequireDefault(require("./Window"));
14
+ var _Document = _interopRequireDefault(require("./Document"));
15
+ var _Location = _interopRequireDefault(require("./Location"));
16
+ var _History = _interopRequireDefault(require("./History"));
17
+ var _credentials = require("./utils/credentials");
18
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
19
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
20
+ var Context = /*#__PURE__*/function () {
21
+ function Context(conf, frame) {
22
+ (0, _classCallCheck2.default)(this, Context);
23
+ this.location = new _Location.default(frame.contentWindow.location);
24
+ this.history = new _History.default(conf.id, frame.contentWindow);
25
+ this.window = new _Window.default(conf, this, frame, location);
26
+ this.allowResources = conf.allowResources || [];
27
+ var body = conf.body;
28
+ var disableBody = conf.disableBody;
29
+ if (disableBody) {
30
+ body = document.body;
31
+ } else if (!body) {
32
+ body = document.createElement('body');
33
+ document.documentElement.appendChild(body);
34
+ }
35
+ this.body = body;
36
+ this.document = new _Document.default(_objectSpread({
37
+ enableScriptEscape: true
38
+ }, conf), this, frame, location);
39
+ this.baseFrame = frame;
40
+ this._listenerMap = new Map();
41
+ this.window.__IS_CONSOLE_OS_CONTEXT__ = true;
42
+ }
43
+ (0, _createClass2.default)(Context, [{
44
+ key: "loadScripts",
45
+ value: function () {
46
+ var _loadScripts = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(url) {
47
+ var resp, code;
48
+ return _regenerator.default.wrap(function _callee$(_context) {
49
+ while (1) switch (_context.prev = _context.next) {
50
+ case 0:
51
+ _context.next = 2;
52
+ return fetch(url, {
53
+ credentials: (0, _credentials.getFetchCredentials)(url)
54
+ });
55
+ case 2:
56
+ resp = _context.sent;
57
+ _context.next = 5;
58
+ return resp.text();
59
+ case 5:
60
+ code = _context.sent;
61
+ this.evalScript(code, url);
62
+ case 7:
63
+ case "end":
64
+ return _context.stop();
65
+ }
66
+ }, _callee, this);
67
+ }));
68
+ function loadScripts(_x) {
69
+ return _loadScripts.apply(this, arguments);
70
+ }
71
+ return loadScripts;
72
+ }()
73
+ }, {
74
+ key: "evalScript",
75
+ value: function evalScript(code) {
76
+ var url = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
77
+ var currentScript = this.document.createElement('script');
78
+ currentScript.src = url;
79
+
80
+ // eslint-disable-next-line no-new-func
81
+ var resolver = new Function("\n return function ({window, location, history, document, __os_current_script__}){\n var document = new Proxy(document, {\n get: function get(target, prop) {\n if (prop === \"currentScript\" && __os_current_script__) {\n return __os_current_script__;\n }\n return target[prop];\n }\n });\n var window = new Proxy(window, {\n get: function get(target, prop) {\n if (prop === \"document\") return document;\n return target[prop];\n }\n })\n var globalThis = window;\n with(window.__CONSOLE_OS_GLOBAL_VARS_) {\n try {\n ".concat(code, "\n } catch(e) {\n console.log(e)\n }\n }\n }//# sourceMappingURL=").concat(url));
82
+ resolver().call(this.window, _objectSpread(_objectSpread({}, this), {}, {
83
+ __os_current_script__: currentScript
84
+ }));
85
+ }
86
+ }, {
87
+ key: "updateBody",
88
+ value: function updateBody(dom) {
89
+ if (!dom && this.body) return;
90
+ this.body = dom;
91
+ }
92
+ }, {
93
+ key: "remove",
94
+ value: function remove() {
95
+ this.document.removeEventListeners();
96
+ if (this.baseFrame) {
97
+ if (this.baseFrame.parentNode) {
98
+ this.baseFrame.parentNode.removeChild(this.baseFrame);
99
+ } else {
100
+ this.baseFrame.setAttribute('src', 'about:blank');
101
+ }
102
+ }
103
+ }
104
+ }], [{
105
+ key: "create",
106
+ value: function create(conf) {
107
+ var _this = this;
108
+ return new Promise(function (resolve) {
109
+ var _document$documentEle;
110
+ var iframe = document.createElement('iframe');
111
+
112
+ // TODO: change src to a reasonable value.
113
+ iframe.setAttribute('src', conf.url ? conf.url : '/api.json');
114
+ iframe.style.cssText = 'position: absolute; top: -20000px; width: 1px; height: 1px;';
115
+ if (conf.id) iframe.setAttribute('data-id', conf.id);
116
+
117
+ // body will be hijacked in sandbox, so get body from html
118
+ var topBody = ((_document$documentEle = document.documentElement) === null || _document$documentEle === void 0 ? void 0 : _document$documentEle.getElementsByTagName('body')[0]) || document.body;
119
+ topBody.appendChild(iframe);
120
+
121
+ // the onload will no trigger when src is about:blank
122
+ if (conf.url === 'about:blank') {
123
+ return resolve(new _this(conf, iframe));
124
+ }
125
+ iframe.onload = function () {
126
+ resolve(new _this(conf, iframe));
127
+ };
128
+ });
129
+ }
130
+ }, {
131
+ key: "remove",
132
+ value: function () {
133
+ var _remove = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(context) {
134
+ return _regenerator.default.wrap(function _callee2$(_context2) {
135
+ while (1) switch (_context2.prev = _context2.next) {
136
+ case 0:
137
+ if (context.remove) {
138
+ context.remove();
139
+ }
140
+ case 1:
141
+ case "end":
142
+ return _context2.stop();
143
+ }
144
+ }, _callee2);
145
+ }));
146
+ function remove(_x2) {
147
+ return _remove.apply(this, arguments);
148
+ }
149
+ return remove;
150
+ }()
151
+ }]);
152
+ return Context;
153
+ }();
154
+ var _default = Context;
155
+ exports.default = _default;
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = void 0;
8
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
9
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
10
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
11
+ var _HTMLScriptElement = require("./utils/HTMLScriptElement");
12
+ /**
13
+ * Document.js
14
+ * @lastModified 2019085
15
+ * @forwardCompatibleTo 2019085
16
+ * @createAt 2019085
17
+ */
18
+ var Document = /*#__PURE__*/(0, _createClass2.default)(function Document() {
19
+ var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
20
+ var context = arguments.length > 1 ? arguments[1] : undefined;
21
+ var frame = arguments.length > 2 ? arguments[2] : undefined;
22
+ (0, _classCallCheck2.default)(this, Document);
23
+ var eventListeners = [];
24
+ return new Proxy(document, {
25
+ set: function set(target, name, value) {
26
+ switch (name) {
27
+ case 'cookie':
28
+ document.cookie = value;
29
+ break;
30
+ default:
31
+ target[name] = value;
32
+ }
33
+ return true;
34
+ },
35
+ get: function get(target, name) {
36
+ switch (name) {
37
+ case 'body':
38
+ return context.body;
39
+ case 'location':
40
+ return context.location;
41
+ case 'defaultView':
42
+ return context.window;
43
+ case 'write':
44
+ case 'writeln':
45
+ return function () {};
46
+ case 'createElement':
47
+ return function () {
48
+ var _document;
49
+ var el = (_document = document).createElement.apply(_document, arguments);
50
+ el.ownerContext = context;
51
+ el.appId = options.id;
52
+ // 对于 script 标签如果开启防逃逸,就直接 hack script 标签
53
+ if (el.tagName === 'SCRIPT' && !options.enableScriptEscape) {
54
+ (0, _HTMLScriptElement.injectHTMLScriptElement)(el);
55
+ }
56
+ return el;
57
+ };
58
+ case 'addEventListener':
59
+ return function () {
60
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
61
+ args[_key] = arguments[_key];
62
+ }
63
+ eventListeners.push(args);
64
+ return target.addEventListener.apply(target, args);
65
+ };
66
+ case 'removeEventListeners':
67
+ return function () {
68
+ for (var _i = 0, _eventListeners = eventListeners; _i < _eventListeners.length; _i++) {
69
+ var args = _eventListeners[_i];
70
+ target.removeEventListener.apply(target, (0, _toConsumableArray2.default)(args));
71
+ }
72
+ };
73
+ default:
74
+ }
75
+
76
+ // TODO: hijack document.getElementsByTagName('body')
77
+ if (typeof target[name] === 'function') {
78
+ return target[name].bind && target[name].bind(target);
79
+ } else {
80
+ return target[name];
81
+ }
82
+ }
83
+ });
84
+ });
85
+ var _default = Document;
86
+ exports.default = _default;
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
5
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
6
+ var _injectScriptCallBack = _interopRequireWildcard(require("./utils/injectScriptCallBack"));
7
+ var _isSSR = require("./utils/isSSR");
8
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
9
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
10
+ var makeElInjector = function makeElInjector(originMethod, methodName) {
11
+ return function (el) {
12
+ var notAllowed = el && el.ownerContext && el.ownerContext.allowResources.indexOf(el.src) === -1 && el.ownerContext.allowResources !== '*';
13
+
14
+ // 如果不在 BrowserVM 的白名单内,尝试通过 context 的 load script 通过 xhr 获取脚本内容,并在沙箱中执行
15
+ if (el && el._evalScriptInSandbox && el.ownerContext && el.nodeName === 'SCRIPT' && el.src && notAllowed && !(0, _injectScriptCallBack.getJsonCallback)(el.src)) {
16
+ return el.ownerContext.loadScripts(el.src).then(function () {
17
+ var fns = el._listenerMap.get('load');
18
+ if (fns) {
19
+ fns.forEach(function (fn) {
20
+ fn();
21
+ });
22
+ }
23
+ var e = new Event('load');
24
+ el.onload && el.onload(e);
25
+ }).catch(function (e) {
26
+ console.error(e, el.src);
27
+ var fns = el._listenerMap.get('error');
28
+ if (fns) {
29
+ fns.forEach(function (fn) {
30
+ fn(e);
31
+ });
32
+ }
33
+ el.onerror && el.onerror(e);
34
+ });
35
+ }
36
+ if (el && el.nodeName === 'SCRIPT' && el.ownerContext) {
37
+ (0, _injectScriptCallBack.default)(el);
38
+ }
39
+
40
+ // 如果有 scriptText, 证明在 append 之前被设置了 text
41
+ // 所以直接执行这个 script
42
+ if (el && el.scriptText) {
43
+ el.ownerContext.evalScript(el.scriptText);
44
+ }
45
+
46
+ // fix: babel 会把 fn.call 转义成 fn.call.apply 造成 chrome 50 的几个版本报错
47
+ // 这里 尝试 try catch 如果报错 直接调用 fn.apply
48
+ for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
49
+ args[_key - 1] = arguments[_key];
50
+ }
51
+ var methodArgs = methodName === 'append' && el === undefined // 修复 append 的过程中 append() 为一个没参数的状态。应为 append 的函数签名为 append(param1, param2, /* ... ,*/ paramN)
52
+ ? [].concat(args) : [el].concat(args);
53
+ try {
54
+ return originMethod.call.apply(originMethod, [this].concat((0, _toConsumableArray2.default)(methodArgs)));
55
+ } catch (_unused) {
56
+ return originMethod.apply(this, methodArgs);
57
+ }
58
+ };
59
+ };
60
+ if (!(0, _isSSR.isSSR)() && typeof window.Element === 'function') {
61
+ var mountElementMethods = ['appendChild', 'insertBefore', 'append'];
62
+ for (var _i = 0, _mountElementMethods = mountElementMethods; _i < _mountElementMethods.length; _i++) {
63
+ var method = _mountElementMethods[_i];
64
+ var originMethod = window.Element.prototype[method];
65
+ window.Element.prototype[method] = makeElInjector(originMethod, method);
66
+ }
67
+ }
package/lib/History.js ADDED
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = void 0;
8
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
9
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
10
+ var History = /*#__PURE__*/(0, _createClass2.default)(function History(id, frame) {
11
+ (0, _classCallCheck2.default)(this, History);
12
+ if (!id) {
13
+ return frame.history;
14
+ }
15
+ var postMessage = function postMessage() {
16
+ frame.postMessage({
17
+ type: "".concat(id, ":history-change"),
18
+ data: JSON.parse(JSON.stringify(frame.location))
19
+ }, '*');
20
+ };
21
+
22
+ // throw error when iframe src is about:blank
23
+ try {
24
+ var originalPushStatus = frame.history.pushState;
25
+ var originalReplaceStatus = frame.history.replaceState;
26
+ frame.history.pushState = function () {
27
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
28
+ args[_key] = arguments[_key];
29
+ }
30
+ var returnValue = originalPushStatus.apply(frame.history, [].concat(args));
31
+ postMessage();
32
+ return returnValue;
33
+ };
34
+ frame.history.replaceState = function () {
35
+ for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
36
+ args[_key2] = arguments[_key2];
37
+ }
38
+ var returnValue = originalReplaceStatus.apply(frame.history, [].concat(args));
39
+ postMessage();
40
+ return returnValue;
41
+ };
42
+ return frame.history;
43
+ } catch (e) {
44
+ return undefined;
45
+ }
46
+ });
47
+ var _default = History;
48
+ exports.default = _default;
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = void 0;
8
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
9
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
10
+ function isAboutBlank(loc) {
11
+ return loc && loc.href === 'about:blank';
12
+ }
13
+ var Location = /*#__PURE__*/(0, _createClass2.default)(function Location(location) {
14
+ (0, _classCallCheck2.default)(this, Location);
15
+ return new Proxy({}, {
16
+ set: function set(target, name, value) {
17
+ switch (name) {
18
+ case 'href':
19
+ break;
20
+ default:
21
+ location[name] = value;
22
+ }
23
+ return true;
24
+ },
25
+ get: function get(target, name) {
26
+ switch (name) {
27
+ case 'reload':
28
+ return function () {
29
+ return window.location.reload();
30
+ };
31
+ case 'replace':
32
+ return function () {};
33
+ case 'toString':
34
+ return function () {
35
+ try {
36
+ return isAboutBlank(location) ? window.location.toString() : location.toString();
37
+ } catch (e) {
38
+ return isAboutBlank(location) ? window.location.href : location.href;
39
+ }
40
+ };
41
+ default:
42
+ break;
43
+ }
44
+ if (typeof location[name] === 'function') {
45
+ return location[name].bind && location[name].bind(target);
46
+ } else if (isAboutBlank(location)) {
47
+ return window.location[name];
48
+ } else {
49
+ return location[name];
50
+ }
51
+ }
52
+ });
53
+ });
54
+ var _default = Location;
55
+ exports.default = _default;