Bug 1312742 - Match spec/other browsers for ping reflection; r=bkelly
authorAryeh Gregor <ayg@aryeh.name>
Wed, 26 Oct 2016 21:24:15 +0300
changeset 320216 bc0cbdabb7512afce5179229920b40af4cbf2acf
parent 320204 fdea89bad933375fd650bc2cd8fee6dc860de9bb
child 320217 192f2eb705fdbaf0217cd2dfce18cc5318d3f776
push id20754
push usercbook@mozilla.com
push dateMon, 31 Oct 2016 15:58:35 +0000
treeherderfx-team@b1b66b1780c2 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersbkelly
bugs1312742
milestone52.0a1
Bug 1312742 - Match spec/other browsers for ping reflection; r=bkelly The spec used to say that getting the .ping property on HTMLAnchorElement or HTMLAreaElement should return a DOMTokenList of parsed URLs, but it now says to return a plain string. All other UAs that implement ping match the new spec, and it's hopefully unlikely that any sites depend on our old behavior. Discussion: https://github.com/whatwg/html/issues/1780 MozReview-Commit-ID: LpmH8ANNT9g
dom/html/HTMLAnchorElement.cpp
dom/html/HTMLAreaElement.cpp
dom/html/nsGenericHTMLElement.cpp
dom/html/nsGenericHTMLElement.h
testing/web-platform/meta/html/dom/reflection-embedded.html.ini
testing/web-platform/meta/html/dom/reflection-text.html.ini
--- a/dom/html/HTMLAnchorElement.cpp
+++ b/dom/html/HTMLAnchorElement.cpp
@@ -342,20 +342,21 @@ HTMLAnchorElement::SetText(const nsAStri
 }
 
 NS_IMETHODIMP
 HTMLAnchorElement::ToString(nsAString& aSource)
 {
   return GetHref(aSource);
 }
 
-NS_IMETHODIMP    
+NS_IMETHODIMP
 HTMLAnchorElement::GetPing(nsAString& aValue)
 {
-  return GetURIListAttr(nsGkAtoms::ping, aValue);
+  GetAttr(kNameSpaceID_None, nsGkAtoms::ping, aValue);
+  return NS_OK;
 }
 
 NS_IMETHODIMP
 HTMLAnchorElement::SetPing(const nsAString& aValue)
 {
   return SetAttr(kNameSpaceID_None, nsGkAtoms::ping, aValue, true);
 }
 
--- a/dom/html/HTMLAreaElement.cpp
+++ b/dom/html/HTMLAreaElement.cpp
@@ -216,20 +216,21 @@ IMPL_URI_PART(Hash)
 #undef IMPL_URI_PART
 
 NS_IMETHODIMP
 HTMLAreaElement::ToString(nsAString& aSource)
 {
   return GetHref(aSource);
 }
 
-NS_IMETHODIMP    
+NS_IMETHODIMP
 HTMLAreaElement::GetPing(nsAString& aValue)
 {
-  return GetURIListAttr(nsGkAtoms::ping, aValue);
+  GetAttr(kNameSpaceID_None, nsGkAtoms::ping, aValue);
+  return NS_OK;
 }
 
 NS_IMETHODIMP
 HTMLAreaElement::SetPing(const nsAString& aValue)
 {
   return SetAttr(kNameSpaceID_None, nsGkAtoms::ping, aValue, true);
 }
 
