<?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>78545</bug_id>
          
          <creation_ts>2012-02-13 15:41:48 -0800</creation_ts>
          <short_desc>chromium_android.py should implement &quot;virtual&quot; methods from ChromiumPort</short_desc>
          <delta_ts>2012-02-13 17:10:54 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>New Bugs</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>78524</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Adam Barth">abarth</reporter>
          <assigned_to name="Adam Barth">abarth</assigned_to>
          <cc>dpranke</cc>
    
    <cc>eric</cc>
    
    <cc>jnd</cc>
    
    <cc>ojan</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>555685</commentid>
    <comment_count>0</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2012-02-13 15:41:48 -0800</bug_when>
    <thetext>chromium_android.py should implement &quot;virtual&quot; methods from ChromiumPort</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>555686</commentid>
    <comment_count>1</comment_count>
      <attachid>126852</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2012-02-13 15:42:46 -0800</bug_when>
    <thetext>Created attachment 126852
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>555691</commentid>
    <comment_count>2</comment_count>
      <attachid>126852</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2012-02-13 15:47:10 -0800</bug_when>
    <thetext>Comment on attachment 126852
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=126852&amp;action=review

&gt; Tools/Scripts/webkitpy/layout_tests/port/chromium_android.py:63
&gt; +    [&apos;/usr/share/doc/ttf-mscorefonts-installer/&apos;, &apos;READ_ME!.gz&apos;],

Huh?

&gt; Tools/Scripts/webkitpy/layout_tests/port/chromium_android.py:86
&gt; +    def default_child_processes(self):
&gt; +        return 1

Why?  Seems this may want to log?

&gt; Tools/Scripts/webkitpy/layout_tests/port/chromium_android.py:89
&gt; +    def baseline_search_path(self):
&gt; +        return map(self._webkit_baseline_path, self.FALLBACK_PATHS)

I&apos;m not sure if these are supposed to be absolute paths or not.

&gt; Tools/Scripts/webkitpy/layout_tests/port/chromium_android.py:96
&gt; +                _log.error(&apos;You are missing %s. Try installing msttcorefonts. &apos;
&gt; +                           &apos;See build instructions.&apos; % font_path)

nit: No real need to wrap.

&gt; Tools/Scripts/webkitpy/layout_tests/port/chromium_android.py:101
&gt; +    def check_sys_deps(self, needs_http):
&gt; +        return True

Wouldn&apos;t the font checks go here instead?

&gt; Tools/Scripts/webkitpy/layout_tests/port/chromium_android.py:104
&gt; +    def default_worker_model(self):
&gt; +        return &apos;inline&apos;

I wonder if this is right.  Dirk would know.

&gt; Tools/Scripts/webkitpy/layout_tests/port/chromium_android.py:111
&gt; +        # FIXME: This is a temporary measure to reduce the manual work when
&gt; +        # updating WebKit. This method should be removed when we merge
&gt; +        # test_expectations_android.txt into test_expectations.txt.

We assume this hasn&apos;t been done yet?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>555695</commentid>
    <comment_count>3</comment_count>
      <attachid>126852</attachid>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2012-02-13 15:52:00 -0800</bug_when>
    <thetext>Comment on attachment 126852
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=126852&amp;action=review

There should probably be a chromium_unittest.py file as well; a skeleton that just subclasses port_testcase should be sufficient to get coverage.

&gt; Tools/Scripts/webkitpy/layout_tests/port/chromium_android.py:71
&gt;      port_name = &apos;chromium-android&apos;

Are we going to be assuming that &apos;android&apos; is a new &quot;operating system&quot; value (like linux/win/mac)? If not, &apos;chromium_android&apos; might be a better name (much like we have google_chrome or chromium_gpu, to indicate that the implementation differs in ways other than just by operating system).

&gt; Tools/Scripts/webkitpy/layout_tests/port/chromium_android.py:116
&gt; +        # This method is called by dump_render_tree_thread.py before testing

Nit: there is no dump_render_tree_thread.py any more; presumably you mean manager.py, but you could probably omit this sentence completely and still get the point across, e.g., &apos;we use an http server that is always running during tests&apos;.

That said, I&apos;m curious ... do chromium/android devs ever run these tests locally and/or interactively, and if so, how is the http server run then?

&gt; Tools/Scripts/webkitpy/layout_tests/port/chromium_android.py:125
&gt; +    def start_helper(self):

Nit: is this actually needed? if not, you could probably remove the FIXME and just note that it isn&apos;t.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>555696</commentid>
    <comment_count>4</comment_count>
      <attachid>126852</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2012-02-13 15:52:41 -0800</bug_when>
    <thetext>Comment on attachment 126852
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=126852&amp;action=review

