├── assets ├── .nomedia └── index.css ├── expand ├── handler │ ├── webErrorHandler.js │ └── bridgeHandler.js ├── inject │ └── demo.ts └── core │ ├── dataBinding.js │ ├── jsBridge.ts │ ├── vConsole.ts │ ├── webViewExpand.js │ └── vconsole.min.ts ├── project.json ├── Release.md ├── main.js ├── README.md ├── index.html └── LICENSE /assets/.nomedia: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /expand/handler/webErrorHandler.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 网页错误跳转指定页面 3 | * 根据错误状态码,自动跳转到地址 4 | */ 5 | module.exports = { 6 | } -------------------------------------------------------------------------------- /project.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "autojs-webView", 3 | "main": "main.js", 4 | "ignore": [ 5 | "build" 6 | ], 7 | "packageName": "org.linbo.autojs.webView", 8 | "versionName": "1.0.4", 9 | "versionCode": 1 10 | } -------------------------------------------------------------------------------- /Release.md: -------------------------------------------------------------------------------- 1 | # 版本说明 2 | ## V 1.0.4 ```2020-07-02``` 3 | - 支持debug模式 4 | 5 | ## V 1.0.3 ```2020-06-12``` 6 | - 修复部分机型兼容问题 7 | 8 | ## V 1.0.2 ```2020-05-14``` 9 | - 替换jsBridge实现 10 | * 支持CSP页面 11 | 12 | ## V 1.0.1 ```2020-05-14``` 13 | - 修复渲染markdown文件bug 14 | * 支持 ` 字符 15 | 16 | ## V 1.0.0 ```2020-05-13``` 17 | 发布 -------------------------------------------------------------------------------- /expand/inject/demo.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * 注入脚本 3 | * 时间: 页面加载完后 4 | * 注意: 5 | * 注入脚本的文件,不能是js后缀文件,autojs打包时会进行加密,导致不能用。 6 | * 使用: 7 | * window.Android.invoke([安卓端方法], [方法入参,json格式], [回调函数,返回值格式是json对象]) 8 | * 具体参数的数据结构,由接口开发自行定义 9 | */ 10 | 11 | window.Android.invoke('toast', 12 | {msg: '测试jsBridge1'}, 13 | (data) => { 14 | console.log('接收到callback1:' + JSON.stringify(data)); 15 | } 16 | ); 17 | 18 | window.Android.invoke('toast', 19 | {msg: '测试jsBridge2'}, 20 | (data) => { 21 | console.log('接收到callback2:' + JSON.stringify(data)); 22 | } 23 | ); -------------------------------------------------------------------------------- /expand/handler/bridgeHandler.js: -------------------------------------------------------------------------------- 1 | /** jsBridge交互处理逻辑实现 */ 2 | module.exports = { 3 | handle: handle, 4 | // 注册被调用方法,名称命名: cmd 5 | toast: toastAction 6 | } 7 | /** 8 | * 命令调度入口 9 | * @param {命令} cmd 10 | * @param {参数} params 11 | */ 12 | function handle(cmd, params) { 13 | console.log('bridgeHandler处理 cmd=%s, params=%s', cmd, JSON.stringify(params)); 14 | // 调度方法命名 15 | let fun = this[cmd]; 16 | if (!fun) { 17 | throw new Error("cmd= " + cmd + " 没有定义实现"); 18 | } 19 | let ret = fun(params) 20 | log(ret) 21 | return fun(params); 22 | } 23 | 24 | /** 25 | * 处理逻辑例子: toast 提示 26 | */ 27 | function toastAction(params) { 28 | toast(params.msg); 29 | return {msg: 'toast提示成功'}; 30 | } 31 | -------------------------------------------------------------------------------- /expand/core/dataBinding.js: -------------------------------------------------------------------------------- 1 | function defineReactive(data, key, val) { 2 | observe(val); // 递归遍历所有子属性 3 | Object.defineProperty(data, key, { 4 | enumerable: true, 5 | configurable: true, 6 | get: function() { 7 | return val; 8 | }, 9 | set: function(newVal) { 10 | val = newVal; 11 | console.log('属性' + key + '已经被监听了,现在值为:“' + newVal.toString() + '”'); 12 | 13 | events.broadcast.emit("data_change_event", newVal.toString()); 14 | } 15 | }); 16 | } 17 | 18 | function observe(data) { 19 | if (!data || typeof data !== 'object') { 20 | return; 21 | } 22 | Object.keys(data).forEach(function(key) { 23 | defineReactive(data, key, data[key]); 24 | }); 25 | }; 26 | 27 | events.broadcast.on("data_change_event", function(name){ 28 | console.log("数据已经变更:" + name); 29 | }); 30 | //保持脚本运行 31 | setInterval(()=>{}, 5000); 32 | function notifyDataChange(data) { 33 | } 34 | 35 | 36 | var data = { 37 | book1: { 38 | name: '' 39 | }, 40 | book2: '', 41 | book3: [ 42 | "1", '2', '5' 43 | ] 44 | }; 45 | 46 | observe(data); 47 | // data.book1.name = 'vue权威指南'; // 属性name已经被监听了,现在值为:“vue权威指南” 48 | // data.book2 = '没有此书籍'; // 属性book2已经被监听了,现在值为:“没有此书籍” 49 | // data.book3[1] = 'a' 50 | log(JSON.stringify(data)) 51 | data.a = 'a' 52 | observe(data) 53 | data.a = '1' -------------------------------------------------------------------------------- /main.js: -------------------------------------------------------------------------------- 1 | "ui"; 2 | var color = "#009688"; 3 | ui.layout( 4 | 5 | 6 | \n \n
\n \n
\n \n'},function(e,t){e.exports='
{{content}}
'},function(e,t,o){var n,r,i;r=[t,o(3),o(25)],void 0===(i="function"==typeof(n=function(o,n,r){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function l(e,t){for(var o=0;o\n
\n'},function(e,t,o){var n,r,i;r=[t,o(1),o(0),o(2),o(27),o(28),o(29)],void 0===(i="function"==typeof(n=function(o,n,r,i,a,l,c){"use strict";function s(e){return e&&e.__esModule?e:{default:e}}function d(e){return(d="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function u(e,t){for(var o=0;o=t.scrollHeight?e.isInBottom=!0:e.isInBottom=!1)}),e.reqList)e.updateRequest(o,{})}},{key:"onRemove",value:function(){window.XMLHttpRequest&&(window.XMLHttpRequest.prototype.open=this._open,window.XMLHttpRequest.prototype.send=this._send,this._open=void 0,this._send=void 0)}},{key:"onShow",value:function(){this.isShow=!0,1==this.isInBottom&&this.scrollToBottom()}},{key:"onHide",value:function(){this.isShow=!1}},{key:"onShowConsole",value:function(){1==this.isInBottom&&this.scrollToBottom()}},{key:"scrollToBottom",value:function(){var e=n.default.one(".vc-content");e.scrollTop=e.scrollHeight-e.offsetHeight}},{key:"clearLog",value:function(){for(var e in this.reqList={},this.domList)this.domList[e].parentNode.removeChild(this.domList[e]),this.domList[e]=void 0;this.domList={},this.renderHeader()}},{key:"renderHeader",value:function(){var e=Object.keys(this.reqList).length,t=n.default.render(l.default,{count:e}),o=n.default.one(".vc-log",this.$tabbox);this.$header?this.$header.parentNode.replaceChild(t,this.$header):o.parentNode.insertBefore(t,o),this.$header=t}},{key:"updateRequest",value:function(e,t){var o=Object.keys(this.reqList).length,i=this.reqList[e]||{};for(var a in t)i[a]=t[a];if(this.reqList[e]=i,this.isReady){var l={id:e,url:i.url,status:i.status,method:i.method||"-",costTime:i.costTime>0?i.costTime+"ms":"-",header:i.header||null,getData:i.getData||null,postData:i.postData||null,response:null,actived:!!i.actived};switch(i.responseType){case"":case"text":if(r.isString(i.response))try{l.response=JSON.parse(i.response),l.response=JSON.stringify(l.response,null,1),l.response=r.htmlEncode(l.response)}catch(e){l.response=r.htmlEncode(i.response)}else void 0!==i.response&&(l.response=Object.prototype.toString.call(i.response));break;case"json":void 0!==i.response&&(l.response=JSON.stringify(i.response,null,1),l.response=r.htmlEncode(l.response));break;case"blob":case"document":case"arraybuffer":default:void 0!==i.response&&(l.response=Object.prototype.toString.call(i.response))}0==i.readyState||1==i.readyState?l.status="Pending":2==i.readyState||3==i.readyState?l.status="Loading":4==i.readyState||(l.status="Unknown");var s=n.default.render(c.default,l),d=this.domList[e];i.status>=400&&n.default.addClass(n.default.one(".vc-group-preview",s),"vc-table-row-error"),d?d.parentNode.replaceChild(s,d):n.default.one(".vc-log",this.$tabbox).insertAdjacentElement("beforeend",s),this.domList[e]=s,Object.keys(this.reqList).length!=o&&this.renderHeader(),this.isInBottom&&this.scrollToBottom()}}},{key:"mockAjax",value:function(){if(window.XMLHttpRequest){var e=this,t=window.XMLHttpRequest.prototype.open,o=window.XMLHttpRequest.prototype.send;e._open=t,e._send=o,window.XMLHttpRequest.prototype.open=function(){var o=this,n=[].slice.call(arguments),r=n[0],i=n[1],a=e.getUniqueID(),l=null;o._requestID=a,o._method=r,o._url=i;var c=o.onreadystatechange||function(){},s=function(){var t=e.reqList[a]||{};if(t.readyState=o.readyState,t.status=0,o.readyState>1&&(t.status=o.status),t.responseType=o.responseType,0==o.readyState)t.startTime||(t.startTime=+new Date);else if(1==o.readyState)t.startTime||(t.startTime=+new Date);else if(2==o.readyState){t.header={};for(var n=o.getAllResponseHeaders()||"",r=n.split("\n"),i=0;i0){a.getData={},l=(l=l.join("?")).split("&");var c=!0,s=!1,d=void 0;try{for(var u,v=l[Symbol.iterator]();!(c=(u=v.next()).done);c=!0){var f=u.value;f=f.split("="),a.getData[f[0]]=decodeURIComponent(f[1])}}catch(e){s=!0,d=e}finally{try{c||null==v.return||v.return()}finally{if(s)throw d}}}if("POST"==a.method)if(r.isString(i)){var p=i.split("&");a.postData={};var b=!0,g=!1,h=void 0;try{for(var m,y=p[Symbol.iterator]();!(b=(m=y.next()).done);b=!0){var _=m.value;_=_.split("="),a.postData[_[0]]=_[1]}}catch(e){g=!0,h=e}finally{try{b||null==y.return||y.return()}finally{if(g)throw h}}}else r.isPlainObject(i)&&(a.postData=i);return t._noVConsole||e.updateRequest(t._requestID,a),o.apply(t,n)}}}},{key:"getUniqueID",value:function(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(e){var t=16*Math.random()|0;return("x"==e?t:3&t|8).toString(16)})}}])&&u(o.prototype,s),d&&u(o,d),t}();o.default=b,e.exports=t.default})?n.apply(t,r):n)||(e.exports=i)},function(e,t){e.exports='
\n
\n
'},function(e,t){e.exports='
\n
Name {{if (count > 0)}}({{count}}){{/if}}
\n
Method
\n
Status
\n
Time
\n
'},function(e,t){e.exports='
\n
\n
{{url}}
\n
{{method}}
\n
{{status}}
\n
{{costTime}}
\n
\n
\n {{if (header !== null)}}\n
\n
\n
Headers
\n
\n {{for (var key in header)}}\n
\n
{{key}}
\n
{{header[key]}}
\n
\n {{/for}}\n
\n {{/if}}\n {{if (getData !== null)}}\n
\n
\n
Query String Parameters
\n
\n {{for (var key in getData)}}\n
\n
{{key}}
\n
{{getData[key]}}
\n
\n {{/for}}\n
\n {{/if}}\n {{if (postData !== null)}}\n
\n
\n
Form Data
\n
\n {{for (var key in postData)}}\n
\n
{{key}}
\n
{{postData[key]}}
\n
\n {{/for}}\n
\n {{/if}}\n
\n
\n
Response
\n
\n
\n
{{response || \'\'}}
\n
\n
\n
\n
'},function(e,t,o){var n,r,i;r=[t,o(31),o(2),o(33),o(34),o(0),o(1)],void 0===(i="function"==typeof(n=function(o,n,r,i,a,l,c){"use strict";function s(e){return e&&e.__esModule?e:{default:e}}function d(e){return(d="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function u(e,t){for(var o=0;o0&&this.onChildRemove(e),e.addedNodes.length>0&&this.onChildAdd(e);break;case"attributes":this.onAttributesChange(e);break;case"characterData":this.onCharacterDataChange(e)}}},{key:"onChildRemove",value:function(e){var t=e.target;if(t.__vconsole_node){for(var o=0;o0||(e.childNodes[r]?n.renderView(e.childNodes[r],a,"replace"):a.style.display="none"))}}}),o){case"replace":t.parentNode.replaceChild(r,t);break;case"insertBefore":t.parentNode.insertBefore(r,t);break;default:t.appendChild(r)}return r}},{key:"getNode",value:function(e){if(!this._isIgnoredElement(e)){var t=e.__vconsole_node||{};if(t.nodeType=e.nodeType,t.nodeName=e.nodeName,t.tagName=e.tagName||"",t.textContent="",t.nodeType!=e.TEXT_NODE&&t.nodeType!=e.DOCUMENT_TYPE_NODE||(t.textContent=e.textContent),t.id=e.id||"",t.className=e.className||"",t.attributes=[],e.hasAttributes&&e.hasAttributes())for(var o=0;o0)for(var n=0;n .vcelm-node {\n display: block;\n}\n.vcelm-l .vcelm-node:active {\n background-color: rgba(0, 0, 0, 0.15);\n}\n.vcelm-l.vcelm-noc .vcelm-node:active {\n background-color: transparent;\n}\n.vcelm-t {\n white-space: pre-wrap;\n word-wrap: break-word;\n}\n/* level */\n.vcelm-l .vcelm-l {\n display: none;\n}\n.vcelm-l.vc-toggle > .vcelm-l {\n margin-left: 4px;\n display: block;\n}\n/* arrow */\n.vcelm-l:before {\n content: "";\n display: block;\n position: absolute;\n top: 6px;\n left: 3px;\n width: 0;\n height: 0;\n border: transparent solid 3px;\n border-left-color: #000;\n}\n.vcelm-l.vc-toggle:before {\n display: block;\n top: 6px;\n left: 0;\n border-top-color: #000;\n border-left-color: transparent;\n}\n.vcelm-l.vcelm-noc:before {\n display: none;\n}\n',""])},function(e,t){e.exports='
\n
\n
'},function(e,t,o){var n,r,i;r=[t,o(35),o(36),o(0),o(1)],void 0===(i="function"==typeof(n=function(o,n,r,i,a){"use strict";function l(e){return e&&e.__esModule?e:{default:e}}function c(e,t){for(var o=0;o-1),l=i;0==e.childNodes.length&&(l=!0);var c=a.default.render(n.default,{node:e}),s=a.default.render(r.default,{node:e});if(l)a.default.addClass(t,"vcelm-noc"),t.appendChild(c),i||t.appendChild(s);else{t.appendChild(c);for(var d=0;d<{{node.tagName.toLowerCase()}}{{if (node.className || node.attributes.length)}}\n \n {{for (var i = 0; i < node.attributes.length; i++)}}\n {{if (node.attributes[i].value !== \'\')}}\n {{node.attributes[i].name}}="{{node.attributes[i].value}}"{{else}}\n {{node.attributes[i].name}}{{/if}}{{/for}}{{/if}}>'},function(e,t){e.exports='</{{node.tagName.toLowerCase()}}>'},function(e,t,o){var n,r,i;r=[t,o(2),o(38),o(39),o(0),o(1)],void 0===(i="function"==typeof(n=function(o,n,r,i,a,l){"use strict";function c(e){return e&&e.__esModule?e:{default:e}}function s(e){return(s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function d(e,t){for(var o=0;o\n
\n'},function(e,t){e.exports='
\n
\n
Name
\n
Value
\n
\n {{for (var i = 0; i < list.length; i++)}}\n
\n
{{list[i].name}}
\n
{{list[i].value}}
\n
\n {{/for}}\n
'}])}); --------------------------------------------------------------------------------