Move focus management API from HTMLDocument to Document
authordbates@webkit.org <dbates@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 2 Apr 2014 21:40:26 +0000 (21:40 +0000)
committerdbates@webkit.org <dbates@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 2 Apr 2014 21:40:26 +0000 (21:40 +0000)
https://bugs.webkit.org/show_bug.cgi?id=131079
<rdar://problem/16220103>

Reviewed by Timothy Hatcher.

Source/WebCore:

Merged from Blink (patch by Christophe Dumez):
https://src.chromium.org/viewvc/blink?view=rev&revision=165515

Move hasFocus() and attribute activeElement from interface HTMLDocument
to DOMDocument as per section Focus management APIs of the HTML5 standard:
<http://www.whatwg.org/specs/web-apps/current-work/#focus-management-apis> (1 April 2014).

Test: fast/dom/Document/xml-document-focus.xml

* bindings/objc/PublicDOMInterfaces.h: Moved hasFocus() and property activeElement from
interface DOMHTMLDocument to DOMDocument.
* dom/Document.cpp:
(WebCore::Document::activeElement): Added.
(WebCore::Document::hasFocus): Added.
* dom/Document.h:
* dom/Document.idl:
* html/HTMLDocument.cpp:
(WebCore::HTMLDocument::activeElement): Deleted.
(WebCore::HTMLDocument::hasFocus): Deleted.
* html/HTMLDocument.h:
* html/HTMLDocument.idl:

LayoutTests:

Derived from a Blink patch by Christophe Dumez:
https://src.chromium.org/viewvc/blink?view=rev&revision=165515

Made the test in <https://src.chromium.org/viewvc/blink?view=rev&revision=165515> a valid XHTML
document. Additionally taught LayoutTests/resources/{js-test, js-test-pre}.js to create actual
HTML elements so that these scripts can be used to write DRT tests in XML documents.

* fast/dom/Document/xml-document-focus-expected.txt: Added.
* fast/dom/Document/xml-document-focus.xml: Added.
* resources/js-test-pre.js: Added function createHTMLElement() and modified code to use it
instead of document.createElement() so as to work around <https://bugs.webkit.org/show_bug.cgi?id=131074>.
* resources/js-test.js: Ditto.

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

13 files changed:
LayoutTests/ChangeLog
LayoutTests/fast/dom/Document/xml-document-focus-expected.txt [new file with mode: 0644]
LayoutTests/fast/dom/Document/xml-document-focus.xml [new file with mode: 0644]
LayoutTests/resources/js-test-pre.js
LayoutTests/resources/js-test.js
Source/WebCore/ChangeLog
Source/WebCore/bindings/objc/PublicDOMInterfaces.h
Source/WebCore/dom/Document.cpp
Source/WebCore/dom/Document.h
Source/WebCore/dom/Document.idl
Source/WebCore/html/HTMLDocument.cpp
Source/WebCore/html/HTMLDocument.h
Source/WebCore/html/HTMLDocument.idl

index 777b837..7292f2a 100644 (file)
@@ -1,5 +1,26 @@
 2014-04-02  Daniel Bates  <dabates@apple.com>
 
+        Move focus management API from HTMLDocument to Document
+        https://bugs.webkit.org/show_bug.cgi?id=131079
+        <rdar://problem/16220103>
+
+        Reviewed by Timothy Hatcher.
+
+        Derived from a Blink patch by Christophe Dumez:
+        https://src.chromium.org/viewvc/blink?view=rev&revision=165515
+
+        Made the test in <https://src.chromium.org/viewvc/blink?view=rev&revision=165515> a valid XHTML
+        document. Additionally taught LayoutTests/resources/{js-test, js-test-pre}.js to create actual
+        HTML elements so that these scripts can be used to write DRT tests in XML documents.
+
+        * fast/dom/Document/xml-document-focus-expected.txt: Added.
+        * fast/dom/Document/xml-document-focus.xml: Added.
+        * resources/js-test-pre.js: Added function createHTMLElement() and modified code to use it
+        instead of document.createElement() so as to work around <https://bugs.webkit.org/show_bug.cgi?id=131074>.
+        * resources/js-test.js: Ditto.
+
+2014-04-02  Daniel Bates  <dabates@apple.com>
+
         Remove Settings::maximumDecodedImageSize()
         https://bugs.webkit.org/show_bug.cgi?id=131057
         <rdar://problem/15626368>