&gt;&gt; Tools/Scripts/webkitpy/layout_tests/port/chromium_android.py:63
&gt;&gt; +    [&apos;/usr/share/doc/ttf-mscorefonts-installer/&apos;, &apos;READ_ME!.gz&apos;],
&gt; 
&gt; Huh?

Presumably this is to check that you&apos;ve accepted the EULA.

&gt;&gt; Tools/Scripts/webkitpy/layout_tests/port/chromium_android.py:86
&gt;&gt; +        return 1
&gt; 
&gt; Why?  Seems this may want to log?

The tests run on the target device.  Using multiple proceses in the host probably isn&apos;t helpful.  We can add a comment to that effect if you like.

&gt;&gt; Tools/Scripts/webkitpy/layout_tests/port/chromium_android.py:89
&gt;&gt; +        return map(self._webkit_baseline_path, self.FALLBACK_PATHS)
&gt; 
&gt; I&apos;m not sure if these are supposed to be absolute paths or not.

This is the same idiom that the other ports use.

&gt;&gt; Tools/Scripts/webkitpy/layout_tests/port/chromium_android.py:96
&gt;&gt; +                           &apos;See build instructions.&apos; % font_path)
&gt; 
&gt; nit: No real need to wrap.

Fixed.

&gt;&gt; Tools/Scripts/webkitpy/layout_tests/port/chromium_android.py:101
&gt;&gt; +        return True
&gt; 
&gt; Wouldn&apos;t the font checks go here instead?

Yeah, I think we can move them here.

&gt;&gt; Tools/Scripts/webkitpy/layout_tests/port/chromium_android.py:104
&gt;&gt; +        return &apos;inline&apos;
&gt; 
&gt; I wonder if this is right.  Dirk would know.

It just means that we don&apos;t use multiple threads.

&gt;&gt; Tools/Scripts/webkitpy/layout_tests/port/chromium_android.py:111
&gt;&gt; +        # test_expectations_android.txt into test_expectations.txt.
&gt; 
&gt; We assume this hasn&apos;t been done yet?

