| Index: third_party/WebKit/Source/core/dom/Document.cpp | 
| diff --git a/third_party/WebKit/Source/core/dom/Document.cpp b/third_party/WebKit/Source/core/dom/Document.cpp | 
| index 252d0aa7089ab20330dc086bc1cf3870f0b1afb5..becff01c5a7ab15128e4fcdf15c1a4acf31da9ac 100644 | 
| --- a/third_party/WebKit/Source/core/dom/Document.cpp | 
| +++ b/third_party/WebKit/Source/core/dom/Document.cpp | 
| @@ -143,6 +143,7 @@ | 
| #include "core/frame/LocalFrameView.h" | 
| #include "core/frame/PerformanceMonitor.h" | 
| #include "core/frame/Settings.h" | 
| +#include "core/frame/VisualViewport.h" | 
| #include "core/frame/csp/ContentSecurityPolicy.h" | 
| #include "core/html/DocumentNameCollection.h" | 
| #include "core/html/HTMLAllCollection.h" | 
| @@ -6443,6 +6444,12 @@ void Document::UpdateHoverActiveState(const HitTestRequest& request, | 
| SetActiveHoverElement(new_active_element); | 
| } | 
| } | 
| + | 
| +  // Do not set hover state if event is from touch and on mobile. | 
| +  bool allow_hover_changes = | 
| +      !(request.TouchEvent() && GetPage() && | 
| +        GetPage()->GetVisualViewport().ShouldDisableDesktopWorkarounds()); | 
| + | 
| // If the mouse has just been pressed, set :active on the chain. Those (and | 
| // only those) nodes should remain :active until the mouse is released. | 
| bool allow_active_changes = !old_active_element && ActiveHoverElement(); | 
| @@ -6462,7 +6469,8 @@ void Document::UpdateHoverActiveState(const HitTestRequest& request, | 
| SkipDisplayNoneAncestors(inner_element_in_document); | 
|  | 
| // Update our current hover element. | 
| -  SetHoverElement(new_hover_element); | 
| +  if (allow_hover_changes) | 
| +    SetHoverElement(new_hover_element); | 
|  | 
| Node* ancestor_element = nullptr; | 
| if (old_hover_element && old_hover_element->isConnected() && | 
| @@ -6503,8 +6511,10 @@ void Document::UpdateHoverActiveState(const HitTestRequest& request, | 
| elements_to_add_to_chain.push_back(curr); | 
| } | 
|  | 
| -  for (Element* element : elements_to_remove_from_chain) | 
| -    element->SetHovered(false); | 
| +  if (allow_hover_changes) { | 
| +    for (Element* element : elements_to_remove_from_chain) | 
| +      element->SetHovered(false); | 
| +  } | 
|  | 
| bool saw_common_ancestor = false; | 
| for (Element* element : elements_to_add_to_chain) { | 
| @@ -6514,7 +6524,8 @@ void Document::UpdateHoverActiveState(const HitTestRequest& request, | 
| saw_common_ancestor = true; | 
| if (allow_active_changes) | 
| element->SetActive(true); | 
| -    if (!saw_common_ancestor || element == hover_element_) | 
| +    if (allow_hover_changes && | 
| +        (!saw_common_ancestor || element == hover_element_)) | 
| element->SetHovered(true); | 
| } | 
| } | 
|  |