2010-11-23 Chris Guillory <chris.guillory@google.com>
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 23 Nov 2010 22:33:49 +0000 (22:33 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 23 Nov 2010 22:33:49 +0000 (22:33 +0000)
        Reviewed by Dimitri Glazkov.

        Include the FrameView widget of a RenderWidget in the accessibility tree.
        https://bugs.webkit.org/show_bug.cgi?id=49106

        * accessibility/iframe-has-document-expected.txt: Added.
        * accessibility/iframe-has-document.html: Added.
        * platform/win/Skipped:
2010-11-23  Chris Guillory  <chris.guillory@google.com>

        Reviewed by Dimitri Glazkov.

        Include the FrameView widget of a RenderWidget in the accessibility tree.
        https://bugs.webkit.org/show_bug.cgi?id=49106

        Include render widget children in the accessibility tree for not mac webkit ports.

        Test: accessibility/iframe-has-document.html

        * accessibility/AccessibilityRenderObject.cpp:
        (WebCore::AccessibilityRenderObject::renderParentObject):
        (WebCore::AccessibilityRenderObject::addChildren):
        (WebCore::AccessibilityRenderObject::addRenderWidgetChildren):
        * accessibility/AccessibilityRenderObject.h:
        * accessibility/chromium/AccessibilityObjectChromium.cpp:
        (WebCore::AccessibilityObject::accessibilityIgnoreAttachment):
2010-11-23  Chris Guillory  <chris.guillory@google.com>

        Reviewed by Dimitri Glazkov.

        Include the FrameView widget of a RenderWidget in the accessibility tree.
        https://bugs.webkit.org/show_bug.cgi?id=49106

        * public/WebAccessibilityObject.h:
        * src/WebAccessibilityObject.cpp:
        (WebKit::WebAccessibilityObject::equals):
        (WebKit::WebAccessibilityObject::parentObject):
2010-11-23  Chris Guillory  <chris.guillory@google.com>

        Reviewed by Dimitri Glazkov.

        Include the FrameView widget of a RenderWidget in the accessibility tree.
        https://bugs.webkit.org/show_bug.cgi?id=49106

        * DumpRenderTree/chromium/AccessibilityUIElement.cpp:
        (AccessibilityUIElement::AccessibilityUIElement):
        (AccessibilityUIElement::parentElementCallback):
        (AccessibilityUIElement::isEqualCallback):
        * DumpRenderTree/chromium/AccessibilityUIElement.h:
        * DumpRenderTree/chromium/CppBoundClass.cpp:
        (CppBoundClass::getFromCppVariant):
        * DumpRenderTree/chromium/CppBoundClass.h:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@72628 268f45cc-cd09-0410-ab3c-d52691b4dbfc

16 files changed:
LayoutTests/ChangeLog
LayoutTests/accessibility/iframe-has-document-expected.txt [new file with mode: 0644]
LayoutTests/accessibility/iframe-has-document.html [new file with mode: 0644]
LayoutTests/platform/win/Skipped
WebCore/ChangeLog
WebCore/accessibility/AccessibilityRenderObject.cpp
WebCore/accessibility/AccessibilityRenderObject.h
WebCore/accessibility/chromium/AccessibilityObjectChromium.cpp
WebKit/chromium/ChangeLog
WebKit/chromium/public/WebAccessibilityObject.h
WebKit/chromium/src/WebAccessibilityObject.cpp
WebKitTools/ChangeLog
WebKitTools/DumpRenderTree/chromium/AccessibilityUIElement.cpp
WebKitTools/DumpRenderTree/chromium/AccessibilityUIElement.h
WebKitTools/DumpRenderTree/chromium/CppBoundClass.cpp
WebKitTools/DumpRenderTree/chromium/CppBoundClass.h

index c66380c..460802e 100644 (file)
@@ -1,3 +1,14 @@
+2010-11-23  Chris Guillory  <chris.guillory@google.com>
+
+        Reviewed by Dimitri Glazkov.
+
+        Include the FrameView widget of a RenderWidget in the accessibility tree.
+        https://bugs.webkit.org/show_bug.cgi?id=49106
+
+        * accessibility/iframe-has-document-expected.txt: Added.
+        * accessibility/iframe-has-document.html: Added.
+        * platform/win/Skipped:
+
 2010-11-23  Tony Chang  <tony@chromium.org>
 
         Reviewed by Ojan Vafai.
diff --git a/LayoutTests/accessibility/iframe-has-document-expected.txt b/LayoutTests/accessibility/iframe-has-document-expected.txt
new file mode 100644 (file)
index 0000000..27a27f8
--- /dev/null
@@ -0,0 +1,11 @@
+
+This test makes sure the iframe's document is included in the main AX tree.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS parentIframeDocument.isEqual(iframe) is true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/accessibility/iframe-has-document.html b/LayoutTests/accessibility/iframe-has-document.html
new file mode 100644 (file)
index 0000000..dd51c73
--- /dev/null
@@ -0,0 +1,37 @@
+<html>
+<head>
+<link rel="stylesheet" href="../fast/js/resources/js-test-style.css" />
+<script>
+var successfullyParsed = false;
+</script>
+<script src="../fast/js/resources/js-test-pre.js"></script>
+</head>
+<body id="body">
+
+    <iframe id='iframe1' src='resources/cake.png'></iframe>
+
+<p id="description"></p>
+<div id="console"></div>
+
+<script>
+
+    description("This test makes sure the iframe's document is included in the main AX tree.");
+
+    if (window.accessibilityController) {
+        document.body.focus();
+        var body = accessibilityController.focusedElement;
+        var renderBlock = body.childAtIndex(0);
+        var iframe = renderBlock.childAtIndex(0);
+        var iframeDocument = iframe.childAtIndex(0);
+        
+        var parentIframeDocument = iframeDocument.parentElement();
+        
+        shouldBe("parentIframeDocument.isEqual(iframe)", "true");
+    }
+
+    successfullyParsed = true;
+</script>
+
+<script src="../fast/js/resources/js-test-post.js"></script>
+</body>
+</html>
index 260d403..46f36d8 100644 (file)
@@ -380,9 +380,6 @@ fast/workers/storage/change-version-handle-reuse-sync.html
 # Sometimes fails http://webkit.org/b/49182
 animations/stop-animation-on-suspend.html
 
-# Crashing in AccessibilityUIElement::parentElement http://webkit.org/b/49379
-accessibility/iframe-bastardization.html
-
 ################################################################################
 ####################### No bugs filed about the below yet#######################
 ################################################################################
index d10ea40..4592c5a 100644 (file)
@@ -1,3 +1,22 @@
+2010-11-23  Chris Guillory  <chris.guillory@google.com>
+
+        Reviewed by Dimitri Glazkov.
+
+        Include the FrameView widget of a RenderWidget in the accessibility tree.
+        https://bugs.webkit.org/show_bug.cgi?id=49106
+
+        Include render widget children in the accessibility tree for not mac webkit ports.
+
+        Test: accessibility/iframe-has-document.html
+
+        * accessibility/AccessibilityRenderObject.cpp:
+        (WebCore::AccessibilityRenderObject::renderParentObject):
+        (WebCore::AccessibilityRenderObject::addChildren):
+        (WebCore::AccessibilityRenderObject::addRenderWidgetChildren):
+        * accessibility/AccessibilityRenderObject.h:
+        * accessibility/chromium/AccessibilityObjectChromium.cpp:
+        (WebCore::AccessibilityObject::accessibilityIgnoreAttachment):
+
 2010-11-23  Chris Rogers  <crogers@google.com>
 
         Reviewed by Alexey Proskuryakov.
index 141d725..4c9fdd8 100644 (file)
@@ -390,26 +390,33 @@ RenderObject* AccessibilityRenderObject::renderParentObject() const
     RenderObject* startOfConts = 0;
     RenderObject* firstChild = 0;
     if (m_renderer->isRenderBlock() && (startOfConts = startOfContinuations(m_renderer)))
-        parent = startOfConts;
+        return startOfConts;
 
     // Case 2: node's parent is an inline which is some node's continuation; parent is 
     // the earliest node in the continuation chain.
-    else if (parent && parent->isRenderInline() && (startOfConts = startOfContinuations(parent)))
-        parent = startOfConts;
+    if (parent && parent->isRenderInline() && (startOfConts = startOfContinuations(parent)))
+        return startOfConts;
     
     // Case 3: The first sibling is the beginning of a continuation chain. Find the origin of that continuation.
-    else if (parent && (firstChild = parent->firstChild()) && firstChild->node()) {
+    if (parent && (firstChild = parent->firstChild()) && firstChild->node()) {
         // Get the node's renderer and follow that continuation chain until the first child is found
         RenderObject* nodeRenderFirstChild = firstChild->node()->renderer();
         if (nodeRenderFirstChild != firstChild) {
             for (RenderObject* contsTest = nodeRenderFirstChild; contsTest; contsTest = nextContinuation(contsTest)) {
-                if (contsTest == firstChild) {
-                    parent = nodeRenderFirstChild->parent();
-                    break;
-                }
+                if (contsTest == firstChild)
+                    return nodeRenderFirstChild->parent();
             }
         }
     }
+
+#if !PLATFORM(MAC)
+    // Case 4: The node is a RenderView whose FrameView has an associated RenderWidget.
+    // The parent is the associated RenderWidget.
+    // On the mac port this parent logic is in AccessibilityObjectWrapper.mm.
+    RenderWidget* renderWidget = 0;
+    if (!parent && (renderWidget = RenderWidget::find(frameViewIfRenderView())))
+        return renderWidget;
+#endif
         
     return parent;
 }
@@ -3358,6 +3365,27 @@ void AccessibilityRenderObject::addChildren()
             }
         }
     }
