1   package com.atlassian.selenium;
2   
3   import com.atlassian.webtest.ui.keys.KeyEventType;
4   
5   import java.util.Set;
6   
7   import static com.google.common.base.Preconditions.checkNotNull;
8   
9   /**
10   * Encapsulates complex key events handling.
11   *
12   * @since v1.21
13   */
14  public final class SeleniumKeyHandler extends AbstractSeleniumDriver
15  {
16      private final String locator;
17      private final Set<KeyEventType> keyEvents;
18      private final boolean reset;
19      private final SeleniumTagInspector tagInspector;
20  
21      public SeleniumKeyHandler(SeleniumClient client, String locator, Set<KeyEventType> keyEvents, boolean reset)
22      {
23          super(client);
24          this.locator = checkNotNull(locator, "locator");
25          this.keyEvents = checkNotNull(keyEvents, "keyEvents");
26          this.reset = checkNotNull(reset, "reset");
27          this.tagInspector = new SeleniumTagInspector(client);
28      }
29  
30      public void typeWithFullKeyEvents(String text)
31      {
32          client.focus(locator);
33          if (reset)
34          {
35              client.type(locator, "");
36          }
37  
38          char[] chars = text.toCharArray();
39          StringBuilder typedTo = new StringBuilder();
40          if(!reset && tagInspector.isInput(locator))
41          {
42              typedTo.append(client.getValue(locator));
43          }
44          for (char aChar : chars)
45          {
46              if (Browser.IE.equals(client.getBrowser()))
47              {
48                  typedTo.append(aChar);
49                  client.type(locator, typedTo.toString());
50              }
51              client.simulateKeyPressForCharacter(locator, aChar, keyEvents);
52          }
53      }
54  
55      
56  }