<?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>67415</bug_id>
          
          <creation_ts>2011-09-01 10:03:51 -0700</creation_ts>
          <short_desc>Text drawn via -webkit-background-clip:text is blurry at device scale factors &gt;1.0</short_desc>
          <delta_ts>2011-09-22 11:02:56 -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>Layout and Rendering</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Mac (Intel)</rep_platform>
          <op_sys>OS X 10.7</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc>data:text/html,%3Cspan%20style=%22background-color:red;%20-webkit-background-clip:text;%20-webkit-text-fill-color:transparent%22%3EThis%20text%20should%20be%20nice%20and%20sharp</bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Adam Roben (:aroben)">aroben</reporter>
          <assigned_to name="Beth Dakin">bdakin</assigned_to>
          <cc>bdakin</cc>
    
    <cc>darin</cc>
    
    <cc>hyatt</cc>
    
    <cc>mdelaney7</cc>
    
    <cc>simon.fraser</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>460544</commentid>
    <comment_count>0</comment_count>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2011-09-01 10:03:51 -0700</bug_when>
    <thetext>To reproduce:

1. On a display with a device scale factor &gt;1.0, go to data:text/html,%3Cspan%20style=%22background-color:red;%20-webkit-background-clip:text;%20-webkit-text-fill-color:transparent%22%3EThis%20text%20should%20be%20nice%20and%20sharp

The text looks blurry. It should be sharp instead!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>460545</commentid>
    <comment_count>1</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2011-09-01 10:04:11 -0700</bug_when>
    <thetext>&lt;rdar://problem/10060379&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>460546</commentid>
    <comment_count>2</comment_count>
      <attachid>105984</attachid>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2011-09-01 10:04:45 -0700</bug_when>
    <thetext>Created attachment 105984
screenshot</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>461242</commentid>
    <comment_count>3</comment_count>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2011-09-02 08:53:17 -0700</bug_when>
    <thetext>This may be a problem everywhere we use ImageBuffers.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>471269</commentid>
    <comment_count>4</comment_count>
      <attachid>108254</attachid>
    <who name="Beth Dakin">bdakin</who>
    <bug_when>2011-09-21 16:51:05 -0700</bug_when>
    <thetext>Created attachment 108254
Patch

We might want to consider baking the scale factor stuff into the ImageBuffer class. This patch doesn&apos;t do that…instead all of the scale factor logic is in RenderBoxModelObject. I still haven&apos;t fully wrapped my head around how useful this would be to ImageBuffers in general, so I kept it specific to text clipping at the time. Anyway, input is of course encouraged.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>471277</commentid>
    <comment_count>5</comment_count>
      <attachid>108254</attachid>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2011-09-21 16:59:56 -0700</bug_when>
    <thetext>Comment on attachment 108254
Patch

Yeah, i wonder if we could pass a scale factor into ImageBuffer::create(), and it would make a larger buffer, and set the context scale.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>471279</commentid>
    <comment_count>6</comment_count>
      <attachid>108254</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2011-09-21 17:01:13 -0700</bug_when>
    <thetext>Comment on attachment 108254
Patch

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

r=me as is even though I have some suggestions for improvement

Is there a good way to make a test for this?

&gt; Source/WebCore/rendering/RenderBoxModelObject.cpp:692
&gt; +        float deviceScaleFactor = Page::deviceScaleFactor(frame());

I’m surprised we made this helper a Page static member, even though I think I possibly suggested putting it in Page.h. I think it could instead just be a namespace-level function that takes a Frame*.

&gt; Source/WebCore/rendering/RenderBoxModelObject.cpp:705
&gt; +        // To create a mask image of the appropriate resolution, we need to scale maskRect&apos;s size
&gt; +        // by the device scale factor.
&gt; +        float deviceScaleFactor = Page::deviceScaleFactor(frame());
&gt; +        IntSize scaledMaskSize = maskRect.size();
&gt; +        scaledMaskSize.scale(deviceScaleFactor);
&gt;          
&gt;          // Now create the mask.
&gt; -        OwnPtr&lt;ImageBuffer&gt; maskImage = ImageBuffer::create(maskRect.size());
&gt; +        OwnPtr&lt;ImageBuffer&gt; maskImage = ImageBuffer::create(scaledMaskSize);
&gt;          if (!maskImage)
&gt;              return;
&gt;          
&gt;          GraphicsContext* maskImageContext = maskImage-&gt;context();
&gt; +
&gt; +        // Scale the whole context by the device scale factor so that all of the clips set up at 
&gt; +        // the appropriate size.
&gt; +        maskImageContext-&gt;scale(FloatSize(deviceScaleFactor, deviceScaleFactor));

