Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
147 changes: 8 additions & 139 deletions src/main/java/org/openqa/selenium/htmlunit/HtmlUnitDriver.java
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,10 @@ public class HtmlUnitDriver implements WebDriver, JavascriptExecutor, HasCapabil
/** JAVASCRIPT_ENABLED = "javascriptEnabled". */
public static final String JAVASCRIPT_ENABLED = "javascriptEnabled";

private WebClient webClient;



/**
* The Lock for the {@link #mainCondition_}, which waits at the end of
* {@link #runAsync(Runnable)} till either and alert is triggered, or
Expand All @@ -163,6 +167,8 @@ public class HtmlUnitDriver implements WebDriver, JavascriptExecutor, HasCapabil
private final ExecutorService defaultExecutor_;
private Executor executor_;


private ProxyConfigurationManager proxyConfigurationManager=new ProxyConfigurationManager();
/**
* Constructs a new instance with JavaScript disabled, and the
* {@link BrowserVersion#getDefault() default} BrowserVersion.
Expand Down Expand Up @@ -255,7 +261,7 @@ private HtmlUnitDriver(final BrowserVersion version, final boolean enableJavascr
clientOptions.setUseInsecureSSL(true);

setJavascriptEnabled(enableJavascript);
setProxySettings(proxy);
proxyConfigurationManager.setProxySettings(proxy);

webClient_.setRefreshHandler(new WaitingRefreshHandler());
webClient_.setClipboardHandler(new AwtClipboardHandler());
Expand Down Expand Up @@ -465,135 +471,7 @@ public void setCurrentWindow(final WebWindow window) {
}
}

/**
* Set proxy for WebClient using Proxy.
*
* @param proxy The proxy preferences.
*/
public void setProxySettings(final Proxy proxy) {
if (proxy == null || proxy.getProxyType() == Proxy.ProxyType.UNSPECIFIED) {
return;
}

switch (proxy.getProxyType()) {
case MANUAL:
configureManualProxy(proxy);
break;

case PAC:
configurePacProxy(proxy);
break;

default:
// Do nothing for other proxy types or log a warning that it's not supported
break;
}
}

private void configureManualProxy(Proxy proxy) {
final List<String> noProxyHosts = extractNoProxyHosts(proxy);
final String httpProxy = proxy.getHttpProxy();
if (httpProxy != null && !httpProxy.isEmpty()) {
configureHttpProxy(httpProxy, noProxyHosts);
}
final String socksProxy = proxy.getSocksProxy();
if (socksProxy != null && !socksProxy.isEmpty()) {
configureSocksProxy(socksProxy, noProxyHosts);
}
// Add any other manual proxy configuration if needed
}

private List<String> extractNoProxyHosts(Proxy proxy) {
final List<String> noProxyHosts = new ArrayList<>();
final String noProxy = proxy.getNoProxy();
if (noProxy != null && !noProxy.isEmpty()) {
for (String host : noProxy.split(",")) {
if (!host.trim().isEmpty()) {
noProxyHosts.add(host.trim());
}
}
}
return noProxyHosts;
}

private void configureHttpProxy(String httpProxy, List<String> noProxyHosts) {
final String[] proxyParts = httpProxy.split(":", 2);
final String host = proxyParts[0];
final int port = proxyParts.length > 1 ? Integer.parseInt(proxyParts[1]) : 0;
setHTTPProxy(host, port, noProxyHosts);
}

private void configureSocksProxy(String socksProxy, List<String> noProxyHosts) {
final String[] proxyParts = socksProxy.split(":", 2);
final String host = proxyParts[0];
final int port = proxyParts.length > 1 ? Integer.parseInt(proxyParts[1]) : 0;
setSocksProxy(host, port, noProxyHosts);
}

private void configurePacProxy(Proxy proxy) {
final String pac = proxy.getProxyAutoconfigUrl();
if (pac != null && !pac.isEmpty()) {
setAutoProxy(pac);
}
}
/**
* Sets HTTP proxy for WebClient.
*
* @param host The hostname of HTTP proxy
* @param port The port of HTTP proxy, 0 means HTTP proxy w/o port
*/
public void setProxy(final String host, final int port) {
setHTTPProxy(host, port, null);
}

/**
* Sets HTTP proxy for WebClient with bypass proxy hosts.
*
* @param host The hostname of HTTP proxy
* @param port The port of HTTP proxy, 0 means HTTP proxy w/o port
* @param noProxyHosts The list of hosts which need to bypass HTTP proxy
*/
public void setHTTPProxy(final String host, final int port, final List<String> noProxyHosts) {
final ProxyConfig proxyConfig = new ProxyConfig();
proxyConfig.setProxyHost(host);
proxyConfig.setProxyPort(port);
if (noProxyHosts != null && noProxyHosts.size() > 0) {
for (final String noProxyHost : noProxyHosts) {
proxyConfig.addHostsToProxyBypass(noProxyHost);
}
}
getWebClient().getOptions().setProxyConfig(proxyConfig);
}

/**
* Sets SOCKS proxy for WebClient.
*
* @param host The hostname of SOCKS proxy
* @param port The port of SOCKS proxy, 0 means HTTP proxy w/o port
*/
public void setSocksProxy(final String host, final int port) {
setSocksProxy(host, port, null);
}

/**
* Sets SOCKS proxy for WebClient with bypass proxy hosts.
*
* @param host The hostname of SOCKS proxy
* @param port The port of SOCKS proxy, 0 means HTTP proxy w/o port
* @param noProxyHosts The list of hosts which need to bypass SOCKS proxy
*/
public void setSocksProxy(final String host, final int port, final List<String> noProxyHosts) {
final ProxyConfig proxyConfig = new ProxyConfig();
proxyConfig.setProxyHost(host);
proxyConfig.setProxyPort(port);
proxyConfig.setSocksProxy(true);
if (noProxyHosts != null && noProxyHosts.size() > 0) {
for (final String noProxyHost : noProxyHosts) {
proxyConfig.addHostsToProxyBypass(noProxyHost);
}
}
getWebClient().getOptions().setProxyConfig(proxyConfig);
}

