Changeset 141738 in webkit


Ignore:
Timestamp:
Feb 3, 2013 10:11:17 PM (11 years ago)
Author:
tkent@chromium.org
Message:

Add FocusDirection argument to HTMLTextFormControlElement::handleFocusEvent
https://bugs.webkit.org/show_bug.cgi?id=108775

Reviewed by Hajime Morita.

We'd like to add a FocusDirection argument to
HTMLTextFormControlElement::handleFocusEvent in order to fix Bug

  1. This is a preparation for it.

We need to add FocusDirection arguments to some focus-related functions
to pass it correctly when TAB or Shift+TAB is pressed.

No new tests. This doesn't make any behavior changes.

  • html/HTMLTextFormControlElement.cpp:

(WebCore::HTMLTextFormControlElement::dispatchFocusEvent):
To pass the FocusDirection argument to handleFocusEvent, we need to add
it to dispatchFocusEvent too.

  • html/HTMLTextFormControlElement.h:

(HTMLTextFormControlElement):
Add FocusDirection arugment to dispatchFocusEvent.
(WebCore::HTMLTextFormControlElement::handleFocusEvent):
Add FocusDirection argument.

  • dom/Node.cpp:

(WebCore::Node::dispatchFocusEvent): Add FocusDirection argument.

  • dom/Node.h:

(Node): Ditto.

  • dom/Document.cpp:

(WebCore::Document::setFocusedNode): Add FocusDirection argument in
order to pass it to Node::dispatchFocusEvent.

  • dom/Document.h:

(Document): Ditto.

  • page/FocusController.cpp:

(WebCore::dispatchEventsOnWindowAndFocusedNode):
Adjust Node::dispatchFocusEvent argument.
(WebCore::FocusController::advanceFocusInDocumentOrder):
Pass FocusDirectio to Element::focus.
(WebCore::FocusController::setFocusedNode):
Add FocusDirection argument in order to pass it to Document::setFocusedNode.
(WebCore::FocusController::advanceFocusDirectionallyInContainer):
Pass FocusDirectio to Element::focus.

  • page/FocusController.h:

(FocusController): Add FocusDirection argument to setFocusedNode.

  • dom/Element.cpp:

(WebCore::Element::focus):
Add FocusDirection argument to pass it to FocusController::setFocusedNode.

  • dom/Element.h:

(Element): Ditto.

  • WebCore.exp.in:

Update FocusController::setFocusedNode and Document::setFocusedNode.

  • html/HTMLLabelElement.cpp:

(WebCore::HTMLLabelElement::focus): Adjust FocusDirection argument.

  • html/HTMLLabelElement.h:

(HTMLLabelElement): Ditto.

  • html/HTMLLegendElement.cpp:

(WebCore::HTMLLegendElement::focus): Ditto.

  • html/HTMLLegendElement.h:

(HTMLLegendElement): Ditto.

  • html/HTMLSelectElement.cpp:

(WebCore::HTMLSelectElement::dispatchFocusEvent): Ditto.

  • html/HTMLSelectElement.h:

(HTMLSelectElement): Ditto.

  • html/HTMLInputElement.cpp:

(WebCore::HTMLInputElement::defaultFocus):
Add FocusDirection argument in order to pass it from
HTMLInputElement::focus() to HTMLTextFormControlElement::focus().
(WebCore::HTMLInputElement::focus):
Pass the FocusDirection argument to InputType::focus. See above.
(WebCore::HTMLInputElement::handleFocusEvent):
Adjust FocusDirection argument.

  • html/HTMLInputElement.h:

(HTMLInputElement):

  • html/InputType.cpp:

(WebCore::InputType::focus): Add FocusDirection argument.

  • html/InputType.h:

(InputType): Ditto.

  • html/BaseMultipleFieldsDateAndTimeInputType.cpp:

(WebCore::BaseMultipleFieldsDateAndTimeInputType::focus):
Add FocusDirection argument to follow InputType.

  • html/BaseMultipleFieldsDateAndTimeInputType.h:

(BaseMultipleFieldsDateAndTimeInputType): Ditto.