It seems to me that without adding a feature to ImageBuffer where it knows its scale factor, we could create a single helper function that creates an image buffer given a size and a scale factor. It would do all the steps here: Increase the size by the scale factor, create the buffer, scale the context.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>471282</commentid>
    <comment_count>7</comment_count>
    <who name="Beth Dakin">bdakin</who>
    <bug_when>2011-09-21 17:06:23 -0700</bug_when>
    <thetext>(In reply to comment #6)
&gt; (From update of attachment 108254 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=108254&amp;action=review
&gt; 
&gt; r=me as is even though I have some suggestions for improvement
&gt; 
&gt; Is there a good way to make a test for this?
&gt; 

Not at this time. I have not yet added HiDPI-testing ability to WebKitTestRunner, though I have talked about doing so extensively with Sam. 

&gt; &gt; Source/WebCore/rendering/RenderBoxModelObject.cpp:692
&gt; &gt; +        float deviceScaleFactor = Page::deviceScaleFactor(frame());
&gt; 
&gt; I’m surprised we made this helper a Page static member, even though I think I possibly suggested putting it in Page.h. I think it could instead just be a namespace-level function that takes a Frame*.
&gt; 

Okay.

&gt; &gt; Source/WebCore/rendering/RenderBoxModelObject.cpp:705
&gt; &gt; +        // To create a mask image of the appropriate resolution, we need to scale maskRect&apos;s size
&gt; &gt; +        // by the device scale factor.
&gt; &gt; +        float deviceScaleFactor = Page::deviceScaleFactor(frame());
&gt; &gt; +        IntSize scaledMaskSize = maskRect.size();
&gt; &gt; +        scaledMaskSize.scale(deviceScaleFactor);
&gt; &gt;          
&gt; &gt;          // Now create the mask.
&gt; &gt; -        OwnPtr&lt;ImageBuffer&gt; maskImage = ImageBuffer::create(maskRect.size());
&gt; &gt; +        OwnPtr&lt;ImageBuffer&gt; maskImage = ImageBuffer::create(scaledMaskSize);
&gt; &gt;          if (!maskImage)
&gt; &gt;              return;
&gt; &gt;          
&gt; &gt;          GraphicsContext* maskImageContext = maskImage-&gt;context();
&gt; &gt; +
&gt; &gt; +        // Scale the whole context by the device scale factor so that all of the clips set up at 
&gt; &gt; +        // the appropriate size.
&gt; &gt; +        maskImageContext-&gt;scale(FloatSize(deviceScaleFactor, deviceScaleFactor));
&gt; 
&gt; It seems to me that without adding a feature to ImageBuffer where it knows its scale factor, we could create a single helper function that creates an image buffer given a size and a scale factor. It would do all the steps here: Increase the size by the scale factor, create the buffer, scale the context.

Do you envision this helper function being a helper in RenderBoxModel object or elsewhere? Just want to clarify.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>471301</commentid>
    <comment_count>8</comment_count>
    <who name="Beth Dakin">bdakin</who>
    <bug_when>2011-09-21 17:51:52 -0700</bug_when>
    <thetext>&gt; 
&gt; Do you envision this helper function being a helper in RenderBoxModel object or elsewhere? Just want to clarify.

Darin and I discussed this in person. We decided that it should just be a static function in RenderBoxModelObject for the time being, and if we find we need to functionality in a different class at a later time, we will move to to an appropriate shared location.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>471330</commentid>
    <comment_count>9</comment_count>
    <who name="Beth Dakin">bdakin</who>
    <bug_when>2011-09-21 20:29:29 -0700</bug_when>
    <thetext>Committed change with Darin&apos;s suggested changes. Revision 95697.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>471490</commentid>
    <comment_count>10</comment_count>
      <attachid>108254</attachid>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2011-09-22 04:40:46 -0700</bug_when>
    <thetext>Comment on attachment 108254
Patch

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

&gt;&gt;&gt; Source/WebCore/rendering/RenderBoxModelObject.cpp:692
&gt;&gt;&gt; +        float deviceScaleFactor = Page::deviceScaleFactor(frame());
&gt;&gt; 
&gt;&gt; I’m surprised we made this helper a Page static member, even though I think I possibly suggested putting it in Page.h. I think it could instead just be a namespace-level function that takes a Frame*.
&gt; 
&gt; Okay.

Do we need to take the page scale factor into account? Or maybe that&apos;s already been handled for us? Otherwise we&apos;ll get blurry text if you full-page zoom.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>471663</commentid>
    <comment_count>11</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2011-09-22 10:21:42 -0700</bug_when>
    <thetext>From my testing it does seem that we would get improved results if page scale factor was also taken into account. I don’t think that’s covered by this bug, but it’s a simple refinement we could make.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>471685</commentid>
    <comment_count>12</comment_count>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2011-09-22 10:44:16 -0700</bug_when>
    <thetext>(In reply to comment #11)
&gt; From my testing it does seem that we would get improved results if page scale factor was also taken into account. I don’t think that’s covered by this bug, but it’s a simple refinement we could make.

Not only the page scale factor, but also scale transforms on ancestors, no? Maybe the right thing to do is extract the scale component of the CTM or something (SVG does this in a number of places).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>471717</commentid>
    <comment_count>13</comment_count>
    <who name="Beth Dakin">bdakin</who>
    <bug_when>2011-09-22 11:02:56 -0700</bug_when>
    <thetext>Good thoughts all around. Here&apos;s the follow-up bug: https://bugs.webkit.org/show_bug.cgi?id=68641</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>105984</attachid>
            <date>2011-09-01 10:04:45 -0700</date>
            <delta_ts>2011-09-01 10:04:45 -0700</delta_ts>
            <desc>screenshot</desc>
            <filename>Screen Shot 2011-09-01 at 1.04.16 PM.png</filename>
            <type>image/png</type>
            <size>13801</size>
            <attacher name="Adam Roben (:aroben)">aroben</attacher>
            
              <data encoding="base64">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
qp02nQ2cc5xn9knvO7zvmQuHS6BLqyvW1cm10nVjv+H+vP2LbopuqW7jB4QPJBx46s7hHuJ+z4PO
g+LR6In2dPa87vmDYk2poGx4mXqVeK1563sXeK/46Pjk+iz7avrm+C75afrl+L3z1/Q/778coB2Q
H7AaqB9YFPg5yCToUtBmsHVwVfBeiHNIXShVqGfonTDGsOCwh+E84QnhwxHiEakRM5FqkXmRa1Hm
UZXRUPSB6NYYJvig0RcrEnsydjZOK644biveKb4xgSEhLKEvUSzxTOJSklHS1YOog94Huw+RDh07
NHtY93D5EeiI15HuZIHkE8mLR42PXjuGOxZ8rD9FJiUn5etx5+NtJ7hPHD0xf9L4ZE0qbWpU6sQp
9VOXTqNOB54eOCN/5sKZn2k+ab3pMun56T/Oep/tPSd7rvDcXoZfxkCmUubFLExWWNZ4tnb2tRyG
nKSc+fOW51ty+XLTcr/meeQ9zVfIv1SAK4gtmCm0KGy9IHgh68KPooCisWK94roSrpIzJZulPqUj
F3Uu1l7ivpR+absssGyy3Li8pYJckX8Zcznu8tsrTld6rqpcra7kqEyv3K0Kq5q5ZnftYbVydfV1
ruuZNYia2JrlG243hm4a3Gytlawtr2OpS68H9bH172953hpvMG/oblRprG0SaippJjantUAtiS1r
twNuz7S6tA7fMbvT3abe1twu1V51l3S3+B7zvcz7uPsn7u91JHVsdEZ0rnb5d813e3RPPdj34PlD
24cDj8wfPXls9PhBj25PxxPNJ3efqj2906vSe/uZ0rOWPsW+5n7F/uYBpYGWQeXB1iHVobZhjeH7
I9ojXaMGo4+fmz5/NmY1NjzuOD454TYxM+kz+e5FyIvPL+Ne7kwdfYV+lTZNP53/mut1xRvRN3Uz
SjP3Zg1m++bs56bmvedXFqIXfiyeeEt4m7/Eu1T9Tu7d3WWj5aH3+98vrkSs7KymfmD4UPJR5GPT
J51PfWv71hY/R33e+3J2nX296qvC1+4Nm43X30K/7WymbbFvXfuu8r1n23l7aSf+B/ZH4a7obttP
85+v9kL39iIoUZTfZwEkfEf4+QHwpQoAggsAxCEAcLT/nE9/a8DHV/hQjYCxEyQFrSBKke4oUTQW
/RmzjJ2gekM9i9ukQRPItOZ0MfRlDBNEPJMWcxJLHesSuxgHhbOAa5AHzavI50vK4G8QGBH8SEYI
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
RU5ErkJggg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>108254</attachid>
            <date>2011-09-21 16:51:05 -0700</date>
            <delta_ts>2011-09-22 04:40:46 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>for-review.txt</filename>
            <type>text/plain</type>
            <size>2643</size>
            <attacher name="Beth Dakin">bdakin</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDk1NjgxKQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTkgQEAKKzIwMTEtMDktMjEgIEJldGggRGFr
aW4gIDxiZGFraW5AYXBwbGUuY29tPgorCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3Jn
L3Nob3dfYnVnLmNnaT9pZD02NzQxNQorICAgICAgICBUZXh0IGRyYXduIHZpYSAtd2Via2l0LWJh
Y2tncm91bmQtY2xpcDp0ZXh0IGlzIGJsdXJyeSBhdCBkZXZpY2Ugc2NhbGUgZmFjdG9ycyA+MS4w
CisgICAgICAgIC1hbmQgY29ycmVzcG9uZGluZy0KKyAgICAgICAgPHJkYXI6Ly9wcm9ibGVtLzEw
MDYwMzc5PgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAg
IFNjYWxlIHRoZSBtYXNrIGltYWdlIGJ5IHRoZSBkZXZpY2VTY2FsZUZhY3RvciB0byBnZXQgYW4g
aW1hZ2Ugb2YgdGhlIGFwcHJvcHJpYXRlIAorICAgICAgICByZXNvbHV0aW9uLiBBbHNvIHNjYWxl
IHRoZSBpbWFnZSdzIEdyYXBoaWNzQ29udGV4dCBzbyB0aGF0IHRoZSBjbGlwIGlzIHNldCB1cCBv
biAKKyAgICAgICAgdGhlIHNhbWUgc2NhbGUsIGJ1dCBzdGlsbCBjbGlwIHRoZSBpbWFnZSB0byB0
aGUgb3JpZ2luYWwgbWFza1JlY3QgdG8gZ2V0IAorICAgICAgICBldmVyeXRoaW5nIHNjYWxlZCBi
YWNrIHRvIHRoZSBhcHByb3ByaWF0ZSBzaXplLgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJC
b3hNb2RlbE9iamVjdC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCb3hNb2RlbE9iamVj
dDo6cGFpbnRGaWxsTGF5ZXJFeHRlbmRlZCk6CisKIDIwMTEtMDktMTkgIEplciBOb2JsZSAgPGpl
ci5ub2JsZUBhcHBsZS5jb20+CiAKICAgICAgICAgQWRkIHNldHRpbmdzIHRvIGNvbnRyb2wgdGhl
IGF2YWlsYWJpbGl0eSBvZiB0aGUgV2ViIEF1ZGlvIEFQSSB0byBXZWJLaXQgYW5kIFdlYktpdDIu
CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQm94TW9kZWxPYmplY3QuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCb3hNb2RlbE9i
amVjdC5jcHAJKHJldmlzaW9uIDk1NDQyKQorKysgU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1Jl
bmRlckJveE1vZGVsT2JqZWN0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNjg2LDEzICs2ODYsMjMg
QEAgdm9pZCBSZW5kZXJCb3hNb2RlbE9iamVjdDo6cGFpbnRGaWxsTGF5ZQogICAgICAgICAvLyB0
byBhY3R1YWxseSByZW5kZXIsIHNvIHdlIHNob3VsZCBpbnRlcnNlY3QgdGhlIGRpcnR5IHJlY3Qg
d2l0aCB0aGUgYm9yZGVyIGJveCBvZiB0aGUgYmFja2dyb3VuZC4KICAgICAgICAgTGF5b3V0UmVj
dCBtYXNrUmVjdCA9IHJlY3Q7CiAgICAgICAgIG1hc2tSZWN0LmludGVyc2VjdChwYWludEluZm8u
cmVjdCk7CisKKyAgICAgICAgLy8gVG8gY3JlYXRlIGEgbWFzayBpbWFnZSBvZiB0aGUgYXBwcm9w
cmlhdGUgcmVzb2x1dGlvbiwgd2UgbmVlZCB0byBzY2FsZSBtYXNrUmVjdCdzIHNpemUKKyAgICAg
ICAgLy8gYnkgdGhlIGRldmljZSBzY2FsZSBmYWN0b3IuCisgICAgICAgIGZsb2F0IGRldmljZVNj
YWxlRmFjdG9yID0gUGFnZTo6ZGV2aWNlU2NhbGVGYWN0b3IoZnJhbWUoKSk7CisgICAgICAgIElu
dFNpemUgc2NhbGVkTWFza1NpemUgPSBtYXNrUmVjdC5zaXplKCk7CisgICAgICAgIHNjYWxlZE1h
c2tTaXplLnNjYWxlKGRldmljZVNjYWxlRmFjdG9yKTsKICAgICAgICAgCiAgICAgICAgIC8vIE5v
dyBjcmVhdGUgdGhlIG1hc2suCi0gICAgICAgIE93blB0cjxJbWFnZUJ1ZmZlcj4gbWFza0ltYWdl
ID0gSW1hZ2VCdWZmZXI6OmNyZWF0ZShtYXNrUmVjdC5zaXplKCkpOworICAgICAgICBPd25QdHI8
SW1hZ2VCdWZmZXI+IG1hc2tJbWFnZSA9IEltYWdlQnVmZmVyOjpjcmVhdGUoc2NhbGVkTWFza1Np
emUpOwogICAgICAgICBpZiAoIW1hc2tJbWFnZSkKICAgICAgICAgICAgIHJldHVybjsKICAgICAg
ICAgCiAgICAgICAgIEdyYXBoaWNzQ29udGV4dCogbWFza0ltYWdlQ29udGV4dCA9IG1hc2tJbWFn
ZS0+Y29udGV4dCgpOworCisgICAgICAgIC8vIFNjYWxlIHRoZSB3aG9sZSBjb250ZXh0IGJ5IHRo
ZSBkZXZpY2Ugc2NhbGUgZmFjdG9yIHNvIHRoYXQgYWxsIG9mIHRoZSBjbGlwcyBzZXQgdXAgYXQg
CisgICAgICAgIC8vIHRoZSBhcHByb3ByaWF0ZSBzaXplLgorICAgICAgICBtYXNrSW1hZ2VDb250
ZXh0LT5zY2FsZShGbG9hdFNpemUoZGV2aWNlU2NhbGVGYWN0b3IsIGRldmljZVNjYWxlRmFjdG9y
KSk7CiAgICAgICAgIG1hc2tJbWFnZUNvbnRleHQtPnRyYW5zbGF0ZSgtbWFza1JlY3QueCgpLCAt
bWFza1JlY3QueSgpKTsKICAgICAgICAgCiAgICAgICAgIC8vIE5vdyBhZGQgdGhlIHRleHQgdG8g
dGhlIGNsaXAuICBXZSBkbyB0aGlzIGJ5IHBhaW50aW5nIHVzaW5nIGEgc3BlY2lhbCBwYWludCBw
aGFzZSB0aGF0IHNpZ25hbHMgdG8K
</data>
<flag name="review"
          id="105176"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
      

    </bug>

</bugzilla>