You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ra...@apache.org on 2020/04/17 18:29:31 UTC

[sling-org-apache-sling-scripting-sightly-js-provider] branch master updated: SLING-9320 - Allow bundled render units to access objects from the same bundle through the Use API

This is an automated email from the ASF dual-hosted git repository.

radu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-scripting-sightly-js-provider.git


The following commit(s) were added to refs/heads/master by this push:
     new 6ebafff  SLING-9320 - Allow bundled render units to access objects from the same bundle through the Use API
6ebafff is described below

commit 6ebafff6d81367a3b7fb2ab942795f7a73972668
Author: Radu Cotescu <ra...@apache.org>
AuthorDate: Fri Apr 17 20:27:36 2020 +0200

    SLING-9320 - Allow bundled render units to access objects from the same bundle through the Use API
    
    * updated the JsUseProvider to work with bundled render units
---
 pom.xml                                            |  2 +-
 .../scripting/sightly/js/impl/JsEnvironment.java   | 84 +++++++++------------
 .../scripting/sightly/js/impl/JsUseProvider.java   | 27 ++++---
 .../js/impl/jsapi/SlyBindingsValuesProvider.java   | 28 +++++--
 .../sightly/js/impl/use/DependencyResolver.java    | 87 +++++++++++++++++-----
 .../scripting/sightly/js/impl/use/UseFunction.java | 47 ++++++------
 6 files changed, 171 insertions(+), 104 deletions(-)

diff --git a/pom.xml b/pom.xml
index 2ef2b5b..184e345 100644
--- a/pom.xml
+++ b/pom.xml
@@ -122,7 +122,7 @@
         <dependency>
             <groupId>org.apache.sling</groupId>
             <artifactId>org.apache.sling.scripting.sightly</artifactId>
-            <version>1.3.1-1.4.0-SNAPSHOT</version>
+            <version>1.4.0-1.4.0-SNAPSHOT</version>
             <scope>provided</scope>
         </dependency>
 
diff --git a/src/main/java/org/apache/sling/scripting/sightly/js/impl/JsEnvironment.java b/src/main/java/org/apache/sling/scripting/sightly/js/impl/JsEnvironment.java
index 98671f3..d0fd050 100644
--- a/src/main/java/org/apache/sling/scripting/sightly/js/impl/JsEnvironment.java
+++ b/src/main/java/org/apache/sling/scripting/sightly/js/impl/JsEnvironment.java
@@ -18,11 +18,6 @@
  ******************************************************************************/
 package org.apache.sling.scripting.sightly.js.impl;
 
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.nio.charset.StandardCharsets;
-
 import javax.script.Bindings;
 import javax.script.Compilable;
 import javax.script.ScriptContext;
@@ -31,7 +26,6 @@ import javax.script.ScriptException;
 import javax.script.SimpleScriptContext;
 
 import org.apache.commons.io.IOUtils;
-import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.scripting.LazyBindings;
 import org.apache.sling.scripting.core.ScriptNameAwareReader;
 import org.apache.sling.scripting.sightly.SightlyException;
@@ -44,6 +38,7 @@ import org.apache.sling.scripting.sightly.js.impl.loop.EventLoopInterop;
 import org.apache.sling.scripting.sightly.js.impl.loop.Task;
 import org.apache.sling.scripting.sightly.js.impl.use.DependencyResolver;
 import org.apache.sling.scripting.sightly.js.impl.use.UseFunction;
+import org.jetbrains.annotations.NotNull;
 import org.mozilla.javascript.Context;
 import org.slf4j.LoggerFactory;
 
