优化
This commit is contained in:
@@ -10,13 +10,18 @@ import android.os.Build
|
|||||||
import com.github.liuyueyi.quick.transfer.ChineseUtils
|
import com.github.liuyueyi.quick.transfer.ChineseUtils
|
||||||
import com.github.liuyueyi.quick.transfer.constants.TransType
|
import com.github.liuyueyi.quick.transfer.constants.TransType
|
||||||
import com.jeremyliao.liveeventbus.LiveEventBus
|
import com.jeremyliao.liveeventbus.LiveEventBus
|
||||||
|
import com.script.rhino.RhinoScriptEngine
|
||||||
import io.legado.app.base.AppContextWrapper
|
import io.legado.app.base.AppContextWrapper
|
||||||
import io.legado.app.constant.AppConst.channelIdDownload
|
import io.legado.app.constant.AppConst.channelIdDownload
|
||||||
import io.legado.app.constant.AppConst.channelIdReadAloud
|
import io.legado.app.constant.AppConst.channelIdReadAloud
|
||||||
import io.legado.app.constant.AppConst.channelIdWeb
|
import io.legado.app.constant.AppConst.channelIdWeb
|
||||||
import io.legado.app.constant.PreferKey
|
import io.legado.app.constant.PreferKey
|
||||||
import io.legado.app.data.appDb
|
import io.legado.app.data.appDb
|
||||||
import io.legado.app.help.*
|
import io.legado.app.help.AppWebDav
|
||||||
|
import io.legado.app.help.CrashHandler
|
||||||
|
import io.legado.app.help.DefaultData
|
||||||
|
import io.legado.app.help.LifecycleHelp
|
||||||
|
import io.legado.app.help.RuleBigDataHelp
|
||||||
import io.legado.app.help.book.BookHelp
|
import io.legado.app.help.book.BookHelp
|
||||||
import io.legado.app.help.config.AppConfig
|
import io.legado.app.help.config.AppConfig
|
||||||
import io.legado.app.help.config.ThemeConfig.applyDayNight
|
import io.legado.app.help.config.ThemeConfig.applyDayNight
|
||||||
@@ -36,6 +41,7 @@ class App : Application() {
|
|||||||
|
|
||||||
override fun onCreate() {
|
override fun onCreate() {
|
||||||
super.onCreate()
|
super.onCreate()
|
||||||
|
RhinoScriptEngine
|
||||||
oldConfig = Configuration(resources.configuration)
|
oldConfig = Configuration(resources.configuration)
|
||||||
CrashHandler(this)
|
CrashHandler(this)
|
||||||
//预下载Cronet so
|
//预下载Cronet so
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
package io.legado.app.data.entities
|
package io.legado.app.data.entities
|
||||||
|
|
||||||
import cn.hutool.crypto.symmetric.AES
|
import cn.hutool.crypto.symmetric.AES
|
||||||
|
import com.script.SimpleBindings
|
||||||
|
import com.script.rhino.RhinoScriptEngine
|
||||||
import io.legado.app.constant.AppConst
|
import io.legado.app.constant.AppConst
|
||||||
import io.legado.app.constant.AppLog
|
import io.legado.app.constant.AppLog
|
||||||
import io.legado.app.data.entities.rule.RowUi
|
import io.legado.app.data.entities.rule.RowUi
|
||||||
@@ -10,9 +12,6 @@ import io.legado.app.help.config.AppConfig
|
|||||||
import io.legado.app.help.http.CookieStore
|
import io.legado.app.help.http.CookieStore
|
||||||
import io.legado.app.model.SharedJsScope
|
import io.legado.app.model.SharedJsScope
|
||||||
import io.legado.app.rhino.Bindings
|
import io.legado.app.rhino.Bindings
|
||||||
import io.legado.app.rhino.Rhino
|
|
||||||
import io.legado.app.rhino.evaluate
|
|
||||||
import io.legado.app.rhino.putBindings
|
|
||||||
import io.legado.app.utils.*
|
import io.legado.app.utils.*
|
||||||
import org.intellij.lang.annotations.Language
|
import org.intellij.lang.annotations.Language
|
||||||
import org.mozilla.javascript.Scriptable
|
import org.mozilla.javascript.Scriptable
|
||||||
@@ -237,14 +236,15 @@ interface BaseSource : JsExtensions {
|
|||||||
bindings["baseUrl"] = getKey()
|
bindings["baseUrl"] = getKey()
|
||||||
bindings["cookie"] = CookieStore
|
bindings["cookie"] = CookieStore
|
||||||
bindings["cache"] = CacheManager
|
bindings["cache"] = CacheManager
|
||||||
return Rhino.use {
|
// return Rhino.use {
|
||||||
val scope = initStandardObjects()
|
// val scope = initStandardObjects()
|
||||||
scope.putBindings(bindings)
|
// scope.putBindings(bindings)
|
||||||
getShareScope()?.let {
|
// getShareScope()?.let {
|
||||||
scope.prototype = it
|
// scope.prototype = it
|
||||||
}
|
// }
|
||||||
evaluate(scope, jsStr)
|
// evaluate(scope, jsStr)
|
||||||
}
|
// }
|
||||||
|
return RhinoScriptEngine.eval(jsStr, SimpleBindings(bindings))
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getShareScope(): Scriptable? {
|
fun getShareScope(): Scriptable? {
|
||||||
|
|||||||
@@ -2,6 +2,8 @@ package io.legado.app.model.analyzeRule
|
|||||||
|
|
||||||
import android.text.TextUtils
|
import android.text.TextUtils
|
||||||
import androidx.annotation.Keep
|
import androidx.annotation.Keep
|
||||||
|
import com.script.SimpleBindings
|
||||||
|
import com.script.rhino.RhinoScriptEngine
|
||||||
import io.legado.app.constant.AppPattern.JS_PATTERN
|
import io.legado.app.constant.AppPattern.JS_PATTERN
|
||||||
import io.legado.app.data.entities.*
|
import io.legado.app.data.entities.*
|
||||||
import io.legado.app.help.CacheManager
|
import io.legado.app.help.CacheManager
|
||||||
@@ -9,9 +11,6 @@ import io.legado.app.help.JsExtensions
|
|||||||
import io.legado.app.help.http.CookieStore
|
import io.legado.app.help.http.CookieStore
|
||||||
import io.legado.app.model.webBook.WebBook
|
import io.legado.app.model.webBook.WebBook
|
||||||
import io.legado.app.rhino.Bindings
|
import io.legado.app.rhino.Bindings
|
||||||
import io.legado.app.rhino.Rhino
|
|
||||||
import io.legado.app.rhino.evaluate
|
|
||||||
import io.legado.app.rhino.putBindings
|
|
||||||
import io.legado.app.utils.*
|
import io.legado.app.utils.*
|
||||||
import kotlinx.coroutines.runBlocking
|
import kotlinx.coroutines.runBlocking
|
||||||
import kotlinx.coroutines.withTimeout
|
import kotlinx.coroutines.withTimeout
|
||||||
@@ -695,14 +694,15 @@ class AnalyzeRule(
|
|||||||
bindings["title"] = chapter?.title
|
bindings["title"] = chapter?.title
|
||||||
bindings["src"] = content
|
bindings["src"] = content
|
||||||
bindings["nextChapterUrl"] = nextChapterUrl
|
bindings["nextChapterUrl"] = nextChapterUrl
|
||||||
return Rhino.use {
|
// return Rhino.use {
|
||||||
val scope = initStandardObjects()
|
// val scope = initStandardObjects()
|
||||||
scope.putBindings(bindings)
|
// scope.putBindings(bindings)
|
||||||
source?.getShareScope()?.let {
|
// source?.getShareScope()?.let {
|
||||||
scope.prototype = it
|
// scope.prototype = it
|
||||||
}
|
// }
|
||||||
evaluate(scope, jsStr)
|
// evaluate(scope, jsStr)
|
||||||
}
|
// }
|
||||||
|
return RhinoScriptEngine.eval(jsStr, SimpleBindings(bindings))
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getSource(): BaseSource? {
|
override fun getSource(): BaseSource? {
|
||||||
|
|||||||
@@ -5,6 +5,8 @@ import android.util.Base64
|
|||||||
import androidx.annotation.Keep
|
import androidx.annotation.Keep
|
||||||
import cn.hutool.core.util.HexUtil
|
import cn.hutool.core.util.HexUtil
|
||||||
import com.bumptech.glide.load.model.GlideUrl
|
import com.bumptech.glide.load.model.GlideUrl
|
||||||
|
import com.script.SimpleBindings
|
||||||
|
import com.script.rhino.RhinoScriptEngine
|
||||||
import io.legado.app.constant.AppConst.UA_NAME
|
import io.legado.app.constant.AppConst.UA_NAME
|
||||||
import io.legado.app.constant.AppPattern
|
import io.legado.app.constant.AppPattern
|
||||||
import io.legado.app.constant.AppPattern.JS_PATTERN
|
import io.legado.app.constant.AppPattern.JS_PATTERN
|
||||||
@@ -19,9 +21,6 @@ import io.legado.app.help.config.AppConfig
|
|||||||
import io.legado.app.help.glide.GlideHeaders
|
import io.legado.app.help.glide.GlideHeaders
|
||||||
import io.legado.app.help.http.*
|
import io.legado.app.help.http.*
|
||||||
import io.legado.app.rhino.Bindings
|
import io.legado.app.rhino.Bindings
|
||||||
import io.legado.app.rhino.Rhino
|
|
||||||
import io.legado.app.rhino.evaluate
|
|
||||||
import io.legado.app.rhino.putBindings
|
|
||||||
import io.legado.app.utils.*
|
import io.legado.app.utils.*
|
||||||
import kotlinx.coroutines.delay
|
import kotlinx.coroutines.delay
|
||||||
import kotlinx.coroutines.runBlocking
|
import kotlinx.coroutines.runBlocking
|
||||||
@@ -267,14 +266,15 @@ class AnalyzeUrl(
|
|||||||
bindings["book"] = ruleData as? Book
|
bindings["book"] = ruleData as? Book
|
||||||
bindings["source"] = source
|
bindings["source"] = source
|
||||||
bindings["result"] = result
|
bindings["result"] = result
|
||||||
return Rhino.use {
|
// return Rhino.use {
|
||||||
val scope = initStandardObjects()
|
// val scope = initStandardObjects()
|
||||||
scope.putBindings(bindings)
|
// scope.putBindings(bindings)
|
||||||
source?.getShareScope()?.let {
|
// source?.getShareScope()?.let {
|
||||||
scope.prototype = it
|
// scope.prototype = it
|
||||||
}
|
// }
|
||||||
evaluate(scope, jsStr)
|
// evaluate(scope, jsStr)
|
||||||
}
|
// }
|
||||||
|
return RhinoScriptEngine.eval(jsStr, SimpleBindings(bindings))
|
||||||
}
|
}
|
||||||
|
|
||||||
fun put(key: String, value: String): String {
|
fun put(key: String, value: String): String {
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
package io.legado.app.rhino
|
package io.legado.app.rhino
|
||||||
|
|
||||||
import com.script.RhinoContextFactory
|
|
||||||
import org.mozilla.javascript.Context
|
import org.mozilla.javascript.Context
|
||||||
import org.mozilla.javascript.ContextFactory
|
|
||||||
import org.mozilla.javascript.Undefined
|
import org.mozilla.javascript.Undefined
|
||||||
import org.mozilla.javascript.Wrapper
|
import org.mozilla.javascript.Wrapper
|
||||||
|
|
||||||
@@ -25,19 +23,18 @@ object Rhino {
|
|||||||
return if (result1 is Undefined) null else result1
|
return if (result1 is Undefined) null else result1
|
||||||
}
|
}
|
||||||
|
|
||||||
init {
|
// init {
|
||||||
ContextFactory.initGlobal(object : RhinoContextFactory() {
|
// ContextFactory.initGlobal(object : RhinoContextFactory() {
|
||||||
|
//
|
||||||
override fun makeContext(): Context {
|
// override fun makeContext(): Context {
|
||||||
val cx = super.makeContext()
|
// val cx = super.makeContext()
|
||||||
cx.languageVersion = 200
|
// cx.languageVersion = 200
|
||||||
cx.optimizationLevel = -1
|
// cx.optimizationLevel = -1
|
||||||
cx.setClassShutter(RhinoClassShutter)
|
// cx.setClassShutter(RhinoClassShutter)
|
||||||
//cx.wrapFactory = RhinoWrapFactory
|
// return cx
|
||||||
return cx
|
// }
|
||||||
}
|
//
|
||||||
|
// })
|
||||||
})
|
// }
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -42,7 +42,7 @@ import java.security.*
|
|||||||
* @since 1.6
|
* @since 1.6
|
||||||
*/
|
*/
|
||||||
@Suppress("MemberVisibilityCanBePrivate")
|
@Suppress("MemberVisibilityCanBePrivate")
|
||||||
class RhinoScriptEngine : AbstractScriptEngine(), Invocable, Compilable {
|
object RhinoScriptEngine : AbstractScriptEngine(), Invocable, Compilable {
|
||||||
var accessContext: AccessControlContext? = null
|
var accessContext: AccessControlContext? = null
|
||||||
private var topLevel: RhinoTopLevel? = null
|
private var topLevel: RhinoTopLevel? = null
|
||||||
private val indexedProps: MutableMap<Any, Any?>
|
private val indexedProps: MutableMap<Any, Any?>
|
||||||
@@ -198,6 +198,62 @@ class RhinoScriptEngine : AbstractScriptEngine(), Invocable, Compilable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
init {
|
init {
|
||||||
|
ContextFactory.initGlobal(object : ContextFactory() {
|
||||||
|
|
||||||
|
override fun makeContext(): Context {
|
||||||
|
val cx = super.makeContext()
|
||||||
|
cx.languageVersion = 200
|
||||||
|
cx.optimizationLevel = -1
|
||||||
|
cx.setClassShutter(RhinoClassShutter)
|
||||||
|
cx.wrapFactory = RhinoWrapFactory
|
||||||
|
return cx
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun hasFeature(cx: Context, featureIndex: Int): Boolean {
|
||||||
|
@Suppress("UNUSED_EXPRESSION")
|
||||||
|
return when (featureIndex) {
|
||||||
|
//Context.FEATURE_ENABLE_JAVA_MAP_ACCESS -> true
|
||||||
|
else -> super.hasFeature(cx, featureIndex)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun doTopCall(
|
||||||
|
callable: Callable,
|
||||||
|
cx: Context,
|
||||||
|
scope: Scriptable,
|
||||||
|
thisObj: Scriptable,
|
||||||
|
args: Array<Any>
|
||||||
|
): Any? {
|
||||||
|
var accContext: AccessControlContext? = null
|
||||||
|
val global = ScriptableObject.getTopLevelScope(scope)
|
||||||
|
val globalProto = global.prototype
|
||||||
|
if (globalProto is RhinoTopLevel) {
|
||||||
|
accContext = globalProto.accessContext
|
||||||
|
}
|
||||||
|
return if (accContext != null) AccessController.doPrivileged(
|
||||||
|
PrivilegedAction {
|
||||||
|
superDoTopCall(callable, cx, scope, thisObj, args)
|
||||||
|
}, accContext
|
||||||
|
) else superDoTopCall(
|
||||||
|
callable,
|
||||||
|
cx,
|
||||||
|
scope,
|
||||||
|
thisObj,
|
||||||
|
args
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun superDoTopCall(
|
||||||
|
callable: Callable,
|
||||||
|
cx: Context,
|
||||||
|
scope: Scriptable,
|
||||||
|
thisObj: Scriptable,
|
||||||
|
args: Array<Any>
|
||||||
|
): Any? {
|
||||||
|
return super.doTopCall(callable, cx, scope, thisObj, args)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
if (System.getSecurityManager() != null) {
|
if (System.getSecurityManager() != null) {
|
||||||
try {
|
try {
|
||||||
AccessController.checkPermission(AllPermission())
|
AccessController.checkPermission(AllPermission())
|
||||||
@@ -251,65 +307,4 @@ class RhinoScriptEngine : AbstractScriptEngine(), Invocable, Compilable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Suppress("unused")
|
|
||||||
companion object {
|
|
||||||
|
|
||||||
init {
|
|
||||||
ContextFactory.initGlobal(object : ContextFactory() {
|
|
||||||
|
|
||||||
override fun makeContext(): Context {
|
|
||||||
val cx = super.makeContext()
|
|
||||||
cx.languageVersion = 200
|
|
||||||
cx.optimizationLevel = -1
|
|
||||||
cx.setClassShutter(RhinoClassShutter)
|
|
||||||
cx.wrapFactory = RhinoWrapFactory
|
|
||||||
return cx
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun hasFeature(cx: Context, featureIndex: Int): Boolean {
|
|
||||||
@Suppress("UNUSED_EXPRESSION")
|
|
||||||
return when (featureIndex) {
|
|
||||||
//Context.FEATURE_ENABLE_JAVA_MAP_ACCESS -> true
|
|
||||||
else -> super.hasFeature(cx, featureIndex)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun doTopCall(
|
|
||||||
callable: Callable,
|
|
||||||
cx: Context,
|
|
||||||
scope: Scriptable,
|
|
||||||
thisObj: Scriptable,
|
|
||||||
args: Array<Any>
|
|
||||||
): Any? {
|
|
||||||
var accContext: AccessControlContext? = null
|
|
||||||
val global = ScriptableObject.getTopLevelScope(scope)
|
|
||||||
val globalProto = global.prototype
|
|
||||||
if (globalProto is RhinoTopLevel) {
|
|
||||||
accContext = globalProto.accessContext
|
|
||||||
}
|
|
||||||
return if (accContext != null) AccessController.doPrivileged(
|
|
||||||
PrivilegedAction {
|
|
||||||
superDoTopCall(callable, cx, scope, thisObj, args)
|
|
||||||
}, accContext
|
|
||||||
) else superDoTopCall(
|
|
||||||
callable,
|
|
||||||
cx,
|
|
||||||
scope,
|
|
||||||
thisObj,
|
|
||||||
args
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun superDoTopCall(
|
|
||||||
callable: Callable,
|
|
||||||
cx: Context,
|
|
||||||
scope: Scriptable,
|
|
||||||
thisObj: Scriptable,
|
|
||||||
args: Array<Any>
|
|
||||||
): Any? {
|
|
||||||
return super.doTopCall(callable, cx, scope, thisObj, args)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -34,15 +34,15 @@ import java.lang.reflect.Method
|
|||||||
import java.security.*
|
import java.security.*
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Implementation of `ScriptEngine` using the Mozilla Rhino
|
* Implementation of `ScriptEngine` using the Mozilla Rhino
|
||||||
* interpreter.
|
* interpreter.
|
||||||
*
|
*
|
||||||
* @author Mike Grogan
|
* @author Mike Grogan
|
||||||
* @author A. Sundararajan
|
* @author A. Sundararajan
|
||||||
* @since 1.6
|
* @since 1.6
|
||||||
*/
|
*/
|
||||||
@Suppress("MemberVisibilityCanBePrivate")
|
@Suppress("MemberVisibilityCanBePrivate")
|
||||||
class RhinoScriptEngine : AbstractScriptEngine(), Invocable, Compilable {
|
object RhinoScriptEngine : AbstractScriptEngine(), Invocable, Compilable {
|
||||||
var accessContext: AccessControlContext? = null
|
var accessContext: AccessControlContext? = null
|
||||||
private var topLevel: RhinoTopLevel? = null
|
private var topLevel: RhinoTopLevel? = null
|
||||||
private val indexedProps: MutableMap<Any, Any?>
|
private val indexedProps: MutableMap<Any, Any?>
|
||||||
@@ -198,6 +198,62 @@ class RhinoScriptEngine : AbstractScriptEngine(), Invocable, Compilable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
init {
|
init {
|
||||||
|
|
||||||
|
ContextFactory.initGlobal(object : ContextFactory() {
|
||||||
|
|
||||||
|
override fun makeContext(): Context {
|
||||||
|
val cx = super.makeContext()
|
||||||
|
cx.languageVersion = 200
|
||||||
|
cx.optimizationLevel = -1
|
||||||
|
cx.setClassShutter(RhinoClassShutter)
|
||||||
|
cx.wrapFactory = RhinoWrapFactory
|
||||||
|
return cx
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun hasFeature(cx: Context, featureIndex: Int): Boolean {
|
||||||
|
return when (featureIndex) {
|
||||||
|
Context.FEATURE_ENABLE_JAVA_MAP_ACCESS -> true
|
||||||
|
else -> super.hasFeature(cx, featureIndex)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun doTopCall(
|
||||||
|
callable: Callable,
|
||||||
|
cx: Context,
|
||||||
|
scope: Scriptable,
|
||||||
|
thisObj: Scriptable,
|
||||||
|
args: Array<Any>
|
||||||
|
): Any? {
|
||||||
|
var accContext: AccessControlContext? = null
|
||||||
|
val global = ScriptableObject.getTopLevelScope(scope)
|
||||||
|
val globalProto = global.prototype
|
||||||
|
if (globalProto is RhinoTopLevel) {
|
||||||
|
accContext = globalProto.accessContext
|
||||||
|
}
|
||||||
|
return if (accContext != null) AccessController.doPrivileged(
|
||||||
|
PrivilegedAction {
|
||||||
|
superDoTopCall(callable, cx, scope, thisObj, args)
|
||||||
|
}, accContext
|
||||||
|
) else superDoTopCall(
|
||||||
|
callable,
|
||||||
|
cx,
|
||||||
|
scope,
|
||||||
|
thisObj,
|
||||||
|
args
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun superDoTopCall(
|
||||||
|
callable: Callable,
|
||||||
|
cx: Context,
|
||||||
|
scope: Scriptable,
|
||||||
|
thisObj: Scriptable,
|
||||||
|
args: Array<Any>
|
||||||
|
): Any? {
|
||||||
|
return super.doTopCall(callable, cx, scope, thisObj, args)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
if (System.getSecurityManager() != null) {
|
if (System.getSecurityManager() != null) {
|
||||||
try {
|
try {
|
||||||
AccessController.checkPermission(AllPermission())
|
AccessController.checkPermission(AllPermission())
|
||||||
@@ -251,64 +307,4 @@ class RhinoScriptEngine : AbstractScriptEngine(), Invocable, Compilable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Suppress("unused")
|
|
||||||
companion object {
|
|
||||||
|
|
||||||
init {
|
|
||||||
ContextFactory.initGlobal(object : ContextFactory() {
|
|
||||||
|
|
||||||
override fun makeContext(): Context {
|
|
||||||
val cx = super.makeContext()
|
|
||||||
cx.languageVersion = 200
|
|
||||||
cx.optimizationLevel = -1
|
|
||||||
cx.setClassShutter(RhinoClassShutter)
|
|
||||||
cx.wrapFactory = RhinoWrapFactory
|
|
||||||
return cx
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun hasFeature(cx: Context, featureIndex: Int): Boolean {
|
|
||||||
return when (featureIndex) {
|
|
||||||
Context.FEATURE_ENABLE_JAVA_MAP_ACCESS -> true
|
|
||||||
else -> super.hasFeature(cx, featureIndex)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun doTopCall(
|
|
||||||
callable: Callable,
|
|
||||||
cx: Context,
|
|
||||||
scope: Scriptable,
|
|
||||||
thisObj: Scriptable,
|
|
||||||
args: Array<Any>
|
|
||||||
): Any? {
|
|
||||||
var accContext: AccessControlContext? = null
|
|
||||||
val global = ScriptableObject.getTopLevelScope(scope)
|
|
||||||
val globalProto = global.prototype
|
|
||||||
if (globalProto is RhinoTopLevel) {
|
|
||||||
accContext = globalProto.accessContext
|
|
||||||
}
|
|
||||||
return if (accContext != null) AccessController.doPrivileged(
|
|
||||||
PrivilegedAction {
|
|
||||||
superDoTopCall(callable, cx, scope, thisObj, args)
|
|
||||||
}, accContext
|
|
||||||
) else superDoTopCall(
|
|
||||||
callable,
|
|
||||||
cx,
|
|
||||||
scope,
|
|
||||||
thisObj,
|
|
||||||
args
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun superDoTopCall(
|
|
||||||
callable: Callable,
|
|
||||||
cx: Context,
|
|
||||||
scope: Scriptable,
|
|
||||||
thisObj: Scriptable,
|
|
||||||
args: Array<Any>
|
|
||||||
): Any? {
|
|
||||||
return super.doTopCall(callable, cx, scope, thisObj, args)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user