--- a/dom/html/nsGenericHTMLElement.cpp
+++ b/dom/html/nsGenericHTMLElement.cpp
@@ -1674,78 +1674,16 @@ nsGenericHTMLElement::GetURIAttr(nsIAtom
 /* static */ bool
 nsGenericHTMLElement::IsScrollGrabAllowed(JSContext*, JSObject*)
 {
   // Only allow scroll grabbing in chrome
   nsIPrincipal* prin = nsContentUtils::SubjectPrincipal();
   return nsContentUtils::IsSystemPrincipal(prin);
 }
 
-nsresult
-nsGenericHTMLElement::GetURIListAttr(nsIAtom* aAttr, nsAString& aResult)
-{
-  aResult.Truncate();
-
-  nsAutoString value;
-  if (!GetAttr(kNameSpaceID_None, aAttr, value))
-    return NS_OK;
-
-  nsIDocument* doc = OwnerDoc(); 
-  nsCOMPtr<nsIURI> baseURI = GetBaseURI();
-
-  nsString::const_iterator end;
-  value.EndReading(end);
-
-  nsAString::const_iterator iter;
-  value.BeginReading(iter);
-
-  while (iter != end) {
-    while (*iter == ' ' && iter != end) {
-      ++iter;
-    }
-
-    if (iter == end) {
-      break;
-    }
-
-    nsAString::const_iterator start = iter;
-
-    while (iter != end && *iter != ' ') {
-      ++iter;
-    }
-
-    if (!aResult.IsEmpty()) {
-      aResult.Append(NS_LITERAL_STRING(" "));
-    }
-
-    const nsSubstring& uriPart = Substring(start, iter);
-    nsCOMPtr<nsIURI> attrURI;
-    nsresult rv =
-      nsContentUtils::NewURIWithDocumentCharset(getter_AddRefs(attrURI),
-                                                uriPart, doc, baseURI);
-    if (NS_FAILED(rv)) {
-      aResult.Append(uriPart);
-      continue;
-    }
-
-    MOZ_ASSERT(attrURI);
-
-    nsAutoCString spec;
-    rv = attrURI->GetSpec(spec);
-    if (NS_WARN_IF(NS_FAILED(rv))) {
-      aResult.Append(uriPart);
-      continue;
-    }
-
-    AppendUTF8toUTF16(spec, aResult);
-  }
-
-  return NS_OK;
-}
-
 HTMLMenuElement*
 nsGenericHTMLElement::GetContextMenu() const
 {
   nsAutoString value;
   GetHTMLAttr(nsGkAtoms::contextmenu, value);
   if (!value.IsEmpty()) {
     //XXXsmaug How should this work in Shadow DOM?
     nsIDocument* doc = GetUncomposedDoc();
--- a/dom/html/nsGenericHTMLElement.h
+++ b/dom/html/nsGenericHTMLElement.h
@@ -1058,30 +1058,16 @@ protected:
   {
     nsAutoString value;
     value.AppendFloat(aValue);
 
     SetHTMLAttr(aAttr, value, aRv);
   }
 
   /**
-   * This method works like GetURIAttr, except that it supports multiple
-   * URIs separated by whitespace (one or more U+0020 SPACE characters).
-   *
-   * Gets the absolute URI values of an attribute, by resolving any relative
-   * URIs in the attribute against the baseuri of the element. If a substring
-   * isn't a relative URI, the substring is returned as is. Only works for
-   * attributes in null namespace.
-   *
-   * @param aAttr    name of attribute.
-   * @param aResult  result value [out]
-   */
-  nsresult GetURIListAttr(nsIAtom* aAttr, nsAString& aResult);
-
-  /**
    * Locates the nsIEditor associated with this node.  In general this is
    * equivalent to GetEditorInternal(), but for designmode or contenteditable,
    * this may need to get an editor that's not actually on this element's
    * associated TextControlFrame.  This is used by the spellchecking routines
    * to get the editor affected by changing the spellcheck attribute on this
    * node.
    */
   virtual already_AddRefed<nsIEditor> GetAssociatedEditor();
--- a/testing/web-platform/meta/html/dom/reflection-embedded.html.ini
+++ b/testing/web-platform/meta/html/dom/reflection-embedded.html.ini
@@ -691,92 +691,8 @@
     expected: FAIL
 
   [area.type: IDL set to object "test-toString" followed by IDL get]
     expected: FAIL
 
   [area.type: IDL set to object "test-valueOf" followed by IDL get]
     expected: FAIL
 
-  [area.ping: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f  foo " followed by IDL get]
-    expected: FAIL
-
-  [area.ping: setAttribute() to undefined followed by IDL get]
-    expected: FAIL
-
-  [area.ping: setAttribute() to 7 followed by IDL get]
-    expected: FAIL
-
-  [area.ping: setAttribute() to 1.5 followed by IDL get]
-    expected: FAIL
-
-  [area.ping: setAttribute() to true followed by IDL get]
-    expected: FAIL
-
-  [area.ping: setAttribute() to false followed by IDL get]
-    expected: FAIL
-
-  [area.ping: setAttribute() to object "[object Object\]" followed by IDL get]
-    expected: FAIL
-
-  [area.ping: setAttribute() to NaN followed by IDL get]
-    expected: FAIL
-
-  [area.ping: setAttribute() to Infinity followed by IDL get]
-    expected: FAIL
-
-  [area.ping: setAttribute() to -Infinity followed by IDL get]
-    expected: FAIL
-
-  [area.ping: setAttribute() to "\\0" followed by IDL get]
-    expected: FAIL
-
-  [area.ping: setAttribute() to null followed by IDL get]
-    expected: FAIL
-
-  [area.ping: setAttribute() to object "test-toString" followed by IDL get]
-    expected: FAIL
-
-  [area.ping: setAttribute() to object "test-valueOf" followed by IDL get]
-    expected: FAIL
-
-  [area.ping: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f  foo " followed by IDL get]
-    expected: FAIL
-
-  [area.ping: IDL set to undefined followed by IDL get]
-    expected: FAIL
-
-  [area.ping: IDL set to 7 followed by IDL get]
-    expected: FAIL
-
-  [area.ping: IDL set to 1.5 followed by IDL get]
-    expected: FAIL
-
-  [area.ping: IDL set to true followed by IDL get]
-    expected: FAIL
-
-  [area.ping: IDL set to false followed by IDL get]
-    expected: FAIL
-
-  [area.ping: IDL set to object "[object Object\]" followed by IDL get]
-    expected: FAIL
-
-  [area.ping: IDL set to NaN followed by IDL get]
-    expected: FAIL
-
-  [area.ping: IDL set to Infinity followed by IDL get]
-    expected: FAIL
-
-  [area.ping: IDL set to -Infinity followed by IDL get]
-    expected: FAIL
-
-  [area.ping: IDL set to "\\0" followed by IDL get]
-    expected: FAIL
-
-  [area.ping: IDL set to null followed by IDL get]
-    expected: FAIL
-
-  [area.ping: IDL set to object "test-toString" followed by IDL get]
-    expected: FAIL
-
-  [area.ping: IDL set to object "test-valueOf" followed by IDL get]
-    expected: FAIL
-
--- a/testing/web-platform/meta/html/dom/reflection-text.html.ini
+++ b/testing/web-platform/meta/html/dom/reflection-text.html.ini
@@ -169,92 +169,8 @@
     expected: FAIL
 
   [wbr.tabIndex: setAttribute() to object "3" followed by getAttribute()]
     expected: FAIL
 
   [wbr.tabIndex: setAttribute() to object "3" followed by IDL get]
     expected: FAIL
 
-  [a.ping: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f  foo " followed by IDL get]
-    expected: FAIL
-
-  [a.ping: setAttribute() to undefined followed by IDL get]
-    expected: FAIL
-
-  [a.ping: setAttribute() to 7 followed by IDL get]
-    expected: FAIL
-
-  [a.ping: setAttribute() to 1.5 followed by IDL get]
-    expected: FAIL
-
-  [a.ping: setAttribute() to true followed by IDL get]
-    expected: FAIL
-
-  [a.ping: setAttribute() to false followed by IDL get]
-    expected: FAIL
-
-  [a.ping: setAttribute() to object "[object Object\]" followed by IDL get]
-    expected: FAIL
-
-  [a.ping: setAttribute() to NaN followed by IDL get]
-    expected: FAIL
-
-  [a.ping: setAttribute() to Infinity followed by IDL get]
-    expected: FAIL
-
-  [a.ping: setAttribute() to -Infinity followed by IDL get]
-    expected: FAIL
-
-  [a.ping: setAttribute() to "\\0" followed by IDL get]
-    expected: FAIL
-
-  [a.ping: setAttribute() to null followed by IDL get]
-    expected: FAIL
-
-  [a.ping: setAttribute() to object "test-toString" followed by IDL get]
-    expected: FAIL
-
-  [a.ping: setAttribute() to object "test-valueOf" followed by IDL get]
-    expected: FAIL
-
-  [a.ping: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f  foo " followed by IDL get]
-    expected: FAIL
-
-  [a.ping: IDL set to undefined followed by IDL get]
-    expected: FAIL
-
-  [a.ping: IDL set to 7 followed by IDL get]
-    expected: FAIL
-
-  [a.ping: IDL set to 1.5 followed by IDL get]
-    expected: FAIL
-
-  [a.ping: IDL set to true followed by IDL get]
-    expected: FAIL
-
-  [a.ping: IDL set to false followed by IDL get]
-    expected: FAIL
-
-  [a.ping: IDL set to object "[object Object\]" followed by IDL get]
-    expected: FAIL
-
-  [a.ping: IDL set to NaN followed by IDL get]
-    expected: FAIL
-
-  [a.ping: IDL set to Infinity followed by IDL get]
-    expected: FAIL
-
-  [a.ping: IDL set to -Infinity followed by IDL get]
-    expected: FAIL
-
-  [a.ping: IDL set to "\\0" followed by IDL get]
-    expected: FAIL
-
-  [a.ping: IDL set to null followed by IDL get]
-    expected: FAIL
-
-  [a.ping: IDL set to object "test-toString" followed by IDL get]
-    expected: FAIL
-
-  [a.ping: IDL set to object "test-valueOf" followed by IDL get]
-    expected: FAIL
-