+
+    addRenderWidgetChildren();
+}
+
+void AccessibilityRenderObject::addRenderWidgetChildren()
+{
+#if !PLATFORM(MAC)
+    // For RenderWidget, add frame's content renderer if the widget is a FrameView.
+    // On the mac port this children logic is in AccessibilityObjectWrapper.mm.
+    Widget* widget = widgetForAttachmentView();
+    if (!widget || !widget->isFrameView())
+        return;
+    Frame* frame = static_cast<FrameView*>(widget)->frame();
+    if (!frame)
+        return;
+    RenderView* renderView = frame->contentRenderer();
+    if (!renderView)
+        return;
+    ASSERT(!m_children.size());
+    m_children.append(axObjectCache()->getOrCreate(renderView));
+#endif
 }
         
 const AtomicString& AccessibilityRenderObject::ariaLiveRegionStatus() const
index 970ef9f..b883d24 100644 (file)
@@ -269,6 +269,7 @@ protected:
     virtual bool isDetached() const { return !m_renderer; }
 
 private:
+    void addRenderWidgetChildren();
     void ariaListboxSelectedChildren(AccessibilityChildrenVector&);
     void ariaListboxVisibleChildren(AccessibilityChildrenVector&);
     bool ariaIsHidden() const;
index 5b4cfd5..2bd3bbe 100644 (file)
 
 #include "config.h"
 #include "AccessibilityObject.h"