@@ -54,10 +49,13 @@ public class JsEnvironment {
 
     private final ScriptEngine jsEngine;
     private final Bindings engineBindings;
+    private final DependencyResolver dependencyResolver;
     private EventLoop eventLoop;
 
-    public JsEnvironment(ScriptEngine jsEngine) {
+    public JsEnvironment(@NotNull ScriptEngine jsEngine,
+                         @NotNull DependencyResolver dependencyResolver) {
         this.jsEngine = jsEngine;
+        this.dependencyResolver = dependencyResolver;
         engineBindings = new LazyBindings();
         TimingBindingsValuesProvider.INSTANCE.addBindings(engineBindings);
     }
@@ -76,67 +74,59 @@ public class JsEnvironment {
         Context.exit();
     }
 
-    public void runResource(Resource scriptResource, Bindings globalBindings, Bindings arguments, UnaryCallback callback) {
+    public void runScript(ScriptNameAwareReader reader, Bindings globalBindings, Bindings arguments, UnaryCallback callback) {
         ScriptContext scriptContext = new SimpleScriptContext();
         CommonJsModule module = new CommonJsModule();
-        Bindings scriptBindings = buildBindings(scriptResource, globalBindings, arguments, module);
+        Bindings scriptBindings = buildBindings(reader, globalBindings, arguments, module);
         scriptContext.setBindings(scriptBindings, ScriptContext.ENGINE_SCOPE);
-        scriptContext.setAttribute(ScriptEngine.FILENAME, scriptResource.getPath(), ScriptContext.ENGINE_SCOPE);
-        runScript(scriptResource, scriptContext, callback, module);
+        scriptContext.setAttribute(ScriptEngine.FILENAME, reader.getScriptName(), ScriptContext.ENGINE_SCOPE);
+        runScript(reader, scriptContext, callback, module);
     }
 
-    public AsyncContainer runResource(Resource scriptResource, Bindings globalBindings, Bindings arguments) {
+    public AsyncContainer runScript(ScriptNameAwareReader reader, Bindings globalBindings, Bindings arguments) {
         AsyncContainer asyncContainer = new AsyncContainer();
-        runResource(scriptResource, globalBindings, arguments, asyncContainer.createCompletionCallback());
+        runScript(reader, globalBindings, arguments, asyncContainer.createCompletionCallback());
         return asyncContainer;
     }
 
-    private Bindings buildBindings(Resource scriptResource, Bindings local, Bindings arguments, CommonJsModule commonJsModule) {
+    private Bindings buildBindings(ScriptNameAwareReader reader, Bindings globalBindings, Bindings arguments, CommonJsModule commonJsModule) {
         Bindings bindings = new LazyBindings();
         bindings.putAll(engineBindings);
-        DependencyResolver dependencyResolver = new DependencyResolver(scriptResource, this, local);
-        UseFunction useFunction = new UseFunction(dependencyResolver, arguments);
+        UseFunction useFunction = new UseFunction(this, dependencyResolver, globalBindings, arguments);
         bindings.put(Variables.JS_USE, useFunction);
         bindings.put(Variables.MODULE, commonJsModule);
         bindings.put(Variables.EXPORTS, commonJsModule.getExports());
-        bindings.put(Variables.CONSOLE, new Console(LoggerFactory.getLogger(scriptResource.getName())));
-        bindings.putAll(local);
+        bindings.put(Variables.CONSOLE, new Console(LoggerFactory.getLogger(reader.getScriptName())));
+        bindings.putAll(globalBindings);
         return bindings;
     }
 
-    private void runScript(Resource scriptResource, ScriptContext scriptContext, UnaryCallback callback, CommonJsModule commonJsModule) {
-        eventLoop.schedule(scriptTask(scriptResource, scriptContext, callback, commonJsModule));
+    private void runScript(ScriptNameAwareReader reader, ScriptContext scriptContext, UnaryCallback callback, CommonJsModule commonJsModule) {
+        eventLoop.schedule(scriptTask(reader, scriptContext, callback, commonJsModule));
     }
 
-    private Task scriptTask(final Resource scriptResource, final ScriptContext scriptContext,
+    private Task scriptTask(final ScriptNameAwareReader reader, final ScriptContext scriptContext,
                             final UnaryCallback callback, final CommonJsModule commonJsModule) {
-        return new Task(new Runnable() {
-            @Override
-            public void run() {
-                Reader reader = null;
-                try {
-                    Object result;
-                    if (jsEngine instanceof Compilable) {
-                        reader = new ScriptNameAwareReader(new InputStreamReader(scriptResource.adaptTo(InputStream.class),
-                                StandardCharsets.UTF_8), scriptResource.getPath());
-                        result = ((Compilable) jsEngine).compile(reader).eval(scriptContext);
-                    } else {
-                        reader = new InputStreamReader(scriptResource.adaptTo(InputStream.class), StandardCharsets.UTF_8);
-                        result = jsEngine.eval(reader, scriptContext);
-                    }
-                    if (commonJsModule.isModified()) {
-                        result = commonJsModule.getExports();
-                    }
-                    if (result instanceof AsyncContainer) {
-                        ((AsyncContainer) result).addListener(callback);
-                    } else {
-                        callback.invoke(result);
-                    }
-                } catch (ScriptException e) {
-                    throw new SightlyException(e);
-                } finally {
-                    IOUtils.closeQuietly(reader);
+        return new Task(() -> {
+            try {
+                Object result;
+                if (jsEngine instanceof Compilable) {
+                    result = ((Compilable) jsEngine).compile(reader).eval(scriptContext);
+                } else {
+                    result = jsEngine.eval(reader, scriptContext);
+                }
+                if (commonJsModule.isModified()) {
+                    result = commonJsModule.getExports();
+                }
+                if (result instanceof AsyncContainer) {
+                    ((AsyncContainer) result).addListener(callback);
+                } else {
+                    callback.invoke(result);
                 }
+            } catch (ScriptException e) {
+                throw new SightlyException(e);
+            } finally {
+                IOUtils.closeQuietly(reader);
             }
         });
     }
diff --git a/src/main/java/org/apache/sling/scripting/sightly/js/impl/JsUseProvider.java b/src/main/java/org/apache/sling/scripting/sightly/js/impl/JsUseProvider.java
index 948cef3..d5c6b58 100644
--- a/src/main/java/org/apache/sling/scripting/sightly/js/impl/JsUseProvider.java
+++ b/src/main/java/org/apache/sling/scripting/sightly/js/impl/JsUseProvider.java
@@ -22,21 +22,25 @@ import javax.script.Bindings;
 import javax.script.ScriptEngine;
 import javax.script.ScriptEngineManager;
 
-import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ResourceResolver;
-import org.apache.sling.api.scripting.SlingScriptHelper;
+import org.apache.sling.api.scripting.LazyBindings;
 import org.apache.sling.scripting.api.resource.ScriptingResourceResolverProvider;
+import org.apache.sling.scripting.core.ScriptNameAwareReader;
 import org.apache.sling.scripting.sightly.SightlyException;
+import org.apache.sling.scripting.sightly.engine.BundledUnitManager;
 import org.apache.sling.scripting.sightly.js.impl.async.AsyncContainer;
 import org.apache.sling.scripting.sightly.js.impl.async.AsyncExtractor;
 import org.apache.sling.scripting.sightly.js.impl.jsapi.ProxyAsyncScriptableFactory;
 import org.apache.sling.scripting.sightly.js.impl.rhino.JsValueAdapter;
+import org.apache.sling.scripting.sightly.js.impl.use.DependencyResolver;
 import org.apache.sling.scripting.sightly.render.RenderContext;
 import org.apache.sling.scripting.sightly.use.ProviderOutcome;
 import org.apache.sling.scripting.sightly.use.UseProvider;
 import org.osgi.framework.Constants;
 import org.osgi.service.component.annotations.Component;
 import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
+import org.osgi.service.component.annotations.ReferencePolicyOption;
 import org.osgi.service.metatype.annotations.AttributeDefinition;
 
 /**
@@ -74,9 +78,13 @@ public class JsUseProvider implements UseProvider {
     @Reference
     private ScriptingResourceResolverProvider scriptingResourceResolverProvider;
 
+    @Reference(cardinality = ReferenceCardinality.OPTIONAL, policyOption = ReferencePolicyOption.GREEDY)
+    private BundledUnitManager bundledUnitManager;
+
     @Override
     public ProviderOutcome provide(String identifier, RenderContext renderContext, Bindings arguments) {
-        Bindings globalBindings = renderContext.getBindings();
+        Bindings globalBindings = new LazyBindings();
+        globalBindings.putAll(renderContext.getBindings());
         if (!Utils.isJsScript(identifier)) {
             return ProviderOutcome.failure();
         }
@@ -84,17 +92,16 @@ public class JsUseProvider implements UseProvider {
         if (jsEngine == null) {
             return ProviderOutcome.failure(new SightlyException("Failed to obtain a " + JS_ENGINE_NAME + " JavaScript engine."));
         }
-        SlingScriptHelper scriptHelper = Utils.getHelper(globalBindings);
         JsEnvironment environment = null;
         try {
-            environment = new JsEnvironment(jsEngine);
-            environment.initialize();
             ResourceResolver slingScriptingResolver = scriptingResourceResolverProvider.getRequestScopedResourceResolver();
-            Resource callerScript = slingScriptingResolver.getResource(scriptHelper.getScript().getScriptResource().getPath());
-            Resource scriptResource = Utils.getScriptResource(callerScript, identifier, globalBindings);
-            globalBindings.put(ScriptEngine.FILENAME, scriptResource.getPath());
+            DependencyResolver dependencyResolver = new DependencyResolver(slingScriptingResolver, bundledUnitManager);
+            environment = new JsEnvironment(jsEngine, dependencyResolver);
+            environment.initialize();
+            ScriptNameAwareReader reader = dependencyResolver.resolve(globalBindings, identifier);
+            globalBindings.put(ScriptEngine.FILENAME, reader.getScriptName());
             proxyAsyncScriptableFactory.registerProxies(slingScriptingResolver, environment, globalBindings);
-            AsyncContainer asyncContainer = environment.runResource(scriptResource, globalBindings, arguments);
+            AsyncContainer asyncContainer = environment.runScript(reader, globalBindings, arguments);
             return ProviderOutcome.success(jsValueAdapter.adapt(asyncContainer));
         } finally {
             if (environment != null) {
diff --git a/src/main/java/org/apache/sling/scripting/sightly/js/impl/jsapi/SlyBindingsValuesProvider.java b/src/main/java/org/apache/sling/scripting/sightly/js/impl/jsapi/SlyBindingsValuesProvider.java
index c129202..b11b3c8 100644
--- a/src/main/java/org/apache/sling/scripting/sightly/js/impl/jsapi/SlyBindingsValuesProvider.java
+++ b/src/main/java/org/apache/sling/scripting/sightly/js/impl/jsapi/SlyBindingsValuesProvider.java
@@ -21,6 +21,7 @@ package org.apache.sling.scripting.sightly.js.impl.jsapi;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
+import java.io.StringReader;
 import java.nio.charset.StandardCharsets;
 import java.util.Collections;
 import java.util.HashMap;
@@ -28,6 +29,7 @@ import java.util.LinkedHashMap;
 import java.util.Map;
 
 import javax.script.Bindings;
+import javax.script.ScriptEngine;
 import javax.script.SimpleBindings;
 import javax.servlet.http.HttpServletRequest;
 
@@ -37,6 +39,7 @@ import org.apache.sling.api.resource.ResourceResolver;
 import org.apache.sling.api.scripting.LazyBindings;
 import org.apache.sling.api.scripting.SlingBindings;
 import org.apache.sling.commons.osgi.PropertiesUtil;
+import org.apache.sling.scripting.core.ScriptNameAwareReader;
 import org.apache.sling.scripting.sightly.SightlyException;
 import org.apache.sling.scripting.sightly.js.impl.JsEnvironment;
 import org.apache.sling.scripting.sightly.js.impl.Variables;
@@ -195,17 +198,30 @@ public class SlyBindingsValuesProvider {
         if (resource == null) {
             throw new SightlyException("Sly namespace loader could not find the following script: " + path);
         }
-        AsyncContainer container = jsEnvironment.runResource(resource, createBindings(bindings), new SimpleBindings());
-        Object obj = container.getResult();
-        if (!(obj instanceof Function)) {
-            throw new SightlyException("Script " + path + " was expected to return a function.");
+        try {
+            AsyncContainer container =
+                    jsEnvironment.runScript(
+                            new ScriptNameAwareReader(
+                                    new StringReader(IOUtils.toString(resource.adaptTo(InputStream.class), StandardCharsets.UTF_8)),
+                                    resource.getPath()
+                            ),
+                            createBindings(bindings, resource.getPath()),
+                            new SimpleBindings()
+                    );
+            Object obj = container.getResult();
+            if (!(obj instanceof Function)) {
+                throw new SightlyException("Script " + path + " was expected to return a function.");
+            }
+            return (Function) obj;
+        } catch (IOException e) {
+            throw new SightlyException("Cannot read script " + path + " .");
         }
-        return (Function) obj;
     }
 
-    private Bindings createBindings(Bindings global) {
+    private Bindings createBindings(Bindings global, String factoryPath) {
         Bindings bindings = new LazyBindings();
         bindings.putAll(global);
+        bindings.put(ScriptEngine.FILENAME, factoryPath);
         TimingBindingsValuesProvider.INSTANCE.addBindings(bindings);
         return bindings;
     }
diff --git a/src/main/java/org/apache/sling/scripting/sightly/js/impl/use/DependencyResolver.java b/src/main/java/org/apache/sling/scripting/sightly/js/impl/use/DependencyResolver.java
index 46b7cfb..073b84a 100644
--- a/src/main/java/org/apache/sling/scripting/sightly/js/impl/use/DependencyResolver.java
+++ b/src/main/java/org/apache/sling/scripting/sightly/js/impl/use/DependencyResolver.java
@@ -19,40 +19,93 @@
 
 package org.apache.sling.scripting.sightly.js.impl.use;
 
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.StringReader;
+import java.net.URL;
+import java.nio.charset.StandardCharsets;
+
 import javax.script.Bindings;
+import javax.script.ScriptEngine;
 
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.sling.api.resource.Resource;
+import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.api.scripting.SlingScript;
+import org.apache.sling.api.scripting.SlingScriptHelper;
+import org.apache.sling.scripting.core.ScriptNameAwareReader;
 import org.apache.sling.scripting.sightly.SightlyException;
-import org.apache.sling.scripting.sightly.js.impl.JsEnvironment;
+import org.apache.sling.scripting.sightly.engine.BundledUnitManager;
 import org.apache.sling.scripting.sightly.js.impl.Utils;
-import org.apache.sling.scripting.sightly.js.impl.async.UnaryCallback;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 /**
  * Resolves dependencies specified by the Use function
  */
 public class DependencyResolver {
 
-    private final Resource caller;
-    private final JsEnvironment jsEnvironment;
-    private final Bindings globalBindings;
+    private final BundledUnitManager bundledUnitManager;
+    private final ResourceResolver scriptingResourceResolver;
 
-    public DependencyResolver(Resource resource, JsEnvironment jsEnvironment, Bindings globalBindings) {
-        this.caller = resource;
-        this.jsEnvironment = jsEnvironment;
-        this.globalBindings = globalBindings;
+    public DependencyResolver(@NotNull ResourceResolver scriptingResourceResolver, @Nullable BundledUnitManager bundledUnitManager) {
+        this.bundledUnitManager = bundledUnitManager;
+        this.scriptingResourceResolver = scriptingResourceResolver;
     }
 
-    /**
-     * Resolve a dependency
-     * @param dependency the dependency identifier
-     * @param callback the callback that will receive the resolved dependency
-     */
-    public void resolve(String dependency, UnaryCallback callback) {
+    public @NotNull ScriptNameAwareReader resolve(Bindings bindings, String dependency) {
         if (!Utils.isJsScript(dependency)) {
             throw new SightlyException("Only JS scripts are allowed as dependencies. Invalid dependency: " + dependency);
         }
-        Resource scriptResource = Utils.getScriptResource(caller, dependency, globalBindings);
-        jsEnvironment.runResource(scriptResource, globalBindings, Utils.EMPTY_BINDINGS, callback);
+        ScriptNameAwareReader reader = null;
+        IOException ioException = null;
+        try {
+            if (bundledUnitManager != null) {
+                URL script = bundledUnitManager.getScript(bindings, dependency);
+                if (script != null) {
+                    reader = new ScriptNameAwareReader(new StringReader(IOUtils.toString(script, StandardCharsets.UTF_8)),
+                            script.toExternalForm());
+                }
+            }
+            if (reader == null) {
+                Resource scriptResource = null;
+                if (dependency.startsWith("/")) {
+                    scriptResource = scriptingResourceResolver.getResource(dependency);
+                }
+                if (scriptResource == null) {
+                    SlingScriptHelper scriptHelper = Utils.getHelper(bindings);
+                    if (scriptHelper != null) {
+                        String callerName = (String) bindings.get(ScriptEngine.FILENAME);
+                        Resource caller = null;
+                        if (StringUtils.isNotEmpty(callerName)) {
+                            caller = scriptingResourceResolver.getResource(callerName);
+                        }
+                        SlingScript slingScript = scriptHelper.getScript();
+                        if (caller == null && slingScript != null) {
+                            caller = scriptingResourceResolver.getResource(slingScript.getScriptResource().getPath());
+                        }
+                        if (caller != null) {
+                            scriptResource = Utils.getScriptResource(caller, dependency, bindings);
+                        }
+                    }
+                }
+                if (scriptResource != null) {
+                    reader = new ScriptNameAwareReader(new StringReader(IOUtils.toString(scriptResource.adaptTo(InputStream.class),
+                            StandardCharsets.UTF_8)), scriptResource.getPath());
+                }
+            }
+        } catch (IOException e) {
+            ioException = e;
+        }
+        if (reader == null) {
+            SightlyException sightlyException = new SightlyException(String.format("Unable to load script dependency %s.", dependency));
+            if (ioException != null) {
+                sightlyException.initCause(ioException);
+            }
+            throw sightlyException;
+        }
+        return reader;
     }
 
 }
diff --git a/src/main/java/org/apache/sling/scripting/sightly/js/impl/use/UseFunction.java b/src/main/java/org/apache/sling/scripting/sightly/js/impl/use/UseFunction.java
index fbfe132..2cb098b 100644
--- a/src/main/java/org/apache/sling/scripting/sightly/js/impl/use/UseFunction.java
+++ b/src/main/java/org/apache/sling/scripting/sightly/js/impl/use/UseFunction.java
@@ -19,13 +19,19 @@
 
 package org.apache.sling.scripting.sightly.js.impl.use;
 
-import javax.script.Bindings;
-
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
+import javax.script.Bindings;
+
+import org.apache.sling.scripting.core.ScriptNameAwareReader;
+import org.apache.sling.scripting.sightly.js.impl.JsEnvironment;
+import org.apache.sling.scripting.sightly.js.impl.Utils;
+import org.apache.sling.scripting.sightly.js.impl.async.AsyncContainer;
+import org.apache.sling.scripting.sightly.js.impl.loop.EventLoopInterop;
+import org.apache.sling.scripting.sightly.js.impl.rhino.JsUtils;
 import org.mozilla.javascript.BaseFunction;
 import org.mozilla.javascript.Context;
 import org.mozilla.javascript.Function;
@@ -33,21 +39,21 @@ import org.mozilla.javascript.NativeArray;
 import org.mozilla.javascript.NativeObject;
 import org.mozilla.javascript.Scriptable;
 import org.mozilla.javascript.ScriptableObject;
-import org.apache.sling.scripting.sightly.js.impl.async.AsyncContainer;
-import org.apache.sling.scripting.sightly.js.impl.async.UnaryCallback;
-import org.apache.sling.scripting.sightly.js.impl.loop.EventLoopInterop;
-import org.apache.sling.scripting.sightly.js.impl.rhino.JsUtils;
 
 /**
  * The JavaScript {@code use} function
  */
 public class UseFunction extends BaseFunction {
 
+    private final JsEnvironment jsEnvironment;
     private final DependencyResolver dependencyResolver;
     private final Scriptable thisObj;
+    private final Bindings globalBindings;
 
-    public UseFunction(DependencyResolver dependencyResolver, Bindings arguments) {
+    public UseFunction(JsEnvironment jsEnvironment, DependencyResolver dependencyResolver, Bindings globalBindings, Bindings arguments) {
+        this.jsEnvironment = jsEnvironment;
         this.dependencyResolver = dependencyResolver;
+        this.globalBindings = globalBindings;
         this.thisObj = createThisBinding(arguments);
     }
 
@@ -76,15 +82,13 @@ public class UseFunction extends BaseFunction {
             final Object[] dependencies = new Object[depNames.size()];
             for (int i = 0; i < depNames.size(); i++) {
                 final int dependencyPos = i;
-                dependencyResolver.resolve(depNames.get(i), new UnaryCallback() {
-                    @Override
-                    public void invoke(Object arg) {
-                        counter[0]--;
-                        dependencies[dependencyPos] = arg;
-                        if (counter[0] == 0) {
-                            Object result = JsUtils.callFn(callback, cx, scope, thisObj, dependencies);
-                            asyncContainer.complete(result);
-                        }
+                ScriptNameAwareReader dependency = dependencyResolver.resolve(globalBindings, depNames.get(i));
+                jsEnvironment.runScript(dependency, globalBindings, Utils.EMPTY_BINDINGS, arg -> {
+                    counter[0]--;
+                    dependencies[dependencyPos] = arg;
+                    if (counter[0] == 0) {
+                        Object result = JsUtils.callFn(callback, cx, scope, thisObj, dependencies);
+                        asyncContainer.complete(result);
                     }
                 });
             }
@@ -93,12 +97,9 @@ public class UseFunction extends BaseFunction {
     }
 
     private void callImmediate(final Function callback, final AsyncContainer asyncContainer, final Context cx, final Scriptable scope) {
-        EventLoopInterop.schedule(cx, new Runnable() {
-            @Override
-            public void run() {
-                Object value = JsUtils.callFn(callback, cx, scope, thisObj, new Object[0]);
-                asyncContainer.complete(value);
-            }
+        EventLoopInterop.schedule(cx, () -> {
+            Object value = JsUtils.callFn(callback, cx, scope, thisObj, new Object[0]);
+            asyncContainer.complete(value);
         });
     }
 
@@ -118,7 +119,7 @@ public class UseFunction extends BaseFunction {
 
     private List<String> decodeDepArray(NativeArray nativeArray) {
         int depLength = (int) nativeArray.getLength();
-        List<String> depNames = new ArrayList<String>(depLength);
+        List<String> depNames = new ArrayList<>(depLength);
         for (int i = 0; i < depLength; i++) {
             String depName = jsToString(nativeArray.get(i, nativeArray));
             depNames.add(depName);