diff --git a/LayoutTests/fast/dom/Document/xml-document-focus-expected.txt b/LayoutTests/fast/dom/Document/xml-document-focus-expected.txt
new file mode 100644 (file)
index 0000000..987e547
--- /dev/null
@@ -0,0 +1,15 @@
+Make sure the focus management API is available to XML documents.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS document.__proto__ is not HTMLDocument.prototype
+PASS document.__proto__ is Document.prototype
+PASS document.hasFocus() is true
+PASS document.activeElement is document.body
+PASS document.activeElement is testElement
+PASS document.hasFocus() is true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/fast/dom/Document/xml-document-focus.xml b/LayoutTests/fast/dom/Document/xml-document-focus.xml
new file mode 100644 (file)
index 0000000..f11f94c
--- /dev/null
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Test document.activeElement and document.hasFocus()</title>
+<script type="text/javascript" src="../../../resources/js-test-pre.js"></script>
+</head>
+<body>
+<input id="testElement"></input>
+<script type="text/javascript">
+description("Make sure the focus management API is available to XML documents.");
+
+shouldNotBe("document.__proto__", "HTMLDocument.prototype");
+shouldBe("document.__proto__", "Document.prototype");
+shouldBeTrue("document.hasFocus()");
+shouldBe("document.activeElement", "document.body");
+var testElement = document.getElementById("testElement");
+testElement.focus();
+shouldBe("document.activeElement", "testElement");
+shouldBeTrue("document.hasFocus()");
+</script>
+<script type="text/javascript" src="../../../resources/js-test-post.js"></script>
+</body>
+</html>
index 1f0b6f5..e5812cb 100644 (file)
@@ -10,13 +10,24 @@ didFailSomeTests = false;
 
 (function() {
 
+    function createHTMLElement(tagName)
+    {
+        // FIXME: In an XML document, document.createElement() creates an element with a null namespace URI.
+        // So, we need use document.createElementNS() to explicitly create an element with the specified
+        // tag name in the HTML namespace. We can remove this function and use document.createElement()
+        // directly once we fix <https://bugs.webkit.org/show_bug.cgi?id=131074>.
+        if (document.createElementNS)
+            return document.createElementNS("http://www.w3.org/1999/xhtml", tagName);
+        return document.createElement(tagName);
+    }
+
     function getOrCreate(id, tagName)
     {
         var element = document.getElementById(id);
         if (element)
             return element;
 
-        element = document.createElement(tagName);
+        element = createHTMLElement(tagName);
         element.id = id;
         var refNode;
         var parent = document.body || document.documentElement;
@@ -32,7 +43,7 @@ didFailSomeTests = false;
     description = function description(msg, quiet)
     {
         // For MSIE 6 compatibility
-        var span = document.createElement("span");
+        var span = createHTMLElement("span");
         if (quiet)
             span.innerHTML = '<p>' + msg + '</p><p>On success, you will see no "<span class="fail">FAIL</span>" messages, followed by "<span class="pass">TEST COMPLETE</span>".</p>';
         else
@@ -47,7 +58,7 @@ didFailSomeTests = false;
 
     debug = function debug(msg)
     {
-        var span = document.createElement("span");
+        var span = createHTMLElement("span");
         getOrCreate("console", "div").appendChild(span); // insert it first so XHTML knows the namespace
         span.innerHTML = msg + '<br />';
     };
@@ -68,7 +79,7 @@ didFailSomeTests = false;
 
     function insertStyleSheet()
     {
-        var styleElement = document.createElement("style");
+        var styleElement = createHTMLElement("style");
         styleElement.textContent = css;
         (document.head || document.documentElement).appendChild(styleElement);
     }
index 98e6f1b..787f31d 100644 (file)
@@ -14,13 +14,24 @@ var unexpectedErrorMessage; // set by onerror when expectingError is not true
 
 (function() {
 
+    function createHTMLElement(tagName)
+    {
+        // FIXME: In an XML document, document.createElement() creates an element with a null namespace URI.
+        // So, we need use document.createElementNS() to explicitly create an element with the specified
+        // tag name in the HTML namespace. We can remove this function and use document.createElement()
+        // directly once we fix <https://bugs.webkit.org/show_bug.cgi?id=131074>.
+        if (document.createElementNS)
+            return document.createElementNS("http://www.w3.org/1999/xhtml", tagName);
+        return document.createElement(tagName);
+    }
+
     function getOrCreate(id, tagName)
     {
         var element = document.getElementById(id);
         if (element)
             return element;
 
-        element = document.createElement(tagName);
+        element = createHTMLElement(tagName);
         element.id = id;
         var refNode;
         var parent = document.body || document.documentElement;
@@ -36,7 +47,7 @@ var unexpectedErrorMessage; // set by onerror when expectingError is not true
     description = function description(msg, quiet)
     {
         // For MSIE 6 compatibility
-        var span = document.createElement("span");
+        var span = createHTMLElement("span");
         if (quiet)
             span.innerHTML = '<p>' + msg + '</p><p>On success, you will see no "<span class="fail">FAIL</span>" messages, followed by "<span class="pass">TEST COMPLETE</span>".</p>';
         else
@@ -51,7 +62,7 @@ var unexpectedErrorMessage; // set by onerror when expectingError is not true
 
     debug = function debug(msg)
     {
-        var span = document.createElement("span");
+        var span = createHTMLElement("span");
         getOrCreate("console", "div").appendChild(span); // insert it first so XHTML knows the namespace
         span.innerHTML = msg + '<br />';
     };
@@ -72,7 +83,7 @@ var unexpectedErrorMessage; // set by onerror when expectingError is not true
 
     function insertStyleSheet()
     {
-        var styleElement = document.createElement("style");
+        var styleElement = createHTMLElement("style");
         styleElement.textContent = css;
         (document.head || document.documentElement).appendChild(styleElement);
     }
index 7d232ee..a3cc2ef 100644 (file)
@@ -1,3 +1,33 @@
+2014-04-02  Daniel Bates  <dabates@apple.com>
+
+        Move focus management API from HTMLDocument to Document
+        https://bugs.webkit.org/show_bug.cgi?id=131079
+        <rdar://problem/16220103>
+
+        Reviewed by Timothy Hatcher.
+
+        Merged from Blink (patch by Christophe Dumez):
+        https://src.chromium.org/viewvc/blink?view=rev&revision=165515
+
+        Move hasFocus() and attribute activeElement from interface HTMLDocument
+        to DOMDocument as per section Focus management APIs of the HTML5 standard:
+        <http://www.whatwg.org/specs/web-apps/current-work/#focus-management-apis> (1 April 2014).
+
+        Test: fast/dom/Document/xml-document-focus.xml
+
+        * bindings/objc/PublicDOMInterfaces.h: Moved hasFocus() and property activeElement from
+        interface DOMHTMLDocument to DOMDocument.
+        * dom/Document.cpp:
+        (WebCore::Document::activeElement): Added.
+        (WebCore::Document::hasFocus): Added.
+        * dom/Document.h:
+        * dom/Document.idl:
+        * html/HTMLDocument.cpp:
+        (WebCore::HTMLDocument::activeElement): Deleted.
+        (WebCore::HTMLDocument::hasFocus): Deleted.
+        * html/HTMLDocument.h:
+        * html/HTMLDocument.idl:
+
 2014-04-02  Benjamin Poulain  <benjamin@webkit.org>
 
         Refactor the function call generator to take the arguments by value
index ecf6ee2..c699d6e 100644 (file)
 @property (readonly, copy) NSString *preferredStylesheetSet WEBKIT_AVAILABLE_MAC(10_5);
 @property (copy) NSString *selectedStylesheetSet WEBKIT_AVAILABLE_MAC(10_5);
 @property (readonly, copy) NSString *lastModified WEBKIT_AVAILABLE_MAC(10_6);
+@property (readonly, strong) DOMElement *activeElement WEBKIT_AVAILABLE_MAC(10_6);
 - (DOMElement *)createElement:(NSString *)tagName;
 - (DOMDocumentFragment *)createDocumentFragment;
 - (DOMText *)createTextNode:(NSString *)data;
 #if defined(ENABLE_FULLSCREEN_API) && ENABLE_FULLSCREEN_API
 - (void)webkitCancelFullScreen WEBKIT_AVAILABLE_MAC(10_6);
 #endif
+- (BOOL)hasFocus WEBKIT_AVAILABLE_MAC(10_6);
 @end
 
 @interface DOMDocumentFragment : DOMNode 10_4
 @property (copy) NSString *alinkColor WEBKIT_AVAILABLE_MAC(10_5);
 @property (copy) NSString *linkColor WEBKIT_AVAILABLE_MAC(10_5);
 @property (copy) NSString *vlinkColor WEBKIT_AVAILABLE_MAC(10_5);
-@property (readonly, strong) DOMElement *activeElement WEBKIT_AVAILABLE_MAC(10_6);
 @property (readonly, copy) NSString *compatMode WEBKIT_AVAILABLE_MAC(10_6);
 - (void)captureEvents WEBKIT_AVAILABLE_MAC(10_5);
 - (void)releaseEvents WEBKIT_AVAILABLE_MAC(10_5);
 - (void)clear WEBKIT_AVAILABLE_MAC(10_6);
-- (BOOL)hasFocus WEBKIT_AVAILABLE_MAC(10_6);
 - (void)open;
 - (void)close;
 - (void)write:(NSString *)text;
index 0ecdeac..2fc5fb0 100644 (file)
@@ -55,6 +55,7 @@
 #include "EntityReference.h"
 #include "EventFactory.h"
 #include "EventHandler.h"
+#include "FocusController.h"
 #include "FontLoader.h"
 #include "FormController.h"
 #include "FrameLoader.h"
@@ -6153,4 +6154,24 @@ bool Document::updateStyleIfNeededForNode(const Node& node)
     return true;
 }
 
+Element* Document::activeElement()
+{
+    updateStyleIfNeeded();
+    if (Element* element = treeScope().focusedElement())
+        return element;
+    return body();
+}
+
+bool Document::hasFocus() const
+{
+    Page* page = this->page();
+    if (!page || !page->focusController().isActive())
+        return false;
+    if (Frame* focusedFrame = page->focusController().focusedFrame()) {
+        if (focusedFrame->tree().isDescendantOf(frame()))
+            return true;
+    }
+    return false;
+}
+
 } // namespace WebCore
index f6ba77d..db1e972 100644 (file)
@@ -405,6 +405,9 @@ public:
         return m_documentElement.get();
     }
 
+    Element* activeElement();
+    bool hasFocus() const;
+
     bool hasManifest() const;
     
     virtual PassRefPtr<Element> createElement(const AtomicString& tagName, ExceptionCode&);
index 594e832..8dd51ff 100644 (file)
     // HTML 5
     NodeList getElementsByClassName([Default=Undefined] optional DOMString tagname);
 
+    readonly attribute Element activeElement;
+    boolean hasFocus();
+
     readonly attribute DOMString compatMode;
 
     // NodeSelector - Selector API
index c6067d8..28c8474 100644 (file)
@@ -137,28 +137,6 @@ void HTMLDocument::setDesignMode(const String& value)
     Document::setDesignMode(mode);
 }
 
-Element* HTMLDocument::activeElement()
-{
-    document().updateStyleIfNeeded();
-    if (Element* element = treeScope().focusedElement())
-        return element;
-    return body();
-}
-
-bool HTMLDocument::hasFocus()
-{
-    Page* page = this->page();
-    if (!page)
-        return false;
-    if (!page->focusController().isActive())
-        return false;
-    if (Frame* focusedFrame = page->focusController().focusedFrame()) {
-        if (focusedFrame->tree().isDescendantOf(frame()))
-            return true;
-    }
-    return false;
-}
-
 const AtomicString& HTMLDocument::bgColor() const
 {
     HTMLElement* bodyElement = body();
index b42d320..a26f5db 100644 (file)
@@ -52,9 +52,6 @@ public:
     String designMode() const;
     void setDesignMode(const String&);
 
-    Element* activeElement();
-    bool hasFocus();
-
     const AtomicString& bgColor() const;
     void setBgColor(const String&);
     const AtomicString& fgColor() const;
index 5e889ec..5b8671f 100644 (file)
@@ -49,9 +49,6 @@
              [TreatNullAs=NullString] attribute DOMString designMode;
     readonly attribute DOMString compatMode;
 
-    readonly attribute Element activeElement;
-    boolean hasFocus();
-
     // Deprecated attributes
              [TreatNullAs=NullString] attribute DOMString bgColor;
              [TreatNullAs=NullString] attribute DOMString fgColor;