| diff --git a/javascript/atoms/action.js b/javascript/atoms/action.js |
| index 74a0fa1c1b..91c2caba62 100644 |
| --- a/javascript/atoms/action.js |
| +++ b/javascript/atoms/action.js |
| @@ -98,7 +98,6 @@ bot.action.clear = function(element) { |
| element.value = ''; |
| } |
| bot.events.fire(element, bot.events.EventType.CHANGE); |
| - bot.events.fire(element, bot.events.EventType.BLUR); |
| var body = bot.getDocument().body; |
| if (body) { |
| bot.action.LegacyDevice_.focusOnElement(body); |
| @@ -113,13 +112,18 @@ bot.action.clear = function(element) { |
| // current value or not |
| bot.action.LegacyDevice_.focusOnElement(element); |
| element.value = ''; |
| - } |
| - |
| - if (bot.dom.isContentEditable(element)) { |
| + } else if (bot.dom.isContentEditable(element)) { |
| // A single space is required, if you put empty string here you'll not be |
| // able to interact with this element anymore in Firefox. |
| bot.action.LegacyDevice_.focusOnElement(element); |
| - element.innerHTML = ' '; |
| + element.innerHTML = goog.userAgent.GECKO ? ' ' : ''; |
| + var body = bot.getDocument().body; |
| + if (body) { |
| + bot.action.LegacyDevice_.focusOnElement(body); |
| + } else { |
| + throw new bot.Error(bot.ErrorCode.UNKNOWN_ERROR, |
| + 'Cannot unfocus element after clearing.'); |
| + } |
| // contentEditable does not generate onchange event. |
| } |
| }; |
| diff --git a/javascript/atoms/dom.js b/javascript/atoms/dom.js |
| index 196412d3cb..bb24c3058a 100644 |
| --- a/javascript/atoms/dom.js |
| +++ b/javascript/atoms/dom.js |
| @@ -595,14 +595,8 @@ bot.dom.isShown = function(elem, opt_ignoreOpacity) { |
| var parent = bot.dom.getParentNodeInComposedDom(e); |
| |
| if (bot.dom.IS_SHADOW_DOM_ENABLED && (parent instanceof ShadowRoot)) { |
| - if (parent.host.shadowRoot !== parent) { |
| - // There is a younger shadow root, which will take precedence over |
| - // the shadow this element is in, thus this element won't be |
| - // displayed. |
| - return false; |
| - } else { |
| - parent = parent.host; |
| - } |
| + // For backward compatibility, treat all shadow roots as shown. |
| + return true; |
| } |
| |
| if (parent && (parent.nodeType == goog.dom.NodeType.DOCUMENT || |
| @@ -610,7 +604,7 @@ bot.dom.isShown = function(elem, opt_ignoreOpacity) { |
| return true; |
| } |
| |
| - return parent && displayed(parent); |
| + return !!parent && displayed(parent); |
| } |
| |
| return bot.dom.isShown_(elem, !!opt_ignoreOpacity, displayed); |
| @@ -1271,13 +1265,6 @@ bot.dom.getOpacityNonIE_ = function(elem) { |
| bot.dom.getParentNodeInComposedDom = function(node) { |
| var /**@type {Node}*/ parent = node.parentNode; |
| |
| - // Shadow DOM v1 |
| - if (parent && parent.shadowRoot && node.assignedSlot !== undefined) { |
| - // Can be null on purpose, meaning it has no parent as |
| - // it hasn't yet been slotted |
| - return node.assignedSlot ? node.assignedSlot.parentNode : null; |
| - } |
| - |
| // Shadow DOM V0 (deprecated) |
| if (node.getDestinationInsertionPoints) { |
| var destinations = node.getDestinationInsertionPoints(); |
| @@ -1286,6 +1273,13 @@ bot.dom.getParentNodeInComposedDom = function(node) { |
| } |
| } |
| |
| + // Shadow DOM v1 |
| + if (parent && parent.shadowRoot && node.assignedSlot !== undefined) { |
| + // Can be null on purpose, meaning it has no parent as |
| + // it hasn't yet been slotted |
| + return node.assignedSlot ? node.assignedSlot.parentNode : null; |
| + } |
| + |
| return parent; |
| }; |
| |
| diff --git a/javascript/atoms/mouse.js b/javascript/atoms/mouse.js |
| index 737ed50f62..1bc9e858f5 100644 |
| --- a/javascript/atoms/mouse.js |
| +++ b/javascript/atoms/mouse.js |
| @@ -143,7 +143,7 @@ bot.Mouse.NO_BUTTON_VALUE_INDEX_ = 3; |
| * click/ mouseup/ mouseout/ mousemove contextmenu |
| * dblclick mousedown mouseover |
| * IE_DOC_PRE9 0 0 0 X 1 4 2 X 0 0 0 0 1 4 2 0 X X 0 X |
| - * WEBKIT/IE9 0 1 2 X 0 1 2 X 0 1 2 0 0 1 2 0 X X 2 X |
| + * WEBKIT/IE9 0 1 2 X 0 1 2 X 0 1 2 4 0 1 2 4 X X 2 X |
| * GECKO 0 1 2 X 0 1 2 X 0 0 0 0 0 0 0 0 X X 2 X |
| * </pre> |
| * @private {!Object.<bot.events.EventType, !Array.<?number>>} |
| @@ -163,8 +163,8 @@ bot.Mouse.MOUSE_BUTTON_VALUE_MAP_ = (function() { |
| buttonValueMap[bot.events.EventType.CLICK] = [0, 1, 2, null]; |
| buttonValueMap[bot.events.EventType.CONTEXTMENU] = [null, null, 2, null]; |
| buttonValueMap[bot.events.EventType.MOUSEUP] = [0, 1, 2, null]; |
| - buttonValueMap[bot.events.EventType.MOUSEOUT] = [0, 1, 2, 0]; |
| - buttonValueMap[bot.events.EventType.MOUSEMOVE] = [0, 1, 2, 0]; |
| + buttonValueMap[bot.events.EventType.MOUSEOUT] = [0, 1, 2, 4]; |
| + buttonValueMap[bot.events.EventType.MOUSEMOVE] = [0, 1, 2, 4]; |
| } else { |
| buttonValueMap[bot.events.EventType.CLICK] = [0, 1, 2, null]; |
| buttonValueMap[bot.events.EventType.CONTEXTMENU] = [null, null, 2, null]; |
| diff --git a/javascript/chrome-driver/atoms.js b/javascript/chrome-driver/atoms.js |
| index 5cf4416460..7cd02f0507 100644 |
| --- a/javascript/chrome-driver/atoms.js |
| +++ b/javascript/chrome-driver/atoms.js |
| @@ -142,7 +142,12 @@ webdriver.chrome.scrollIntoView_ = function(elem, region, center) { |
| |
| offset = goog.style.getClientPosition(elem); |
| var windowSize = goog.dom.getDomHelper(elem).getViewportSize(); |
| - scrollHelper(doc.body, windowSize, offset, region, center); |
| + // Chrome uses either doc.documentElement or doc.body, depending on |
| + // compatibility settings. For reliability, call scrollHelper on both. |
| + // Calling scrollHelper on the wrong object is harmless. |
| + scrollHelper(doc.documentElement, windowSize, offset, region, center); |
| + if (doc.body) |
| + scrollHelper(doc.body, windowSize, offset, region, center); |
| }; |
| |
| |
| diff --git a/rake-tasks/crazy_fun/mappings/javascript.rb b/rake-tasks/crazy_fun/mappings/javascript.rb |
| index 1ac2b2066a..dfa11fbbc2 100644 |
| --- a/rake-tasks/crazy_fun/mappings/javascript.rb |
| +++ b/rake-tasks/crazy_fun/mappings/javascript.rb |
| @@ -857,6 +857,8 @@ module Javascript |
| flags.push("--jscomp_error=undefinedVars") |
| flags.push("--jscomp_error=uselessCode") |
| flags.push("--jscomp_error=visibility") |
| + # Work around https://github.com/google/closure-compiler/issues/1044 |
| + flags.push("--use_types_for_optimization=false") |
| |
| expanded_flags = flags.join(" ") << |
| " --js='" << |