<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[173622] trunk/Source/WebCore</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/173622">173622</a></dd>
<dt>Author</dt> <dd>cdumez@apple.com</dd>
<dt>Date</dt> <dd>2014-09-15 08:59:39 -0700 (Mon, 15 Sep 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Avoid redundant isElementNode() checks in Traversal&lt;HTML*Element&gt; / Traversal&lt;SVG*Element&gt;
https://bugs.webkit.org/show_bug.cgi?id=136719

Reviewed by Darin Adler.

Avoid redundant isElementNode() checks in Traversal&lt;HTML*Element&gt; /
Traversal&lt;SVG*Element&gt;.  We used to iterate through Elements, and then
call isElementOfType&lt;HTML*Element&gt;()  on each Element. This made sense
because hasTagName() used to be defined on Element. However, after
http://trac.webkit.org/changeset/165699, hasTagName() is now defined on
Node for HTMLQualifiedName / SVGQualifiedName arguments.

Node::hasTagName(HTMLQualifiedName) basically does the following check
&quot;isHTMLElement() &amp;&amp;  toHTMLElement(*this).hasTagName(tagName)&quot;. As a
consequence, doing an isElementNode() check is now redundant as
isHTMLElement() is defined on Node.

This patch adds a template parameter to isElementOfType() so that it can
take any type in argument (particulaly Node, Element, HTMLElement,
SVGElement, MathMLElement), not just an Element. I had to add an
ElementTypeCastTraits struct to support partial specialization as C++
does not support partial specialization of template functions.
This patch also updates Traversal&lt;ElementType&gt; so that the methods use
NodeTraversal internally instead of Traversal&lt;ElementType&gt;. As a result,
we now iterate over Nodes (not Elements) and call the new
isElementOfType&lt;ElementType&gt;(Node) helpers (which are efficient after
<a href="http://trac.webkit.org/projects/webkit/changeset/165699">r165699</a>).

Before the patch, the code ended up doing the following checks for
Traversal&lt;HTML*element&gt;:
node.isElementNode() &amp;&amp; toElement(node).isHTMLElement()
    &amp;&amp; toHTMLElement(node).hasTagName(HTMLNames::fooTag)

After the patch, the code only does:
node.isHTMLElement()
    &amp;&amp; toHTMLElement(node).hasTagName(HTMLNames::fooTag)

No new tests, no behavior change.

* dom/Element.h:
(WebCore::Element&gt;):
(WebCore::isElementOfType):
Add template parameter to isElementOfType() function so that it can
handle any argument type, not just Elements. Also introduce an
ElementTypeCastTraits struct that is called by isElementOfType()
function so that we can so partial template specialization.

* dom/ElementTraversal.h:
(WebCore::Traversal&lt;ElementType&gt;::firstWithinTemplate):
(WebCore::Traversal&lt;ElementType&gt;::lastWithinTemplate):
(WebCore::Traversal&lt;ElementType&gt;::nextTemplate):
(WebCore::Traversal&lt;ElementType&gt;::previousTemplate):
Use NodeTraversal API internally instead of Traversal&lt;Element&gt; to avoid
redundant isElementNode() checks.

(WebCore::Traversal&lt;Element&gt;::lastWithinTemplate): Deleted.
The code is now identical to the generic version.

(WebCore::Traversal&lt;Element&gt;::previousTemplate): Deleted.
The code is now identical to the generic version.

* dom/make_names.pl:
(printTypeHelpers):
- Generate template specializations for ElementTypeCastTraits struct
  instead of isElementOfType(). This avoids having to provide overloads
  for specific argument types (e.g. Node, Element, HTMLElement, ...).
- Share more code between HTML code path and the other path (for SVG,
  MTHML).

* html/HTMLElement.h:
(WebCore::HTMLElement&gt;):
Provide HTMLElement template specialization for ElementTypeCastTraits
struct instead of isElementOfType().

* html/HTMLFormControlElement.h:
(WebCore::HTMLFormControlElement&gt;):
Provide HTMLFormControlElement template specialization for
ElementTypeCastTraits struct instead of isElementOfType().

* html/HTMLFrameElementBase.h:
(WebCore::isHTMLFrameElementBase):
- Remove helper taking an Element in argument as it does not bring any
  benefit. Instead, update the overload taking a Node in argument to
  remove the unnecessary isElementNode() check as isHTMLFrameElement(Node)
  is now efficient.
- Add an overload taking an HTMLElement in argument so that we can bypass
  the isHTMLElement() check when we know the input is an HTMLElement.

* html/HTMLMediaElement.h:
(WebCore::HTMLMediaElement&gt;):
Provide HTMLMediaElement template specialization for ElementTypeCastTraits
struct instead of isElementOfType().

* html/HTMLPlugInImageElement.h:
(WebCore::HTMLPlugInImageElement&gt;):
Provide HTMLPlugInImageElement template specialization for
ElementTypeCastTraits struct instead of isElementOfType().

* html/LabelableElement.h:
(WebCore::LabelableElement&gt;):
Provide LabelableElement template specialization for ElementTypeCastTraits
struct instead of isElementOfType().

* mathml/MathMLElement.h:
(WebCore::MathMLElement&gt;):
Provide MathMLElement template specialization for ElementTypeCastTraits
struct for consistency with HTMLElement / SVGElement.

* svg/SVGElement.h:
(WebCore::SVGElement&gt;):
- Provide SVGElement template specialization for ElementTypeCastTraits
  struct instead of isElementOfType().
- include SVGElementTypeHelpers.h at the end of the file (similarly to
  what is already done in HTMLElement.h because
  isElementOfType(const SVGElement&amp;) needs to be defiend because the
  include.

* svg/SVGFilterPrimitiveStandardAttributes.h:
(WebCore::SVGFilterPrimitiveStandardAttributes&gt;):
Provide SVGFilterPrimitiveStandardAttributes template specialization for
ElementTypeCastTraits struct instead of isElementOfType().

* svg/animation/SVGSMILElement.h:
(WebCore::SVGSMILElement&gt;):
Provide SVGSMILElement template specialization for ElementTypeCastTraits
struct instead of isElementOfType().</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoredomElementh">trunk/Source/WebCore/dom/Element.h</a></li>
<li><a href="#trunkSourceWebCoredomElementTraversalh">trunk/Source/WebCore/dom/ElementTraversal.h</a></li>
<li><a href="#trunkSourceWebCoredommake_namespl">trunk/Source/WebCore/dom/make_names.pl</a></li>
<li><a href="#trunkSourceWebCorehtmlHTMLElementh">trunk/Source/WebCore/html/HTMLElement.h</a></li>
<li><a href="#trunkSourceWebCorehtmlHTMLFormControlElementh">trunk/Source/WebCore/html/HTMLFormControlElement.h</a></li>
<li><a href="#trunkSourceWebCorehtmlHTMLFrameElementBaseh">trunk/Source/WebCore/html/HTMLFrameElementBase.h</a></li>
<li><a href="#trunkSourceWebCorehtmlHTMLMediaElementh">trunk/Source/WebCore/html/HTMLMediaElement.h</a></li>
<li><a href="#trunkSourceWebCorehtmlHTMLPlugInImageElementh">trunk/Source/WebCore/html/HTMLPlugInImageElement.h</a></li>
<li><a href="#trunkSourceWebCorehtmlLabelableElementh">trunk/Source/WebCore/html/LabelableElement.h</a></li>
<li><a href="#trunkSourceWebCoremathmlMathMLElementh">trunk/Source/WebCore/mathml/MathMLElement.h</a></li>
<li><a href="#trunkSourceWebCoresvgSVGElementh">trunk/Source/WebCore/svg/SVGElement.h</a></li>
<li><a href="#trunkSourceWebCoresvgSVGFilterPrimitiveStandardAttributesh">trunk/Source/WebCore/svg/SVGFilterPrimitiveStandardAttributes.h</a></li>
<li><a href="#trunkSourceWebCoresvganimationSVGSMILElementh">trunk/Source/WebCore/svg/animation/SVGSMILElement.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (173621 => 173622)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-09-15 14:45:33 UTC (rev 173621)
+++ trunk/Source/WebCore/ChangeLog        2014-09-15 15:59:39 UTC (rev 173622)
</span><span class="lines">@@ -1,3 +1,133 @@
</span><ins>+2014-09-15  Chris Dumez  &lt;cdumez@apple.com&gt;
+
+        Avoid redundant isElementNode() checks in Traversal&lt;HTML*Element&gt; / Traversal&lt;SVG*Element&gt;
+        https://bugs.webkit.org/show_bug.cgi?id=136719
+
+        Reviewed by Darin Adler.
+
+        Avoid redundant isElementNode() checks in Traversal&lt;HTML*Element&gt; /
+        Traversal&lt;SVG*Element&gt;.  We used to iterate through Elements, and then
+        call isElementOfType&lt;HTML*Element&gt;()  on each Element. This made sense
+        because hasTagName() used to be defined on Element. However, after
+        http://trac.webkit.org/changeset/165699, hasTagName() is now defined on
+        Node for HTMLQualifiedName / SVGQualifiedName arguments.
+
+        Node::hasTagName(HTMLQualifiedName) basically does the following check
+        &quot;isHTMLElement() &amp;&amp;  toHTMLElement(*this).hasTagName(tagName)&quot;. As a
+        consequence, doing an isElementNode() check is now redundant as
+        isHTMLElement() is defined on Node.
+
+        This patch adds a template parameter to isElementOfType() so that it can
+        take any type in argument (particulaly Node, Element, HTMLElement,
+        SVGElement, MathMLElement), not just an Element. I had to add an
+        ElementTypeCastTraits struct to support partial specialization as C++
+        does not support partial specialization of template functions.
+        This patch also updates Traversal&lt;ElementType&gt; so that the methods use
+        NodeTraversal internally instead of Traversal&lt;ElementType&gt;. As a result,
+        we now iterate over Nodes (not Elements) and call the new
+        isElementOfType&lt;ElementType&gt;(Node) helpers (which are efficient after
+        r165699).
+
+        Before the patch, the code ended up doing the following checks for
+        Traversal&lt;HTML*element&gt;:
+        node.isElementNode() &amp;&amp; toElement(node).isHTMLElement()
+            &amp;&amp; toHTMLElement(node).hasTagName(HTMLNames::fooTag)
+
+        After the patch, the code only does:
+        node.isHTMLElement()
+            &amp;&amp; toHTMLElement(node).hasTagName(HTMLNames::fooTag)
+
+        No new tests, no behavior change.
+
+        * dom/Element.h:
+        (WebCore::Element&gt;):
+        (WebCore::isElementOfType):
+        Add template parameter to isElementOfType() function so that it can
+        handle any argument type, not just Elements. Also introduce an
+        ElementTypeCastTraits struct that is called by isElementOfType()
+        function so that we can so partial template specialization.
+
+        * dom/ElementTraversal.h:
+        (WebCore::Traversal&lt;ElementType&gt;::firstWithinTemplate):
+        (WebCore::Traversal&lt;ElementType&gt;::lastWithinTemplate):
+        (WebCore::Traversal&lt;ElementType&gt;::nextTemplate):
+        (WebCore::Traversal&lt;ElementType&gt;::previousTemplate):
+        Use NodeTraversal API internally instead of Traversal&lt;Element&gt; to avoid
+        redundant isElementNode() checks.
+
+        (WebCore::Traversal&lt;Element&gt;::lastWithinTemplate): Deleted.
+        The code is now identical to the generic version.
+
+        (WebCore::Traversal&lt;Element&gt;::previousTemplate): Deleted.
+        The code is now identical to the generic version.
+
+        * dom/make_names.pl:
+        (printTypeHelpers):
+        - Generate template specializations for ElementTypeCastTraits struct
+          instead of isElementOfType(). This avoids having to provide overloads
+          for specific argument types (e.g. Node, Element, HTMLElement, ...).
+        - Share more code between HTML code path and the other path (for SVG,
+          MTHML).
+
+        * html/HTMLElement.h:
+        (WebCore::HTMLElement&gt;):
+        Provide HTMLElement template specialization for ElementTypeCastTraits
+        struct instead of isElementOfType().
+
+        * html/HTMLFormControlElement.h:
+        (WebCore::HTMLFormControlElement&gt;):
+        Provide HTMLFormControlElement template specialization for
+        ElementTypeCastTraits struct instead of isElementOfType().
+
+        * html/HTMLFrameElementBase.h:
+        (WebCore::isHTMLFrameElementBase):
+        - Remove helper taking an Element in argument as it does not bring any
+          benefit. Instead, update the overload taking a Node in argument to
+          remove the unnecessary isElementNode() check as isHTMLFrameElement(Node)
+          is now efficient.
+        - Add an overload taking an HTMLElement in argument so that we can bypass
+          the isHTMLElement() check when we know the input is an HTMLElement.
+
+        * html/HTMLMediaElement.h:
+        (WebCore::HTMLMediaElement&gt;):
+        Provide HTMLMediaElement template specialization for ElementTypeCastTraits
+        struct instead of isElementOfType().
+
+        * html/HTMLPlugInImageElement.h:
+        (WebCore::HTMLPlugInImageElement&gt;):
+        Provide HTMLPlugInImageElement template specialization for
+        ElementTypeCastTraits struct instead of isElementOfType().
+
+        * html/LabelableElement.h:
+        (WebCore::LabelableElement&gt;):
+        Provide LabelableElement template specialization for ElementTypeCastTraits
+        struct instead of isElementOfType().
+
+        * mathml/MathMLElement.h:
+        (WebCore::MathMLElement&gt;):
+        Provide MathMLElement template specialization for ElementTypeCastTraits
+        struct for consistency with HTMLElement / SVGElement.
+
+        * svg/SVGElement.h:
+        (WebCore::SVGElement&gt;):
+        - Provide SVGElement template specialization for ElementTypeCastTraits
+          struct instead of isElementOfType().
+        - include SVGElementTypeHelpers.h at the end of the file (similarly to
+          what is already done in HTMLElement.h because
+          isElementOfType(const SVGElement&amp;) needs to be defiend because the
+          include.
+
+        * svg/SVGFilterPrimitiveStandardAttributes.h:
+        (WebCore::SVGFilterPrimitiveStandardAttributes&gt;):
+        Provide SVGFilterPrimitiveStandardAttributes template specialization for
+        ElementTypeCastTraits struct instead of isElementOfType().
+
+        * svg/animation/SVGSMILElement.h:
+        (WebCore::SVGSMILElement&gt;):
+        Provide SVGSMILElement template specialization for ElementTypeCastTraits
+        struct instead of isElementOfType().
+
+
</ins><span class="cx"> 2014-08-07  Sergio Villar Senin  &lt;svillar@igalia.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [CSS Grid Layout] Sort items by span when resolving content-based track sizing functions
</span></span></pre></div>
<a id="trunkSourceWebCoredomElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/Element.h (173621 => 173622)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/Element.h        2014-09-15 14:45:33 UTC (rev 173621)
+++ trunk/Source/WebCore/dom/Element.h        2014-09-15 15:59:39 UTC (rev 173622)
</span><span class="lines">@@ -670,10 +670,25 @@
</span><span class="cx"> 
</span><span class="cx"> NODE_TYPE_CASTS(Element)
</span><span class="cx"> 
</span><del>-template &lt;typename Type&gt; bool isElementOfType(const Element&amp;);
-template &lt;typename Type&gt; inline bool isElementOfType(const Node&amp; node) { return node.isElementNode() &amp;&amp; isElementOfType&lt;const Type&gt;(toElement(node)); }
-template &lt;&gt; inline bool isElementOfType&lt;const Element&gt;(const Element&amp;) { return true; }
</del><ins>+template &lt;typename ExpectedType, typename ArgType&gt;
+struct ElementTypeCastTraits {
+    static bool is(ArgType&amp;);
+};
</ins><span class="cx"> 
</span><ins>+// This is needed so that the compiler can deduce the second template parameter (ArgType).
+template &lt;typename ExpectedType, typename ArgType&gt;
+inline bool isElementOfType(const ArgType&amp; node) { return ElementTypeCastTraits&lt;ExpectedType, const ArgType&gt;::is(node); }
+
+template &lt;&gt;
+struct ElementTypeCastTraits&lt;const Element, const Node&gt; {
+    static bool is(const Node&amp; node) { return node.isElementNode(); }
+};
+
+template &lt;typename ExpectedType&gt;
+struct ElementTypeCastTraits&lt;ExpectedType, ExpectedType&gt; {
+    static bool is(ExpectedType&amp;) { return true; }
+};
+
</ins><span class="cx"> inline bool Node::hasAttributes() const
</span><span class="cx"> {
</span><span class="cx">     return isElementNode() &amp;&amp; toElement(this)-&gt;hasAttributes();
</span></span></pre></div>
<a id="trunkSourceWebCoredomElementTraversalh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/ElementTraversal.h (173621 => 173622)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/ElementTraversal.h        2014-09-15 14:45:33 UTC (rev 173621)
+++ trunk/Source/WebCore/dom/ElementTraversal.h        2014-09-15 15:59:39 UTC (rev 173622)
</span><span class="lines">@@ -92,16 +92,6 @@
</span><span class="cx"> 
</span><span class="cx"> template &lt;&gt;
</span><span class="cx"> template &lt;typename CurrentType&gt;
</span><del>-inline Element* Traversal&lt;Element&gt;::lastWithinTemplate(CurrentType* current)
-{
-    Node* node = NodeTraversal::last(current);
-    while (node &amp;&amp; !node-&gt;isElementNode())
-        node = NodeTraversal::previous(node, current);
-    return toElement(node);
-}
-
-template &lt;&gt;
-template &lt;typename CurrentType&gt;
</del><span class="cx"> inline Element* Traversal&lt;Element&gt;::nextTemplate(CurrentType* current)
</span><span class="cx"> {
</span><span class="cx">     Node* node = NodeTraversal::next(current);
</span><span class="lines">@@ -120,24 +110,6 @@
</span><span class="cx">     return toElement(node);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template &lt;&gt;
-inline Element* Traversal&lt;Element&gt;::previous(const Node* current)
-{
-    Node* node = NodeTraversal::previous(current);
-    while (node &amp;&amp; !node-&gt;isElementNode())
-        node = NodeTraversal::previous(node);
-    return toElement(node);
-}
-
-template &lt;&gt;
-inline Element* Traversal&lt;Element&gt;::previous(const Node* current, const Node* stayWithin)
-{
-    Node* node = NodeTraversal::previous(current, stayWithin);
-    while (node &amp;&amp; !node-&gt;isElementNode())
-        node = NodeTraversal::previous(node, stayWithin);
-    return toElement(node);
-}
-
</del><span class="cx"> // Generic versions.
</span><span class="cx"> template &lt;typename ElementType&gt;
</span><span class="cx"> template &lt;typename CurrentType&gt;
</span><span class="lines">@@ -163,58 +135,58 @@
</span><span class="cx"> template &lt;typename CurrentType&gt;
</span><span class="cx"> inline ElementType* Traversal&lt;ElementType&gt;::firstWithinTemplate(CurrentType* current)
</span><span class="cx"> {
</span><del>-    Element* element = Traversal&lt;Element&gt;::firstWithin(current);
-    while (element &amp;&amp; !isElementOfType&lt;const ElementType&gt;(*element))
-        element = Traversal&lt;Element&gt;::next(element, current);
-    return static_cast&lt;ElementType*&gt;(element);
</del><ins>+    Node* node = current-&gt;firstChild();
+    while (node &amp;&amp; !isElementOfType&lt;const ElementType&gt;(*node))
+        node = NodeTraversal::next(node, current);
+    return static_cast&lt;ElementType*&gt;(node);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template &lt;typename ElementType&gt;
</span><span class="cx"> template &lt;typename CurrentType&gt;
</span><span class="cx"> inline ElementType* Traversal&lt;ElementType&gt;::lastWithinTemplate(CurrentType* current)
</span><span class="cx"> {
</span><del>-    Element* element = Traversal&lt;Element&gt;::lastWithin(current);
-    while (element &amp;&amp; !isElementOfType&lt;const ElementType&gt;(*element))
-        element = Traversal&lt;Element&gt;::previous(element, current);
-    return static_cast&lt;ElementType*&gt;(element);
</del><ins>+    Node* node = NodeTraversal::last(current);
+    while (node &amp;&amp; !isElementOfType&lt;const ElementType&gt;(*node))
+        node = NodeTraversal::previous(node, current);
+    return static_cast&lt;ElementType*&gt;(node);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template &lt;typename ElementType&gt;
</span><span class="cx"> template &lt;typename CurrentType&gt;
</span><span class="cx"> inline ElementType* Traversal&lt;ElementType&gt;::nextTemplate(CurrentType* current)
</span><span class="cx"> {
</span><del>-    Element* element = Traversal&lt;Element&gt;::next(current);
-    while (element &amp;&amp; !isElementOfType&lt;const ElementType&gt;(*element))
-        element = Traversal&lt;Element&gt;::next(element);
-    return static_cast&lt;ElementType*&gt;(element);
</del><ins>+    Node* node = NodeTraversal::next(current);
+    while (node &amp;&amp; !isElementOfType&lt;const ElementType&gt;(*node))
+        node = NodeTraversal::next(node);
+    return static_cast&lt;ElementType*&gt;(node);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template &lt;typename ElementType&gt;
</span><span class="cx"> template &lt;typename CurrentType&gt;
</span><span class="cx"> inline ElementType* Traversal&lt;ElementType&gt;::nextTemplate(CurrentType* current, const Node* stayWithin)
</span><span class="cx"> {
</span><del>-    Element* element = Traversal&lt;Element&gt;::next(current, stayWithin);
-    while (element &amp;&amp; !isElementOfType&lt;const ElementType&gt;(*element))
-        element = Traversal&lt;Element&gt;::next(element, stayWithin);
-    return static_cast&lt;ElementType*&gt;(element);
</del><ins>+    Node* node = NodeTraversal::next(current, stayWithin);
+    while (node &amp;&amp; !isElementOfType&lt;const ElementType&gt;(*node))
+        node = NodeTraversal::next(node, stayWithin);
+    return static_cast&lt;ElementType*&gt;(node);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template &lt;typename ElementType&gt;
</span><span class="cx"> inline ElementType* Traversal&lt;ElementType&gt;::previous(const Node* current)
</span><span class="cx"> {
</span><del>-    Element* element = Traversal&lt;Element&gt;::previous(current);
-    while (element &amp;&amp; !isElementOfType&lt;const ElementType&gt;(*element))
-        element = Traversal&lt;Element&gt;::previous(element);
-    return static_cast&lt;ElementType*&gt;(element);
</del><ins>+    Node* node = NodeTraversal::previous(current);
+    while (node &amp;&amp; !isElementOfType&lt;const ElementType&gt;(*node))
+        node = NodeTraversal::previous(node);
+    return static_cast&lt;ElementType*&gt;(node);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template &lt;typename ElementType&gt;
</span><span class="cx"> inline ElementType* Traversal&lt;ElementType&gt;::previous(const Node* current, const Node* stayWithin)
</span><span class="cx"> {
</span><del>-    Element* element = Traversal&lt;Element&gt;::previous(current, stayWithin);
-    while (element &amp;&amp; !isElementOfType&lt;const ElementType&gt;(*element))
-        element = Traversal&lt;Element&gt;::previous(element, stayWithin);
-    return static_cast&lt;ElementType*&gt;(element);
</del><ins>+    Node* node = NodeTraversal::previous(current, stayWithin);
+    while (node &amp;&amp; !isElementOfType&lt;const ElementType&gt;(*node))
+        node = NodeTraversal::previous(node, stayWithin);
+    return static_cast&lt;ElementType*&gt;(node);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template &lt;typename ElementType&gt;
</span></span></pre></div>
<a id="trunkSourceWebCoredommake_namespl"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/make_names.pl (173621 => 173622)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/make_names.pl        2014-09-15 14:45:33 UTC (rev 173621)
+++ trunk/Source/WebCore/dom/make_names.pl        2014-09-15 15:59:39 UTC (rev 173622)
</span><span class="lines">@@ -642,40 +642,29 @@
</span><span class="cx"> END
</span><span class="cx">         ;
</span><span class="cx"> 
</span><del>-        if ($parameters{namespace} eq &quot;HTML&quot;) {
-            if ($parsedTags{$name}{wrapperOnlyIfMediaIsAvailable}) {
-                # We need to check for HTMLUnknownElement if it might have been created by the factory.
-                print F &lt;&lt;END
</del><ins>+        if ($parameters{namespace} eq &quot;HTML&quot; &amp;&amp; $parsedTags{$name}{wrapperOnlyIfMediaIsAvailable}) {
+            # We need to check for HTMLUnknownElement if it might have been created by the factory.
+            print F &lt;&lt;END
</ins><span class="cx"> inline bool $checkHelper(const HTMLElement&amp; element) { return !element.isHTMLUnknownElement() &amp;&amp; element.hasTagName($parameters{namespace}Names::${name}Tag); }
</span><del>-inline bool $checkHelper(const HTMLElement* element) { ASSERT(element); return $checkHelper(*element); }
-END
-                ;
-            } else {
-                print F &lt;&lt;END
-inline bool $checkHelper(const HTMLElement&amp; element) { return element.hasTagName(HTMLNames::${name}Tag); }
-inline bool $checkHelper(const HTMLElement* element) { ASSERT(element); return $checkHelper(*element); }
-END
-                ;
-            }
-
-                print F &lt;&lt;END
</del><span class="cx"> inline bool $checkHelper(const Node&amp; node) { return node.isHTMLElement() &amp;&amp; $checkHelper(toHTMLElement(node)); }
</span><del>-inline bool $checkHelper(const Node* node) { ASSERT(node); return $checkHelper(*node); }
-template &lt;&gt; inline bool isElementOfType&lt;const $class&gt;(const HTMLElement&amp; element) { return $checkHelper(element); }
-template &lt;&gt; inline bool isElementOfType&lt;const $class&gt;(const Element&amp; element) { return $checkHelper(element); }
</del><span class="cx"> END
</span><del>-                ;
-
</del><ins>+            ;
</ins><span class="cx">         } else {
</span><span class="cx">             print F &lt;&lt;END
</span><del>-inline bool $checkHelper(const Element&amp; element) { return element.hasTagName($parameters{namespace}Names::${name}Tag); }
-inline bool $checkHelper(const Element* element) { ASSERT(element); return $checkHelper(*element); }
-inline bool $checkHelper(const Node&amp; node) { return node.isElementNode() &amp;&amp; $checkHelper(toElement(node)); }
-inline bool $checkHelper(const Node* node) { ASSERT(node); return node-&gt;isElementNode() &amp;&amp; $checkHelper(toElement(node)); }
-template &lt;&gt; inline bool isElementOfType&lt;const $class&gt;(const Element&amp; element) { return $checkHelper(element); }
</del><ins>+inline bool $checkHelper(const $parameters{namespace}Element&amp; element) { return element.hasTagName($parameters{namespace}Names::${name}Tag); }
+inline bool $checkHelper(const Node&amp; node) { return node.hasTagName($parameters{namespace}Names::${name}Tag); }
</ins><span class="cx"> END
</span><span class="cx">             ;
</span><span class="cx">         }
</span><ins>+        print F &lt;&lt;END
+inline bool $checkHelper(const $parameters{namespace}Element* element) { ASSERT(element); return $checkHelper(*element); }
+inline bool $checkHelper(const Node* node) { ASSERT(node); return $checkHelper(*node); }
+template &lt;typename ArgType&gt;
+struct ElementTypeCastTraits&lt;const $class, ArgType&gt; {
+    static bool is(ArgType&amp; node) { return $checkHelper(node); }
+};
+END
+        ;
</ins><span class="cx"> 
</span><span class="cx">         print F &quot;\n&quot;;
</span><span class="cx">     }
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlHTMLElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/HTMLElement.h (173621 => 173622)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/HTMLElement.h        2014-09-15 14:45:33 UTC (rev 173621)
+++ trunk/Source/WebCore/html/HTMLElement.h        2014-09-15 15:59:39 UTC (rev 173622)
</span><span class="lines">@@ -146,13 +146,14 @@
</span><span class="cx">     ASSERT(tagName.localName().impl());
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template &lt;typename Type&gt; bool isElementOfType(const HTMLElement&amp;);
-
</del><span class="cx"> void isHTMLElement(const HTMLElement&amp;); // Catch unnecessary runtime check of type known at compile time.
</span><span class="cx"> inline bool isHTMLElement(const Node&amp; node) { return node.isHTMLElement(); }
</span><del>-template &lt;&gt; inline bool isElementOfType&lt;const HTMLElement&gt;(const HTMLElement&amp;) { return true; }
-template &lt;&gt; inline bool isElementOfType&lt;const HTMLElement&gt;(const Element&amp; element) { return element.isHTMLElement(); }
</del><span class="cx"> 
</span><ins>+template &lt;typename ArgType&gt;
+struct ElementTypeCastTraits&lt;const HTMLElement, ArgType&gt; {
+    static bool is(ArgType&amp; node) { return isHTMLElement(node); }
+};
+
</ins><span class="cx"> NODE_TYPE_CASTS(HTMLElement)
</span><span class="cx"> 
</span><span class="cx"> inline bool Node::hasTagName(const HTMLQualifiedName&amp; name) const
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlHTMLFormControlElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/HTMLFormControlElement.h (173621 => 173622)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/HTMLFormControlElement.h        2014-09-15 14:45:33 UTC (rev 173621)
+++ trunk/Source/WebCore/html/HTMLFormControlElement.h        2014-09-15 15:59:39 UTC (rev 173622)
</span><span class="lines">@@ -193,8 +193,12 @@
</span><span class="cx"> void isHTMLFormControlElement(const HTMLFormControlElement&amp;); // Catch unnecessary runtime check of type known at compile time.
</span><span class="cx"> inline bool isHTMLFormControlElement(const Element&amp; element) { return element.isFormControlElement(); }
</span><span class="cx"> inline bool isHTMLFormControlElement(const Node&amp; node) { return node.isElementNode() &amp;&amp; toElement(node).isFormControlElement(); }
</span><del>-template &lt;&gt; inline bool isElementOfType&lt;const HTMLFormControlElement&gt;(const Element&amp; element) { return isHTMLFormControlElement(element); }
</del><span class="cx"> 
</span><ins>+template &lt;typename ArgType&gt;
+struct ElementTypeCastTraits&lt;const HTMLFormControlElement, ArgType&gt; {
+    static bool is(ArgType&amp; node) { return isHTMLFormControlElement(node); }
+};
+
</ins><span class="cx"> NODE_TYPE_CASTS(HTMLFormControlElement)
</span><span class="cx"> 
</span><span class="cx"> FORM_ASSOCIATED_ELEMENT_TYPE_CASTS(HTMLFormControlElement, isFormControlElement())
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlHTMLFrameElementBaseh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/HTMLFrameElementBase.h (173621 => 173622)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/HTMLFrameElementBase.h        2014-09-15 14:45:33 UTC (rev 173621)
+++ trunk/Source/WebCore/html/HTMLFrameElementBase.h        2014-09-15 15:59:39 UTC (rev 173622)
</span><span class="lines">@@ -77,8 +77,8 @@
</span><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> void isHTMLFrameElementBase(const HTMLFrameElementBase&amp;); // Catch unnecessary runtime check of type known at compile time.
</span><del>-inline bool isHTMLFrameElementBase(const Element&amp; element) { return isHTMLFrameElement(element) || isHTMLIFrameElement(element); }
-inline bool isHTMLFrameElementBase(const Node&amp; node) { return node.isElementNode() &amp;&amp; isHTMLFrameElementBase(toElement(node)); }
</del><ins>+inline bool isHTMLFrameElementBase(const HTMLElement&amp; element) { return isHTMLFrameElement(element) || isHTMLIFrameElement(element); }
+inline bool isHTMLFrameElementBase(const Node&amp; node) { return isHTMLFrameElement(node) || isHTMLIFrameElement(node); }
</ins><span class="cx"> 
</span><span class="cx"> NODE_TYPE_CASTS(HTMLFrameElementBase)
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlHTMLMediaElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/HTMLMediaElement.h (173621 => 173622)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/HTMLMediaElement.h        2014-09-15 14:45:33 UTC (rev 173621)
+++ trunk/Source/WebCore/html/HTMLMediaElement.h        2014-09-15 15:59:39 UTC (rev 173622)
</span><span class="lines">@@ -916,8 +916,12 @@
</span><span class="cx"> void isHTMLMediaElement(const HTMLMediaElement&amp;); // Catch unnecessary runtime check of type known at compile time.
</span><span class="cx"> inline bool isHTMLMediaElement(const Element&amp; element) { return element.isMediaElement(); }
</span><span class="cx"> inline bool isHTMLMediaElement(const Node&amp; node) { return node.isElementNode() &amp;&amp; toElement(node).isMediaElement(); }
</span><del>-template &lt;&gt; inline bool isElementOfType&lt;const HTMLMediaElement&gt;(const Element&amp; element) { return element.isMediaElement(); }
</del><span class="cx"> 
</span><ins>+template &lt;typename ArgType&gt;
+struct ElementTypeCastTraits&lt;const HTMLMediaElement, ArgType&gt; {
+    static bool is(ArgType&amp; node) { return isHTMLMediaElement(node); }
+};
+
</ins><span class="cx"> NODE_TYPE_CASTS(HTMLMediaElement)
</span><span class="cx"> 
</span><span class="cx"> #ifndef NDEBUG
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlHTMLPlugInImageElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/HTMLPlugInImageElement.h (173621 => 173622)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/HTMLPlugInImageElement.h        2014-09-15 14:45:33 UTC (rev 173621)
+++ trunk/Source/WebCore/html/HTMLPlugInImageElement.h        2014-09-15 15:59:39 UTC (rev 173622)
</span><span class="lines">@@ -160,7 +160,12 @@
</span><span class="cx"> void isHTMLPlugInImageElement(const HTMLPlugInImageElement&amp;); // Catch unnecessary runtime check of type known at compile time.
</span><span class="cx"> inline bool isHTMLPlugInImageElement(const HTMLPlugInElement&amp; element) { return element.isPlugInImageElement(); }
</span><span class="cx"> inline bool isHTMLPlugInImageElement(const Node&amp; node) { return node.isPluginElement() &amp;&amp; toHTMLPlugInElement(node).isPlugInImageElement(); }
</span><del>-template &lt;&gt; inline bool isElementOfType&lt;const HTMLPlugInImageElement&gt;(const Element&amp; element) { return isHTMLPlugInImageElement(element); }
</del><ins>+
+template &lt;typename ArgType&gt;
+struct ElementTypeCastTraits&lt;const HTMLPlugInImageElement, ArgType&gt; {
+    static bool is(ArgType&amp; node) { return isHTMLPlugInImageElement(node); }
+};
+
</ins><span class="cx"> NODE_TYPE_CASTS(HTMLPlugInImageElement)
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlLabelableElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/LabelableElement.h (173621 => 173622)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/LabelableElement.h        2014-09-15 14:45:33 UTC (rev 173621)
+++ trunk/Source/WebCore/html/LabelableElement.h        2014-09-15 15:59:39 UTC (rev 173622)
</span><span class="lines">@@ -53,8 +53,12 @@
</span><span class="cx"> void isLabelableElement(const LabelableElement&amp;); // Catch unnecessary runtime check of type known at compile time.
</span><span class="cx"> inline bool isLabelableElement(const HTMLElement&amp; element) { return element.isLabelable(); }
</span><span class="cx"> inline bool isLabelableElement(const Node&amp; node) { return node.isHTMLElement() &amp;&amp; toHTMLElement(node).isLabelable(); }
</span><del>-template &lt;&gt; inline bool isElementOfType&lt;const LabelableElement&gt;(const Element&amp; element) { return isLabelableElement(element); }
</del><span class="cx"> 
</span><ins>+template &lt;typename ArgType&gt;
+struct ElementTypeCastTraits&lt;const LabelableElement, ArgType&gt; {
+    static bool is(ArgType&amp; node) { return isLabelableElement(node); }
+};
+
</ins><span class="cx"> NODE_TYPE_CASTS(LabelableElement)
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoremathmlMathMLElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/mathml/MathMLElement.h (173621 => 173622)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/mathml/MathMLElement.h        2014-09-15 14:45:33 UTC (rev 173621)
+++ trunk/Source/WebCore/mathml/MathMLElement.h        2014-09-15 15:59:39 UTC (rev 173622)
</span><span class="lines">@@ -75,6 +75,12 @@
</span><span class="cx"> 
</span><span class="cx"> void isMathMLElement(const MathMLElement&amp;); // Catch unnecessary runtime check of type known at compile time.
</span><span class="cx"> inline bool isMathMLElement(const Node&amp; node) { return node.isMathMLElement(); }
</span><ins>+
+template &lt;typename ArgType&gt;
+struct ElementTypeCastTraits&lt;const MathMLElement, ArgType&gt; {
+    static bool is(ArgType&amp; node) { return isMathMLElement(node); }
+};
+
</ins><span class="cx"> NODE_TYPE_CASTS(MathMLElement)
</span><span class="cx"> 
</span><span class="cx"> inline bool Node::hasTagName(const MathMLQualifiedName&amp; name) const
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGElement.h (173621 => 173622)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGElement.h        2014-09-15 14:45:33 UTC (rev 173621)
+++ trunk/Source/WebCore/svg/SVGElement.h        2014-09-15 15:59:39 UTC (rev 173622)
</span><span class="lines">@@ -25,9 +25,9 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;CSSPropertyNames.h&quot;
</span><span class="cx"> #include &quot;SVGAnimatedString.h&quot;
</span><del>-#include &quot;SVGElementTypeHelpers.h&quot;
</del><span class="cx"> #include &quot;SVGLangSpace.h&quot;
</span><span class="cx"> #include &quot;SVGLocatable.h&quot;
</span><ins>+#include &quot;SVGNames.h&quot;
</ins><span class="cx"> #include &quot;SVGParsingError.h&quot;
</span><span class="cx"> #include &quot;SVGPropertyInfo.h&quot;
</span><span class="cx"> #include &quot;StyledElement.h&quot;
</span><span class="lines">@@ -225,8 +225,12 @@
</span><span class="cx"> 
</span><span class="cx"> void isSVGElement(const SVGElement&amp;); // Catch unnecessary runtime check of type known at compile time.
</span><span class="cx"> inline bool isSVGElement(const Node&amp; node) { return node.isSVGElement(); }
</span><del>-template &lt;&gt; inline bool isElementOfType&lt;const SVGElement&gt;(const Element&amp; element) { return element.isSVGElement(); }
</del><span class="cx"> 
</span><ins>+template &lt;typename ArgType&gt;
+struct ElementTypeCastTraits&lt;const SVGElement, ArgType&gt; {
+    static bool is(ArgType&amp; node) { return isSVGElement(node); }
+};
+
</ins><span class="cx"> NODE_TYPE_CASTS(SVGElement)
</span><span class="cx"> 
</span><span class="cx"> inline bool Node::hasTagName(const SVGQualifiedName&amp; name) const
</span><span class="lines">@@ -234,6 +238,8 @@
</span><span class="cx">     return isSVGElement() &amp;&amp; toSVGElement(*this).hasTagName(name);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-}
</del><ins>+} // namespace WebCore
</ins><span class="cx"> 
</span><ins>+#include &quot;SVGElementTypeHelpers.h&quot;
+
</ins><span class="cx"> #endif
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGFilterPrimitiveStandardAttributesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGFilterPrimitiveStandardAttributes.h (173621 => 173622)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGFilterPrimitiveStandardAttributes.h        2014-09-15 14:45:33 UTC (rev 173621)
+++ trunk/Source/WebCore/svg/SVGFilterPrimitiveStandardAttributes.h        2014-09-15 15:59:39 UTC (rev 173622)
</span><span class="lines">@@ -85,8 +85,12 @@
</span><span class="cx"> void isSVGFilterPrimitiveStandardAttributes(const SVGFilterPrimitiveStandardAttributes&amp;); // Catch unnecessary runtime check of type known at compile time.
</span><span class="cx"> inline bool isSVGFilterPrimitiveStandardAttributes(const SVGElement&amp; element) { return element.isFilterEffect(); }
</span><span class="cx"> inline bool isSVGFilterPrimitiveStandardAttributes(const Node&amp; node) { return node.isSVGElement() &amp;&amp; toSVGElement(node).isFilterEffect(); }
</span><del>-template &lt;&gt; inline bool isElementOfType&lt;const SVGFilterPrimitiveStandardAttributes&gt;(const Element&amp; element) { return isSVGFilterPrimitiveStandardAttributes(element); }
</del><span class="cx"> 
</span><ins>+template &lt;typename ArgType&gt;
+struct ElementTypeCastTraits&lt;const SVGFilterPrimitiveStandardAttributes, ArgType&gt; {
+    static bool is(ArgType&amp; node) { return isSVGFilterPrimitiveStandardAttributes(node); }
+};
+
</ins><span class="cx"> NODE_TYPE_CASTS(SVGFilterPrimitiveStandardAttributes)
</span><span class="cx"> 
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoresvganimationSVGSMILElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/animation/SVGSMILElement.h (173621 => 173622)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/animation/SVGSMILElement.h        2014-09-15 14:45:33 UTC (rev 173621)
+++ trunk/Source/WebCore/svg/animation/SVGSMILElement.h        2014-09-15 15:59:39 UTC (rev 173622)
</span><span class="lines">@@ -240,8 +240,13 @@
</span><span class="cx"> void isSVGSMILElement(const SVGSMILElement&amp;); // Catch unnecessary runtime check of type known at compile time.
</span><span class="cx"> inline bool isSVGSMILElement(const SVGElement&amp; element) { return element.isSMILElement(); }
</span><span class="cx"> inline bool isSVGSMILElement(const Node&amp; node) { return node.isSVGElement() &amp;&amp; toSVGElement(node).isSMILElement(); }
</span><del>-template &lt;&gt; inline bool isElementOfType&lt;const SVGSMILElement&gt;(const Element&amp; element) { return isSVGSMILElement(element); }
</del><span class="cx"> 
</span><ins>+template &lt;typename ArgType&gt;
+struct ElementTypeCastTraits&lt;const SVGSMILElement, ArgType&gt; {
+    static bool is(ArgType&amp; node) { return isSVGSMILElement(node); }
+};
+
+
</ins><span class="cx"> NODE_TYPE_CASTS(SVGSMILElement)
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre>
</div>
</div>

</body>
</html>