+#include "Frame.h"
+#include "FrameView.h"
+#include "Widget.h"
 
 namespace WebCore {
 
 bool AccessibilityObject::accessibilityIgnoreAttachment() const
 {
+    // Ignore render widgets with an attached RenderView because they have
+    // no role and are not useful in the accessibility tree.
+    // On the mac port, these render widgets are ignored by forwarding
+    // calls the to the attached widget.
+    Widget* widget = widgetForAttachmentView();
+    if (widget && widget->isFrameView()) {
+        Frame* frame = static_cast<FrameView*>(widget)->frame();
+        if (frame && frame->contentRenderer())
+            return true;
+    }
+
     return false;
 }
 
index 7a57986..126acd5 100644 (file)
@@ -1,3 +1,15 @@
+2010-11-23  Chris Guillory  <chris.guillory@google.com>
+
+        Reviewed by Dimitri Glazkov.
+
+        Include the FrameView widget of a RenderWidget in the accessibility tree.
+        https://bugs.webkit.org/show_bug.cgi?id=49106
+
+        * public/WebAccessibilityObject.h:
+        * src/WebAccessibilityObject.cpp:
+        (WebKit::WebAccessibilityObject::equals):
+        (WebKit::WebAccessibilityObject::parentObject):
+
 2010-11-23  John Knottenbelt  <jknotten@chromium.org>
 
         Reviewed by Darin Fisher.
index f7c93f2..2d562f6 100644 (file)
@@ -63,6 +63,7 @@ public:
 
     WEBKIT_API void reset();
     WEBKIT_API void assign(const WebAccessibilityObject&);
+    WEBKIT_API bool equals(const WebAccessibilityObject&) const;
 
     bool isNull() const { return !m_private; }
 
index 9df69cf..f1d4574 100644 (file)
@@ -65,6 +65,11 @@ void WebAccessibilityObject::assign(const WebKit::WebAccessibilityObject& other)
     assign(p);
 }
 
+bool WebAccessibilityObject::equals(const WebKit::WebAccessibilityObject& other) const
+{
+    return (m_private == other.m_private);
+}
+
 WebString WebAccessibilityObject::accessibilityDescription() const
 {
     if (!m_private)
@@ -178,7 +183,7 @@ WebAccessibilityObject WebAccessibilityObject::parentObject() const
         return WebAccessibilityObject();
 
     m_private->updateBackingStore();
-    return WebAccessibilityObject(m_private->parentObject());
+    return WebAccessibilityObject(m_private->parentObjectUnignored());
 }
 
 
