Skip to content

Commit 6f3c043

Browse files
committed
next try to optimize js class configuration
1 parent c149e61 commit 6f3c043

File tree

3 files changed

+162
-192
lines changed

3 files changed

+162
-192
lines changed

src/main/java/org/htmlunit/javascript/JavaScriptEngine.java

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,9 @@ public static void configureScope(final HtmlUnitScriptable jsScope,
282282
final BrowserVersion browserVersion,
283283
final Map<Class<? extends Scriptable>, Scriptable> prototypes,
284284
final Map<String, Scriptable> prototypesPerJSName) throws Exception {
285+
286+
final Scriptable objectPrototype = ScriptableObject.getObjectPrototype(jsScope);
287+
285288
// setup the prototypes
286289
for (final ClassConfiguration config : jsConfig.getAll()) {
287290
if (config != scopeConfig) {
@@ -299,21 +302,14 @@ public static void configureScope(final HtmlUnitScriptable jsScope,
299302
}
300303
prototypes.put(config.getHostClass(), prototype);
301304
prototypesPerJSName.put(config.getClassName(), prototype);
302-
}
303-
}
304305

305-
// once all prototypes have been build, it's possible to configure the chains
306-
final Scriptable objectPrototype = ScriptableObject.getObjectPrototype(jsScope);
307-
for (final Map.Entry<String, Scriptable> entry : prototypesPerJSName.entrySet()) {
308-
final String name = entry.getKey();
309-
final ClassConfiguration config = jsConfig.getClassConfiguration(name);
310-
final Scriptable prototype = entry.getValue();
311-
if (!StringUtils.isEmpty(config.getExtendedClassName())) {
312-
final Scriptable parentPrototype = prototypesPerJSName.get(config.getExtendedClassName());
313-
prototype.setPrototype(parentPrototype);
314-
}
315-
else {
316-
prototype.setPrototype(objectPrototype);
306+
if (!StringUtils.isEmpty(config.getExtendedClassName())) {
307+
final Scriptable parentPrototype = prototypesPerJSName.get(config.getExtendedClassName());
308+
prototype.setPrototype(parentPrototype);
309+
}
310+
else {
311+
prototype.setPrototype(objectPrototype);
312+
}
317313
}
318314
}
319315

src/main/java/org/htmlunit/javascript/configuration/AbstractJavaScriptConfiguration.java

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@
2222
import java.lang.annotation.Annotation;
2323
import java.lang.reflect.Field;
2424
import java.lang.reflect.Method;
25+
import java.util.ArrayList;
2526
import java.util.HashSet;
27+
import java.util.List;
2628
import java.util.Map;
2729
import java.util.Map.Entry;
2830
import java.util.Set;
@@ -50,19 +52,19 @@ public abstract class AbstractJavaScriptConfiguration {
5052

5153
private Map<Class<?>, Class<? extends HtmlUnitScriptable>> domJavaScriptMap_;
5254

53-
private final Map<String, ClassConfiguration> configuration_;
55+
private final ArrayList<ClassConfiguration> configuration_;
5456

5557
/**
5658
* Constructor.
5759
* @param browser the browser version to use
5860
*/
5961
protected AbstractJavaScriptConfiguration(final BrowserVersion browser) {
60-
configuration_ = new ConcurrentHashMap<>(getClasses().length);
62+
configuration_ = new ArrayList<>(getClasses().length);
6163

6264
for (final Class<? extends HtmlUnitScriptable> klass : getClasses()) {
6365
final ClassConfiguration config = getClassConfiguration(klass, browser);
6466
if (config != null) {
65-
configuration_.put(config.getClassName(), config);
67+
configuration_.add(config);
6668
}
6769
}
6870
}
@@ -77,7 +79,7 @@ protected AbstractJavaScriptConfiguration(final BrowserVersion browser) {
7779
* @return the class configurations
7880
*/
7981
public Iterable<ClassConfiguration> getAll() {
80-
return configuration_.values();
82+
return configuration_;
8183
}
8284

8385
/**
@@ -383,7 +385,12 @@ public static boolean isCompatible(final SupportedBrowser browser1, final Suppor
383385
* @return the class configuration for the supplied JavaScript class name
384386
*/
385387
public ClassConfiguration getClassConfiguration(final String hostClassName) {
386-
return configuration_.get(hostClassName);
388+
for (final ClassConfiguration classConfig : configuration_) {
389+
if (hostClassName.equals(classConfig.getClassName())) {
390+
return classConfig;
391+
}
392+
}
393+
return null;
387394
}
388395

389396
/**
@@ -399,12 +406,11 @@ public Class<? extends HtmlUnitScriptable> getDomJavaScriptMappingFor(final Clas
399406
new ConcurrentHashMap<>(configuration_.size());
400407

401408
final boolean debug = LOG.isDebugEnabled();
402-
for (final Map.Entry<String, ClassConfiguration> entry : configuration_.entrySet()) {
403-
final ClassConfiguration classConfig = entry.getValue();
409+
for (final ClassConfiguration classConfig : configuration_) {
404410
for (final Class<?> domClass : classConfig.getDomClasses()) {
405411
// preload and validate that the class exists
406412
if (debug) {
407-
LOG.debug("Mapping " + domClass.getName() + " to " + entry.getKey());
413+
LOG.debug("Mapping " + domClass.getName() + " to " + classConfig.getClassName());
408414
}
409415
map.put(domClass, classConfig.getHostClass());
410416
}

0 commit comments

Comments
 (0)