Correct.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>555700</commentid>
    <comment_count>5</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2012-02-13 15:56:51 -0800</bug_when>
    <thetext>(In reply to comment #3)
&gt; (From update of attachment 126852 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=126852&amp;action=review
&gt; 
&gt; There should probably be a chromium_unittest.py file as well; a skeleton that just subclasses port_testcase should be sufficient to get coverage.

Will do.

&gt; &gt; Tools/Scripts/webkitpy/layout_tests/port/chromium_android.py:71
&gt; &gt;      port_name = &apos;chromium-android&apos;
&gt; 
&gt; Are we going to be assuming that &apos;android&apos; is a new &quot;operating system&quot; value (like linux/win/mac)? If not, &apos;chromium_android&apos; might be a better name (much like we have google_chrome or chromium_gpu, to indicate that the implementation differs in ways other than just by operating system).

Android is a new operating system.  It&apos;s PLATFORM(CHROMIUM) and OS(ANDROID).

&gt; &gt; Tools/Scripts/webkitpy/layout_tests/port/chromium_android.py:116
&gt; &gt; +        # This method is called by dump_render_tree_thread.py before testing
&gt; 
&gt; Nit: there is no dump_render_tree_thread.py any more; presumably you mean manager.py, but you could probably omit this sentence completely and still get the point across, e.g., &apos;we use an http server that is always running during tests&apos;.

Fixed.

&gt; That said, I&apos;m curious ... do chromium/android devs ever run these tests locally and/or interactively, and if so, how is the http server run then?

It&apos;s started in start_helper, which I haven&apos;t uploaded yet.

&gt; &gt; Tools/Scripts/webkitpy/layout_tests/port/chromium_android.py:125
&gt; &gt; +    def start_helper(self):
&gt; 
&gt; Nit: is this actually needed? if not, you could probably remove the FIXME and just note that it isn&apos;t.

I&apos;ll fill it in in the next patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>555702</commentid>
    <comment_count>6</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2012-02-13 15:59:37 -0800</bug_when>
    <thetext>(In reply to comment #4)
&gt; &gt;&gt; Tools/Scripts/webkitpy/layout_tests/port/chromium_android.py:86
&gt; &gt;&gt; +        return 1
&gt; &gt; 
&gt; &gt; Why?  Seems this may want to log?
&gt; 
&gt; The tests run on the target device.  Using multiple proceses in the host probably isn&apos;t helpful.  We can add a comment to that effect if you like.
&gt;

One wonders if there could be some way to run multiple targets for a single host.
 
&gt; &gt;&gt; Tools/Scripts/webkitpy/layout_tests/port/chromium_android.py:89
&gt; &gt;&gt; +        return map(self._webkit_baseline_path, self.FALLBACK_PATHS)
&gt; &gt; 
&gt; &gt; I&apos;m not sure if these are supposed to be absolute paths or not.
&gt; 
&gt; This is the same idiom that the other ports use.
&gt; 

webkit_baseline_path maps basenames to absolute paths.

&gt; &gt;&gt; Tools/Scripts/webkitpy/layout_tests/port/chromium_android.py:101
&gt; &gt;&gt; +        return True
&gt; &gt; 
&gt; &gt; Wouldn&apos;t the font checks go here instead?
&gt; 
&gt; Yeah, I think we can move them here.
&gt;

Eric is right; this would be a slightly better place.
 
&gt; &gt;&gt; Tools/Scripts/webkitpy/layout_tests/port/chromium_android.py:104
&gt; &gt;&gt; +        return &apos;inline&apos;
&gt; &gt; 
&gt; &gt; I wonder if this is right.  Dirk would know.
&gt; 
&gt; It just means that we don&apos;t use multiple threads.
&gt;

Not exactly. &apos;inline&apos; actually uses a single python process for both manager and worker and hence means you *can&apos;t* run multiple threads; You could have &apos;processes&apos; and still only use run one test at a time (this used to be useful when we had the wedge-detection code, but isn&apos;t really helpful anymore).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>555715</commentid>
    <comment_count>7</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2012-02-13 16:09:36 -0800</bug_when>
    <thetext>(In reply to comment #5)
&gt; &gt; Are we going to be assuming that &apos;android&apos; is a new &quot;operating system&quot; value (like linux/win/mac)? If not, &apos;chromium_android&apos; might be a better name (much like we have google_chrome or chromium_gpu, to indicate that the implementation differs in ways other than just by operating system).
&gt; 
&gt; Android is a new operating system.  It&apos;s PLATFORM(CHROMIUM) and OS(ANDROID).
&gt; 

I don&apos;t think I asked the right question; I was more thinking of the implications in the python code, which is more along the lines of the &apos;host&apos; o/s rather than the &apos;target&apos; o/s. 

First case where it matters: if you were to say &quot;run-webkit-tests --chromium&quot;, normally we would figure out which version of the port to use based on the platforminfo value - which is the host value. Would we ever want/need a way for that to return &apos;android&apos;, or will we always expect the user/bot to use &apos;--platform chromium-android instead&apos;? Would it make sense to have a set-webkit-configuration setting to indicate that we should default to android instead of regular linux (or something)?

The second case: what does port.operating_system() return? Here, I think the answer should clearly be &apos;android&apos;, just as a chromium-mac port will always return &apos;mac&apos; regardless of what port it was actually created on.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>555721</commentid>
    <comment_count>8</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2012-02-13 16:12:38 -0800</bug_when>
    <thetext>&gt; First case where it matters: if you were to say &quot;run-webkit-tests --chromium&quot;, normally we would figure out which version of the port to use based on the platforminfo value - which is the host value. Would we ever want/need a way for that to return &apos;android&apos;, or will we always expect the user/bot to use &apos;--platform chromium-android instead&apos;?

Downstream has a hack where they look at some environment variables, but I think just passing --platform=chromium-android is better.

&gt; Would it make sense to have a set-webkit-configuration setting to indicate that we should default to android instead of regular linux (or something)?

That sounds like an optimization that we can worry about later.

&gt; The second case: what does port.operating_system() return? Here, I think the answer should clearly be &apos;android&apos;, just as a chromium-mac port will always return &apos;mac&apos; regardless of what port it was actually created on.

Correct.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>555722</commentid>
    <comment_count>9</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2012-02-13 16:14:03 -0800</bug_when>
    <thetext>&gt; &gt; There should probably be a chromium_unittest.py file as well; a skeleton that just subclasses port_testcase should be sufficient to get coverage.
&gt; 
&gt; Will do.

There are some complications, which I&apos;ll handle in a follow-up patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>555729</commentid>
    <comment_count>10</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2012-02-13 16:16:19 -0800</bug_when>
    <thetext>Committed r107634: &lt;http://trac.webkit.org/changeset/107634&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>555735</commentid>
    <comment_count>11</comment_count>
      <attachid>126852</attachid>
    <who name="Johnny(Jianning) Ding">jnd</who>
    <bug_when>2012-02-13 16:30:05 -0800</bug_when>
    <thetext>Comment on attachment 126852
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=126852&amp;action=review

&gt;&gt;&gt; Tools/Scripts/webkitpy/layout_tests/port/chromium_android.py:116
&gt;&gt;&gt; +        # This method is called by dump_render_tree_thread.py before testing
&gt;&gt; 
&gt;&gt; Nit: there is no dump_render_tree_thread.py any more; presumably you mean manager.py, but you could probably omit this sentence completely and still get the point across, e.g., &apos;we use an http server that is always running during tests&apos;.
&gt;&gt; 
&gt;&gt; That said, I&apos;m curious ... do chromium/android devs ever run these tests locally and/or interactively, and if so, how is the http server run then?
&gt; 
&gt; Fixed.

For chromium/android, the http server is running on the host, the DRT binary is running on the device, we actually forward the device ports (8000 and other ports for test) to the host to make it work.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>555742</commentid>
    <comment_count>12</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2012-02-13 16:34:00 -0800</bug_when>
    <thetext>(In reply to comment #11)
&gt; (From update of attachment 126852 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=126852&amp;action=review
&gt; 
&gt; &gt;&gt;&gt; Tools/Scripts/webkitpy/layout_tests/port/chromium_android.py:116
&gt; &gt;&gt;&gt; +        # This method is called by dump_render_tree_thread.py before testing
&gt; &gt;&gt; 
&gt; &gt;&gt; Nit: there is no dump_render_tree_thread.py any more; presumably you mean manager.py, but you could probably omit this sentence completely and still get the point across, e.g., &apos;we use an http server that is always running during tests&apos;.
&gt; &gt;&gt; 
&gt; &gt;&gt; That said, I&apos;m curious ... do chromium/android devs ever run these tests locally and/or interactively, and if so, how is the http server run then?
&gt; &gt; 
&gt; &gt; Fixed.
&gt; 
&gt; For chromium/android, the http server is running on the host, the DRT binary is running on the device, we actually forward the device ports (8000 and other ports for test) to the host to make it work.

Normally new-run-webkit-tests starts and stops the http server on the host, so wouldn&apos;t you want to just use the default implementation, then? This code doesn&apos;t have to mean that you&apos;d start and stop a server on the device itself ...</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>555763</commentid>
    <comment_count>13</comment_count>
    <who name="Johnny(Jianning) Ding">jnd</who>
    <bug_when>2012-02-13 16:49:46 -0800</bug_when>
    <thetext>(In reply to comment #12)

&gt; Normally new-run-webkit-tests starts and stops the http server on the host, so wouldn&apos;t you want to just use the default implementation, then? This code doesn&apos;t have to mean that you&apos;d start and stop a server on the device itself ...

For other platforms, the http server is running as required. (It&apos;s only launched for http/https test, at least last time I checked). However for Chromium/Android, due to the huge data size and slow speed to push the data to device, we actually leave all data on the host and launch the http server tp host the data during the whole test period. That means all data the DRT accesses are from the HTTP server on the host on layout tests for Android.
For most tests which are assumed to access via file protocol, we have a feature called &apos;file over http&apos; to convert the file request to http request and convert the http response to file response.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>555765</commentid>
    <comment_count>14</comment_count>
    <who name="Johnny(Jianning) Ding">jnd</who>
    <bug_when>2012-02-13 16:51:21 -0800</bug_when>
    <thetext>(In reply to comment #13)
&gt; (In reply to comment #12)
&gt; 
&gt; &gt; Normally new-run-webkit-tests starts and stops the http server on the host, so wouldn&apos;t you want to just use the default implementation, then? This code doesn&apos;t have to mean that you&apos;d start and stop a server on the device itself ...
&gt; 
&gt; For other platforms, the http server is running as required. (It&apos;s only launched for http/https test, at least last time I checked). However for Chromium/Android, due to the huge data size and slow speed to push the data to device, we actually leave all data on the host and launch the http server tp host the data during the whole test period. That means all data the DRT accesses are from the HTTP server on the host on layout tests for Android.
&gt; For most tests which are assumed to access via file protocol, we have a feature called &apos;file over http&apos; to convert the file request to http request and convert the http response to file response.

That is why we bypass the default start/stop_http_server routines because we want to keep it during the whole test.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>555772</commentid>
    <comment_count>15</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2012-02-13 16:57:36 -0800</bug_when>
    <thetext>(In reply to comment #13)
&gt; For other platforms, the http server is running as required. (It&apos;s only launched for http/https test, at least last time I checked). However for Chromium/Android, due to the huge data size and slow speed to push the data to device, we actually leave all data on the host and launch the http server tp host the data during the whole test period. That means all data the DRT accesses are from the HTTP server on the host on layout tests for Android.
&gt; For most tests which are assumed to access via file protocol, we have a feature called &apos;file over http&apos; to convert the file request to http request and convert the http response to file response.

Ah, gotcha. I&apos;ve always imagined this would be how you would run tests on a target device :). Curious ... have you ever checked how many of the tests would fail if you just ran them over HTTP directly without the &apos;file over http&apos; proxying?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>555783</commentid>
    <comment_count>16</comment_count>
    <who name="Johnny(Jianning) Ding">jnd</who>
    <bug_when>2012-02-13 17:10:54 -0800</bug_when>
    <thetext>(In reply to comment #15)
&gt; Ah, gotcha. I&apos;ve always imagined this would be how you would run tests on a target device :). Curious ... have you ever checked how many of the tests would fail if you just ran them over HTTP directly without the &apos;file over http&apos; proxying?

The tests which expect the file protocol (some of them explicitly check protocol scheme) are definitely failed. Besides that, less than hundred failed if I remembered correctly, forgot the detailed number now. But I think using &apos;file over http&apos; on Chromium/Android can make it complied with other webkit ports</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>126852</attachid>
            <date>2012-02-13 15:42:46 -0800</date>
            <delta_ts>2012-02-13 16:30:05 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-78545-20120213154254.patch</filename>
            <type>text/plain</type>
            <size>5606</size>
            <attacher name="Adam Barth">abarth</attacher>
            
              <data encoding="base64">SW5kZXg6IFRvb2xzL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9DaGFuZ2VMb2cJKHJl
dmlzaW9uIDEwNzYyNikKKysrIFRvb2xzL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwz
ICsxLDI3IEBACisyMDEyLTAyLTEzICBBZGFtIEJhcnRoICA8YWJhcnRoQHdlYmtpdC5vcmc+CisK
KyAgICAgICAgY2hyb21pdW1fYW5kcm9pZC5weSBzaG91bGQgaW1wbGVtZW50ICJ2aXJ0dWFsIiBt
ZXRob2RzIGZyb20gQ2hyb21pdW1Qb3J0CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3Jn
L3Nob3dfYnVnLmNnaT9pZD03ODU0NQorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgIFRoaXMgcGF0Y2ggYWRkcyBiYXNpYyBpbXBsZW1lbnRhdGlvbnMgdGhh
dCBzcGVjaWFsaXplIGEgYnVuY2ggb2YKKyAgICAgICAgZnVuY3Rpb25zIGZyb20gQ2hyb21pdW1Q
b3J0LgorCisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC9jaHJv
bWl1bV9hbmRyb2lkLnB5OgorICAgICAgICAoQ2hyb21pdW1BbmRyb2lkUG9ydCk6CisgICAgICAg
IChDaHJvbWl1bUFuZHJvaWRQb3J0Ll9faW5pdF9fKToKKyAgICAgICAgKENocm9taXVtQW5kcm9p
ZFBvcnQuZGVmYXVsdF9jaGlsZF9wcm9jZXNzZXMpOgorICAgICAgICAoQ2hyb21pdW1BbmRyb2lk
UG9ydC5iYXNlbGluZV9zZWFyY2hfcGF0aCk6CisgICAgICAgIChDaHJvbWl1bUFuZHJvaWRQb3J0
LmNoZWNrX2J1aWxkKToKKyAgICAgICAgKENocm9taXVtQW5kcm9pZFBvcnQuY2hlY2tfc3lzX2Rl
cHMpOgorICAgICAgICAoQ2hyb21pdW1BbmRyb2lkUG9ydC5kZWZhdWx0X3dvcmtlcl9tb2RlbCk6
CisgICAgICAgIChDaHJvbWl1bUFuZHJvaWRQb3J0LnRlc3RfZXhwZWN0YXRpb25zKToKKyAgICAg
ICAgKENocm9taXVtQW5kcm9pZFBvcnQuc3RhcnRfaHR0cF9zZXJ2ZXIpOgorICAgICAgICAoQ2hy
b21pdW1BbmRyb2lkUG9ydC5zdG9wX2h0dHBfc2VydmVyKToKKyAgICAgICAgKENocm9taXVtQW5k
cm9pZFBvcnQuc3RhcnRfaGVscGVyKToKKyAgICAgICAgKENocm9taXVtQW5kcm9pZFBvcnQuc3Rv
cF9oZWxwZXIpOgorCiAyMDEyLTAyLTEzICBBZGFtIEJhcnRoICA8YWJhcnRoQHdlYmtpdC5vcmc+
CiAKICAgICAgICAgQWRkIGEgc2tlbGV0b24gQ2hyb21pdW1BbmRyb2lkIHBvcnQgdG8gd2Via2l0
cHkKSW5kZXg6IFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvY2hyb21p
dW1fYW5kcm9pZC5weQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91
dF90ZXN0cy9wb3J0L2Nocm9taXVtX2FuZHJvaWQucHkJKHJldmlzaW9uIDEwNzYyMCkKKysrIFRv
b2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvY2hyb21pdW1fYW5kcm9pZC5w
eQkod29ya2luZyBjb3B5KQpAQCAtMjgsOSArMjgsMTA0IEBACiAKIGZyb20gd2Via2l0cHkubGF5
b3V0X3Rlc3RzLnBvcnQgaW1wb3J0IGNocm9taXVtCiAKK01TX1RSVUVUWVBFX0ZPTlRTX0RJUiA9
ICcvdXNyL3NoYXJlL2ZvbnRzL3RydWV0eXBlL21zdHRjb3JlZm9udHMvJworCisjIExpc3Qgb2Yg
Zm9udHMgdGhhdCBsYXlvdXQgdGVzdHMgZXhwZWN0LCBjb3BpZWQgZnJvbSBEdW1wUmVuZGVyVHJl
ZS9ndGsvVGVzdFNoZWxsR3RrLmNwcC4KK0hPU1RfRk9OVF9GSUxFUyA9IFsKKyAgICBbTVNfVFJV
RVRZUEVfRk9OVFNfRElSLCAnQXJpYWwudHRmJ10sCisgICAgW01TX1RSVUVUWVBFX0ZPTlRTX0RJ
UiwgJ0FyaWFsX0JvbGQudHRmJ10sCisgICAgW01TX1RSVUVUWVBFX0ZPTlRTX0RJUiwgJ0FyaWFs
X0JvbGRfSXRhbGljLnR0ZiddLAorICAgIFtNU19UUlVFVFlQRV9GT05UU19ESVIsICdBcmlhbF9J
dGFsaWMudHRmJ10sCisgICAgW01TX1RSVUVUWVBFX0ZPTlRTX0RJUiwgJ0NvbWljX1NhbnNfTVMu
dHRmJ10sCisgICAgW01TX1RSVUVUWVBFX0ZPTlRTX0RJUiwgJ0NvbWljX1NhbnNfTVNfQm9sZC50
dGYnXSwKKyAgICBbTVNfVFJVRVRZUEVfRk9OVFNfRElSLCAnQ291cmllcl9OZXcudHRmJ10sCisg
ICAgW01TX1RSVUVUWVBFX0ZPTlRTX0RJUiwgJ0NvdXJpZXJfTmV3X0JvbGQudHRmJ10sCisgICAg
W01TX1RSVUVUWVBFX0ZPTlRTX0RJUiwgJ0NvdXJpZXJfTmV3X0JvbGRfSXRhbGljLnR0ZiddLAor
ICAgIFtNU19UUlVFVFlQRV9GT05UU19ESVIsICdDb3VyaWVyX05ld19JdGFsaWMudHRmJ10sCisg
ICAgW01TX1RSVUVUWVBFX0ZPTlRTX0RJUiwgJ0dlb3JnaWEudHRmJ10sCisgICAgW01TX1RSVUVU
WVBFX0ZPTlRTX0RJUiwgJ0dlb3JnaWFfQm9sZC50dGYnXSwKKyAgICBbTVNfVFJVRVRZUEVfRk9O
VFNfRElSLCAnR2VvcmdpYV9Cb2xkX0l0YWxpYy50dGYnXSwKKyAgICBbTVNfVFJVRVRZUEVfRk9O
VFNfRElSLCAnR2VvcmdpYV9JdGFsaWMudHRmJ10sCisgICAgW01TX1RSVUVUWVBFX0ZPTlRTX0RJ
UiwgJ0ltcGFjdC50dGYnXSwKKyAgICBbTVNfVFJVRVRZUEVfRk9OVFNfRElSLCAnVHJlYnVjaGV0
X01TLnR0ZiddLAorICAgIFtNU19UUlVFVFlQRV9GT05UU19ESVIsICdUcmVidWNoZXRfTVNfQm9s
ZC50dGYnXSwKKyAgICBbTVNfVFJVRVRZUEVfRk9OVFNfRElSLCAnVHJlYnVjaGV0X01TX0JvbGRf
SXRhbGljLnR0ZiddLAorICAgIFtNU19UUlVFVFlQRV9GT05UU19ESVIsICdUcmVidWNoZXRfTVNf
SXRhbGljLnR0ZiddLAorICAgIFtNU19UUlVFVFlQRV9GT05UU19ESVIsICdUaW1lc19OZXdfUm9t
YW4udHRmJ10sCisgICAgW01TX1RSVUVUWVBFX0ZPTlRTX0RJUiwgJ1RpbWVzX05ld19Sb21hbl9C
b2xkLnR0ZiddLAorICAgIFtNU19UUlVFVFlQRV9GT05UU19ESVIsICdUaW1lc19OZXdfUm9tYW5f
Qm9sZF9JdGFsaWMudHRmJ10sCisgICAgW01TX1RSVUVUWVBFX0ZPTlRTX0RJUiwgJ1RpbWVzX05l
d19Sb21hbl9JdGFsaWMudHRmJ10sCisgICAgW01TX1RSVUVUWVBFX0ZPTlRTX0RJUiwgJ1ZlcmRh
bmEudHRmJ10sCisgICAgW01TX1RSVUVUWVBFX0ZPTlRTX0RJUiwgJ1ZlcmRhbmFfQm9sZC50dGYn
XSwKKyAgICBbTVNfVFJVRVRZUEVfRk9OVFNfRElSLCAnVmVyZGFuYV9Cb2xkX0l0YWxpYy50dGYn
XSwKKyAgICBbTVNfVFJVRVRZUEVfRk9OVFNfRElSLCAnVmVyZGFuYV9JdGFsaWMudHRmJ10sCisg
ICAgIyBUaGUgTWljcm9zb2Z0IGZvbnQgRVVMQQorICAgIFsnL3Vzci9zaGFyZS9kb2MvdHRmLW1z
Y29yZWZvbnRzLWluc3RhbGxlci8nLCAnUkVBRF9NRSEuZ3onXSwKKyAgICBbJy91c3Ivc2hhcmUv
Zm9udHMvdHJ1ZXR5cGUvdHRmLWRlamF2dS8nLCAnRGVqYVZ1U2Fucy50dGYnXSwKK10KKyMgU2hv
dWxkIGluY3JlYXNlIHRoaXMgdmVyc2lvbiBhZnRlciBjaGFuZ2luZyBIT1NUX0ZPTlRfRklMRVMu
CitGT05UX0ZJTEVTX1ZFUlNJT04gPSAxCisKIAogY2xhc3MgQ2hyb21pdW1BbmRyb2lkUG9ydChj
aHJvbWl1bS5DaHJvbWl1bVBvcnQpOgogICAgIHBvcnRfbmFtZSA9ICdjaHJvbWl1bS1hbmRyb2lk
JwogCisgICAgRkFMTEJBQ0tfUEFUSFMgPSBbCisgICAgICAgICdjaHJvbWl1bS1hbmRyb2lkJywK
KyAgICAgICAgJ2Nocm9taXVtLWxpbnV4JywKKyAgICAgICAgJ2Nocm9taXVtLXdpbicsCisgICAg
ICAgICdjaHJvbWl1bScsCisgICAgICAgICd3aW4nLAorICAgICAgICAnbWFjJywKKyAgICBdCisK
ICAgICBkZWYgX19pbml0X18oc2VsZiwgaG9zdCwgcG9ydF9uYW1lLCAqKmt3YXJncyk6CiAgICAg
ICAgIHBhc3MKKworICAgIGRlZiBkZWZhdWx0X2NoaWxkX3Byb2Nlc3NlcyhzZWxmKToKKyAgICAg
ICAgcmV0dXJuIDEKKworICAgIGRlZiBiYXNlbGluZV9zZWFyY2hfcGF0aChzZWxmKToKKyAgICAg
ICAgcmV0dXJuIG1hcChzZWxmLl93ZWJraXRfYmFzZWxpbmVfcGF0aCwgc2VsZi5GQUxMQkFDS19Q
QVRIUykKKworICAgIGRlZiBjaGVja19idWlsZChzZWxmLCBuZWVkc19odHRwKToKKyAgICAgICAg
Zm9yIChmb250X2RpciwgZm9udF9maWxlKSBpbiBIT1NUX0ZPTlRfRklMRVM6CisgICAgICAgICAg
ICBmb250X3BhdGggPSBmb250X2RpciArIGZvbnRfZmlsZQorICAgICAgICAgICAgaWYgbm90IHNl
bGYuX2NoZWNrX2ZpbGVfZXhpc3RzKGZvbnRfcGF0aCwgJ2ZvbnQgZmlsZScpOgorICAgICAgICAg
ICAgICAgIF9sb2cuZXJyb3IoJ1lvdSBhcmUgbWlzc2luZyAlcy4gVHJ5IGluc3RhbGxpbmcgbXN0
dGNvcmVmb250cy4gJworICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1NlZSBidWlsZCBpbnN0
cnVjdGlvbnMuJyAlIGZvbnRfcGF0aCkKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAg
ICAgICAgcmV0dXJuIHNlbGYuX2hvc3RfcG9ydC5jaGVja19idWlsZChuZWVkc19odHRwKQorCisg
ICAgZGVmIGNoZWNrX3N5c19kZXBzKHNlbGYsIG5lZWRzX2h0dHApOgorICAgICAgICByZXR1cm4g
VHJ1ZQorCisgICAgZGVmIGRlZmF1bHRfd29ya2VyX21vZGVsKHNlbGYpOgorICAgICAgICByZXR1
cm4gJ2lubGluZScKKworICAgIGRlZiB0ZXN0X2V4cGVjdGF0aW9ucyhzZWxmKToKKyAgICAgICAg
IyBBdXRvbWF0aWNhbGx5IGFwcGx5IGFsbCBleHBlY3RhdGlvbiBydWxlcyBvZiBjaHJvbWl1bS1s
aW51eCB0bworICAgICAgICAjIGNocm9taXVtLWFuZHJvaWQuCisgICAgICAgICMgRklYTUU6IFRo
aXMgaXMgYSB0ZW1wb3JhcnkgbWVhc3VyZSB0byByZWR1Y2UgdGhlIG1hbnVhbCB3b3JrIHdoZW4K
KyAgICAgICAgIyB1cGRhdGluZyBXZWJLaXQuIFRoaXMgbWV0aG9kIHNob3VsZCBiZSByZW1vdmVk
IHdoZW4gd2UgbWVyZ2UKKyAgICAgICAgIyB0ZXN0X2V4cGVjdGF0aW9uc19hbmRyb2lkLnR4dCBp
bnRvIHRlc3RfZXhwZWN0YXRpb25zLnR4dC4KKyAgICAgICAgZXhwZWN0YXRpb25zID0gY2hyb21p
dW0uQ2hyb21pdW1Qb3J0LnRlc3RfZXhwZWN0YXRpb25zKHNlbGYpCisgICAgICAgIHJldHVybiBl
eHBlY3RhdGlvbnMucmVwbGFjZSgnTElOVVggJywgJ0xJTlVYIEFORFJPSUQgJykKKworICAgIGRl
ZiBzdGFydF9odHRwX3NlcnZlcihzZWxmLCBhZGRpdGlvbmFsX2RpcnM9Tm9uZSk6CisgICAgICAg
ICMgVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IGR1bXBfcmVuZGVyX3RyZWVfdGhyZWFkLnB5IGJl
Zm9yZSB0ZXN0aW5nCisgICAgICAgICMgaHR0cCBhbmQgd2Vic29ja2V0IHRlc3RzLiBIb3dldmVy
LCBvdXIgaHR0cCBzZXJ2ZXIgcnVucyBkdXJpbmcgdGhlCisgICAgICAgICMgd2hvbGUgdGVzdGlu
ZyBwZXJpb2QsIHNvIGlnbm9yZSB0aGlzIGNhbGwuCisgICAgICAgIHBhc3MKKworICAgIGRlZiBz
dG9wX2h0dHBfc2VydmVyKHNlbGYpOgorICAgICAgICAjIFNhbWUgYXMgc3RhcnRfaHR0cF9zZXJ2
ZXIoKS4KKyAgICAgICAgcGFzcworCisgICAgZGVmIHN0YXJ0X2hlbHBlcihzZWxmKToKKyAgICAg
ICAgIyBGSVhNRTogTm90IGltcGxlbWVudGVkICh5ZXQhKQorICAgICAgICBwYXNzCisKKyAgICBk
ZWYgc3RvcF9oZWxwZXIoc2VsZik6CisgICAgICAgICMgRklYTUU6IE5vdCBpbXBsZW1lbnRlZCAo
eWV0ISkKKyAgICAgICAgcGFzcwo=
</data>
<flag name="review"
          id="128800"
          type_id="1"
          status="+"
          setter="dpranke"
    />
          </attachment>
      

    </bug>

</bugzilla>