index 6654258..3fb0281 100644 (file)
@@ -1,3 +1,19 @@
+2010-11-23  Chris Guillory  <chris.guillory@google.com>
+
+        Reviewed by Dimitri Glazkov.
+
+        Include the FrameView widget of a RenderWidget in the accessibility tree.
+        https://bugs.webkit.org/show_bug.cgi?id=49106
+
+        * DumpRenderTree/chromium/AccessibilityUIElement.cpp:
+        (AccessibilityUIElement::AccessibilityUIElement):
+        (AccessibilityUIElement::parentElementCallback):
+        (AccessibilityUIElement::isEqualCallback):
+        * DumpRenderTree/chromium/AccessibilityUIElement.h:
+        * DumpRenderTree/chromium/CppBoundClass.cpp:
+        (CppBoundClass::getFromCppVariant):
+        * DumpRenderTree/chromium/CppBoundClass.h:
+
 2010-11-23  Alex Grilo  <abgrilo@profusion.mobi>
 
         Reviewed by Kenneth Rohde Christiansen.
index dbd025a..43a7380 100644 (file)
@@ -304,6 +304,7 @@ AccessibilityUIElement::AccessibilityUIElement(const WebAccessibilityObject& obj
     bindMethod("parentElement", &AccessibilityUIElement::parentElementCallback);
     bindMethod("increment", &AccessibilityUIElement::incrementCallback);
     bindMethod("decrement", &AccessibilityUIElement::decrementCallback);
+    bindMethod("isEqual", &AccessibilityUIElement::isEqualCallback);
 
     bindProperty("role", &AccessibilityUIElement::roleGetterCallback);
     bindProperty("subrole", &m_subrole);
@@ -490,7 +491,11 @@ void AccessibilityUIElement::isActionSupportedCallback(const CppArgumentList&, C
 
 void AccessibilityUIElement::parentElementCallback(const CppArgumentList&, CppVariant* result)
 {
-    result->setNull();
+    AccessibilityUIElement* parent = m_factory->create(accessibilityObject().parentObject());
+    if (parent)
+        result->set(*(parent->getAsCppVariant()));
+    else
+        result->setNull();        
 }
 
 void AccessibilityUIElement::incrementCallback(const CppArgumentList&, CppVariant* result)
@@ -503,6 +508,15 @@ void AccessibilityUIElement::decrementCallback(const CppArgumentList&, CppVarian
     result->setNull();
 }
 
+void AccessibilityUIElement::isEqualCallback(const CppArgumentList& arguments, CppVariant* result)
+{
+    bool equal = false;
+    AccessibilityUIElement* element = static_cast<AccessibilityUIElement*>(CppBoundClass::getFromCppVariant(arguments[0]));
+    if (element)
+        equal = accessibilityObject().equals(element->accessibilityObject());
+    result->set(equal);
+}
+
 void AccessibilityUIElement::fallbackCallback(const CppArgumentList &, CppVariant* result)
 {
     // FIXME: Implement this.
index 366ed42..f2ce2e4 100644 (file)
@@ -82,6 +82,7 @@ private:
     void parentElementCallback(const CppArgumentList&, CppVariant*);
     void incrementCallback(const CppArgumentList&, CppVariant*);
     void decrementCallback(const CppArgumentList&, CppVariant*);
+    void isEqualCallback(const CppArgumentList&, CppVariant*);
     void fallbackCallback(const CppArgumentList&, CppVariant*);
 
     void childrenCountGetterCallback(CppVariant*);
index 1348bbf..2d3d0e1 100644 (file)
@@ -324,6 +324,18 @@ bool CppBoundClass::isMethodRegistered(const string& name) const
     return callback != m_methods.end();
 }
 
+// static
+CppBoundClass* CppBoundClass::getFromCppVariant(const CppVariant& value)
+{
+    if (!value.isObject())
+        return 0;
+    NPObject* npObj = NPVARIANT_TO_OBJECT(value);
+    if (!npObj || npObj->_class != &CppNPObject::npClass)
+        return 0;
+    CppNPObject* obj = reinterpret_cast<CppNPObject*>(npObj);
+    return obj->boundClass;
+}
+
 CppVariant* CppBoundClass::getAsCppVariant()
 {
     if (!m_selfVariant.isObject()) {
index 6cb638e..3e271f9 100644 (file)
@@ -85,6 +85,10 @@ public:
     CppBoundClass() : m_boundToFrame(false) {}
     virtual ~CppBoundClass();
 
+    // Return the CppBoundClass bound to a CppVariant if it exists. Returns null
+    // otherwise.
+    static CppBoundClass* getFromCppVariant(const CppVariant&);
+
     // Return a CppVariant representing this class, for use with BindProperty().
     // The variant type is guaranteed to be NPVariantType_Object.
     CppVariant* getAsCppVariant();