diff --git a/java/server/src/org/openqa/selenium/remote/server/DefaultDriverFactory.java b/java/server/src/org/openqa/selenium/remote/server/DefaultDriverFactory.java index c6572a2d64de0..6a5ad3cee4ddd 100644 --- a/java/server/src/org/openqa/selenium/remote/server/DefaultDriverFactory.java +++ b/java/server/src/org/openqa/selenium/remote/server/DefaultDriverFactory.java @@ -30,8 +30,11 @@ public class DefaultDriverFactory implements DriverFactory { new ConcurrentHashMap(); public void registerDriver(Capabilities capabilities, Class implementation) { - capabilitiesToDriverProvider.put(capabilities, - new DefaultDriverProvider(capabilities, implementation)); + registerDriverProvider(capabilities, new DefaultDriverProvider(capabilities, implementation)); + } + + public void registerDriverProvider(Capabilities capabilities, DriverProvider implementation) { + capabilitiesToDriverProvider.put(capabilities, implementation); } protected Class getBestMatchFor(Capabilities desired) { diff --git a/java/server/src/org/openqa/selenium/remote/server/DefaultDriverSessions.java b/java/server/src/org/openqa/selenium/remote/server/DefaultDriverSessions.java index 9c55e77f4e52c..11a809d676998 100644 --- a/java/server/src/org/openqa/selenium/remote/server/DefaultDriverSessions.java +++ b/java/server/src/org/openqa/selenium/remote/server/DefaultDriverSessions.java @@ -25,6 +25,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.Map; +import java.util.ServiceLoader; import java.util.Set; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; @@ -65,6 +66,7 @@ public DefaultDriverSessions( protected DefaultDriverSessions(Platform runningOn, DriverFactory factory) { this.factory = factory; registerDefaults(runningOn); + registerDriverProviders(runningOn); } private void registerDefaults(Platform current) { @@ -81,6 +83,18 @@ private void registerDefaults(Platform current) { } } + private void registerDriverProviders(Platform current) { + for (DriverProvider provider : ServiceLoader.load(DriverProvider.class)) { + Capabilities caps = provider.getProvidedCapabilities(); + if (caps.getPlatform() == null || caps.getPlatform().is(current)) { + factory.registerDriverProvider(caps, provider); + } else { + log.info("Driver provider " + provider + " registration is skipped: registration capabilities " + + caps.toString() + " does not match with current platform: " + current.toString()); + } + } + } + private void registerDriver(Capabilities caps, String className) { try { registerDriver(caps, Class.forName(className).asSubclass(WebDriver.class)); diff --git a/java/server/src/org/openqa/selenium/remote/server/DriverFactory.java b/java/server/src/org/openqa/selenium/remote/server/DriverFactory.java index 5dd94df27eaab..d3d49bdd70d47 100644 --- a/java/server/src/org/openqa/selenium/remote/server/DriverFactory.java +++ b/java/server/src/org/openqa/selenium/remote/server/DriverFactory.java @@ -21,6 +21,8 @@ public interface DriverFactory { void registerDriver(Capabilities capabilities, Class implementation); + void registerDriverProvider(Capabilities capabilities, DriverProvider implementation); + WebDriver newInstance(Capabilities capabilities); boolean hasMappingFor(Capabilities capabilities);