[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    =?utf-8?q?=5Bkdelibs=5D_khtml=3A_Handle_tabIndex_every_where=2C_?=
From:       Maks Orlovich <maksim () kde ! org>
Date:       2011-05-17 12:46:31
Message-ID: 20110517124631.50000A60B9 () git ! kde ! org
[Download RAW message or body]

Git commit 8fdb65112cb87f07d25433bcfe5a6c9913984277 by Maks Orlovich.
Committed on 08/05/2011 at 22:12.
Pushed by orlovich into branch 'master'.

Handle tabIndex every where, as per ARIA

CCBUG: 121572
CCBUG: 158857

M  +6    -19   khtml/ecma/kjs_html.cpp     
M  +9    -10   khtml/ecma/kjs_html.h     
M  +4    -2    khtml/html/html_baseimpl.cpp     
M  +1    -1    khtml/html/html_baseimpl.h     
M  +4    -2    khtml/html/html_elementimpl.cpp     
M  +14   -1    khtml/html/html_formimpl.cpp     
M  +2    -4    khtml/html/html_formimpl.h     
M  +6    -0    khtml/html/html_inlineimpl.cpp     
M  +1    -1    khtml/html/html_inlineimpl.h     
M  +5    -25   khtml/svg/SVGAElement.cpp     
M  +1    -3    khtml/svg/SVGAElement.h     
M  +28   -3    khtml/xml/dom_elementimpl.cpp     
M  +4    -2    khtml/xml/dom_elementimpl.h     
M  +13   -3    khtml/xml/dom_nodeimpl.h     

http://commits.kde.org/kdelibs/8fdb65112cb87f07d25433bcfe5a6c9913984277

diff --git a/khtml/ecma/kjs_html.cpp b/khtml/ecma/kjs_html.cpp
index f73f051..826baa1 100644
--- a/khtml/ecma/kjs_html.cpp
+++ b/khtml/ecma/kjs_html.cpp
@@ -707,6 +707,7 @@ const ClassInfo* KJS::HTMLElement::classInfo() const
   innerHTML	KJS::HTMLElement::ElementInnerHTML DontDelete
   innerText	KJS::HTMLElement::ElementInnerText DontDelete
   document	KJS::HTMLElement::ElementDocument  DontDelete|ReadOnly
+  tabIndex      KJS::HTMLElement::ElementTabIndex  DontDelete
 # IE extension
   children	KJS::HTMLElement::ElementChildren  DontDelete|ReadOnly
   all           KJS::HTMLElement::ElementAll       DontDelete|ReadOnly
@@ -804,7 +805,6 @@ const ClassInfo* KJS::HTMLElement::classInfo() const
   multiple	KJS::HTMLElement::SelectMultiple	DontDelete
   name		KJS::HTMLElement::SelectName	DontDelete
   size		KJS::HTMLElement::SelectSize	DontDelete
-  tabIndex	KJS::HTMLElement::SelectTabIndex	DontDelete
 @end
 @begin HTMLSelectElementProtoTable 4
   add		KJS::HTMLElement::SelectAdd	DontDelete|Function 2
@@ -842,7 +842,6 @@ const ClassInfo* KJS::HTMLElement::classInfo() const
   readOnly	KJS::HTMLElement::InputReadOnly		DontDelete
   size		KJS::HTMLElement::InputSize		DontDelete
   src		KJS::HTMLElement::InputSrc		DontDelete
-  tabIndex	KJS::HTMLElement::InputTabIndex		DontDelete
   type		KJS::HTMLElement::InputType		DontDelete
   useMap	KJS::HTMLElement::InputUseMap		DontDelete
   value		KJS::HTMLElement::InputValue		DontDelete
@@ -864,7 +863,6 @@ const ClassInfo* KJS::HTMLElement::classInfo() const
   name		KJS::HTMLElement::TextAreaName		DontDelete
   readOnly	KJS::HTMLElement::TextAreaReadOnly	DontDelete
   rows		KJS::HTMLElement::TextAreaRows		DontDelete
-  tabIndex	KJS::HTMLElement::TextAreaTabIndex	DontDelete
   type		KJS::HTMLElement::TextAreaType		DontDelete|ReadOnly
   value		KJS::HTMLElement::TextAreaValue		DontDelete
   selectionStart KJS::HTMLElement::TextAreaSelectionStart DontDelete
@@ -881,7 +879,6 @@ const ClassInfo* KJS::HTMLElement::classInfo() const
   accessKey	KJS::HTMLElement::ButtonAccessKey	DontDelete
   disabled	KJS::HTMLElement::ButtonDisabled	DontDelete
   name		KJS::HTMLElement::ButtonName		DontDelete
-  tabIndex	KJS::HTMLElement::ButtonTabIndex	DontDelete
   type		KJS::HTMLElement::ButtonType		DontDelete|ReadOnly
   value		KJS::HTMLElement::ButtonValue		DontDelete
 @end
@@ -981,7 +978,6 @@ const ClassInfo* KJS::HTMLElement::classInfo() const
   rev		KJS::HTMLElement::AnchorRev		DontDelete
   search	KJS::HTMLElement::AnchorSearch		DontDelete
   shape		KJS::HTMLElement::AnchorShape		DontDelete
-  tabIndex	KJS::HTMLElement::AnchorTabIndex	DontDelete
   target	KJS::HTMLElement::AnchorTarget		DontDelete
   text		KJS::HTMLElement::AnchorText		DontDelete|ReadOnly
   type		KJS::HTMLElement::AnchorType		DontDelete
@@ -1021,7 +1017,6 @@ const ClassInfo* KJS::HTMLElement::classInfo() const
   hspace	  KJS::HTMLElement::ObjectHspace	  DontDelete
   name		  KJS::HTMLElement::ObjectName		  DontDelete
   standby	  KJS::HTMLElement::ObjectStandby	  DontDelete
-  tabIndex	  KJS::HTMLElement::ObjectTabIndex	  DontDelete
   type		  KJS::HTMLElement::ObjectType		  DontDelete
   useMap	  KJS::HTMLElement::ObjectUseMap	  DontDelete
   vspace	  KJS::HTMLElement::ObjectVspace	  DontDelete
@@ -1069,7 +1064,6 @@ const ClassInfo* KJS::HTMLElement::classInfo() const
   search	KJS::HTMLElement::AreaSearch		DontDelete|ReadOnly
   noHref	KJS::HTMLElement::AreaNoHref		DontDelete
   shape		KJS::HTMLElement::AreaShape		DontDelete
-  tabIndex	KJS::HTMLElement::AreaTabIndex		DontDelete
   target	KJS::HTMLElement::AreaTarget		DontDelete
 @end
 @begin HTMLScriptElementTable 7
@@ -1378,7 +1372,6 @@ const KJS::HTMLElement::BoundPropInfo \
KJS::HTMLElement::bpTable[] = {  {ID_SELECT, SelectDisabled, T_Bool,  ATTR_DISABLED},
   {ID_SELECT, SelectMultiple, T_Bool,  ATTR_MULTIPLE},
   {ID_SELECT, SelectSize,     T_Int,   ATTR_SIZE}, //toInt on attr, then number
-  {ID_SELECT, SelectTabIndex, T_TabIdx, NotApplicable},
   {ID_OPTGROUP, OptGroupDisabled, T_Bool, ATTR_DISABLED},
   {ID_OPTGROUP, OptGroupLabel,    T_String, ATTR_LABEL},
   {ID_OPTION, OptionDefaultSelected, T_Bool, ATTR_SELECTED},
@@ -1395,18 +1388,15 @@ const KJS::HTMLElement::BoundPropInfo \
KJS::HTMLElement::bpTable[] = {  {ID_INPUT,  InputReadOnly,  T_Bool,   \
ATTR_READONLY},  {ID_INPUT,  InputSize,      T_Int,    ATTR_SIZE},
   {ID_INPUT,  InputSrc,       T_URL,    ATTR_SRC},
-  {ID_INPUT,  InputTabIndex,  T_TabIdx, NotApplicable},
   {ID_INPUT,  InputUseMap,    T_String, ATTR_USEMAP},
   {ID_TEXTAREA, TextAreaAccessKey, T_String, ATTR_ACCESSKEY},
   {ID_TEXTAREA, TextAreaCols, T_Int, ATTR_COLS},
   {ID_TEXTAREA, TextAreaDisabled, T_Bool, ATTR_DISABLED},
   {ID_TEXTAREA, TextAreaReadOnly, T_Bool, ATTR_READONLY},
   {ID_TEXTAREA, TextAreaRows, T_Int,  ATTR_ROWS},
-  {ID_TEXTAREA, TextAreaTabIndex, T_TabIdx, NotApplicable},
   {ID_BUTTON,   ButtonAccessKey, T_String, ATTR_ACCESSKEY},
   {ID_BUTTON,   ButtonDisabled, T_Bool  , ATTR_DISABLED},
   {ID_BUTTON,   ButtonName,     T_String, ATTR_NAME},
-  {ID_BUTTON,   ButtonTabIndex, T_TabIdx, NotApplicable},
   {ID_BUTTON,   ButtonValue,    T_String, ATTR_VALUE},
   {ID_LABEL,    LabelAccessKey, T_String, ATTR_ACCESSKEY},
   {ID_LABEL,    LabelHtmlFor,   T_String, ATTR_FOR},
@@ -1450,7 +1440,6 @@ const KJS::HTMLElement::BoundPropInfo \
KJS::HTMLElement::bpTable[] = {  {ID_A,        AnchorRel,        T_String, ATTR_REL},
   {ID_A,        AnchorRev,        T_String, ATTR_REV},
   {ID_A,        AnchorShape,      T_String, ATTR_SHAPE},
-  {ID_A,        AnchorTabIndex,   T_Int,    ATTR_TABINDEX}, //### not ->tabIndex??
   {ID_A,        AnchorTarget,     T_String, ATTR_TARGET},
   {ID_A,        AnchorType,       T_String, ATTR_TYPE},
   {ID_IMG,      ImageName,        T_String, ATTR_NAME},
@@ -1475,7 +1464,6 @@ const KJS::HTMLElement::BoundPropInfo \
KJS::HTMLElement::bpTable[] = {  {ID_OBJECT,   ObjectHspace,     T_Int,    \
ATTR_HSPACE},  {ID_OBJECT,   ObjectName,       T_String, ATTR_NAME},
   {ID_OBJECT,   ObjectStandby,    T_String, ATTR_STANDBY},
-  {ID_OBJECT,   ObjectTabIndex,   T_Int,    ATTR_TABINDEX}, //### not element's \
tabindex?  {ID_OBJECT,   ObjectType,       T_String, ATTR_TYPE},
   {ID_OBJECT,   ObjectUseMap,     T_String, ATTR_USEMAP},
   {ID_OBJECT,   ObjectVspace,     T_Int,    ATTR_VSPACE},
@@ -1503,7 +1491,6 @@ const KJS::HTMLElement::BoundPropInfo \
KJS::HTMLElement::bpTable[] = {  {ID_AREA,     AreaHref,         T_URL,    \
ATTR_HREF},  {ID_AREA,     AreaNoHref,       T_Bool,   ATTR_NOHREF},
   {ID_AREA,     AreaShape,        T_String, ATTR_SHAPE},
-  {ID_AREA,     AreaTabIndex,     T_Int,    ATTR_TABINDEX},
   {ID_AREA,     AreaTarget,       T_String, ATTR_TARGET},
   {ID_SCRIPT,   ScriptHtmlFor,    T_Res,    NotApplicable},
   {ID_SCRIPT,   ScriptEvent,      T_Res,    NotApplicable},
@@ -1649,8 +1636,6 @@ JSValue* KJS::HTMLElement::handleBoundRead(ExecState* exec, int \
token) const  return jsNumber(impl()->getAttribute(prop->attrId).toInt());
     case T_URL:
       return jsString(getURLArg(prop->attrId));
-    case T_TabIdx:
-      return jsNumber(impl()->tabIndex());
     case T_Res:
       return jsString("");
     case T_Coll:
@@ -2042,6 +2027,8 @@ JSValue* KJS::HTMLElement::getValueProperty(ExecState *exec, \
                int token) const
       return getHTMLCollection(exec,new HTMLCollectionImpl(&element, \
HTMLCollectionImpl::DOC_ALL));  else // Enabled but hidden by default
       return getHTMLCollection(exec,new HTMLCollectionImpl(&element, \
HTMLCollectionImpl::DOC_ALL), true); +  case ElementTabIndex:
+      return jsNumber(element.tabIndex());
   // ### what about style? or is this used instead for DOM2 stylesheets?
   case ElementContentEditable:
       return jsString(element.contentEditable());
@@ -2458,9 +2445,6 @@ bool KJS::HTMLElement::handleBoundWrite(ExecState* exec, int \
token, JSValue* val  case T_Bool:
       impl()->setAttribute(prop->attrId, value->toBoolean(exec) ? "" : 0);
       return true;
-    case T_TabIdx:
-      impl()->setTabIndex(value->toInteger(exec));
-      return true;
     case T_Res: //ignored
       return true;
   }
@@ -2678,6 +2662,9 @@ void KJS::HTMLElement::putValueProperty(ExecState *exec, int \
token, JSValue *val  case ElementContentEditable:
     element.setContentEditable(str);
     return;
+  case ElementTabIndex:
+    element.setTabIndex(value->toInteger(exec));
+    return;
   default:
     kDebug(6070) << "WARNING: KJS::HTMLElement::putValueProperty unhandled token " \
<< token << " thisTag=" << element.tagName().string() << " str=" << str.string();  }
diff --git a/khtml/ecma/kjs_html.h b/khtml/ecma/kjs_html.h
index c7aace7..6cfcca8 100644
--- a/khtml/ecma/kjs_html.h
+++ b/khtml/ecma/kjs_html.h
@@ -98,23 +98,23 @@ namespace KJS {
            BodyOnError, BodyOnMessage, BodyFocus,
            FormAction, FormEncType, FormElements, FormLength, FormAcceptCharset,
            FormReset, FormTarget, FormName, FormMethod, FormSubmit, SelectAdd,
-           SelectTabIndex, SelectValue, SelectSelectedIndex, SelectLength,
+           SelectValue, SelectSelectedIndex, SelectLength,
            SelectRemove, SelectForm, SelectType, SelectOptions,
            SelectDisabled, SelectMultiple, SelectName, SelectSize, SelectItem,  
            OptGroupDisabled, OptGroupLabel, OptionIndex, OptionSelected,
            OptionForm, OptionText, OptionDefaultSelected, OptionDisabled,
            OptionLabel, OptionValue, InputReadOnly, InputAccept,
-           InputSize, InputDefaultValue, InputTabIndex, InputValue, InputType,
+           InputSize, InputDefaultValue, InputValue, InputType,
            InputMaxLength, InputDefaultChecked, InputDisabled,
            InputChecked, InputIndeterminate, InputForm, InputAccessKey, InputAlign, \
InputAlt,  InputName, InputSrc, InputUseMap, InputSelect, InputClick,
            InputSelectionStart, InputSelectionEnd, InputSetSelectionRange, \
                InputPlaceholder,
            TextAreaAccessKey, TextAreaName, TextAreaDefaultValue, TextAreaSelect,
            TextAreaCols, TextAreaDisabled, TextAreaForm, TextAreaType,
-           TextAreaTabIndex, TextAreaReadOnly, TextAreaRows, TextAreaValue,
+           TextAreaReadOnly, TextAreaRows, TextAreaValue,
            TextAreaSelectionStart, TextAreaSelectionEnd, TextAreaSetSelectionRange,
            TextAreaTextLength,  TextAreaPlaceholder,
-           ButtonClick, ButtonForm, ButtonTabIndex, ButtonName,
+           ButtonClick, ButtonForm, ButtonName,
            ButtonDisabled, ButtonAccessKey, ButtonType, ButtonValue, LabelHtmlFor,
            LabelForm, LabelAccessKey, FieldSetForm, LegendForm, LegendAccessKey,
            LegendAlign, UListType, UListCompact, OListStart, OListCompact,
@@ -126,19 +126,19 @@ namespace KJS {
            AnchorAccessKey, AnchorCoords, AnchorHref, AnchorProtocol, AnchorHost,
            AnchorCharset, AnchorHrefLang, AnchorHostname, AnchorType,
            AnchorPort, AnchorPathName, AnchorHash, AnchorSearch, AnchorName,
-           AnchorRev, AnchorTabIndex, AnchorTarget, AnchorText, AnchorClick,
+           AnchorRev, AnchorTarget, AnchorText, AnchorClick,
            ImageName, ImageAlign, ImageHspace, ImageVspace, ImageUseMap, ImageAlt,
            ImageLowSrc, ImageWidth, ImageIsMap, ImageBorder, ImageHeight,
            ImageLongDesc, ImageSrc, ImageX, ImageY, ImageComplete, ObjectHspace, \
                ObjectHeight, ObjectAlign,
            ObjectBorder, ObjectCode, ObjectType, ObjectVspace, ObjectArchive,
            ObjectDeclare, ObjectForm, ObjectCodeBase, ObjectCodeType, ObjectData, \
                ObjectGetSVGDocument,
-           ObjectName, ObjectStandby, ObjectTabIndex, ObjectUseMap, ObjectWidth, \
ObjectContentDocument, +           ObjectName, ObjectStandby, ObjectUseMap, \
                ObjectWidth, ObjectContentDocument,
            ParamName, ParamType, ParamValueType, ParamValue, AppletArchive,
            AppletAlt, AppletCode, AppletWidth, AppletAlign, AppletCodeBase,
            AppletName, AppletHeight, AppletHspace, AppletObject, AppletVspace,
            MapAreas, MapName, AreaHash, AreaHref, AreaTarget, AreaPort, AreaShape,
            AreaCoords, AreaAlt, AreaAccessKey, AreaNoHref, AreaHost, AreaProtocol,
-           AreaHostName, AreaPathName, AreaSearch, AreaTabIndex, ScriptEvent,
+           AreaHostName, AreaPathName, AreaSearch, ScriptEvent,
            ScriptType, ScriptHtmlFor, ScriptText, ScriptSrc, ScriptCharset,
            ScriptDefer, TableSummary, TableTBodies, TableTHead, TableCellPadding,
            TableDeleteCaption, TableCreateCaption, TableCaption, TableWidth,
@@ -168,8 +168,8 @@ namespace KJS {
            LayerTop, LayerLeft, LayerVisibility, LayerBgColor, LayerClip, \
                LayerDocument, LayerLayers,
            ElementInnerHTML, ElementTitle, ElementId, ElementDir, ElementLang,
            ElementClassName, ElementInnerText, ElementDocument,
-	   ElementChildren, ElementContentEditable, ElementIsContentEditable,
-	   ElementAll, ElementScrollIntoView };
+           ElementChildren, ElementContentEditable, ElementIsContentEditable,
+           ElementAll, ElementScrollIntoView, ElementTabIndex };
 
     DOM::HTMLElementImpl* impl() const { return \
static_cast<DOM::HTMLElementImpl*>(m_impl.get()); }  JSValue* indexGetter(ExecState \
*exec, unsigned index); @@ -189,7 +189,6 @@ namespace KJS {
       T_Bool,   //Boolean, return true if property is not null
       T_Int,
       T_URL,
-      T_TabIdx,   //Magic tab-index handling
       T_Res,      //Reserved, ignore sets, return empty string
       T_Coll,     //Collection, type is in attrID
       T_ReadOnly = 0x80 //Property should be handled only on read.
diff --git a/khtml/html/html_baseimpl.cpp b/khtml/html/html_baseimpl.cpp
index e90b92d..6a65e89 100644
--- a/khtml/html/html_baseimpl.cpp
+++ b/khtml/html/html_baseimpl.cpp
@@ -453,9 +453,11 @@ void HTMLFrameElementImpl::setLocation( const DOMString& str )
         setNeedComputeContent(); // otherwise, request it.. 
 }
 
-bool HTMLFrameElementImpl::isFocusable() const
+bool HTMLFrameElementImpl::isFocusableImpl(FocusType ft) const
 {
-    return m_render!=0;
+    if (m_render!=0)
+        return true;
+    return HTMLPartContainerElementImpl::isFocusableImpl(ft);
 }
 
 void HTMLFrameElementImpl::setFocus(bool received)
diff --git a/khtml/html/html_baseimpl.h b/khtml/html/html_baseimpl.h
index 61a27d9..b32034b 100644
--- a/khtml/html/html_baseimpl.h
+++ b/khtml/html/html_baseimpl.h
@@ -102,7 +102,7 @@ public:
     bool noResize() { return noresize; }
     void setLocation( const DOMString& str );
 
-    virtual bool isFocusable() const;
+    virtual bool isFocusableImpl(FocusType ft) const;
     virtual void setFocus(bool);
 
     DocumentImpl* contentDocument() const;
diff --git a/khtml/html/html_elementimpl.cpp b/khtml/html/html_elementimpl.cpp
index ba79de3..de0ca30 100644
--- a/khtml/html/html_elementimpl.cpp
+++ b/khtml/html/html_elementimpl.cpp
@@ -158,8 +158,10 @@ void HTMLElementImpl::parseAttribute(AttributeImpl *attr)
         break;
     case ATTR_TABINDEX:
         indexstring=getAttribute(ATTR_TABINDEX);
-        if (indexstring.length())
-            setTabIndex(indexstring.toInt());
+        if (attr->val())
+            setTabIndex(attr->value().toInt());
+        else
+            setNoTabIndex();
         break;
 // i18n attributes
     case ATTR_LANG:
diff --git a/khtml/html/html_formimpl.cpp b/khtml/html/html_formimpl.cpp
index 07cd035..986f301 100644
--- a/khtml/html/html_formimpl.cpp
+++ b/khtml/html/html_formimpl.cpp
@@ -1029,8 +1029,11 @@ void HTMLGenericFormElementImpl::setDisabled( bool _disabled )
     }
 }
 
-bool HTMLGenericFormElementImpl::isFocusable() const
+bool HTMLGenericFormElementImpl::isFocusableImpl(FocusType ft) const
 {
+    if (hasTabIndex())
+        return HTMLElementImpl::isFocusableImpl(ft);
+
     if (disabled())
 	return false;
 
@@ -2073,6 +2076,16 @@ void HTMLLabelElementImpl::attach()
     HTMLElementImpl::attach();
 }
 
+
+bool HTMLLabelElementImpl::isFocusableImpl(FocusType ft) const
+{
+    if (hasTabIndex())
+        return HTMLGenericFormElementImpl::isFocusableImpl(ft);
+
+    // We want labels to accept focus on click, but not on tabbing.
+    return (ft != FT_Tab);
+}
+
 NodeImpl* HTMLLabelElementImpl::getFormElement()
 {
 	    const DOMString formElementId = getAttribute(ATTR_FOR);
diff --git a/khtml/html/html_formimpl.h b/khtml/html/html_formimpl.h
index 9cf9dc1..997d3ec 100644
--- a/khtml/html/html_formimpl.h
+++ b/khtml/html/html_formimpl.h
@@ -165,9 +165,8 @@ public:
     bool disabled() const { return m_disabled; }
     void setDisabled(bool _disabled);
 
-    virtual bool isFocusable() const;
+    virtual bool isFocusableImpl(FocusType ft) const;
     virtual bool isEnumerable() const { return false; }
-    
     virtual bool isDefault() const { return false; }
 
     bool readOnly() const { return m_readOnly; }
@@ -377,8 +376,7 @@ public:
     virtual Id id() const;
     virtual void attach();
     virtual void defaultEventHandler(EventImpl *evt);
-    virtual bool isFocusable() const { return true; }
-    virtual bool isTabFocusable() const { return false; }
+    virtual bool isFocusableImpl(FocusType ft) const;
     NodeImpl* getFormElement();
 
  private:
diff --git a/khtml/html/html_inlineimpl.cpp b/khtml/html/html_inlineimpl.cpp
index eb7bbc2..172297e 100644
--- a/khtml/html/html_inlineimpl.cpp
+++ b/khtml/html/html_inlineimpl.cpp
@@ -200,6 +200,12 @@ void HTMLAnchorElementImpl::parseAttribute(AttributeImpl *attr)
     }
 }
 
+bool HTMLAnchorElementImpl::isFocusableImpl(FocusType ft) const {
+    if (m_hasAnchor)
+        return true;
+    return HTMLElementImpl::isFocusableImpl(ft);
+}
+
 // -------------------------------------------------------------------------
 
 NodeImpl::Id HTMLBRElementImpl::id() const
diff --git a/khtml/html/html_inlineimpl.h b/khtml/html/html_inlineimpl.h
index 139c762..79a2293 100644
--- a/khtml/html/html_inlineimpl.h
+++ b/khtml/html/html_inlineimpl.h
@@ -35,7 +35,7 @@ public:
     HTMLAnchorElementImpl(DocumentImpl *doc)
         : HTMLElementImpl(doc), m_hasTarget(false) {}
 
-    virtual bool isFocusable() const { return m_hasAnchor; }
+    virtual bool isFocusableImpl(FocusType ft) const;
     virtual Id id() const;
     virtual void parseAttribute(AttributeImpl *attr);
     virtual void defaultEventHandler(EventImpl *evt);
diff --git a/khtml/svg/SVGAElement.cpp b/khtml/svg/SVGAElement.cpp
index 7f3e8da..5157ae1 100644
--- a/khtml/svg/SVGAElement.cpp
+++ b/khtml/svg/SVGAElement.cpp
@@ -172,35 +172,15 @@ bool SVGAElement::supportsFocus() const
     return isFocusable() || (document() && !document()->haveStylesheetsLoaded());
 }
 
-bool SVGAElement::isFocusable() const
+bool SVGAElement::isFocusableImpl(FocusType ft) const
 {
-    if (isContentEditable())
-        return SVGStyledTransformableElement::isFocusable();
-    
-    // FIXME: Even if we are not visible, we might have a child that is visible.
-    // Dave wants to fix that some day with a "has visible content" flag or the \
                like.
-    if (!renderer() || !(renderer()->style()->visibility() == VISIBLE))
+    if (ft == FT_Mouse)
         return false;
-    
-    //khtml FIXME return !renderer()->absoluteClippedOverflowRect().isEmpty();
-    return false;
-}
 
-bool SVGAElement::isMouseFocusable() const
-{
-    return false;
-}
+    if (isContentEditable())
+        return SVGStyledTransformableElement::isFocusableImpl(ft);
 
-bool SVGAElement::isKeyboardFocusable(DOM::KeyboardEventImpl* event) const
-{
-    Q_UNUSED(event);
-    if (!isFocusable())
-        return false;
-    
-    if (!document()->view())
-        return false;
-    
-    //khtml FIXME return document()->view()->eventHandler()->tabsToLinks(event);
+    // TODO: implement focus rules for SVG
     return false;
 }
 
diff --git a/khtml/svg/SVGAElement.h b/khtml/svg/SVGAElement.h
index 4f745fd..b8d1a25 100644
--- a/khtml/svg/SVGAElement.h
+++ b/khtml/svg/SVGAElement.h
@@ -54,9 +54,7 @@ namespace WebCore {
         virtual void defaultEventHandler(Event*);
         
         virtual bool supportsFocus() const;
-        virtual bool isMouseFocusable() const;
-        virtual bool isKeyboardFocusable(DOM::KeyboardEventImpl*) const;
-        virtual bool isFocusable() const;
+        virtual bool isFocusableImpl(FocusType ft) const;
 
         virtual bool childShouldCreateRenderer(Node*) const;
 
diff --git a/khtml/xml/dom_elementimpl.cpp b/khtml/xml/dom_elementimpl.cpp
index 2a90072..baf0dc9 100644
--- a/khtml/xml/dom_elementimpl.cpp
+++ b/khtml/xml/dom_elementimpl.cpp
@@ -366,10 +366,11 @@ public:
     ElementRareDataImpl();
     void resetComputedStyle();
     short tabIndex() const { return m_tabIndex; }
-    void setTabIndex(short _tabIndex) { m_tabIndex = _tabIndex; }
+    void setTabIndex(short _tabIndex) { m_tabIndex = _tabIndex; m_hasTabIndex = \
true; }  
     RenderStyle* m_computedStyle;
     signed short m_tabIndex;
+    bool m_hasTabIndex;
 };
 
 typedef WTF::HashMap<const ElementImpl*, ElementRareDataImpl*> ElementRareDataMap;
@@ -386,7 +387,7 @@ static ElementRareDataImpl* rareDataFromMap(const ElementImpl* \
element)  }
 
 inline ElementRareDataImpl::ElementRareDataImpl()
-    : m_computedStyle(0), m_tabIndex(0)
+    : m_computedStyle(0), m_tabIndex(0), m_hasTabIndex(false)
 {}
 
 void ElementRareDataImpl::resetComputedStyle()
@@ -825,6 +826,18 @@ void ElementImpl::setTabIndex(short _tabIndex)
     createRareData()->setTabIndex(_tabIndex);
 }
 
+void ElementImpl::setNoTabIndex()
+{
+    if (!m_elementHasRareData)
+        return;
+    rareData()->m_hasTabIndex = false;
+}
+
+bool ElementImpl::hasTabIndex() const
+{
+    return m_elementHasRareData ? rareData()->m_hasTabIndex : false;
+}
+
 void ElementImpl::defaultEventHandler(EventImpl *e)
 {
     if (!e->defaultHandled() && document()->part() && e->id() == \
EventImpl::KEYPRESS_EVENT && e->isKeyRelatedEvent()) { @@ -1023,11 +1036,23 @@ void \
ElementImpl::recalcStyle( StyleChange change )  setHasChangedChild( false );
 }
 
-bool ElementImpl::isFocusable() const
+bool ElementImpl::isFocusableImpl(FocusType ft) const
 {
     if (m_render && m_render->scrollsOverflow())
         return true;
 
+    // See WAI-ARIA 1.0, UA implementor's guide, 3.1 for the rules this
+    // implements.
+    if (hasTabIndex()) {
+        int ti = tabIndex();
+
+        // Negative things are focusable, but not in taborder
+        if (ti < 0)
+            return (ft != FT_Tab);
+        else // ... while everything else is completely focusable
+            return true;
+    }
+
     // Only make editable elements selectable if its parent element
     // is not editable. FIXME: this is not 100% right as non-editable elements
     // within editable elements are focusable too.
diff --git a/khtml/xml/dom_elementimpl.h b/khtml/xml/dom_elementimpl.h
index bc611fa..5f33d49 100644
--- a/khtml/xml/dom_elementimpl.h
+++ b/khtml/xml/dom_elementimpl.h
@@ -209,7 +209,7 @@ public:
     AttrImpl* getAttributeNodeNS( const DOMString &namespaceURI, const DOMString \
&localName, int& exceptioncode );  Attr setAttributeNodeNS( AttrImpl* newAttr, int& \
exceptioncode );  
-    //Commonly supported extensions
+    // At this level per WAI-ARIA
     void blur();
     void focus();
 
@@ -237,6 +237,8 @@ public:
 
     virtual short tabIndex() const;
     void setTabIndex(short _tabIndex);
+    void setNoTabIndex();
+    bool hasTabIndex() const;
 
     // DOM methods overridden from  parent classes
     virtual DOMString tagName() const;
@@ -330,7 +332,7 @@ public:
     virtual DOMString toString() const;
     virtual DOMString selectionToString(NodeImpl *selectionStart, NodeImpl \
*selectionEnd, int startOffset, int endOffset, bool &found) const;  
-    virtual bool isFocusable() const;
+    virtual bool isFocusableImpl(FocusType ft) const;
     virtual bool isContentEditable() const;
     void setContentEditable(bool enabled);
 
diff --git a/khtml/xml/dom_nodeimpl.h b/khtml/xml/dom_nodeimpl.h
index 25a3e04..742d5b3 100644
--- a/khtml/xml/dom_nodeimpl.h
+++ b/khtml/xml/dom_nodeimpl.h
@@ -265,9 +265,19 @@ public:
  
     virtual short tabIndex() const { return 0; }
 
-    virtual bool isFocusable() const { return false; }
-    virtual bool isMouseFocusable() const { return isFocusable(); }
-    virtual bool isTabFocusable() const { return isFocusable(); }
+    enum FocusType {
+        FT_Any,
+        FT_Mouse,
+        FT_Tab
+    };
+
+    // Elements that are focusable by default should override this.
+    // Warning: if they're in a language that supports tabIndex (e.g. HTML),
+    // they must call back to the base class whenever hasTabIndex() is set.
+    virtual bool isFocusableImpl(FocusType) const { return false; }
+    bool isFocusable() const { return isFocusableImpl(FT_Any); }
+    bool isMouseFocusable() const { return isFocusableImpl(FT_Mouse); }
+    bool isTabFocusable() const { return isFocusableImpl(FT_Tab); }
 
     virtual bool isInline() const;
 


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic