<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE bugzilla SYSTEM "https://bugs.webkit.org/page.cgi?id=bugzilla.dtd">

<bugzilla version="5.0.4.1"
          urlbase="https://bugs.webkit.org/"
          
          maintainer="admin@webkit.org"
>

    <bug>
          <bug_id>79222</bug_id>
          
          <creation_ts>2012-02-22 04:12:23 -0800</creation_ts>
          <short_desc>[chromium] createObjectURL(Blob) throws &apos;Illegal invocation&apos; error when MEDIA_STREAM is disabled.</short_desc>
          <delta_ts>2012-04-02 09:58:30 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebCore Misc.</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>66687</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Hao Zheng">zhenghao</reporter>
          <assigned_to name="Hao Zheng">zhenghao</assigned_to>
          <cc>abarth</cc>
    
    <cc>ager</cc>
    
    <cc>arv</cc>
    
    <cc>haraken</cc>
    
    <cc>japhet</cc>
    
    <cc>kaustubh.ra</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>561834</commentid>
    <comment_count>0</comment_count>
    <who name="Hao Zheng">zhenghao</who>
    <bug_when>2012-02-22 04:12:23 -0800</bug_when>
    <thetext>All chromium platforms except Android enable both BLOB and MEDIA_STREAM, so the error is not seen normally. However, if you turn off MediaStream in features.gypi and build DRT, all tests related to createObjectURL(Blob) would throw &apos;Illegal invocation&apos; error. I&apos;m not sure whether other ports have this error, so classify it under chromium.

I don&apos;t think it&apos;s related to MediaStream. Probably caused by https://bugs.webkit.org/show_bug.cgi?id=74386 .</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>561835</commentid>
    <comment_count>1</comment_count>
    <who name="Hao Zheng">zhenghao</who>
    <bug_when>2012-02-22 04:14:14 -0800</bug_when>
    <thetext>Sorry, forgot to mention build without MEDIA_STREAM is broken. You need to apply patch from https://bugs.webkit.org/show_bug.cgi?id=79214 to build.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>561838</commentid>
    <comment_count>2</comment_count>
    <who name="Hao Zheng">zhenghao</who>
    <bug_when>2012-02-22 04:15:20 -0800</bug_when>
    <thetext>One example test you can try is fast/files/create-blob-url-crash.html .</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>561848</commentid>
    <comment_count>3</comment_count>
    <who name="Kaustubh Atrawalkar">kaustubh.ra</who>
    <bug_when>2012-02-22 04:25:33 -0800</bug_when>
    <thetext>I had a look in this issue. As far as #ifdefs are concerned for MEDIA_STREAM, they all are proper. Will try to debug this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>563014</commentid>
    <comment_count>4</comment_count>
    <who name="Hao Zheng">zhenghao</who>
    <bug_when>2012-02-23 03:58:05 -0800</bug_when>
    <thetext>The problem may be caused by the method is changed to static. I&apos;m confused about the static semantics of DOMURL. Let&apos;s see Screen.idl. Of course, there is only a single instance of Screen, and we still don&apos;t add static to its attributes/methods. And in DOMWindow.idl, it&apos;s defined as:
attribute [Replaceable] Screen screen;
However, for DOMURL, it&apos;s defined as:
attribute [Conditional=BLOB] DOMURLConstructor webkitURL;
And it&apos;s much like other new-able elements like:
attribute EventConstructor Event;

Now that all methods of DOMURL are static, we can treat it as other singleton classes like Screen, Console, etc.

Of course, defining it as static is also fine. But obviously something is wrong. I&apos;m not familiar with idl, but webkitURL is defined as a constructor. Is it right to call static methods on a constructor, rather than the class? In debugging, I found the code when the error happens (builtins.cc HandleApiCallHelper()):

  Object* raw_holder = TypeCheck(heap, args.length(), &amp;args[0], fun_data);               // &lt;--- TypeCheck failed.

  if (raw_holder-&gt;IsNull()) {
    // This function cannot be called with the given receiver.  Abort!
    Handle&lt;Object&gt; obj =
        isolate-&gt;factory()-&gt;NewTypeError(
            &quot;illegal_invocation&quot;, HandleVector(&amp;function, 1));
    return isolate-&gt;Throw(*obj);
  }</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>563018</commentid>
    <comment_count>5</comment_count>
    <who name="Hao Zheng">zhenghao</who>
    <bug_when>2012-02-23 04:07:59 -0800</bug_when>
    <thetext>If there are 2 createBlobURL methods, the generated code is:

    desc-&gt;Set(v8::String::New(&quot;createObjectURL&quot;), v8::FunctionTemplate::New(DOMURLInternal::createObjectURLCallback, v8::Handle&lt;v8::Value&gt;(), v8::Local&lt;v8::Signature&gt;()));
    desc-&gt;Set(v8::String::New(&quot;revokeObjectURL&quot;), v8::FunctionTemplate::New(DOMURLInternal::revokeObjectURLCallback, v8::Handle&lt;v8::Value&gt;(), v8::Local&lt;v8::Signature&gt;()));

If there is only 1 createBlobURL method (after MEDIA_STREAM is disabled), the code is:

    // Custom Signature &apos;createObjectURL&apos;
    const int createObjectURLArgc = 1;
    v8::Handle&lt;v8::FunctionTemplate&gt; createObjectURLArgv[createObjectURLArgc] = { V8Blob::GetRawTemplate() };
    v8::Handle&lt;v8::Signature&gt; createObjectURLSignature = v8::Signature::New(desc, createObjectURLArgc, createObjectURLArgv);
    desc-&gt;Set(v8::String::New(&quot;createObjectURL&quot;), v8::FunctionTemplate::New(DOMURLInternal::createObjectURLCallback, v8::Handle&lt;v8::Value&gt;(), createObjectURLSignature));
    desc-&gt;Set(v8::String::New(&quot;revokeObjectURL&quot;), v8::FunctionTemplate::New(DOMURLInternal::revokeObjectURLCallback, v8::Handle&lt;v8::Value&gt;(), v8::Local&lt;v8::Signature&gt;()));

It appears to me that signature check is only executed when one method is defined. Not sure if it&apos;s related to the bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>563146</commentid>
    <comment_count>6</comment_count>
    <who name="Erik Arvidsson">arv</who>
    <bug_when>2012-02-23 09:07:07 -0800</bug_when>
    <thetext>(In reply to comment #4)
&gt; The problem may be caused by the method is changed to static. I&apos;m confused about the static semantics of DOMURL. Let&apos;s see Screen.idl. Of course, there is only a single instance of Screen, and we still don&apos;t add static to its attributes/methods. And in DOMWindow.idl, it&apos;s defined as:
&gt; attribute [Replaceable] Screen screen;
&gt; However, for DOMURL, it&apos;s defined as:
&gt; attribute [Conditional=BLOB] DOMURLConstructor webkitURL;
&gt; And it&apos;s much like other new-able elements like:
&gt; attribute EventConstructor Event;

URL is going to be constructable real soon. See 74385

&gt; Now that all methods of DOMURL are static, we can treat it as other singleton classes like Screen, Console, etc.

No, screen is just an object (instanceof Object). URL is a constructor (instanceof Function).

&gt; Of course, defining it as static is also fine. But obviously something is wrong. I&apos;m not familiar with idl, but webkitURL is defined as a constructor. Is it right to call static methods on a constructor, rather than the class? In debugging, I found the code when the error happens (builtins.cc HandleApiCallHelper()):
&gt; 
&gt;   Object* raw_holder = TypeCheck(heap, args.length(), &amp;args[0], fun_data);               // &lt;--- TypeCheck failed.
&gt; 
&gt;   if (raw_holder-&gt;IsNull()) {
&gt;     // This function cannot be called with the given receiver.  Abort!
&gt;     Handle&lt;Object&gt; obj =
&gt;         isolate-&gt;factory()-&gt;NewTypeError(
&gt;             &quot;illegal_invocation&quot;, HandleVector(&amp;function, 1));
&gt;     return isolate-&gt;Throw(*obj);
&gt;   }

This does sound like a bug. More in next reply.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>563148</commentid>
    <comment_count>7</comment_count>
    <who name="Erik Arvidsson">arv</who>
    <bug_when>2012-02-23 09:08:05 -0800</bug_when>
    <thetext>(In reply to comment #5)
&gt; It appears to me that signature check is only executed when one method is defined. Not sure if it&apos;s related to the bug.

If there are overloaded functions then the bindings check which one to call based on the type check. If there is only one, the same type check is not required.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>563813</commentid>
    <comment_count>8</comment_count>
    <who name="Hao Zheng">zhenghao</who>
    <bug_when>2012-02-23 18:43:48 -0800</bug_when>
    <thetext>(In reply to comment #7)
&gt; (In reply to comment #5)
&gt; &gt; It appears to me that signature check is only executed when one method is defined. Not sure if it&apos;s related to the bug.
&gt; 
&gt; If there are overloaded functions then the bindings check which one to call based on the type check. If there is only one, the same type check is not required.

Thanks for your explanation, Eric. Do you mean the type check in v8 builtins.cc should be skipped for non-overloaded methods? But why other non-overloaded methods doesn&apos;t throw &apos;illegal invocation&apos; error? For example, revokeObjectURLCallback doesn&apos;t have a signature.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>563817</commentid>
    <comment_count>9</comment_count>
    <who name="Erik Arvidsson">arv</who>
    <bug_when>2012-02-23 18:48:01 -0800</bug_when>
    <thetext>I think we have bugs related to overloaded static methods.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>563821</commentid>
    <comment_count>10</comment_count>
    <who name="Hao Zheng">zhenghao</who>
    <bug_when>2012-02-23 19:00:04 -0800</bug_when>
    <thetext>(In reply to comment #9)
&gt; I think we have bugs related to overloaded static methods.

Is it a v8 bug or WebKit bug? Eric, could you help on this, or add someone here?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>563826</commentid>
    <comment_count>11</comment_count>
    <who name="Hao Zheng">zhenghao</who>
    <bug_when>2012-02-23 19:05:35 -0800</bug_when>
    <thetext>(In reply to comment #9)
&gt; I think we have bugs related to overloaded static methods.

I just tested createBlobURL after removing the other definition in DOMURL.idl:

#if defined(ENABLE_MEDIA_STREAM) &amp;&amp; ENABLE_MEDIA_STREAM
        static [CallWith=ScriptExecutionContext,TreatReturnedNullStringAs=Undefined] DOMString createObjectURL(in MediaStream stream);
#endif

So there is only one static createBlobURL now. However, I still got illegal invocation error... So maybe it&apos;s not related to overloaded methods, just related to static methods. But weirdly, revokeObjectURL is also static method.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>564402</commentid>
    <comment_count>12</comment_count>
    <who name="Erik Arvidsson">arv</who>
    <bug_when>2012-02-24 09:55:54 -0800</bug_when>
    <thetext>(In reply to comment #11)
&gt; (In reply to comment #9)
&gt; &gt; I think we have bugs related to overloaded static methods.
&gt; 
&gt; I just tested createBlobURL after removing the other definition in DOMURL.idl:
&gt; 
&gt; #if defined(ENABLE_MEDIA_STREAM) &amp;&amp; ENABLE_MEDIA_STREAM
&gt;         static [CallWith=ScriptExecutionContext,TreatReturnedNullStringAs=Undefined] DOMString createObjectURL(in MediaStream stream);
&gt; #endif
&gt; 
&gt; So there is only one static createBlobURL now. However, I still got illegal invocation error... So maybe it&apos;s not related to overloaded methods, just related to static methods. But weirdly, revokeObjectURL is also static method.

Do you have a test? This passes on the LayoutTests so maybe you are doing something strange.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>564770</commentid>
    <comment_count>13</comment_count>
    <who name="Hao Zheng">zhenghao</who>
    <bug_when>2012-02-24 17:01:55 -0800</bug_when>
    <thetext>Have you disabled MEDIASTREAM? fast/files/create-blob-url-crash.html
throws error in both config, but a different one (illegal invocation)
in this config. And many other tests related to createBlobURL fail.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>589876</commentid>
    <comment_count>14</comment_count>
    <who name="Hao Zheng">zhenghao</who>
    <bug_when>2012-03-28 05:33:20 -0700</bug_when>
    <thetext>(In reply to comment #13)
&gt; Have you disabled MEDIASTREAM? fast/files/create-blob-url-crash.html
&gt; throws error in both config, but a different one (illegal invocation)
&gt; in this config. And many other tests related to createBlobURL fail.

The error is in CodeGeneratorV8.pm RequiresCustomSignature. If the function is overloaded, it returns 0 at the 2nd if. Otherwise, as Blob is wrapper type, it returns 1 at the if inside the 2nd foreach.

sub RequiresCustomSignature
{
    my $function = shift;
    # No signature needed for Custom function
    if ($function-&gt;signature-&gt;extendedAttributes-&gt;{&quot;Custom&quot;} ||
        $function-&gt;signature-&gt;extendedAttributes-&gt;{&quot;V8Custom&quot;}) {
        return 0;
    }
    # No signature needed for overloaded function
    if (@{$function-&gt;{overloads}} &gt; 1) {
        return 0;
    }
    # Type checking is performed in the generated code
    if ($function-&gt;signature-&gt;extendedAttributes-&gt;{&quot;StrictTypeChecking&quot;}) {
      return 0;
    }
    foreach my $parameter (@{$function-&gt;parameters}) {
        my $optional = $parameter-&gt;extendedAttributes-&gt;{&quot;Optional&quot;};
        if (($optional &amp;&amp; $optional ne &quot;DefaultIsUndefined&quot; &amp;&amp; $optional ne &quot;DefaultIsNullString&quot;) || $parameter-&gt;extendedAttributes-&gt;{&quot;Callback&quot;}) {
            return 0;
        }
    }

    foreach my $parameter (@{$function-&gt;parameters}) {
        if (IsWrapperType($parameter-&gt;type)) {
            return 1;
        }
    }
    return 0;
}</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>589878</commentid>
    <comment_count>15</comment_count>
    <who name="Hao Zheng">zhenghao</who>
    <bug_when>2012-03-28 05:34:47 -0700</bug_when>
    <thetext>(In reply to comment #14)
&gt; (In reply to comment #13)
&gt; &gt; Have you disabled MEDIASTREAM? fast/files/create-blob-url-crash.html
&gt; &gt; throws error in both config, but a different one (illegal invocation)
&gt; &gt; in this config. And many other tests related to createBlobURL fail.
&gt; 
&gt; The error is in CodeGeneratorV8.pm RequiresCustomSignature. If the function is overloaded, it returns 0 at the 2nd if. Otherwise, as Blob is wrapper type, it returns 1 at the if inside the 2nd foreach.
&gt; 
&gt; sub RequiresCustomSignature
&gt; {
&gt;     my $function = shift;
&gt;     # No signature needed for Custom function
&gt;     if ($function-&gt;signature-&gt;extendedAttributes-&gt;{&quot;Custom&quot;} ||
&gt;         $function-&gt;signature-&gt;extendedAttributes-&gt;{&quot;V8Custom&quot;}) {
&gt;         return 0;
&gt;     }
&gt;     # No signature needed for overloaded function
&gt;     if (@{$function-&gt;{overloads}} &gt; 1) {
&gt;         return 0;
&gt;     }
&gt;     # Type checking is performed in the generated code
&gt;     if ($function-&gt;signature-&gt;extendedAttributes-&gt;{&quot;StrictTypeChecking&quot;}) {
&gt;       return 0;
&gt;     }
&gt;     foreach my $parameter (@{$function-&gt;parameters}) {
&gt;         my $optional = $parameter-&gt;extendedAttributes-&gt;{&quot;Optional&quot;};
&gt;         if (($optional &amp;&amp; $optional ne &quot;DefaultIsUndefined&quot; &amp;&amp; $optional ne &quot;DefaultIsNullString&quot;) || $parameter-&gt;extendedAttributes-&gt;{&quot;Callback&quot;}) {
&gt;             return 0;
&gt;         }
&gt;     }
&gt; 
&gt;     foreach my $parameter (@{$function-&gt;parameters}) {
&gt;         if (IsWrapperType($parameter-&gt;type)) {
&gt;             return 1;
&gt;         }
&gt;     }
&gt;     return 0;
&gt; }

revokeObjectURL doesn&apos;t require custom signature, because DOMString is not wrapper type.

[CallWith=ScriptExecutionContext] static void revokeObjectURL(in DOMString url);</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>590908</commentid>
    <comment_count>16</comment_count>
    <who name="Hao Zheng">zhenghao</who>
    <bug_when>2012-03-29 00:30:43 -0700</bug_when>
    <thetext>OK. Now I think it&apos;s right that createBlobURL needs a custom signature. But v8 could not handle static function correctly. In builtins.cc TypeCheck:

  Object* holder = recv;
  if (!recv_type-&gt;IsUndefined()) {
    for (; holder != heap-&gt;null_value(); holder = holder-&gt;GetPrototype()) {
      if (holder-&gt;IsInstanceOf(FunctionTemplateInfo::cast(recv_type))) {
        break;
      }
    }
    if (holder == heap-&gt;null_value()) return holder;
  }

It try to verify holder is instance of recv_type. But for static function, holder is actually recv_type itself, not instance of recv_type. Thus, if we omit the step in objects-inl.h IsInstanceOf:

bool Object::IsInstanceOf(FunctionTemplateInfo* expected) {
  // There is a constraint on the object; check.
//  if (!this-&gt;IsJSObject()) return false;
  // Fetch the constructor function of the object.
//  Object* cons_obj = JSObject::cast(this)-&gt;map()-&gt;constructor();

  // Omit the above step. Use this directly.
  Object* cons_obj = this;

  if (!cons_obj-&gt;IsJSFunction()) return false;
  JSFunction* fun = JSFunction::cast(cons_obj);
  // Iterate through the chain of inheriting function templates to
  // see if the required one occurs.
  for (Object* type = fun-&gt;shared()-&gt;function_data();
       type-&gt;IsFunctionTemplateInfo();
       type = FunctionTemplateInfo::cast(type)-&gt;parent_template()) {
    if (type == expected) return true;
  }
  // Didn&apos;t find the required type in the inheritance chain.
  return false;
}

Then we can invoke the static function. I got a simple patch to v8, but I&apos;m not confident if it&apos;s correct. Erik/Adam, could you add some v8 folks here? Thanks!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>590910</commentid>
    <comment_count>17</comment_count>
      <attachid>134517</attachid>
    <who name="Hao Zheng">zhenghao</who>
    <bug_when>2012-03-29 00:32:10 -0700</bug_when>
    <thetext>Created attachment 134517
demo patch. not for review.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>590918</commentid>
    <comment_count>18</comment_count>
    <who name="Hao Zheng">zhenghao</who>
    <bug_when>2012-03-29 00:48:12 -0700</bug_when>
    <thetext>(In reply to comment #17)
&gt; Created an attachment (id=134517) [details]
&gt; demo patch. not for review.

When MEDIA_STREAM is enabled, we have overloaded createObjectURL. The bug is hidden, because no custom signature is generated. I&apos;m not sure if it&apos;s a v8 bug, or it&apos;s WebKit bug about invoking v8 incorrectly.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>592366</commentid>
    <comment_count>19</comment_count>
    <who name="Erik Arvidsson">arv</who>
    <bug_when>2012-03-30 11:59:19 -0700</bug_when>
    <thetext>(In reply to comment #18)
&gt; (In reply to comment #17)
&gt; &gt; Created an attachment (id=134517) [details] [details]
&gt; &gt; demo patch. not for review.
&gt; 
&gt; When MEDIA_STREAM is enabled, we have overloaded createObjectURL. The bug is hidden, because no custom signature is generated. I&apos;m not sure if it&apos;s a v8 bug, or it&apos;s WebKit bug about invoking v8 incorrectly.

It is a bug in the code generator.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>592785</commentid>
    <comment_count>20</comment_count>
      <attachid>134938</attachid>
    <who name="Hao Zheng">zhenghao</who>
    <bug_when>2012-03-30 21:03:30 -0700</bug_when>
    <thetext>Created attachment 134938
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>592980</commentid>
    <comment_count>21</comment_count>
      <attachid>134938</attachid>
    <who name="Kentaro Hara">haraken</who>
    <bug_when>2012-04-01 00:50:07 -0700</bug_when>
    <thetext>Comment on attachment 134938
Patch

Makes sense.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>592994</commentid>
    <comment_count>22</comment_count>
      <attachid>134938</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-04-01 01:23:48 -0700</bug_when>
    <thetext>Comment on attachment 134938
Patch

Clearing flags on attachment: 134938

Committed r112811: &lt;http://trac.webkit.org/changeset/112811&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>592995</commentid>
    <comment_count>23</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-04-01 01:23:53 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>593553</commentid>
    <comment_count>24</comment_count>
    <who name="Erik Arvidsson">arv</who>
    <bug_when>2012-04-02 09:58:30 -0700</bug_when>
    <thetext>Sorry for not replying earlier to this.

It would have been nice if you added the problematic case to one of the test idl files so we could see how the generated code changed.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>134517</attachid>
            <date>2012-03-29 00:32:10 -0700</date>
            <delta_ts>2012-03-30 21:03:15 -0700</delta_ts>
            <desc>demo patch. not for review.</desc>
            <filename>v8.patch</filename>
            <type>text/plain</type>
            <size>660</size>
            <attacher name="Hao Zheng">zhenghao</attacher>
            
              <data encoding="base64">SW5kZXg6IHNyYy9vYmplY3RzLWlubC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHNyYy9vYmplY3RzLWlubC5o
CShyZXZpc2lvbiAxMTEwMikKKysrIHNyYy9vYmplY3RzLWlubC5oCSh3b3JraW5nIGNvcHkpCkBA
IC0xNDksNyArMTQ5LDcgQEAKICAgLy8gVGhlcmUgaXMgYSBjb25zdHJhaW50IG9uIHRoZSBvYmpl
Y3Q7IGNoZWNrLgogICBpZiAoIXRoaXMtPklzSlNPYmplY3QoKSkgcmV0dXJuIGZhbHNlOwogICAv
LyBGZXRjaCB0aGUgY29uc3RydWN0b3IgZnVuY3Rpb24gb2YgdGhlIG9iamVjdC4KLSAgT2JqZWN0
KiBjb25zX29iaiA9IEpTT2JqZWN0OjpjYXN0KHRoaXMpLT5tYXAoKS0+Y29uc3RydWN0b3IoKTsK
KyAgT2JqZWN0KiBjb25zX29iaiA9IHRoaXMtPklzSlNGdW5jdGlvbigpID8gdGhpcyA6IEpTT2Jq
ZWN0OjpjYXN0KHRoaXMpLT5tYXAoKS0+Y29uc3RydWN0b3IoKTsKICAgaWYgKCFjb25zX29iai0+
SXNKU0Z1bmN0aW9uKCkpIHJldHVybiBmYWxzZTsKICAgSlNGdW5jdGlvbiogZnVuID0gSlNGdW5j
dGlvbjo6Y2FzdChjb25zX29iaik7CiAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgY2hhaW4gb2Yg
aW5oZXJpdGluZyBmdW5jdGlvbiB0ZW1wbGF0ZXMgdG8K
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>134938</attachid>
            <date>2012-03-30 21:03:30 -0700</date>
            <delta_ts>2012-04-01 01:23:48 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-79222-20120331120328.patch</filename>
            <type>text/plain</type>
            <size>1448</size>
            <attacher name="Hao Zheng">zhenghao</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTEyMjQzCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggOTg2YWNjNDlhMGM5ZGRl
ODYyNDVmMTE0NDk0NWJmNjcxMTcyYTExZi4uZWVjZjBjOThmMDQzZTQ3NDQ1ZWUwZDdjYTY5Yjgz
MjYyYzRjNmEyNiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDE1IEBACisyMDEyLTAzLTMwICBIYW8g
WmhlbmcgIDx6aGVuZ2hhb0BjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgW2Nocm9taXVtXSBEbyBu
b3QgZ2VuZXJhdGUgY3VzdG9tIHNpZ25hdHVyZSBmb3Igc3RhdGljIG1ldGhvZHMuCisgICAgICAg
IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD03OTIyMgorCisgICAgICAg
IFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIE5vIG5ldyB0ZXN0cy4gQ292
ZXJlZCBieSBleGlzdGluZyB0ZXN0cyB3aGVuIE1FRElBX1NUUkVBTSBpcyBkaXNhYmxlZC4KKwor
ICAgICAgICAqIGJpbmRpbmdzL3NjcmlwdHMvQ29kZUdlbmVyYXRvclY4LnBtOgorICAgICAgICAo
UmVxdWlyZXNDdXN0b21TaWduYXR1cmUpOgorCiAyMDEyLTAzLTI3ICBMZXZpIFdlaW50cmF1YiAg
PGxldml3QGNocm9taXVtLm9yZz4KIAogICAgICAgICBMYXlvdXRSZXBhaW50ZXI6IFJlbW92ZSB1
bnVzZWQgY29uc3RydWN0b3IgcGFyYW1ldGVyIGFuZCB1cGRhdGUgdG8gTGF5b3V0VW5pdHMKZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2JpbmRpbmdzL3NjcmlwdHMvQ29kZUdlbmVyYXRvclY4
LnBtIGIvU291cmNlL1dlYkNvcmUvYmluZGluZ3Mvc2NyaXB0cy9Db2RlR2VuZXJhdG9yVjgucG0K
aW5kZXggYmRjM2FjOTEzZTEwODk3M2IzY2Q3MDFmNTdjZDZiNzVjM2U3NTc4ZS4uYzVlZjc5OTA5
ZjMxNjk2MmRlNzRiMzEwMzI1ZjZhZDEyODU2N2IxMiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNv
cmUvYmluZGluZ3Mvc2NyaXB0cy9Db2RlR2VuZXJhdG9yVjgucG0KKysrIGIvU291cmNlL1dlYkNv
cmUvYmluZGluZ3Mvc2NyaXB0cy9Db2RlR2VuZXJhdG9yVjgucG0KQEAgLTM2MzMsNiArMzYzMyw5
IEBAIHN1YiBSZXF1aXJlc0N1c3RvbVNpZ25hdHVyZQogICAgIGlmIChAeyRmdW5jdGlvbi0+e292
ZXJsb2Fkc319ID4gMSkgewogICAgICAgICByZXR1cm4gMDsKICAgICB9CisgICAgaWYgKCRmdW5j
dGlvbi0+aXNTdGF0aWMpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogICAgICMgVHlwZSBj
aGVja2luZyBpcyBwZXJmb3JtZWQgaW4gdGhlIGdlbmVyYXRlZCBjb2RlCiAgICAgaWYgKCRmdW5j
dGlvbi0+c2lnbmF0dXJlLT5leHRlbmRlZEF0dHJpYnV0ZXMtPnsiU3RyaWN0VHlwZUNoZWNraW5n
In0pIHsKICAgICAgIHJldHVybiAwOwo=
</data>

          </attachment>
      

    </bug>

</bugzilla>