<html>
    <head>
      <base href="https://bugs.webkit.org/" />
    </head>
    <body>
      <p>
        <div>
            <b><a class="bz_bug_link 
          bz_status_NEW "
   title="NEW - jQuery 'is' implementation causes exception to be thrown"
   href="https://bugs.webkit.org/show_bug.cgi?id=151165#c3">Comment # 3</a>
              on <a class="bz_bug_link 
          bz_status_NEW "
   title="NEW - jQuery 'is' implementation causes exception to be thrown"
   href="https://bugs.webkit.org/show_bug.cgi?id=151165">bug 151165</a>
              from <span class="vcard"><a class="email" href="mailto:cdumez&#64;apple.com" title="Chris Dumez &lt;cdumez&#64;apple.com&gt;"> <span class="fn">Chris Dumez</span></a>
</span></b>
        <pre>(In reply to <a href="show_bug.cgi?id=151165#c0">comment #0</a>)
<span class="quote">&gt; Created <span class=""><a href="attachment.cgi?id=265332" name="attach_265332" title="Example that triggers the issue.">attachment 265332</a> <a href="attachment.cgi?id=265332&amp;action=edit" title="Example that triggers the issue.">[details]</a></span>
&gt; Example that triggers the issue.
&gt; 
&gt; While debugging another issue, I noticed that exceptions were being thrown
&gt; inside JSC in a fairly simple jQuery test page. These 'exceptions' are not
&gt; catchable in script, and seem to be consumed inside WebKit without
&gt; triggering any external exception handling behavior. Perhaps this is normal
&gt; and expected, but I'm writing this bug up so we can make that decision.
&gt; 
&gt; Consider the following code:
&gt; 
&gt;     if (!elem.is(&quot;:visible&quot;)) {
&gt;         ... do something
&gt;     }
&gt; 
&gt; When this code is executed (at least in jQuery 2.1.4), we are encountering a
&gt; DOMError 12 (Syntax Error) being generated in the
&gt; WebCore::JsElementPrototypeFunctionMatches method.
&gt; 
&gt; +  377024 ( 408808 -  31784)    373 allocsBackTrace175CD6B0
&gt; +     344 (    373 -     29)BackTrace175CD6B0allocations
&gt; 
&gt;     ntdll!RtlpCallInterceptRoutine+26
&gt;     ntdll!RtlReAllocateHeap+3E7B1
&gt;     WTF!realloc+43 (f:\dd\vctools\crt\crtw32\heap\realloc.c, 85)
&gt;     WTF!WTF::fastRealloc+E (c:\bwa\wtf-7601.2.3\srcroot\wtf\fastmalloc.cpp,
&gt; 155)
&gt;     WTF!WTF::StringImpl::reallocateInternal&lt;unsigned char&gt;+72
&gt; (c:\bwa\wtf-7601.2.3\srcroot\wtf\text\stringimpl.cpp, 224)
&gt;     WTF!WTF::StringImpl::reallocate+23
&gt; (c:\bwa\wtf-7601.2.3\srcroot\wtf\text\stringimpl.cpp, 231)
&gt;     WTF!WTF::StringBuilder::reallocateBuffer&lt;unsigned char&gt;+4F
&gt; (c:\bwa\wtf-7601.2.3\srcroot\wtf\text\stringbuilder.cpp, 150)
&gt;     WTF!WTF::StringBuilder::appendUninitializedSlow&lt;unsigned char&gt;+3C
&gt; (c:\bwa\wtf-7601.2.3\srcroot\wtf\text\stringbuilder.cpp, 235)
&gt;     WTF!WTF::StringBuilder::append+73
&gt; (c:\bwa\wtf-7601.2.3\srcroot\wtf\text\stringbuilder.cpp, 283)
&gt;     JavaScriptCore!JSC::Interpreter::stackTraceAsString+C5
&gt; (c:\bwa\javascriptcore-7601.2.3\srcroot\interpreter\interpreter.cpp, 580)
&gt;     JavaScriptCore!JSC::addErrorInfoAndGetBytecodeOffset+2D2
&gt; (c:\bwa\javascriptcore-7601.2.3\srcroot\runtime\error.cpp, 179)
&gt;     JavaScriptCore!JSC::addErrorInfo+39
&gt; (c:\bwa\javascriptcore-7601.2.3\srcroot\runtime\error.cpp, 190)
&gt;     WebKit!WebCore::createDOMException+273
&gt;     WebKit!WebCore::setDOMException+4B
&gt;     WebKit!WebCore::jsElementPrototypeFunctionMatches+12A
&gt; 
&gt; The jsElementPrototypeFunctionMatches implementation calls the
&gt; Element::matches method, which eventually takes us to
&gt; SelectorQueryCache::add:
&gt; 
&gt;     SelectorQuery* SelectorQueryCache::add(const String&amp; selectors,
&gt; Document&amp; document, ExceptionCode&amp; ec)
&gt;     SelectorQuery* Document::selectorQueryForString(const String&amp;
&gt; selectorString, ExceptionCode&amp; ec)
&gt;     bool Element::matches(const String&amp; selector, ExceptionCode&amp; ec)
&gt; 
&gt; When SelectorQueryCache::add parses the document looking for selectors, and
&gt; does not find a match the exception code is set to 12 (SYNTAX_ERR) and it
&gt; does an early return.
&gt; 
&gt; This returns a false value, and everyone is happy. Except, the presence of
&gt; the SYNTAX_ERR code causes us to generate an exception objects:
&gt; 
&gt;     JSValue result = jsBoolean(impl.matches(selectors, ec));
&gt; 
&gt;     setDOMException(state, ec);
&gt;     return JSValue::encode(result);
&gt; 
&gt; The call to 'setDOMException' creates an exception object, which lives in
&gt; the JSC heap until it gets cleaned up. The exception object is fairly
&gt; heavy-weight, since it contains a call stack and other information about the
&gt; error location. In some jQuery applications we measured, this can produce a
&gt; few Megabytes of memory use within a short period.
&gt; 
&gt; I'm wondering if we really do want to be treating this 'normal' matches case
&gt; as an exception.</span >

If we throw, this likely means that we were unable to parse this selector. Throwing in such case is as per the spec. However, I am not familiar enough with this selector to know if it is valid.</pre>
        </div>
      </p>
      <hr>
      <span>You are receiving this mail because:</span>
      
      <ul>
          <li>You are the assignee for the bug.</li>
      </ul>
    </body>
</html>