| Index: Source/core/dom/Element.cpp
|
| diff --git a/Source/core/dom/Element.cpp b/Source/core/dom/Element.cpp
|
| index 0253525e3481a27a63fbedffb0bd68d3fdddb7af..2b7b2cf8673ca3a2c468c1d3b1f40bde9ac07be9 100644
|
| --- a/Source/core/dom/Element.cpp
|
| +++ b/Source/core/dom/Element.cpp
|
| @@ -139,6 +139,7 @@ PassRefPtrWillBeRawPtr<Element> Element::create(const QualifiedName& tagName, Do
|
| Element::Element(const QualifiedName& tagName, Document* document, ConstructionType type)
|
| : ContainerNode(document, type)
|
| , m_tagName(tagName)
|
| + , m_wasFocusedByMouse(false)
|
| {
|
| ScriptWrappable::init(this);
|
| }
|
| @@ -2126,6 +2127,12 @@ bool Element::supportsFocus() const
|
| || supportsSpatialNavigationFocus();
|
| }
|
|
|
| +bool Element::shouldHaveFocusAppearance() const
|
| +{
|
| + ASSERT(focused());
|
| + return shouldShowFocusRingOnMouseFocus() || !m_wasFocusedByMouse;
|
| +}
|
| +
|
| bool Element::supportsSpatialNavigationFocus() const
|
| {
|
| // This function checks whether the element satisfies the extended criteria
|
| @@ -2164,8 +2171,23 @@ bool Element::isMouseFocusable() const
|
| return isFocusable();
|
| }
|
|
|
| -void Element::dispatchFocusEvent(Element* oldFocusedElement, FocusType)
|
| +void Element::willCallDefaultEventHandler(const Event& event)
|
| {
|
| + if (!m_wasFocusedByMouse)
|
| + return;
|
| + if (!event.isKeyboardEvent() || event.type() != EventTypeNames::keydown)
|
| + return;
|
| + m_wasFocusedByMouse = false;
|
| + // Focus changes could affect the focus ring appearance if the focus ring is not shown by default on mouse focus.
|
| + if (!shouldShowFocusRingOnMouseFocus() && renderer())
|
| + renderer()->setShouldDoFullPaintInvalidation(true);
|
| +}
|
| +
|
| +void Element::dispatchFocusEvent(Element* oldFocusedElement, FocusType type)
|
| +{
|
| + if (type != FocusTypePage)
|
| + m_wasFocusedByMouse = type == FocusTypeMouse;
|
| +
|
| RefPtrWillBeRawPtr<FocusEvent> event = FocusEvent::create(EventTypeNames::focus, false, false, document().domWindow(), 0, oldFocusedElement);
|
| EventDispatcher::dispatchEvent(this, FocusEventDispatchMediator::create(event.release()));
|
| }
|
|
|