From 6102f6e8fe1b7f3c0083cbbfbaae834e465760a9 Mon Sep 17 00:00:00 2001 From: hyb1996 <946994919@qq.com> Date: Sun, 14 May 2017 23:34:38 +0800 Subject: [PATCH] fix sublime plugin issue with ui mode, object prototype pollution, try for ui api --- .../stardust/scriptdroid/script/Scripts.java | 2 ++ .../SublimePluginClient.java | 34 ++++++++----------- autojs/build.gradle | 1 + .../src/main/assets/javascript_engine_init.js | 5 +-- autojs/src/main/assets/modules/__app__.js | 2 +- autojs/src/main/assets/modules/__console__.js | 2 +- autojs/src/main/assets/modules/__ui__.js | 2 +- .../stardust/autojs/ScriptEngineService.java | 6 ++++ .../execution/ScriptExecuteActivity.java | 10 ++++-- .../runtime/api/ui/AttributeHandler.java | 2 +- .../runtime/api/ui/ConvertLayoutInflater.java | 19 ++++------- .../runtime/api/ui/JsLayoutInflater.java | 2 +- .../stardust/autojs/runtime/api/ui/UI.java | 6 ++-- 13 files changed, 50 insertions(+), 43 deletions(-) diff --git a/app/src/main/java/com/stardust/scriptdroid/script/Scripts.java b/app/src/main/java/com/stardust/scriptdroid/script/Scripts.java index 74147767..c1b19e14 100644 --- a/app/src/main/java/com/stardust/scriptdroid/script/Scripts.java +++ b/app/src/main/java/com/stardust/scriptdroid/script/Scripts.java @@ -26,6 +26,8 @@ import com.stardust.util.AssetsCache; import java.io.File; +import javax.xml.parsers.DocumentBuilderFactory; + /** * Created by Stardust on 2017/5/3. */ diff --git a/app/src/main/java/com/stardust/scriptdroid/sublime_plugin_client/SublimePluginClient.java b/app/src/main/java/com/stardust/scriptdroid/sublime_plugin_client/SublimePluginClient.java index cdcbcbba..0452d13c 100644 --- a/app/src/main/java/com/stardust/scriptdroid/sublime_plugin_client/SublimePluginClient.java +++ b/app/src/main/java/com/stardust/scriptdroid/sublime_plugin_client/SublimePluginClient.java @@ -87,26 +87,22 @@ public class SublimePluginClient { if (mSocket == null) { throw new IllegalStateException("Socket is not listening "); } - if (Looper.myLooper() == Looper.getMainLooper()) { - if (mExecutor == null) { - mExecutor = Executors.newSingleThreadExecutor(); - } - mExecutor.execute(new Runnable() { - @Override - public void run() { - send(object); + if (mExecutor == null) { + mExecutor = Executors.newSingleThreadExecutor(); + } + mExecutor.execute(new Runnable() { + @Override + public void run() { + try { + mOutputStream.write(object.toString().getBytes()); + mOutputStream.write("\n".getBytes()); + mOutputStream.flush(); + } catch (IOException e) { + e.printStackTrace(); + tryClose(); } - }); - } - try { - mOutputStream.write(object.toString().getBytes()); - mOutputStream.write("\n".getBytes()); - mOutputStream.flush(); - } catch (IOException e) { - e.printStackTrace(); - tryClose(); - } - + } + }); } public void close() throws IOException { diff --git a/autojs/build.gradle b/autojs/build.gradle index 929ae653..c4c503c1 100644 --- a/autojs/build.gradle +++ b/autojs/build.gradle @@ -29,6 +29,7 @@ dependencies { }) testCompile 'junit:junit:4.12' compile 'com.github.hyb1996:node-android-lib:1.0.14' + compile 'com.github.hyb1996:DynamicLayoutInflator:0.1' compile 'org.greenrobot:eventbus:3.0.0' compile project(path: ':common') compile project(path: ':automator') diff --git a/autojs/src/main/assets/javascript_engine_init.js b/autojs/src/main/assets/javascript_engine_init.js index 27948427..4b49e21a 100644 --- a/autojs/src/main/assets/javascript_engine_init.js +++ b/autojs/src/main/assets/javascript_engine_init.js @@ -13,12 +13,13 @@ if(__engine_name__ == "rhino"){ } } +var __that__ = this; var __asGlobal__ = function(obj, functions){ var len = functions.length; for(var i = 0; i < len; i++) { var funcName = functions[i]; - this[funcName] = obj[funcName].bind(obj); + __that__[funcName] = obj[funcName].bind(obj); } } @@ -32,4 +33,4 @@ require("__general__")(__runtime__, this); var m = modules[i]; scope[m] = require('__' + m + '__')(scope.__runtime__, scope); } -})(this); +})(__that__); diff --git a/autojs/src/main/assets/modules/__app__.js b/autojs/src/main/assets/modules/__app__.js index 30886c6a..d0de5e09 100644 --- a/autojs/src/main/assets/modules/__app__.js +++ b/autojs/src/main/assets/modules/__app__.js @@ -1,6 +1,6 @@ module.exports = function(__runtime__, scope){ - var app = new Object(__runtime__.app); + var app = Object.create(__runtime__.app); var context = scope.context; app.intent = function(i) { diff --git a/autojs/src/main/assets/modules/__console__.js b/autojs/src/main/assets/modules/__console__.js index fae66653..85e3a159 100644 --- a/autojs/src/main/assets/modules/__console__.js +++ b/autojs/src/main/assets/modules/__console__.js @@ -1,6 +1,6 @@ module.exports = function(__runtime__, scope){ - var console = new Object(__runtime__.console); + var console = Object.create(__runtime__.console); console.assert = function(value, message){ message = message || ""; diff --git a/autojs/src/main/assets/modules/__ui__.js b/autojs/src/main/assets/modules/__ui__.js index 78a6e02f..cc17e0fd 100644 --- a/autojs/src/main/assets/modules/__ui__.js +++ b/autojs/src/main/assets/modules/__ui__.js @@ -1,7 +1,7 @@ module.exports = function(__runtime__, scope){ var ui = Object(__runtime__.ui); ui.layout = function(xml){ - view = ui.inflate(xml); + view = ui.inflate(activity, xml); ui.setView(view); } diff --git a/autojs/src/main/java/com/stardust/autojs/ScriptEngineService.java b/autojs/src/main/java/com/stardust/autojs/ScriptEngineService.java index 13e26169..7172989d 100644 --- a/autojs/src/main/java/com/stardust/autojs/ScriptEngineService.java +++ b/autojs/src/main/java/com/stardust/autojs/ScriptEngineService.java @@ -120,6 +120,12 @@ public class ScriptEngineService { task.setExecutionListener(mScriptExecutionObserver); } if (isUiMode(task)) { + mUiHandler.post(new Runnable() { + @Override + public void run() { + + } + }); return ScriptExecuteActivity.execute(mContext, this, task); } else { RunnableScriptExecution scriptExecution = new RunnableScriptExecution(this, task); diff --git a/autojs/src/main/java/com/stardust/autojs/execution/ScriptExecuteActivity.java b/autojs/src/main/java/com/stardust/autojs/execution/ScriptExecuteActivity.java index 371c856f..2ee81c5c 100644 --- a/autojs/src/main/java/com/stardust/autojs/execution/ScriptExecuteActivity.java +++ b/autojs/src/main/java/com/stardust/autojs/execution/ScriptExecuteActivity.java @@ -83,20 +83,26 @@ public class ScriptExecuteActivity extends Activity { private ScriptEngine mScriptEngine; private ScriptRuntime mScriptRuntime; + private ScriptEngineService mScriptEngineService; ActivityScriptExecution(ScriptEngineService service, ScriptExecutionTask task) { super(task); - mScriptEngine = service.createScriptEngine(); - mScriptRuntime = service.createScriptRuntime(); + mScriptEngineService = service; } @Override public ScriptEngine getEngine() { + if (mScriptEngine == null) { + mScriptEngine = mScriptEngineService.createScriptEngine(); + } return mScriptEngine; } @Override public ScriptRuntime getRuntime() { + if (mScriptRuntime == null) { + mScriptRuntime = mScriptEngineService.createScriptRuntime(); + } return mScriptRuntime; } diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/api/ui/AttributeHandler.java b/autojs/src/main/java/com/stardust/autojs/runtime/api/ui/AttributeHandler.java index f48ff4e9..06fec3f1 100644 --- a/autojs/src/main/java/com/stardust/autojs/runtime/api/ui/AttributeHandler.java +++ b/autojs/src/main/java/com/stardust/autojs/runtime/api/ui/AttributeHandler.java @@ -105,7 +105,7 @@ public interface AttributeHandler { @Override public boolean handle(String nodeName, Node attr, StringBuilder layoutXml) { - String dimen = convertToAndroidDimen(attr.getNodeName()); + String dimen = convertToAndroidDimen(attr.getNodeValue()); layoutXml.append("android:").append(mAttrName).append("=\"").append(dimen).append("\"\n"); return true; } diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/api/ui/ConvertLayoutInflater.java b/autojs/src/main/java/com/stardust/autojs/runtime/api/ui/ConvertLayoutInflater.java index 5b8ec43b..399d1ee6 100644 --- a/autojs/src/main/java/com/stardust/autojs/runtime/api/ui/ConvertLayoutInflater.java +++ b/autojs/src/main/java/com/stardust/autojs/runtime/api/ui/ConvertLayoutInflater.java @@ -4,6 +4,9 @@ import android.content.Context; import android.util.Xml; import android.view.LayoutInflater; import android.view.View; +import android.widget.FrameLayout; + +import com.nickandjerry.dynamiclayoutinflator.lib.DynamicLayoutInflator; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserFactory; @@ -16,22 +19,14 @@ import java.io.StringReader; public class ConvertLayoutInflater implements JsLayoutInflater { - private Context mContext; - - public ConvertLayoutInflater(Context context) { - mContext = context; - } @Override - public View inflate(String xml) { + public View inflate(Context context, String xml) { try { - // 我靠%>_<% 弄完了xml转换以后发现android并不能动态inflate非resources的xml啊啊啊啊啊啊 String androidLayoutXml = XmlConverter.convertToAndroidLayout(xml); - XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); - XmlPullParser parser = factory.newPullParser(); - LayoutInflater inflater = LayoutInflater.from(mContext); - parser.setInput(new StringReader(androidLayoutXml)); - return inflater.inflate(parser, null); + FrameLayout root = new FrameLayout(context); + DynamicLayoutInflator.inflate(context, androidLayoutXml, root); + return root; } catch (Exception e) { throw new RuntimeException(e); } diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/api/ui/JsLayoutInflater.java b/autojs/src/main/java/com/stardust/autojs/runtime/api/ui/JsLayoutInflater.java index ef629a65..042c1663 100644 --- a/autojs/src/main/java/com/stardust/autojs/runtime/api/ui/JsLayoutInflater.java +++ b/autojs/src/main/java/com/stardust/autojs/runtime/api/ui/JsLayoutInflater.java @@ -9,5 +9,5 @@ import android.view.View; public interface JsLayoutInflater { - View inflate(String xml); + View inflate(Context context, String xml); } diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/api/ui/UI.java b/autojs/src/main/java/com/stardust/autojs/runtime/api/ui/UI.java index 7104f5e1..7a5a5f34 100644 --- a/autojs/src/main/java/com/stardust/autojs/runtime/api/ui/UI.java +++ b/autojs/src/main/java/com/stardust/autojs/runtime/api/ui/UI.java @@ -20,14 +20,14 @@ public class UI { public UI(Context context) { - this(context, new ConvertLayoutInflater(context)); + this(context, new ConvertLayoutInflater()); } public JsLayoutInflater getLayoutInflater() { return mJsLayoutInflater; } - public View inflate(String xml) { - return mJsLayoutInflater.inflate(xml); + public View inflate(Context context, String xml) { + return mJsLayoutInflater.inflate(context, xml); } }