Location:
trunk/Source/WebCore
Files:
24 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r141735 r141738  
     12013-02-03  Kent Tamura  <tkent@chromium.org>
     2
     3        Add FocusDirection argument to HTMLTextFormControlElement::handleFocusEvent
     4        https://bugs.webkit.org/show_bug.cgi?id=108775
     5
     6        Reviewed by Hajime Morita.
     7
     8        We'd like to add a FocusDirection argument to
     9        HTMLTextFormControlElement::handleFocusEvent in order to fix Bug
     10        108447. This is a preparation for it.
     11
     12        We need to add FocusDirection arguments to some focus-related functions
     13        to pass it correctly when TAB or Shift+TAB is pressed.
     14
     15        No new tests. This doesn't make any behavior changes.
     16
     17        * html/HTMLTextFormControlElement.cpp:
     18        (WebCore::HTMLTextFormControlElement::dispatchFocusEvent):
     19        To pass the FocusDirection argument to handleFocusEvent, we need to add
     20        it to dispatchFocusEvent too.
     21        * html/HTMLTextFormControlElement.h:
     22        (HTMLTextFormControlElement):
     23        Add FocusDirection arugment to dispatchFocusEvent.
     24        (WebCore::HTMLTextFormControlElement::handleFocusEvent):
     25        Add FocusDirection argument.
     26
     27        * dom/Node.cpp:
     28        (WebCore::Node::dispatchFocusEvent): Add FocusDirection argument.
     29        * dom/Node.h:
     30        (Node): Ditto.
     31
     32        * dom/Document.cpp:
     33        (WebCore::Document::setFocusedNode): Add FocusDirection argument in
     34        order to pass it to Node::dispatchFocusEvent.
     35        * dom/Document.h:
     36        (Document): Ditto.
     37
     38        * page/FocusController.cpp:
     39        (WebCore::dispatchEventsOnWindowAndFocusedNode):
     40        Adjust Node::dispatchFocusEvent argument.
     41        (WebCore::FocusController::advanceFocusInDocumentOrder):
     42        Pass FocusDirectio to Element::focus.
     43        (WebCore::FocusController::setFocusedNode):
     44        Add FocusDirection argument in order to pass it to Document::setFocusedNode.
     45        (WebCore::FocusController::advanceFocusDirectionallyInContainer):
     46        Pass FocusDirectio to Element::focus.
     47        * page/FocusController.h:
     48        (FocusController): Add FocusDirection argument to setFocusedNode.
     49
     50        * dom/Element.cpp:
     51        (WebCore::Element::focus):
     52        Add FocusDirection argument to pass it to FocusController::setFocusedNode.
     53        * dom/Element.h:
     54        (Element): Ditto.
     55
     56        * WebCore.exp.in:
     57        Update FocusController::setFocusedNode and Document::setFocusedNode.
     58
     59        * html/HTMLLabelElement.cpp:
     60        (WebCore::HTMLLabelElement::focus): Adjust FocusDirection argument.
     61        * html/HTMLLabelElement.h:
     62        (HTMLLabelElement): Ditto.
     63        * html/HTMLLegendElement.cpp:
     64        (WebCore::HTMLLegendElement::focus): Ditto.
     65        * html/HTMLLegendElement.h:
     66        (HTMLLegendElement): Ditto.
     67        * html/HTMLSelectElement.cpp:
     68        (WebCore::HTMLSelectElement::dispatchFocusEvent): Ditto.
     69        * html/HTMLSelectElement.h:
     70        (HTMLSelectElement): Ditto.
     71
     72        * html/HTMLInputElement.cpp:
     73        (WebCore::HTMLInputElement::defaultFocus):
     74        Add FocusDirection argument in order to pass it from
     75        HTMLInputElement::focus() to HTMLTextFormControlElement::focus().
     76        (WebCore::HTMLInputElement::focus):
     77        Pass the FocusDirection argument to InputType::focus. See above.
     78        (WebCore::HTMLInputElement::handleFocusEvent):
     79        Adjust FocusDirection argument.
     80        * html/HTMLInputElement.h:
     81        (HTMLInputElement):
     82        * html/InputType.cpp:
     83        (WebCore::InputType::focus): Add FocusDirection argument.
     84        * html/InputType.h:
     85        (InputType): Ditto.
     86
     87        * html/BaseMultipleFieldsDateAndTimeInputType.cpp:
     88        (WebCore::BaseMultipleFieldsDateAndTimeInputType::focus):
     89        Add FocusDirection argument to follow InputType.
     90        * html/BaseMultipleFieldsDateAndTimeInputType.h:
     91        (BaseMultipleFieldsDateAndTimeInputType): Ditto.
     92
    1932013-02-03  Kassy Coan  <kassycoan@chromium.org>
    294
  • trunk/Source/WebCore/WebCore.exp.in

    r141656 r141738  
    385385__ZN7WebCore15DatabaseManager9setClientEPNS_21DatabaseManagerClientE
    386386__ZN7WebCore15FocusController10setFocusedEb
    387 __ZN7WebCore15FocusController14setFocusedNodeEPNS_4NodeEN3WTF10PassRefPtrINS_5FrameEEE
     387__ZN7WebCore15FocusController14setFocusedNodeEPNS_4NodeEN3WTF10PassRefPtrINS_5FrameEEENS_14FocusDirectionE
    388388__ZN7WebCore15FocusController15setFocusedFrameEN3WTF10PassRefPtrINS_5FrameEEE
    389389__ZN7WebCore15FocusController15setInitialFocusENS_14FocusDirectionEPNS_13KeyboardEventE
     
    931931__ZN7WebCore8Document13createElementERKNS_13QualifiedNameEb
    932932__ZN7WebCore8Document14createTextNodeERKN3WTF6StringE
    933 __ZN7WebCore8Document14setFocusedNodeEN3WTF10PassRefPtrINS_4NodeEEE
     933__ZN7WebCore8Document14setFocusedNodeEN3WTF10PassRefPtrINS_4NodeEEENS_14FocusDirectionE
    934934__ZN7WebCore8Document16isPageBoxVisibleEi
    935935__ZN7WebCore8Document17getFocusableNodesERN3WTF6VectorINS1_6RefPtrINS_4NodeEEELm0EEE
  • trunk/Source/WebCore/dom/Document.cpp

    r141570 r141738  
    32873287#endif
    32883288
    3289 bool Document::setFocusedNode(PassRefPtr<Node> prpNewFocusedNode)
     3289bool Document::setFocusedNode(PassRefPtr<Node> prpNewFocusedNode, FocusDirection direction)
    32903290{
    32913291    RefPtr<Node> newFocusedNode = prpNewFocusedNode;
     
    33653365
    33663366        // Dispatch the focus event and let the node do any other focus related activities (important for text fields)
    3367         m_focusedNode->dispatchFocusEvent(oldFocusedNode);
     3367        m_focusedNode->dispatchFocusEvent(oldFocusedNode, direction);
    33683368
    33693369        if (m_focusedNode != newFocusedNode) {
  • trunk/Source/WebCore/dom/Document.h

    r141524 r141738  
    3535#include "DocumentEventQueue.h"
    3636#include "DocumentTiming.h"
     37#include "FocusDirection.h"
    3738#include "IconURL.h"
    3839#include "InspectorCounters.h"
     
    687688    void setSelectedStylesheetSet(const String&);
    688689
    689     bool setFocusedNode(PassRefPtr<Node>);
     690    bool setFocusedNode(PassRefPtr<Node>, FocusDirection = FocusDirectionNone);
    690691    Node* focusedNode() const { return m_focusedNode.get(); }
    691692    UserActionElementSet& userActionElements()  { return m_userActionElements; }
  • trunk/Source/WebCore/dom/Element.cpp

    r141570 r141738  
    18651865}
    18661866
    1867 void Element::focus(bool restorePreviousSelection)
     1867void Element::focus(bool restorePreviousSelection, FocusDirection direction)
    18681868{
    18691869    if (!inDocument())
     
    18921892        // does not make sense to continue and update appearence.
    18931893        protect = this;
    1894         if (!page->focusController()->setFocusedNode(this, doc->frame()))
     1894        if (!page->focusController()->setFocusedNode(this, doc->frame(), direction))
    18951895            return;
    18961896    }
  • trunk/Source/WebCore/dom/Element.h

    r141524 r141738  
    346346    virtual String target() const { return String(); }
    347347
    348     virtual void focus(bool restorePreviousSelection = true);
     348    virtual void focus(bool restorePreviousSelection = true, FocusDirection = FocusDirectionNone);
    349349    virtual void updateFocusAppearance(bool restorePreviousSelection);
    350350    virtual void blur();
  • trunk/Source/WebCore/dom/Node.cpp

    r141570 r141738  
    24132413}
    24142414
    2415 void Node::dispatchFocusEvent(PassRefPtr<Node> oldFocusedNode)
     2415void Node::dispatchFocusEvent(PassRefPtr<Node> oldFocusedNode, FocusDirection)
    24162416{
    24172417    if (document()->page())
  • trunk/Source/WebCore/dom/Node.h

    r141533 r141738  
    2828#include "EditingBoundary.h"
    2929#include "EventTarget.h"
     30#include "FocusDirection.h"
    3031#include "KURLHash.h"
    3132#include "LayoutRect.h"
     
    638639    bool dispatchBeforeLoadEvent(const String& sourceURL);
    639640
    640     virtual void dispatchFocusEvent(PassRefPtr<Node> oldFocusedNode);
     641    virtual void dispatchFocusEvent(PassRefPtr<Node> oldFocusedNode, FocusDirection);
    641642    virtual void dispatchBlurEvent(PassRefPtr<Node> newFocusedNode);
    642643    virtual void dispatchChangeEvent();
  • trunk/Source/WebCore/html/BaseMultipleFieldsDateAndTimeInputType.cpp

    r141395 r141738  
    241241}
    242242
    243 void BaseMultipleFieldsDateAndTimeInputType::focus(bool)
     243void BaseMultipleFieldsDateAndTimeInputType::focus(bool, FocusDirection)
    244244{
    245245    if (m_dateTimeEditElement)
  • trunk/Source/WebCore/html/BaseMultipleFieldsDateAndTimeInputType.h

    r141395 r141738  
    8282    virtual void destroyShadowSubtree() OVERRIDE FINAL;
    8383    virtual void disabledAttributeChanged() OVERRIDE FINAL;
    84     virtual void focus(bool restorePreviousSelection) OVERRIDE FINAL;
     84    virtual void focus(bool restorePreviousSelection, FocusDirection) OVERRIDE FINAL;
    8585    virtual void forwardEvent(Event*) OVERRIDE FINAL;
    8686    virtual void handleKeydownEvent(KeyboardEvent*) OVERRIDE FINAL;
  • trunk/Source/WebCore/html/HTMLInputElement.cpp

    r141570 r141738  
    371371}
    372372
    373 void HTMLInputElement::defaultFocus(bool restorePreviousSelection)
    374 {
    375     HTMLTextFormControlElement::focus(restorePreviousSelection);
    376 }
    377 
    378 void HTMLInputElement::focus(bool restorePreviousSelection)
    379 {
    380     m_inputType->focus(restorePreviousSelection);
     373void HTMLInputElement::defaultFocus(bool restorePreviousSelection, FocusDirection direction)
     374{
     375    HTMLTextFormControlElement::focus(restorePreviousSelection, direction);
     376}
     377
     378void HTMLInputElement::focus(bool restorePreviousSelection, FocusDirection direction)
     379{
     380    m_inputType->focus(restorePreviousSelection, direction);
    381381}
    382382
     
    438438}
    439439
    440 void HTMLInputElement::handleFocusEvent()
    441 {
     440void HTMLInputElement::handleFocusEvent(FocusDirection)
     441{
     442    // FIXME: Pass the FocusDirection argument to InputType:handleFocusEvent.
    442443    m_inputType->handleFocusEvent();
    443444}
  • trunk/Source/WebCore/html/HTMLInputElement.h

    r141395 r141738  
    281281    virtual void blur() OVERRIDE;
    282282    void defaultBlur();
    283     void defaultFocus(bool restorePreviousSelection);
    284     virtual void focus(bool restorePreviousSelection = true) OVERRIDE;
     283    void defaultFocus(bool restorePreviousSelection, FocusDirection);
     284    virtual void focus(bool restorePreviousSelection = true, FocusDirection = FocusDirectionNone) OVERRIDE;
    285285
    286286    virtual const AtomicString& name() const OVERRIDE;
     
    381381    virtual bool isEmptyValue() const OVERRIDE { return innerTextValue().isEmpty(); }
    382382    virtual bool isEmptySuggestedValue() const { return suggestedValue().isEmpty(); }
    383     virtual void handleFocusEvent();
     383    virtual void handleFocusEvent(FocusDirection);
    384384    virtual void handleBlurEvent();
    385385
  • trunk/Source/WebCore/html/HTMLLabelElement.cpp

    r141395 r141738  
    156156}
    157157
    158 void HTMLLabelElement::focus(bool)
     158void HTMLLabelElement::focus(bool, FocusDirection direction)
    159159{
    160160    // to match other browsers, always restore previous selection
    161161    if (HTMLElement* element = control())
    162         element->focus();
     162        element->focus(true, direction);
    163163}
    164164
  • trunk/Source/WebCore/html/HTMLLabelElement.h

    r124022 r141738  
    5353    virtual void defaultEventHandler(Event*);
    5454
    55     void focus(bool restorePreviousSelection = true);
     55    virtual void focus(bool restorePreviousSelection, FocusDirection) OVERRIDE;
    5656};
    5757
  • trunk/Source/WebCore/html/HTMLLegendElement.cpp

    r137406 r141738  
    6868}
    6969
    70 void HTMLLegendElement::focus(bool)
     70void HTMLLegendElement::focus(bool, FocusDirection direction)
    7171{
    7272    if (isFocusable())
    73         Element::focus();
     73        Element::focus(true, direction);
    7474       
    7575    // To match other browsers' behavior, never restore previous selection.
    7676    if (HTMLFormControlElement* control = associatedControl())
    77         control->focus(false);
     77        control->focus(false, direction);
    7878}
    7979
  • trunk/Source/WebCore/html/HTMLLegendElement.h

    r134510 r141738  
    4242
    4343    virtual void accessKeyAction(bool sendMouseEvents);
    44     virtual void focus(bool restorePreviousSelection = true);
     44    virtual void focus(bool restorePreviousSelection, FocusDirection) OVERRIDE;
    4545    virtual HTMLFormElement* virtualForm() const OVERRIDE;
    4646};
  • trunk/Source/WebCore/html/HTMLSelectElement.cpp

    r139045 r141738  
    901901}
    902902
    903 void HTMLSelectElement::dispatchFocusEvent(PassRefPtr<Node> oldFocusedNode)
     903void HTMLSelectElement::dispatchFocusEvent(PassRefPtr<Node> oldFocusedNode, FocusDirection direction)
    904904{
    905905    // Save the selection so it can be compared to the new selection when
     
    907907    if (usesMenuList())
    908908        saveLastSelection();
    909     HTMLFormControlElementWithState::dispatchFocusEvent(oldFocusedNode);
     909    HTMLFormControlElementWithState::dispatchFocusEvent(oldFocusedNode, direction);
    910910}
    911911
  • trunk/Source/WebCore/html/HTMLSelectElement.h

    r136205 r141738  
    115115    virtual bool isMouseFocusable() const;
    116116
    117     virtual void dispatchFocusEvent(PassRefPtr<Node> oldFocusedNode);
     117    virtual void dispatchFocusEvent(PassRefPtr<Node> oldFocusedNode, FocusDirection) OVERRIDE;
    118118    virtual void dispatchBlurEvent(PassRefPtr<Node> newFocusedNode);
    119119   
  • trunk/Source/WebCore/html/HTMLTextFormControlElement.cpp

    r141570 r141738  
    8585}
    8686
    87 void HTMLTextFormControlElement::dispatchFocusEvent(PassRefPtr<Node> oldFocusedNode)
     87void HTMLTextFormControlElement::dispatchFocusEvent(PassRefPtr<Node> oldFocusedNode, FocusDirection direction)
    8888{
    8989    if (supportsPlaceholder())
    9090        updatePlaceholderVisibility(false);
    91     handleFocusEvent();
    92     HTMLFormControlElementWithState::dispatchFocusEvent(oldFocusedNode);
     91    handleFocusEvent(direction);
     92    HTMLFormControlElementWithState::dispatchFocusEvent(oldFocusedNode, direction);
    9393}
    9494
  • trunk/Source/WebCore/html/HTMLTextFormControlElement.h

    r140215 r141738  
    119119    TextFieldSelectionDirection computeSelectionDirection() const;
    120120
    121     virtual void dispatchFocusEvent(PassRefPtr<Node> oldFocusedNode);
     121    virtual void dispatchFocusEvent(PassRefPtr<Node> oldFocusedNode, FocusDirection) OVERRIDE;
    122122    virtual void dispatchBlurEvent(PassRefPtr<Node> newFocusedNode);
    123123    virtual bool childShouldCreateRenderer(const NodeRenderingContext&) const OVERRIDE;
     
    128128    virtual bool isEmptySuggestedValue() const { return true; }
    129129    // Called in dispatchFocusEvent(), after placeholder process, before calling parent's dispatchFocusEvent().
    130     virtual void handleFocusEvent() { }
     130    virtual void handleFocusEvent(FocusDirection) { }
    131131    // Called in dispatchBlurEvent(), after placeholder process, before calling parent's dispatchBlurEvent().
    132132    virtual void handleBlurEvent() { }
  • trunk/Source/WebCore/html/InputType.cpp

    r141395 r141738  
    471471}
    472472
    473 void InputType::focus(bool restorePreviousSelection)
    474 {
    475     element()->defaultFocus(restorePreviousSelection);
     473void InputType::focus(bool restorePreviousSelection, FocusDirection direction)
     474{
     475    element()->defaultFocus(restorePreviousSelection, direction);
    476476}
    477477
  • trunk/Source/WebCore/html/InputType.h

    r141395 r141738  
    216216
    217217    virtual void blur();
    218     virtual void focus(bool restorePreviousSelection);
     218    virtual void focus(bool restorePreviousSelection, FocusDirection);
    219219
    220220    // Shadow tree handling
  • trunk/Source/WebCore/page/FocusController.cpp

    r140541 r141738  
    128128    document->dispatchWindowEvent(Event::create(focused ? eventNames().focusEvent : eventNames().blurEvent, false, false));
    129129    if (focused && document->focusedNode())
    130         document->focusedNode()->dispatchFocusEvent(0);
     130        document->focusedNode()->dispatchFocusEvent(0, FocusDirectionNone);
    131131}
    132132
     
    354354    }
    355355
    356     static_cast<Element*>(node.get())->focus(false);
     356    static_cast<Element*>(node.get())->focus(false, direction);
    357357    return true;
    358358}
     
    579579}
    580580
    581 bool FocusController::setFocusedNode(Node* node, PassRefPtr<Frame> newFocusedFrame)
     581bool FocusController::setFocusedNode(Node* node, PassRefPtr<Frame> newFocusedFrame, FocusDirection direction)
    582582{
    583583    RefPtr<Frame> oldFocusedFrame = focusedFrame();
     
    618618    RefPtr<Node> protect = node;
    619619    if (newDocument) {
    620         bool successfullyFocused = newDocument->setFocusedNode(node);
     620        bool successfullyFocused = newDocument->setFocusedNode(node, direction);
    621621        if (!successfullyFocused)
    622622            return false;
     
    832832    ASSERT(element);
    833833
    834     element->focus(false);
     834    element->focus(false, direction);
    835835    return true;
    836836}
  • trunk/Source/WebCore/page/FocusController.h

    r133779 r141738  
    7171    bool advanceFocus(FocusDirection, KeyboardEvent*, bool initialFocus = false);
    7272       
    73     bool setFocusedNode(Node*, PassRefPtr<Frame>);
     73    bool setFocusedNode(Node*, PassRefPtr<Frame>, FocusDirection = FocusDirectionNone);
    7474
    7575    void setActive(bool);
Note: See TracChangeset for help on using the changeset viewer.