package net.thucydides.core.webdriver;
import com.google.common.collect.ImmutableList;
import net.thucydides.core.guice.Injectors;
import org.openqa.selenium.WebDriver;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import static java.util.Collections.synchronizedList;
/**
* Provides a proxy for a WebDriver instance.
* The proxy lets you delay opening the browser until you really know you are going to use it.
*/
public class WebdriverProxyFactory implements Serializable {
private static final long serialVersionUID = 1L;
private static ThreadLocal<WebdriverProxyFactory> factory = new ThreadLocal<WebdriverProxyFactory>();
private static List<ThucydidesWebDriverEventListener> eventListeners
= synchronizedList(new ArrayList<ThucydidesWebDriverEventListener>());
private WebDriverFactory webDriverFactory;
private WebDriverFacade mockDriver;
private final Configuration configuration;
private WebdriverProxyFactory() {
webDriverFactory = new WebDriverFactory();
this.configuration = Injectors.getInjector().getInstance(Configuration.class);
}
public static WebdriverProxyFactory getFactory() {
if (factory.get() == null) {
factory.set(new WebdriverProxyFactory());
}
return factory.get();
}
public static List<ThucydidesWebDriverEventListener> getEventListeners() {
return ImmutableList.copyOf(eventListeners);
}
public WebDriverFacade proxyFor(final Class<? extends WebDriver> driverClass) {
return proxyFor(driverClass, new WebDriverFactory());
}
public WebDriverFacade proxyFor(final Class<? extends WebDriver> driverClass,
final WebDriverFactory webDriverFactory) {
if (mockDriver != null) {
return mockDriver;
} else {
return new WebDriverFacade(driverClass, webDriverFactory);
}
}
public void registerListener(final ThucydidesWebDriverEventListener eventListener) {
eventListeners.add(eventListener);
}
public void notifyListenersOfWebdriverCreationIn(final WebDriverFacade webDriverFacade) {
for(ThucydidesWebDriverEventListener listener : getEventListeners()) {
listener.driverCreatedIn(webDriverFacade);
}
}
public WebDriver proxyDriver() {
Class<? extends WebDriver> driverClass = webDriverFactory.getClassFor(configuration.getDriverType());
return proxyFor(driverClass, webDriverFactory);
}
public static void resetDriver(final WebDriver driver) {
if (driver instanceof WebDriverFacade) {
((WebDriverFacade) driver).reset();
}
}
public void useMockDriver(final WebDriverFacade mockDriver) {
this.mockDriver = mockDriver;
}
public void clearMockDriver() {
this.mockDriver = null;
}
}