/**
* Sets the {@link Executor} to be used for submitting async tasks to. You have
Expand All @@ -608,16 +486,7 @@ public void setExecutor(final Executor executor) {
this.executor_ = executor;
}

/**
* Sets Proxy Autoconfiguration URL for WebClient.
*
* @param autoProxyUrl The Proxy Autoconfiguration URL
*/
public void setAutoProxy(final String autoProxyUrl) {
final ProxyConfig proxyConfig = new ProxyConfig();
proxyConfig.setProxyAutoConfigUrl(autoProxyUrl);
getWebClient().getOptions().setProxyConfig(proxyConfig);
}


@Override
public Capabilities getCapabilities() {
Expand Down
57 changes: 24 additions & 33 deletions src/main/java/org/openqa/selenium/htmlunit/HtmlUnitKeyboard.java
Original file line number Diff line number Diff line change
Expand Up @@ -68,12 +68,11 @@ void sendKeys(final HtmlUnitWebElement htmlElem, final boolean releaseAllAtEnd,
}

private void sendKeys(final HtmlElement element,
final InputKeysContainer keysToSend, final boolean releaseAllAtEnd) {
final InputKeysContainer keysToSend, final boolean releaseAllAtEnd) {
keysToSend.setCapitalization(modifiersState_.isShiftPressed());
final String keysSequence = keysToSend.toString();

// HtmlElement.type doesn't modify the value of a file input element. Special
// case.
// Special case for HtmlFileInput
if (element instanceof HtmlFileInput) {
final HtmlFileInput fileInput = (HtmlFileInput) element;
fileInput.setValue(keysSequence);
Expand All @@ -82,21 +81,13 @@ private void sendKeys(final HtmlElement element,

try {
final boolean startAtEnd = lastElement_ != element && !(element instanceof HtmlNumberInput);
final Keyboard keyboard = asHtmlUnitKeyboard(startAtEnd, keysSequence, true);
if (releaseAllAtEnd) {
if (isShiftPressed()) {
addToKeyboard(keyboard, Keys.SHIFT.charAt(0), false);
}
if (isAltPressed()) {
addToKeyboard(keyboard, Keys.ALT.charAt(0), false);
}
if (isCtrlPressed()) {
addToKeyboard(keyboard, Keys.CONTROL.charAt(0), false);
}
final Keyboard keyboard = new Keyboard(startAtEnd);
for (int i = 0; i < keysSequence.length(); i++) {
final char ch = keysSequence.charAt(i);
modifiersState_.addToKeyboard(keyboard, ch, releaseAllAtEnd); // This line is modified
}
element.type(keyboard);
}
catch (final IOException e) {
} catch (final IOException e) {
throw new WebDriverException(e);
}
lastElement_ = element;
Expand All @@ -107,27 +98,27 @@ private Keyboard asHtmlUnitKeyboard(final boolean startAtEnd, final CharSequence
final Keyboard keyboard = new Keyboard(startAtEnd);
for (int i = 0; i < keysSequence.length(); i++) {
final char ch = keysSequence.charAt(i);
addToKeyboard(keyboard, ch, isPress);
modifiersState_.addToKeyboard(keyboard, ch, isPress);
}
return keyboard;
}

private void addToKeyboard(final Keyboard keyboard, final char ch, final boolean isPress) {
if (HtmlUnitKeyboardMapping.isSpecialKey(ch)) {
final int keyCode = HtmlUnitKeyboardMapping.getKeysMapping(ch);
if (isPress) {
keyboard.press(keyCode);
modifiersState_.storeKeyDown(ch);
}
else {
keyboard.release(keyCode);
modifiersState_.storeKeyUp(ch);
}
}
else {
keyboard.type(ch);
}
}
// private void addToKeyboard(final Keyboard keyboard, final char ch, final boolean isPress) {
// if (HtmlUnitKeyboardMapping.isSpecialKey(ch)) {
// final int keyCode = HtmlUnitKeyboardMapping.getKeysMapping(ch);
// if (isPress) {
// keyboard.press(keyCode);
// modifiersState_.storeKeyDown(ch);
// }
// else {
// keyboard.release(keyCode);
// modifiersState_.storeKeyUp(ch);
// }
// }
// else {
// keyboard.type(ch);
// }
// }

public void pressKey(final CharSequence keyToPress) {
final HtmlUnitWebElement htmlElement = (HtmlUnitWebElement) parent_.switchTo().activeElement();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@

import java.util.HashSet;
import java.util.Set;

import org.htmlunit.html.Keyboard;
import org.openqa.selenium.Keys;

/**
Expand Down Expand Up @@ -61,6 +61,21 @@ public void storeKeyUp(final char key) {
set_.remove(key);
}

public void addToKeyboard(final Keyboard keyboard, final char ch, final boolean isPress) {
if (HtmlUnitKeyboardMapping.isSpecialKey(ch)) {
final int keyCode = HtmlUnitKeyboardMapping.getKeysMapping(ch);
if (isPress) {
keyboard.press(keyCode);
storeKeyDown(ch);
} else {
keyboard.release(keyCode);
storeKeyUp(ch);
}
} else {
keyboard.type(ch);
}
}

private void storeIfEqualsShift(final char key, final boolean keyState) {
if (key == Keys.SHIFT.charAt(0)) {
shiftPressed_ = keyState;
Expand Down
Loading