<?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>71207</bug_id>
          
          <creation_ts>2011-10-31 00:43:00 -0700</creation_ts>
          <short_desc>An extra line break is inserted when pasting into a font element</short_desc>
          <delta_ts>2012-04-19 14:34:31 -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>HTML Editing</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>OS X 10.7</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>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="equinux AG">dev-bugzilla</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>enrica</cc>
    
    <cc>max.hong.shen</cc>
    
    <cc>rniwa</cc>
    
    <cc>sullivan</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>493193</commentid>
    <comment_count>0</comment_count>
      <attachid>113020</attachid>
    <who name="equinux AG">dev-bugzilla</who>
    <bug_when>2011-10-31 00:43:00 -0700</bug_when>
    <thetext>Created attachment 113020
Sample file.

Summary:

WebKit editing: Under certain circumstances an additional linebreak is inserted when pasting text from the pasteboard.


Steps to Reproduce:

1. Open the attached document in Safari.
2. Select any of the words in red.
3. Choose Edit &gt; Copy.
4. Place the insertion point anywhere within the red text.
5. Choose Edit &gt; Paste.


Expected Results:

The copied word is inserted at insertion point.


Actual Results:

An additional linebreak is inserted after the word.


Regression:

Reproducible with latest WebKit nightly build (r98835).


Notes:

A similar bug (#71018) has recently been fixed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>493199</commentid>
    <comment_count>1</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-10-31 00:55:38 -0700</bug_when>
    <thetext>I wouldn&apos;t call this a regression. The behavior on Safari 5.1 is far worse (it inserts the pasted content into the previous line AND inserts a line break at where the caret was.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>493200</commentid>
    <comment_count>2</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-10-31 00:56:40 -0700</bug_when>
    <thetext>Confirmed on nightly build.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>585617</commentid>
    <comment_count>3</comment_count>
      <attachid>133329</attachid>
    <who name="Yi Shen">max.hong.shen</who>
    <bug_when>2012-03-22 13:13:13 -0700</bug_when>
    <thetext>Created attachment 133329
First try</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>585630</commentid>
    <comment_count>4</comment_count>
      <attachid>133329</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2012-03-22 13:23:23 -0700</bug_when>
    <thetext>Comment on attachment 133329
First try

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

&gt; Source/WebCore/editing/ReplaceSelectionCommand.cpp:116
&gt; +static Position nextPositionInContainerNode(Position pos)

Please don&apos;t use abbreviations like pos.

&gt; Source/WebCore/editing/ReplaceSelectionCommand.cpp:120
&gt; +    Node* n = pos.deprecatedNode();    

You should use pos.containerNode(). Also please don&apos;t use one-letter variable like n.

&gt; Source/WebCore/editing/ReplaceSelectionCommand.cpp:125
&gt; +    return createLegacyEditingPosition(parent, n-&gt;nodeIndex() + 1);

Why do we always want to move up in the node hierarchy? If we had a bunch of siblings after pos&apos;s container node, then we&apos;ll still want to skip those. r- because I don&apos;t think this is a correct fix.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>585745</commentid>
    <comment_count>5</comment_count>
    <who name="Yi Shen">max.hong.shen</who>
    <bug_when>2012-03-22 15:04:19 -0700</bug_when>
    <thetext>Thanks for the reviewing.
(In reply to comment #4)
&gt; (From update of attachment 133329 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=133329&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/editing/ReplaceSelectionCommand.cpp:116
&gt; &gt; +static Position nextPositionInContainerNode(Position pos)
&gt; 
&gt; Please don&apos;t use abbreviations like pos.
Will fix it.
&gt; 
&gt; &gt; Source/WebCore/editing/ReplaceSelectionCommand.cpp:120
&gt; &gt; +    Node* n = pos.deprecatedNode();    
&gt; 
&gt; You should use pos.containerNode(). Also please don&apos;t use one-letter variable like n.
Will fix it.
&gt; 
&gt; &gt; Source/WebCore/editing/ReplaceSelectionCommand.cpp:125
&gt; &gt; +    return createLegacyEditingPosition(parent, n-&gt;nodeIndex() + 1);
&gt; 
&gt; Why do we always want to move up in the node hierarchy? If we had a bunch of siblings after pos&apos;s container node, then we&apos;ll still want to skip those. r- because I don&apos;t think this is a correct fix.

The insertion position only move up if the visible positions of the current position and the high level node&apos;s position are the same. So, if we had a bunch of siblings after pos&apos;s container node, they won&apos;t get skipped because of the difference visible positions.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>585748</commentid>
    <comment_count>6</comment_count>
      <attachid>133329</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2012-03-22 15:05:33 -0700</bug_when>
    <thetext>Comment on attachment 133329
First try

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

&gt;&gt;&gt; Source/WebCore/editing/ReplaceSelectionCommand.cpp:125
&gt;&gt;&gt; +    return createLegacyEditingPosition(parent, n-&gt;nodeIndex() + 1);
&gt;&gt; 
&gt;&gt; Why do we always want to move up in the node hierarchy? If we had a bunch of siblings after pos&apos;s container node, then we&apos;ll still want to skip those. r- because I don&apos;t think this is a correct fix.
&gt; 
&gt; The insertion position only move up if the visible positions of the current position and the high level node&apos;s position are the same. So, if we had a bunch of siblings after pos&apos;s container node, they won&apos;t get skipped because of the difference visible positions.

Right, but what if they&apos;re empty? If that case, I think we do want to skip those empty elements but moving to the next position in the parent may not be possible due to it being a different visible position.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>585952</commentid>
    <comment_count>7</comment_count>
    <who name="Yi Shen">max.hong.shen</who>
    <bug_when>2012-03-22 18:28:17 -0700</bug_when>
    <thetext>(In reply to comment #6)
&gt; (From update of attachment 133329 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=133329&amp;action=review
&gt; 
&gt; &gt;&gt;&gt; Source/WebCore/editing/ReplaceSelectionCommand.cpp:125
&gt; &gt;&gt;&gt; +    return createLegacyEditingPosition(parent, n-&gt;nodeIndex() + 1);
&gt; &gt;&gt; 
&gt; &gt;&gt; Why do we always want to move up in the node hierarchy? If we had a bunch of siblings after pos&apos;s container node, then we&apos;ll still want to skip those. r- because I don&apos;t think this is a correct fix.
&gt; &gt; 
&gt; &gt; The insertion position only move up if the visible positions of the current position and the high level node&apos;s position are the same. So, if we had a bunch of siblings after pos&apos;s container node, they won&apos;t get skipped because of the difference visible positions.
&gt; 
&gt; Right, but what if they&apos;re empty? If that case, I think we do want to skip those empty elements but moving to the next position in the parent may not be possible due to it being a different visible position.

Correct me if I am wrong :) In the context, the empty elements means they don&apos;t occupy any space, right? If so, all the empty sibling elements would have the same visible position as the next position in the parent. For example,
&lt;div&gt;&lt;u&gt;abc^&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt;&lt;/u&gt;&lt;/div&gt;, &quot;^&quot; is the insertion position. After calling the positionAvoidingPrecedingNodes(), it should be &lt;div&gt;&lt;u&gt;abc&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt;&lt;/u&gt;^&lt;/div&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>585956</commentid>
    <comment_count>8</comment_count>
      <attachid>133329</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2012-03-22 18:36:11 -0700</bug_when>
    <thetext>Comment on attachment 133329
First try

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

&gt;&gt;&gt;&gt;&gt; Source/WebCore/editing/ReplaceSelectionCommand.cpp:125
&gt;&gt;&gt;&gt;&gt; +    return createLegacyEditingPosition(parent, n-&gt;nodeIndex() + 1);
&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt; Why do we always want to move up in the node hierarchy? If we had a bunch of siblings after pos&apos;s container node, then we&apos;ll still want to skip those. r- because I don&apos;t think this is a correct fix.
&gt;&gt;&gt; 
&gt;&gt;&gt; The insertion position only move up if the visible positions of the current position and the high level node&apos;s position are the same. So, if we had a bunch of siblings after pos&apos;s container node, they won&apos;t get skipped because of the difference visible positions.
&gt;&gt; 
&gt;&gt; Right, but what if they&apos;re empty? If that case, I think we do want to skip those empty elements but moving to the next position in the parent may not be possible due to it being a different visible position.
&gt; 
&gt; Correct me if I am wrong :) In the context, the empty elements means they don&apos;t occupy any space, right? If so, all the empty sibling elements would have the same visible position as the next position in the parent. For example,
&gt; &lt;div&gt;&lt;u&gt;abc^&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt;&lt;/u&gt;&lt;/div&gt;, &quot;^&quot; is the insertion position. After calling the positionAvoidingPrecedingNodes(), it should be &lt;div&gt;&lt;u&gt;abc&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt;&lt;/u&gt;^&lt;/div&gt;

Yes, but your code doesn&apos;t do that at the moment because you always retrieve the parent of the deprecated node. i.e. the first call to nextPositionInContainerNode would move the position to be anchored at div, then the next call will try to move out of div.

In general, we shouldn&apos;t try to out-smart what Position does. Position.next/previous and all other editing code has been well-tested and deals with all sorts of edge-cases. Adding completely different algorithm to deal with this particular situation is extremely undesirable.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>585978</commentid>
    <comment_count>9</comment_count>
    <who name="Yi Shen">max.hong.shen</who>
    <bug_when>2012-03-22 19:01:51 -0700</bug_when>
    <thetext>(In reply to comment #8)
&gt; (From update of attachment 133329 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=133329&amp;action=review
&gt; 
&gt; &gt;&gt;&gt;&gt;&gt; Source/WebCore/editing/ReplaceSelectionCommand.cpp:125
&gt; &gt;&gt;&gt;&gt;&gt; +    return createLegacyEditingPosition(parent, n-&gt;nodeIndex() + 1);
&gt; &gt;&gt;&gt;&gt; 
&gt; &gt;&gt;&gt;&gt; Why do we always want to move up in the node hierarchy? If we had a bunch of siblings after pos&apos;s container node, then we&apos;ll still want to skip those. r- because I don&apos;t think this is a correct fix.
&gt; &gt;&gt;&gt; 
&gt; &gt;&gt;&gt; The insertion position only move up if the visible positions of the current position and the high level node&apos;s position are the same. So, if we had a bunch of siblings after pos&apos;s container node, they won&apos;t get skipped because of the difference visible positions.
&gt; &gt;&gt; 
&gt; &gt;&gt; Right, but what if they&apos;re empty? If that case, I think we do want to skip those empty elements but moving to the next position in the parent may not be possible due to it being a different visible position.
&gt; &gt; 
&gt; &gt; Correct me if I am wrong :) In the context, the empty elements means they don&apos;t occupy any space, right? If so, all the empty sibling elements would have the same visible position as the next position in the parent. For example,
&gt; &gt; &lt;div&gt;&lt;u&gt;abc^&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt;&lt;/u&gt;&lt;/div&gt;, &quot;^&quot; is the insertion position. After calling the positionAvoidingPrecedingNodes(), it should be &lt;div&gt;&lt;u&gt;abc&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt;&lt;/u&gt;^&lt;/div&gt;
&gt; 
&gt; Yes, but your code doesn&apos;t do that at the moment because you always retrieve the parent of the deprecated node. i.e. the first call to nextPositionInContainerNode would move the position to be anchored at div, then the next call will try to move out of div.

I think my code does move the position to be anchored at div. In above case, let&apos;s say the start insertion position is (#text, 3), first call to nextPositionInContainerNode returns the position (#u, 1) and then the position moves to (#u, 1). The second call to nextPositionInContainerNode returns the position (#div 1) and move the position to be anchored at div. However, it wouldn&apos;t move the position out of div because we always check the position node  with the enclosingBlockFlowElement to make sure the position stay at the same block.

&gt; 
&gt; In general, we shouldn&apos;t try to out-smart what Position does. Position.next/previous and all other editing code has been well-tested and deals with all sorts of edge-cases. Adding completely different algorithm to deal with this particular situation is extremely undesirable.

The reason why I don&apos;t use Position.next here because it may return the child node&apos;s position and then moves the insertion position into the child node.
e.g without my changes, &lt;div&gt;&lt;u&gt;&lt;u&gt;abc^&lt;/u&gt;&lt;u&gt;efg&lt;/u&gt;&lt;/u&gt;&lt;/div&gt; ==&gt; &lt;div&gt;&lt;u&gt;&lt;u&gt;abc&lt;/u&gt;&lt;u&gt;^efg&lt;/u&gt;&lt;/u&gt;&lt;/div&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>585981</commentid>
    <comment_count>10</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2012-03-22 19:08:08 -0700</bug_when>
    <thetext>(In reply to comment #9)
&gt; &gt; In general, we shouldn&apos;t try to out-smart what Position does. Position.next/previous and all other editing code has been well-tested and deals with all sorts of edge-cases. Adding completely different algorithm to deal with this particular situation is extremely undesirable.
&gt; 
&gt; The reason why I don&apos;t use Position.next here because it may return the child node&apos;s position and then moves the insertion position into the child node.
&gt; e.g without my changes, &lt;div&gt;&lt;u&gt;&lt;u&gt;abc^&lt;/u&gt;&lt;u&gt;efg&lt;/u&gt;&lt;/u&gt;&lt;/div&gt; ==&gt; &lt;div&gt;&lt;u&gt;&lt;u&gt;abc&lt;/u&gt;&lt;u&gt;^efg&lt;/u&gt;&lt;/u&gt;&lt;/div&gt;

What you need here is to use/make a function like nodeToSplitToAvoidPastingIntoInlineNodesWithStyle that finds the position outside of the inline elements.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>585995</commentid>
    <comment_count>11</comment_count>
    <who name="Yi Shen">max.hong.shen</who>
    <bug_when>2012-03-22 19:20:31 -0700</bug_when>
    <thetext>(In reply to comment #10)
&gt; (In reply to comment #9)
&gt; &gt; &gt; In general, we shouldn&apos;t try to out-smart what Position does. Position.next/previous and all other editing code has been well-tested and deals with all sorts of edge-cases. Adding completely different algorithm to deal with this particular situation is extremely undesirable.
&gt; &gt; 
&gt; &gt; The reason why I don&apos;t use Position.next here because it may return the child node&apos;s position and then moves the insertion position into the child node.
&gt; &gt; e.g without my changes, &lt;div&gt;&lt;u&gt;&lt;u&gt;abc^&lt;/u&gt;&lt;u&gt;efg&lt;/u&gt;&lt;/u&gt;&lt;/div&gt; ==&gt; &lt;div&gt;&lt;u&gt;&lt;u&gt;abc&lt;/u&gt;&lt;u&gt;^efg&lt;/u&gt;&lt;/u&gt;&lt;/div&gt;
&gt; 
&gt; What you need here is to use/make a function like nodeToSplitToAvoidPastingIntoInlineNodesWithStyle that finds the position outside of the inline elements.

Thanks, will look at it and provide a new patch :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>586746</commentid>
    <comment_count>12</comment_count>
      <attachid>133563</attachid>
    <who name="Yi Shen">max.hong.shen</who>
    <bug_when>2012-03-23 14:23:20 -0700</bug_when>
    <thetext>Created attachment 133563
updated patch based on Niwa&apos;s review</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>587010</commentid>
    <comment_count>13</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2012-03-23 22:00:50 -0700</bug_when>
    <thetext>Anyway, my preference is to do something along the line of:

Index: Source/WebCore/editing/ReplaceSelectionCommand.cpp
===================================================================
--- Source/WebCore/editing/ReplaceSelectionCommand.cpp	(revision 111896)
+++ Source/WebCore/editing/ReplaceSelectionCommand.cpp	(working copy)
@@ -121,9 +121,14 @@
     // same.  E.g.,
     //   &lt;div&gt;foo^&lt;/div&gt;^
     // The two positions above are the same visual position, but we want to stay in the same block.
-    Node* stopNode = pos.deprecatedNode()-&gt;enclosingBlockFlowElement();
-    while (stopNode != pos.deprecatedNode() &amp;&amp; VisiblePosition(pos) == VisiblePosition(pos.next()))
-        pos = pos.next();
+    Node* enclosingBlock = pos.containerNode()-&gt;enclosingBlockFlowElement();
+    for (Position nextPosition = pos; ;pos = nextPosition) {
+        nextPosition = pos.next();
+        if (nextPosition == pos
+            || nextPosition.containerNode()-&gt;enclosingBlockFlowElement() != enclosingBlock
+            || VisiblePosition(pos) != VisiblePosition(nextPosition))
+            break;
+    }
     return pos;
 }

Note that a couple of tests fail with this change along, and there&apos;s about a dozen test to be rebaselined.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>587846</commentid>
    <comment_count>14</comment_count>
    <who name="Yi Shen">max.hong.shen</who>
    <bug_when>2012-03-26 09:49:53 -0700</bug_when>
    <thetext>Thanks for the follow up :) But I have two concerns about your code,

1) Since the Position::next() is still used here, it is possible to move the insertion position into sibling node&apos;s child, which seems incorrect (that&apos;s why my patch doesn&apos;t use position::next to avoid it). e.g
&lt;div&gt;&lt;u&gt;&lt;u&gt;text underline&lt;u&gt;^&lt;u&gt;test underline&lt;/u&gt;&lt;/u&gt;&lt;/div&gt;
==&gt;
&lt;div&gt;&lt;u&gt;&lt;u&gt;text underline&lt;u&gt;&lt;u&gt;^test underline&lt;/u&gt;&lt;/u&gt;&lt;/div&gt;

2) It is possible to move the insertion position to the end of the enclosingBlock. That&apos;s why some tests failed.
e.g.
&lt;div&gt;&lt;u&gt;abc^&lt;/u&gt;#text &quot;\n&quot;&lt;div&gt; ==&gt; &lt;div&gt;&lt;u&gt;abc^&lt;/u&gt;#text &quot;\n&quot;&lt;div&gt;^
This can be fixed by changing the for statement to 
for (Position nextPosition = pos; nextPosition.containerNode() != enclosingBlock; pos = nextPosition) {
 ...
}

(In reply to comment #13)
&gt; Anyway, my preference is to do something along the line of:
&gt; 
&gt; Index: Source/WebCore/editing/ReplaceSelectionCommand.cpp
&gt; ===================================================================
&gt; --- Source/WebCore/editing/ReplaceSelectionCommand.cpp    (revision 111896)
&gt; +++ Source/WebCore/editing/ReplaceSelectionCommand.cpp    (working copy)
&gt; @@ -121,9 +121,14 @@
&gt;      // same.  E.g.,
&gt;      //   &lt;div&gt;foo^&lt;/div&gt;^
&gt;      // The two positions above are the same visual position, but we want to stay in the same block.
&gt; -    Node* stopNode = pos.deprecatedNode()-&gt;enclosingBlockFlowElement();
&gt; -    while (stopNode != pos.deprecatedNode() &amp;&amp; VisiblePosition(pos) == VisiblePosition(pos.next()))
&gt; -        pos = pos.next();
&gt; +    Node* enclosingBlock = pos.containerNode()-&gt;enclosingBlockFlowElement();
&gt; +    for (Position nextPosition = pos; ;pos = nextPosition) {
&gt; +        nextPosition = pos.next();
&gt; +        if (nextPosition == pos
&gt; +            || nextPosition.containerNode()-&gt;enclosingBlockFlowElement() != enclosingBlock
&gt; +            || VisiblePosition(pos) != VisiblePosition(nextPosition))
&gt; +            break;
&gt; +    }
&gt;      return pos;
&gt;  }
&gt; 
&gt; Note that a couple of tests fail with this change along, and there&apos;s about a dozen test to be rebaselined.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>588856</commentid>
    <comment_count>15</comment_count>
      <attachid>134055</attachid>
    <who name="Yi Shen">max.hong.shen</who>
    <bug_when>2012-03-27 07:14:50 -0700</bug_when>
    <thetext>Created attachment 134055
updated patch without using a help function</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>589030</commentid>
    <comment_count>16</comment_count>
      <attachid>134055</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2012-03-27 10:39:03 -0700</bug_when>
    <thetext>Comment on attachment 134055
updated patch without using a help function

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

&gt; Source/WebCore/editing/ReplaceSelectionCommand.cpp:127
&gt; +        if (pos.containerNode()-&gt;nonShadowBoundaryParentNode())
&gt; +            nextPosition = positionInParentAfterNode(pos.containerNode());

Again, this is incorrect. You need to skip siblings of pos.containerNode() first.
I&apos;d say that any solution that involves calling positionInParentAfterNode won&apos;t be correct.
On my second thought, we should be able to replace this enture function by pos.downstream().</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>589243</commentid>
    <comment_count>17</comment_count>
    <who name="Yi Shen">max.hong.shen</who>
    <bug_when>2012-03-27 14:00:09 -0700</bug_when>
    <thetext>Well, I think I misunderstood your comments #6 &amp; #8. 

Regarding the pos.downstream(), I have tried it on my code and seems it doesn&apos;t work. Also, you can see it by checking Tony&apos;s comments (#10) in bug Bug 21840.

Now my question is why we need to skip the siblings of pos.containerNode()? Considering following case,

e.g.   &lt;div&gt;&lt;u&gt;abc^&lt;/u&gt;/n&lt;/div&gt;

if we skip all the siblings, then the new insertion position is after the &quot;/n&quot;, which seems incorrect for me.

(In reply to comment #16)
&gt; (From update of attachment 134055 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=134055&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/editing/ReplaceSelectionCommand.cpp:127
&gt; &gt; +        if (pos.containerNode()-&gt;nonShadowBoundaryParentNode())
&gt; &gt; +            nextPosition = positionInParentAfterNode(pos.containerNode());
&gt; 
&gt; Again, this is incorrect. You need to skip siblings of pos.containerNode() first.
&gt; I&apos;d say that any solution that involves calling positionInParentAfterNode won&apos;t be correct.
&gt; On my second thought, we should be able to replace this enture function by pos.downstream().</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>589671</commentid>
    <comment_count>18</comment_count>
      <attachid>134055</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2012-03-27 23:01:24 -0700</bug_when>
    <thetext>Comment on attachment 134055
updated patch without using a help function

Okay, I thought about this for a while but I couldn&apos;t come up with a better solution. So let&apos;s land this patch as is. We&apos;ll need to refactor ReplaceSelectionCommand in the future anyway so let us think through by then.

Thanks for the patch and explanations.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>589672</commentid>
    <comment_count>19</comment_count>
      <attachid>134055</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-03-27 23:04:42 -0700</bug_when>
    <thetext>Comment on attachment 134055
updated patch without using a help function

Rejecting attachment 134055 from commit-queue.

Failed to run &quot;[&apos;/mnt/git/webkit-commit-queue/Tools/Scripts/webkit-patch&apos;, &apos;--status-host=queues.webkit.org&apos;, &apos;-...&quot; exit_code: 1

Last 500 characters of output:
ueue/Tools/Scripts/webkitpy/tool/commands/stepsequence.py&quot;, line 70, in run_and_handle_errors
    self._run(tool, options, state)
  File &quot;/mnt/git/webkit-commit-queue/Tools/Scripts/webkitpy/tool/commands/stepsequence.py&quot;, line 64, in _run
    step(tool, options).run(state)
  File &quot;/mnt/git/webkit-commit-queue/Tools/Scripts/webkitpy/tool/steps/validatereviewer.py&quot;, line 50, in run
    if changelog_entry.has_valid_reviewer():
AttributeError: &apos;NoneType&apos; object has no attribute &apos;has_valid_reviewer&apos;

Full output: http://queues.webkit.org/results/12146860</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>589677</commentid>
    <comment_count>20</comment_count>
      <attachid>134055</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-03-27 23:10:16 -0700</bug_when>
    <thetext>Comment on attachment 134055
updated patch without using a help function

Rejecting attachment 134055 from commit-queue.

Failed to run &quot;[&apos;/mnt/git/webkit-commit-queue/Tools/Scripts/webkit-patch&apos;, &apos;--status-host=queues.webkit.org&apos;, &apos;-...&quot; exit_code: 1

Last 500 characters of output:
ueue/Tools/Scripts/webkitpy/tool/commands/stepsequence.py&quot;, line 70, in run_and_handle_errors
    self._run(tool, options, state)
  File &quot;/mnt/git/webkit-commit-queue/Tools/Scripts/webkitpy/tool/commands/stepsequence.py&quot;, line 64, in _run
    step(tool, options).run(state)
  File &quot;/mnt/git/webkit-commit-queue/Tools/Scripts/webkitpy/tool/steps/validatereviewer.py&quot;, line 50, in run
    if changelog_entry.has_valid_reviewer():
AttributeError: &apos;NoneType&apos; object has no attribute &apos;has_valid_reviewer&apos;

Full output: http://queues.webkit.org/results/12147943</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>589679</commentid>
    <comment_count>21</comment_count>
      <attachid>134055</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2012-03-27 23:13:49 -0700</bug_when>
    <thetext>Comment on attachment 134055
updated patch without using a help function

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

&gt; Source/WebCore/ChangeLog:1
&gt; +02012-03-27  Yi Shen  &lt;yi.4.shen@nokia.com&gt;,  Ryosuke Niwa  &lt;rniwa@webkit.org&gt;

Oops, you need to fix this line :( Please delete my name.

&gt; LayoutTests/editing/inserting/insert-text-into-font.html:1
&gt; +&lt;body contentEditable=&quot;true&quot;&gt;

No DOCTYPE?

&gt; LayoutTests/editing/inserting/insert-text-into-font.html:39
&gt; +    // Inserting HTML to replace the &quot;line&quot; in the &quot;Second line&quot; should not insert an extra div (line break).
&gt; +    var targetDiv = document.getElementById(&quot;secondDiv&quot;);
&gt; +    var targetText = targetDiv.firstChild;
&gt; +    execSetSelectionCommand(targetText, 8, targetText, targetText.textContent.length);
&gt; +    document.execCommand(&quot;inserthtml&quot;, false, &quot;&lt;span id=&apos;red&apos; style=&apos;color:red&apos;&gt;line&lt;/span&gt;&quot;);
&gt; +
&gt; +    // Verify that the font still only has one div.
&gt; +    var font = document.getElementById(&quot;fonts&quot;);
&gt; +    var divs = font.querySelectorAll(&quot;div&quot;);
&gt; +    if (divs.length != 1)
&gt; +        fail(&quot;An extra div is inserted which is incorrect. There are &quot; + divs.length + &quot; divs inside font element.&quot;);
&gt; +
&gt; +    // Inserting HTML into &quot;Second line&quot; should not insert an extra div (line break).
&gt; +    execSetSelectionCommand(targetText, 8, targetText, 8);
&gt; +    document.execCommand(&quot;inserthtml&quot;, false, &quot;&lt;span id=&apos;green&apos; style=&apos;color:green&apos;&gt;green&lt;/span&gt;&quot;);
&gt; +
&gt; +    // Verify that the font still only has one div.
&gt; +    var font = document.getElementById(&quot;fonts&quot;);
&gt; +    var divs = font.querySelectorAll(&quot;div&quot;);
&gt; +    if (divs.length != 1)
&gt; +        fail(&quot;An extra div is inserted which is incorrect. There are &quot; + divs.length + &quot; divs inside font element.&quot;);

It&apos;s probably better to use dump-as-markup.js here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>589967</commentid>
    <comment_count>22</comment_count>
    <who name="Yi Shen">max.hong.shen</who>
    <bug_when>2012-03-28 08:01:16 -0700</bug_when>
    <thetext>Committed r112399: &lt;http://trac.webkit.org/changeset/112399&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>589968</commentid>
    <comment_count>23</comment_count>
    <who name="Yi Shen">max.hong.shen</who>
    <bug_when>2012-03-28 08:02:20 -0700</bug_when>
    <thetext>Thanks for the review :)

(In reply to comment #21)
&gt; (From update of attachment 134055 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=134055&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/ChangeLog:1
&gt; &gt; +02012-03-27  Yi Shen  &lt;yi.4.shen@nokia.com&gt;,  Ryosuke Niwa  &lt;rniwa@webkit.org&gt;
&gt; 
&gt; Oops, you need to fix this line :( Please delete my name.
&gt; 
&gt; &gt; LayoutTests/editing/inserting/insert-text-into-font.html:1
&gt; &gt; +&lt;body contentEditable=&quot;true&quot;&gt;
&gt; 
&gt; No DOCTYPE?
&gt; 
&gt; &gt; LayoutTests/editing/inserting/insert-text-into-font.html:39
&gt; &gt; +    // Inserting HTML to replace the &quot;line&quot; in the &quot;Second line&quot; should not insert an extra div (line break).
&gt; &gt; +    var targetDiv = document.getElementById(&quot;secondDiv&quot;);
&gt; &gt; +    var targetText = targetDiv.firstChild;
&gt; &gt; +    execSetSelectionCommand(targetText, 8, targetText, targetText.textContent.length);
&gt; &gt; +    document.execCommand(&quot;inserthtml&quot;, false, &quot;&lt;span id=&apos;red&apos; style=&apos;color:red&apos;&gt;line&lt;/span&gt;&quot;);
&gt; &gt; +
&gt; &gt; +    // Verify that the font still only has one div.
&gt; &gt; +    var font = document.getElementById(&quot;fonts&quot;);
&gt; &gt; +    var divs = font.querySelectorAll(&quot;div&quot;);
&gt; &gt; +    if (divs.length != 1)
&gt; &gt; +        fail(&quot;An extra div is inserted which is incorrect. There are &quot; + divs.length + &quot; divs inside font element.&quot;);
&gt; &gt; +
&gt; &gt; +    // Inserting HTML into &quot;Second line&quot; should not insert an extra div (line break).
&gt; &gt; +    execSetSelectionCommand(targetText, 8, targetText, 8);
&gt; &gt; +    document.execCommand(&quot;inserthtml&quot;, false, &quot;&lt;span id=&apos;green&apos; style=&apos;color:green&apos;&gt;green&lt;/span&gt;&quot;);
&gt; &gt; +
&gt; &gt; +    // Verify that the font still only has one div.
&gt; &gt; +    var font = document.getElementById(&quot;fonts&quot;);
&gt; &gt; +    var divs = font.querySelectorAll(&quot;div&quot;);
&gt; &gt; +    if (divs.length != 1)
&gt; &gt; +        fail(&quot;An extra div is inserted which is incorrect. There are &quot; + divs.length + &quot; divs inside font element.&quot;);
&gt; 
&gt; It&apos;s probably better to use dump-as-markup.js here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>605920</commentid>
    <comment_count>24</comment_count>
      <attachid>133563</attachid>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2012-04-19 14:34:31 -0700</bug_when>
    <thetext>Comment on attachment 133563
updated patch based on Niwa&apos;s review

I assume this patch is obsolete since the bug is RESOLVED</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>113020</attachid>
            <date>2011-10-31 00:43:00 -0700</date>
            <delta_ts>2011-10-31 00:43:00 -0700</delta_ts>
            <desc>Sample file.</desc>
            <filename>content.html</filename>
            <type>text/html</type>
            <size>370</size>
            <attacher name="equinux AG">dev-bugzilla</attacher>
            
              <data encoding="base64">PGh0bWw+Cjxib2R5PgoKCTxkaXYgY29udGVudGVkaXRhYmxlPSJ0cnVlIj4KCSAgICA8Zm9udCBj
bGFzcz0iQXBwbGUtc3R5bGUtc3BhbiIgc3R5bGU9ImxpbmUtaGVpZ2h0OiAxLjU7ICI+CiAgICAg
ICAgICAgIExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LAogICAgICAgICAgICA8ZGl2PgogICAg
ICAgICAgICAgICAgY29uc2VjdGV0dXIgYWRpcGlzY2luZyBlbGl0LgogICAgICAgICAgICAgICAg
PGZvbnQgY2xhc3M9IkFwcGxlLXN0eWxlLXNwYW4iIGNvbG9yPSIjQjYwNTBDIj5TZWQgZmF1Y2li
dXMgZWxlaWZlbmQgdnVscHV0YXRlLjwvZm9udD4KICAgICAgICAgICAgPC9kaXY+CgkgICAgPC9m
b250PgoJPC9kaXY+Cgo8L2JvZHk+PC9odG1sPg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>133329</attachid>
            <date>2012-03-22 13:13:13 -0700</date>
            <delta_ts>2012-03-23 14:23:20 -0700</delta_ts>
            <desc>First try</desc>
            <filename>71207v1.patch</filename>
            <type>text/plain</type>
            <size>6203</size>
            <attacher name="Yi Shen">max.hong.shen</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDExMTc0NykKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDI0IEBACisyMDEyLTAzLTIyICBZaSBTaGVu
ICA8eWkuNC5zaGVuQG5va2lhLmNvbT4KKworICAgICAgICBBbiBleHRyYSBsaW5lIGJyZWFrIGlz
IGluc2VydGVkIHdoZW4gcGFzdGluZyBpbnRvIGEgZm9udCBlbGVtZW50LgorICAgICAgICBodHRw
czovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzEyMDcKKworICAgICAgICBSZXZp
ZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBUZXN0OiBlZGl0aW5nL2luc2VydGlu
Zy9pbnNlcnQtdGV4dC1pbnRvLWZvbnQuaHRtbAorCisgICAgICAgIEZpeCBhbiBlZGl0aW5nIGJ1
ZyB3aGVyZSBpbnNlcnRpbmcgdGV4dCBpbnRvIGEgZm9udCBlbGVtZW50IHdvdWxkCisgICAgICAg
IGNyZWF0ZSBhbiBleHRyYSBkaXYgZWxlbWVudCBpbiB0aGUgZG9tIHRyZWUuIFRoZSAKKyAgICAg
ICAgV2ViQ29yZTo6cG9zaXRpb25Bdm9pZGluZ1ByZWNlZGluZ05vZGVzKCkgdHJpZXMgdG8gc2V0
IHRoZSBjb3JyZWN0CisgICAgICAgIGRlc3RpbmF0aW9uIHBvc2l0aW9uIGJ5IGNoZWNraW5nIHRo
ZSBuZXh0IHZpc2libGUgcG9zaXRpb24sIGhvd2V2ZXIsCisgICAgICAgIGl0IGNhdXNlcyB0aGUg
cG9zaXRpb24gbW92ZXMgaW50byB0aGUgY2hpbGQgZG9tIGVsZW1lbnQgaW4gc29tZWNhc2UuCisg
ICAgICAgIEluc3RlYWQsIHdlIHNob3VsZCBvbmx5IGNoZWNrIHRoZSBuZXh0IHNpYmxpbmcgbm9k
ZSdzIHBvc2l0aW9uLiAgCisKKyAgICAgICAgKiBlZGl0aW5nL1JlcGxhY2VTZWxlY3Rpb25Db21t
YW5kLmNwcDoKKyAgICAgICAgKFdlYkNvcmUpOgorICAgICAgICAoV2ViQ29yZTo6bmV4dFBvc2l0
aW9uSW5Db250YWluZXJOb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OnBvc2l0aW9uQXZvaWRpbmdQ
cmVjZWRpbmdOb2Rlcyk6CisKIDIwMTItMDMtMjIgIEtldmluIE9sbGl2aWVyICA8a2V2aW5vQHRo
ZW9sbGl2aWVycy5jb20+CiAKICAgICAgICAgW3d4XSBVbnJldmlld2VkLiBXZWJET00gYnVpbGQg
Zml4IGFmdGVyIGFycmF5IHR5cGUgY2hhbmdlcy4KSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2VkaXRp
bmcvUmVwbGFjZVNlbGVjdGlvbkNvbW1hbmQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJD
b3JlL2VkaXRpbmcvUmVwbGFjZVNlbGVjdGlvbkNvbW1hbmQuY3BwCShyZXZpc2lvbiAxMTE3NDYp
CisrKyBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL1JlcGxhY2VTZWxlY3Rpb25Db21tYW5kLmNwcAko
d29ya2luZyBjb3B5KQpAQCAtMTEyLDYgKzExMiwxOCBAQCBzdGF0aWMgYm9vbCBpc0ludGVyY2hh
bmdlQ29udmVydGVkU3BhY2VTCiAgICAgcmV0dXJuIG5vZGUtPmlzSFRNTEVsZW1lbnQoKSAmJiAK
ICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgSFRNTEVsZW1lbnQgKj4obm9kZSktPmdldEF0
dHJpYnV0ZShjbGFzc0F0dHIpID09IGNvbnZlcnRlZFNwYWNlU3BhbkNsYXNzU3RyaW5nOwogfQor
ICAgIAorc3RhdGljIFBvc2l0aW9uIG5leHRQb3NpdGlvbkluQ29udGFpbmVyTm9kZShQb3NpdGlv
biBwb3MpCit7CisgICAgQVNTRVJUKHBvcy5pc05vdE51bGwoKSk7CisgICAgCisgICAgTm9kZSog
biA9IHBvcy5kZXByZWNhdGVkTm9kZSgpOyAgICAKKyAgICBDb250YWluZXJOb2RlKiBwYXJlbnQg
PSBuLT5ub25TaGFkb3dCb3VuZGFyeVBhcmVudE5vZGUoKTsKKyAgICBpZiAoIXBhcmVudCkKKyAg
ICAgICAgcmV0dXJuIHBvczsKKyAgICAgICAKKyAgICByZXR1cm4gY3JlYXRlTGVnYWN5RWRpdGlu
Z1Bvc2l0aW9uKHBhcmVudCwgbi0+bm9kZUluZGV4KCkgKyAxKTsKK30KIAogc3RhdGljIFBvc2l0
aW9uIHBvc2l0aW9uQXZvaWRpbmdQcmVjZWRpbmdOb2RlcyhQb3NpdGlvbiBwb3MpCiB7CkBAIC0x
MjQsOCArMTM2LDExIEBAIHN0YXRpYyBQb3NpdGlvbiBwb3NpdGlvbkF2b2lkaW5nUHJlY2VkaW4K
ICAgICAvLyAgIDxkaXY+Zm9vXjwvZGl2Pl4KICAgICAvLyBUaGUgdHdvIHBvc2l0aW9ucyBhYm92
ZSBhcmUgdGhlIHNhbWUgdmlzdWFsIHBvc2l0aW9uLCBidXQgd2Ugd2FudCB0byBzdGF5IGluIHRo
ZSBzYW1lIGJsb2NrLgogICAgIE5vZGUqIHN0b3BOb2RlID0gcG9zLmRlcHJlY2F0ZWROb2RlKCkt
PmVuY2xvc2luZ0Jsb2NrRmxvd0VsZW1lbnQoKTsKLSAgICB3aGlsZSAoc3RvcE5vZGUgIT0gcG9z
LmRlcHJlY2F0ZWROb2RlKCkgJiYgVmlzaWJsZVBvc2l0aW9uKHBvcykgPT0gVmlzaWJsZVBvc2l0
aW9uKHBvcy5uZXh0KCkpKQotICAgICAgICBwb3MgPSBwb3MubmV4dCgpOworICAgIFBvc2l0aW9u
IG5leHRQb3MgPSBuZXh0UG9zaXRpb25JbkNvbnRhaW5lck5vZGUocG9zKTsKKyAgICB3aGlsZSAo
c3RvcE5vZGUgIT0gcG9zLmRlcHJlY2F0ZWROb2RlKCkgJiYgVmlzaWJsZVBvc2l0aW9uKHBvcykg
PT0gVmlzaWJsZVBvc2l0aW9uKG5leHRQb3MpKSB7CisgICAgICAgIHBvcyA9IG5leHRQb3M7Cisg
ICAgICAgIG5leHRQb3MgPSBuZXh0UG9zaXRpb25JbkNvbnRhaW5lck5vZGUocG9zKTsKKyAgICB9
CiAgICAgcmV0dXJuIHBvczsKIH0KIApJbmRleDogTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIExheW91dFRlc3RzL0NoYW5nZUxvZwkocmV2aXNpb24gMTExNzQ3KQorKysgTGF5
b3V0VGVzdHMvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMjAgQEAKKzIwMTIt
MDMtMjIgIFlpIFNoZW4gIDx5aS40LnNoZW5Abm9raWEuY29tPgorCisgICAgICAgIEFuIGV4dHJh
IGxpbmUgYnJlYWsgaXMgaW5zZXJ0ZWQgd2hlbiBwYXN0aW5nIGludG8gYSBmb250IGVsZW1lbnQu
CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD03MTIwNwor
CisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEZpeCBhbiBl
ZGl0aW5nIGJ1ZyB3aGVyZSBpbnNlcnRpbmcgdGV4dCBpbnRvIGEgZm9udCBlbGVtZW50IHdvdWxk
IAorICAgICAgICBjcmVhdGUgYW4gZXh0cmEgZGl2IGVsZW1lbnQgaW4gdGhlIGRvbSB0cmVlLiBU
aGUgCisgICAgICAgIFdlYkNvcmU6OnBvc2l0aW9uQXZvaWRpbmdQcmVjZWRpbmdOb2RlcygpIHRy
aWVzIHRvIHNldCB0aGUgY29ycmVjdAorICAgICAgICBkZXN0aW5hdGlvbiBwb3NpdGlvbiBieSBj
aGVja2luZyB0aGUgbmV4dCB2aXNpYmxlIHBvc2l0aW9uLCBob3dldmVyLCAgICAgICAgCisgICAg
ICAgIGl0IGNhdXNlcyB0aGUgcG9zaXRpb24gbW92ZXMgaW50byB0aGUgY2hpbGQgZG9tIGVsZW1l
bnQgaW4gc29tZWNhc2UuCisgICAgICAgIEluc3RlYWQsIHdlIHNob3VsZCBvbmx5IGNoZWNrIHRo
ZSBuZXh0IHNpYmxpbmcgbm9kZSdzIHBvc2l0aW9uLgorCisgICAgICAgICogZWRpdGluZy9pbnNl
cnRpbmcvaW5zZXJ0LXRleHQtaW50by1mb250LWV4cGVjdGVkLnR4dDogQWRkZWQuCisgICAgICAg
ICogZWRpdGluZy9pbnNlcnRpbmcvaW5zZXJ0LXRleHQtaW50by1mb250Lmh0bWw6IEFkZGVkLgor
CiAyMDEyLTAzLTIyICBEYW4gQmVybnN0ZWluICA8bWl0ekBhcHBsZS5jb20+CiAKICAgICAgICAg
QWRkZWQgYWxsIHRlc3RzIHRoYXQgZmFpbGVkIG9uIHRoZSBMaW9uIFdlYktpdDIgUmVsZWFzZSBi
b3QgaW4gcjExMTczOSB0byB0aGUgTWFjIFdlYktpdDIKSW5kZXg6IExheW91dFRlc3RzL2VkaXRp
bmcvaW5zZXJ0aW5nL2luc2VydC10ZXh0LWludG8tZm9udC1leHBlY3RlZC50eHQKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gTGF5b3V0VGVzdHMvZWRpdGluZy9pbnNlcnRpbmcvaW5zZXJ0LXRleHQtaW50by1mb250
LWV4cGVjdGVkLnR4dAkocmV2aXNpb24gMCkKKysrIExheW91dFRlc3RzL2VkaXRpbmcvaW5zZXJ0
aW5nL2luc2VydC10ZXh0LWludG8tZm9udC1leHBlY3RlZC50eHQJKHJldmlzaW9uIDApCkBAIC0w
LDAgKzEgQEAKK1NVQ0NFU1MKSW5kZXg6IExheW91dFRlc3RzL2VkaXRpbmcvaW5zZXJ0aW5nL2lu
c2VydC10ZXh0LWludG8tZm9udC5odG1sCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2VkaXRp
bmcvaW5zZXJ0aW5nL2luc2VydC10ZXh0LWludG8tZm9udC5odG1sCShyZXZpc2lvbiAwKQorKysg
TGF5b3V0VGVzdHMvZWRpdGluZy9pbnNlcnRpbmcvaW5zZXJ0LXRleHQtaW50by1mb250Lmh0bWwJ
KHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNDMgQEAKKzxib2R5IGNvbnRlbnRFZGl0YWJsZT0idHJ1
ZSI+Cis8Zm9udCBpZD0iZm9udHMiPgorRmlyc3QgbGluZQorPGRpdiBpZD0ic2Vjb25kRGl2Ij4K
K1NlY29uZCBsaW5lCis8L2Rpdj4KKzwvZm9udD4KKzwvYm9keT4KKzxzY3JpcHQgc3JjPSIuLi9l
ZGl0aW5nLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQ+CisgICAgaWYgKHdpbmRvdy5sYXlvdXRUZXN0
Q29udHJvbGxlcikKKyAgICAgICAgbGF5b3V0VGVzdENvbnRyb2xsZXIuZHVtcEFzVGV4dCgpOwor
CisgICAgZnVuY3Rpb24gZmFpbChtc2cpIHsKKyAgICAgICAgY29uc29sZS5sb2cobXNnKTsKKyAg
ICAgICAgdGhyb3cgbXNnOworICAgIH0KKworICAgIC8vIEluc2VydGluZyBIVE1MIHRvIHJlcGxh
Y2UgdGhlICJsaW5lIiBpbiB0aGUgIlNlY29uZCBsaW5lIiBzaG91bGQgbm90IGluc2VydCBhbiBl
eHRyYSBkaXYgKGxpbmUgYnJlYWspLgorICAgIHZhciB0YXJnZXREaXYgPSBkb2N1bWVudC5nZXRF
bGVtZW50QnlJZCgic2Vjb25kRGl2Iik7CisgICAgdmFyIHRhcmdldFRleHQgPSB0YXJnZXREaXYu
Zmlyc3RDaGlsZDsKKyAgICBleGVjU2V0U2VsZWN0aW9uQ29tbWFuZCh0YXJnZXRUZXh0LCA4LCB0
YXJnZXRUZXh0LCB0YXJnZXRUZXh0LnRleHRDb250ZW50Lmxlbmd0aCk7CisgICAgZG9jdW1lbnQu
ZXhlY0NvbW1hbmQoImluc2VydGh0bWwiLCBmYWxzZSwgIjxzcGFuIGlkPSdyZWQnIHN0eWxlPSdj
b2xvcjpyZWQnPmxpbmU8L3NwYW4+Iik7CisKKyAgICAvLyBWZXJpZnkgdGhhdCB0aGUgZm9udCBz
dGlsbCBvbmx5IGhhcyBvbmUgZGl2LgorICAgIHZhciBmb250ID0gZG9jdW1lbnQuZ2V0RWxlbWVu
dEJ5SWQoImZvbnRzIik7CisgICAgdmFyIGRpdnMgPSBmb250LnF1ZXJ5U2VsZWN0b3JBbGwoImRp
diIpOworICAgIGlmIChkaXZzLmxlbmd0aCAhPSAxKQorICAgICAgICBmYWlsKCJBbiBleHRyYSBk
aXYgaXMgaW5zZXJ0ZWQgd2hpY2ggaXMgaW5jb3JyZWN0LiBUaGVyZSBhcmUgIiArIGRpdnMubGVu
Z3RoICsgIiBkaXZzIGluc2lkZSBmb250IGVsZW1lbnQuIik7CisKKyAgICAvLyBJbnNlcnRpbmcg
SFRNTCBpbnRvICJTZWNvbmQgbGluZSIgc2hvdWxkIG5vdCBpbnNlcnQgYW4gZXh0cmEgZGl2IChs
aW5lIGJyZWFrKS4KKyAgICBleGVjU2V0U2VsZWN0aW9uQ29tbWFuZCh0YXJnZXRUZXh0LCA4LCB0
YXJnZXRUZXh0LCA4KTsKKyAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgiaW5zZXJ0aHRtbCIsIGZh
bHNlLCAiPHNwYW4gaWQ9J2dyZWVuJyBzdHlsZT0nY29sb3I6Z3JlZW4nPmdyZWVuPC9zcGFuPiIp
OworCisgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIGZvbnQgc3RpbGwgb25seSBoYXMgb25lIGRpdi4K
KyAgICB2YXIgZm9udCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJmb250cyIpOworICAgIHZh
ciBkaXZzID0gZm9udC5xdWVyeVNlbGVjdG9yQWxsKCJkaXYiKTsKKyAgICBpZiAoZGl2cy5sZW5n
dGggIT0gMSkKKyAgICAgICAgZmFpbCgiQW4gZXh0cmEgZGl2IGlzIGluc2VydGVkIHdoaWNoIGlz
IGluY29ycmVjdC4gVGhlcmUgYXJlICIgKyBkaXZzLmxlbmd0aCArICIgZGl2cyBpbnNpZGUgZm9u
dCBlbGVtZW50LiIpOworCisgICAgLy8gUmVwbGFjZSB0ZXh0IHdpdGggU1VDQ0VTUy4KKyAgICBk
b2N1bWVudC5ib2R5LmlubmVySFRNTCA9ICJTVUNDRVNTIjsKKzwvc2NyaXB0Pgo=
</data>
<flag name="review"
          id="137282"
          type_id="1"
          status="-"
          setter="rniwa"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>133563</attachid>
            <date>2012-03-23 14:23:20 -0700</date>
            <delta_ts>2012-04-19 14:34:31 -0700</delta_ts>
            <desc>updated patch based on Niwa&apos;s review</desc>
            <filename>71207v2.patch</filename>
            <type>text/plain</type>
            <size>8643</size>
            <attacher name="Yi Shen">max.hong.shen</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDExMTkwNCkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDI5IEBACisyMDEyLTAzLTIzICBZaSBTaGVu
ICA8eWkuNC5zaGVuQG5va2lhLmNvbT4KKworICAgICAgICBBbiBleHRyYSBsaW5lIGJyZWFrIGlz
IGluc2VydGVkIHdoZW4gcGFzdGluZyBpbnRvIGEgZm9udCBlbGVtZW50LgorICAgICAgICBodHRw
czovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzEyMDcKKworICAgICAgICBSZXZp
ZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBGaXggYW4gZWRpdGluZyBidWcgd2hl
cmUgaW5zZXJ0aW5nIHRleHQgaW50byBhIGZvbnQgZWxlbWVudCB3b3VsZAorICAgICAgICBjcmVh
dGUgYW4gZXh0cmEgZGl2IGVsZW1lbnQgaW4gdGhlIGRvbSB0cmVlLiBUaGUKKyAgICAgICAgV2Vi
Q29yZTo6cG9zaXRpb25Bdm9pZGluZ1ByZWNlZGluZ05vZGVzKCkgdHJpZXMgdG8gc2V0IHRoZSBj
b3JyZWN0CisgICAgICAgIGRlc3RpbmF0aW9uIHBvc2l0aW9uIGJ5IGNoZWNraW5nIHRoZSBuZXh0
IHZpc2libGUgcG9zaXRpb24sIGhvd2V2ZXIsCisgICAgICAgIGl0IGNhdXNlcyB0aGUgcG9zaXRp
b24gbW92ZXMgaW50byB0aGUgY2hpbGQgZWxlbWVudCBpbiBzb21lY2FzZS4KKyAgICAgICAgSW5z
dGVhZCwgd2Ugc2hvdWxkIG9ubHkgY2hlY2sgdGhlIHBvc2l0aW9uIGluIHBhcmVudCBhZnRlciBu
b2RlLgorCisgICAgICAgIFRlc3Q6IGVkaXRpbmcvaW5zZXJ0aW5nL2luc2VydC10ZXh0LWludG8t
Zm9udC5odG1sCisKKyAgICAgICAgKiBlZGl0aW5nL1JlcGxhY2VTZWxlY3Rpb25Db21tYW5kLmNw
cDoKKyAgICAgICAgKFdlYkNvcmUpOgorICAgICAgICAoV2ViQ29yZTo6aXNOZXh0U2libGluZ05v
ZGVXaXRoU2FtZVZpc2libGVQb3NpdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpwb3NpdGlvbkF2
b2lkaW5nUHJlY2VkaW5nTm9kZXMpOgorICAgICAgICAqIGVkaXRpbmcvaHRtbGVkaXRpbmcuY3Bw
OgorICAgICAgICAoV2ViQ29yZSk6CisgICAgICAgIChXZWJDb3JlOjphbmNob3JQb3NpdGlvbk9m
RGVzaXJlZCk6IGhlbHAgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyB0aGUgZGVzaXJlZCBwb3NpdGlv
bi4KKyAgICAgICAgKiBlZGl0aW5nL2h0bWxlZGl0aW5nLmg6CisgICAgICAgIChXZWJDb3JlKToK
KwogMjAxMi0wMy0yMyAgQmV0aCBEYWtpbiAgPGJkYWtpbkBhcHBsZS5jb20+CiAKICAgICAgICAg
aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTgyMDgzCkluZGV4OiBTb3Vy
Y2UvV2ViQ29yZS9lZGl0aW5nL1JlcGxhY2VTZWxlY3Rpb25Db21tYW5kLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL1JlcGxhY2VTZWxlY3Rpb25Db21tYW5kLmNwcAko
cmV2aXNpb24gMTExODYzKQorKysgU291cmNlL1dlYkNvcmUvZWRpdGluZy9SZXBsYWNlU2VsZWN0
aW9uQ29tbWFuZC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTExMiwyMSArMTEyLDMxIEBAIHN0YXRp
YyBib29sIGlzSW50ZXJjaGFuZ2VDb252ZXJ0ZWRTcGFjZVMKICAgICByZXR1cm4gbm9kZS0+aXNI
VE1MRWxlbWVudCgpICYmIAogICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBIVE1MRWxlbWVu
dCAqPihub2RlKS0+Z2V0QXR0cmlidXRlKGNsYXNzQXR0cikgPT0gY29udmVydGVkU3BhY2VTcGFu
Q2xhc3NTdHJpbmc7CiB9CisgICAgCitzdGF0aWMgYm9vbCBpc05leHRTaWJsaW5nTm9kZVdpdGhT
YW1lVmlzaWJsZVBvc2l0aW9uKGNvbnN0IFBvc2l0aW9uJiBwb3NpdGlvbikKK3sKKyAgICBBU1NF
UlQocG9zaXRpb24uaXNOb3ROdWxsKCkpOworICAgIE5vZGUqIG5vZGUgPSBwb3NpdGlvbi5hbmNo
b3JOb2RlKCk7CisgICAgaWYgKCFub2RlLT5ub25TaGFkb3dCb3VuZGFyeVBhcmVudE5vZGUoKSkK
KyAgICAgICAgcmV0dXJuIGZhbHNlOwogCi1zdGF0aWMgUG9zaXRpb24gcG9zaXRpb25Bdm9pZGlu
Z1ByZWNlZGluZ05vZGVzKFBvc2l0aW9uIHBvcykKKyAgICByZXR1cm4gVmlzaWJsZVBvc2l0aW9u
KHBvc2l0aW9uKSA9PSBWaXNpYmxlUG9zaXRpb24ocG9zaXRpb25JblBhcmVudEFmdGVyTm9kZShu
b2RlKSk7Cit9CisgICAgCitzdGF0aWMgUG9zaXRpb24gcG9zaXRpb25Bdm9pZGluZ1ByZWNlZGlu
Z05vZGVzKGNvbnN0IFBvc2l0aW9uJiBpbnNlcnRpb25Qb3MpCiB7CisgICAgQVNTRVJUKGluc2Vy
dGlvblBvcy5pc05vdE51bGwoKSk7CiAgICAgLy8gSWYgd2UncmUgYWxyZWFkeSBvbiBhIGJyZWFr
LCBpdCdzIHByb2JhYmx5IGEgcGxhY2Vob2xkZXIgYW5kIHdlIHNob3VsZG4ndCBjaGFuZ2Ugb3Vy
IHBvc2l0aW9uLgotICAgIGlmIChlZGl0aW5nSWdub3Jlc0NvbnRlbnQocG9zLmRlcHJlY2F0ZWRO
b2RlKCkpKQotICAgICAgICByZXR1cm4gcG9zOworICAgIGlmIChlZGl0aW5nSWdub3Jlc0NvbnRl
bnQoaW5zZXJ0aW9uUG9zLmFuY2hvck5vZGUoKSkpCisgICAgICAgIHJldHVybiBpbnNlcnRpb25Q
b3M7CisgICAgCiAKICAgICAvLyBXZSBhbHNvIHN0b3Agd2hlbiBjaGFuZ2luZyBibG9jayBmbG93
IGVsZW1lbnRzIGJlY2F1c2UgZXZlbiB0aG91Z2ggdGhlIHZpc3VhbCBwb3NpdGlvbiBpcyB0aGUK
ICAgICAvLyBzYW1lLiAgRS5nLiwKICAgICAvLyAgIDxkaXY+Zm9vXjwvZGl2Pl4KICAgICAvLyBU
aGUgdHdvIHBvc2l0aW9ucyBhYm92ZSBhcmUgdGhlIHNhbWUgdmlzdWFsIHBvc2l0aW9uLCBidXQg
d2Ugd2FudCB0byBzdGF5IGluIHRoZSBzYW1lIGJsb2NrLgotICAgIE5vZGUqIHN0b3BOb2RlID0g
cG9zLmRlcHJlY2F0ZWROb2RlKCktPmVuY2xvc2luZ0Jsb2NrRmxvd0VsZW1lbnQoKTsKLSAgICB3
aGlsZSAoc3RvcE5vZGUgIT0gcG9zLmRlcHJlY2F0ZWROb2RlKCkgJiYgVmlzaWJsZVBvc2l0aW9u
KHBvcykgPT0gVmlzaWJsZVBvc2l0aW9uKHBvcy5uZXh0KCkpKQotICAgICAgICBwb3MgPSBwb3Mu
bmV4dCgpOwotICAgIHJldHVybiBwb3M7CisgICAgTm9kZSogY29udGFpbmdCbG9jayA9IGVuY2xv
c2luZ0Jsb2NrKGluc2VydGlvblBvcy5jb250YWluZXJOb2RlKCkpOworICAgIHJldHVybiBhbmNo
b3JQb3NpdGlvbk9mRGVzaXJlZChpbnNlcnRpb25Qb3MsIGlzTmV4dFNpYmxpbmdOb2RlV2l0aFNh
bWVWaXNpYmxlUG9zaXRpb24sIGNvbnRhaW5nQmxvY2spOwogfQogCiBSZXBsYWNlbWVudEZyYWdt
ZW50OjpSZXBsYWNlbWVudEZyYWdtZW50KERvY3VtZW50KiBkb2N1bWVudCwgRG9jdW1lbnRGcmFn
bWVudCogZnJhZ21lbnQsIGJvb2wgbWF0Y2hTdHlsZSwgY29uc3QgVmlzaWJsZVNlbGVjdGlvbiYg
c2VsZWN0aW9uKQpJbmRleDogU291cmNlL1dlYkNvcmUvZWRpdGluZy9odG1sZWRpdGluZy5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvZWRpdGluZy9odG1sZWRpdGluZy5jcHAJKHJl
dmlzaW9uIDExMTg2MykKKysrIFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvaHRtbGVkaXRpbmcuY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC0yNTAsNiArMjUwLDIwIEBAIFBvc2l0aW9uIHByZXZpb3VzVmlz
dWFsbHlEaXN0aW5jdENhbmRpZGEKICAgICB9CiAgICAgcmV0dXJuIFBvc2l0aW9uKCk7CiB9Cisg
ICAgCitQb3NpdGlvbiBhbmNob3JQb3NpdGlvbk9mRGVzaXJlZChjb25zdCBQb3NpdGlvbiYgcG9z
aXRpb24sIGJvb2wgKCpwb3NpdGlvbklzT2ZEZXNpcmVkKShjb25zdCBQb3NpdGlvbiYpLCBOb2Rl
KiBzdGF5V2l0aGluKQoreworICAgIEFTU0VSVChwb3NpdGlvbi5pc05vdE51bGwoKSk7CisgICAg
UG9zaXRpb24gYW5jaG9yUG9zaXRpb24gPSBwb3NpdGlvbjsKKyAgICBmb3IgKE5vZGUqIG5vZGUg
PSBwb3NpdGlvbi5hbmNob3JOb2RlKCk7IG5vZGUgJiYgbm9kZSAhPSBzdGF5V2l0aGluICYmIG5v
ZGUgPT0gYW5jaG9yUG9zaXRpb24uYW5jaG9yTm9kZSgpOyBub2RlID0gbm9kZS0+cGFyZW50Tm9k
ZSgpKSB7CisgICAgICAgIGlmIChwb3NpdGlvbklzT2ZEZXNpcmVkKGFuY2hvclBvc2l0aW9uKSkg
eworICAgICAgICAgICAgaWYgKG5vZGUtPm5vblNoYWRvd0JvdW5kYXJ5UGFyZW50Tm9kZSgpKQor
ICAgICAgICAgICAgICAgIGFuY2hvclBvc2l0aW9uID0gcG9zaXRpb25JblBhcmVudEFmdGVyTm9k
ZShub2RlKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAg
cmV0dXJuIGFuY2hvclBvc2l0aW9uOworfQogCiBWaXNpYmxlUG9zaXRpb24gZmlyc3RFZGl0YWJs
ZVBvc2l0aW9uQWZ0ZXJQb3NpdGlvbkluUm9vdChjb25zdCBQb3NpdGlvbiYgcG9zaXRpb24sIE5v
ZGUqIGhpZ2hlc3RSb290KQogewpJbmRleDogU291cmNlL1dlYkNvcmUvZWRpdGluZy9odG1sZWRp
dGluZy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvaHRtbGVkaXRpbmcu
aAkocmV2aXNpb24gMTExODYzKQorKysgU291cmNlL1dlYkNvcmUvZWRpdGluZy9odG1sZWRpdGlu
Zy5oCSh3b3JraW5nIGNvcHkpCkBAIC0xMzIsNiArMTMyLDggQEAgUG9zaXRpb24gcG9zaXRpb25C
ZWZvcmVDb250YWluaW5nU3BlY2lhbAogUG9zaXRpb24gcG9zaXRpb25BZnRlckNvbnRhaW5pbmdT
cGVjaWFsRWxlbWVudChjb25zdCBQb3NpdGlvbiYsIE5vZGUqKiBjb250YWluaW5nU3BlY2lhbEVs
ZW1lbnQ9MCk7CiBQb3NpdGlvbiBwb3NpdGlvbk91dHNpZGVDb250YWluaW5nU3BlY2lhbEVsZW1l
bnQoY29uc3QgUG9zaXRpb24mLCBOb2RlKiogY29udGFpbmluZ1NwZWNpYWxFbGVtZW50PTApOwog
CitQb3NpdGlvbiBhbmNob3JQb3NpdGlvbk9mRGVzaXJlZChjb25zdCBQb3NpdGlvbiYsIGJvb2wg
KCpwb3NpdGlvbklzT2ZEZXNpcmVkKShjb25zdCBQb3NpdGlvbiYpLCBOb2RlKiBzdGF5V2l0aGlu
ID0gMCk7ICAgIAorCiBpbmxpbmUgUG9zaXRpb24gZmlyc3RQb3NpdGlvbkluT3JCZWZvcmVOb2Rl
KE5vZGUqIG5vZGUpCiB7CiAgICAgaWYgKCFub2RlKQpJbmRleDogTGF5b3V0VGVzdHMvQ2hhbmdl
TG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL0NoYW5nZUxvZwkocmV2aXNpb24gMTExOTA0
KQorKysgTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMjAg
QEAKKzIwMTItMDMtMjMgIFlpIFNoZW4gIDx5aS40LnNoZW5Abm9raWEuY29tPgorCisgICAgICAg
IEFuIGV4dHJhIGxpbmUgYnJlYWsgaXMgaW5zZXJ0ZWQgd2hlbiBwYXN0aW5nIGludG8gYSBmb250
IGVsZW1lbnQuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9p
ZD03MTIwNworCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAg
IEZpeCBhbiBlZGl0aW5nIGJ1ZyB3aGVyZSBpbnNlcnRpbmcgdGV4dCBpbnRvIGEgZm9udCBlbGVt
ZW50IHdvdWxkCisgICAgICAgIGNyZWF0ZSBhbiBleHRyYSBkaXYgZWxlbWVudCBpbiB0aGUgZG9t
IHRyZWUuIFRoZQorICAgICAgICBXZWJDb3JlOjpwb3NpdGlvbkF2b2lkaW5nUHJlY2VkaW5nTm9k
ZXMoKSB0cmllcyB0byBzZXQgdGhlIGNvcnJlY3QKKyAgICAgICAgZGVzdGluYXRpb24gcG9zaXRp
b24gYnkgY2hlY2tpbmcgdGhlIG5leHQgdmlzaWJsZSBwb3NpdGlvbiwgaG93ZXZlciwKKyAgICAg
ICAgaXQgY2F1c2VzIHRoZSBwb3NpdGlvbiBtb3ZlcyBpbnRvIHRoZSBjaGlsZCBlbGVtZW50IGlu
IHNvbWVjYXNlLgorICAgICAgICBJbnN0ZWFkLCB3ZSBzaG91bGQgb25seSBjaGVjayB0aGUgcG9z
aXRpb24gaW4gcGFyZW50IGFmdGVyIG5vZGUuCisKKyAgICAgICAgKiBlZGl0aW5nL2luc2VydGlu
Zy9pbnNlcnQtdGV4dC1pbnRvLWZvbnQtZXhwZWN0ZWQudHh0OiBBZGRlZC4KKyAgICAgICAgKiBl
ZGl0aW5nL2luc2VydGluZy9pbnNlcnQtdGV4dC1pbnRvLWZvbnQuaHRtbDogQWRkZWQuCisKIDIw
MTItMDMtMjMgIEFkcmllbm5lIFdhbGtlciAgPGVubmVAZ29vZ2xlLmNvbT4KIAogICAgICAgICBb
Y2hyb21pdW1dIFVucmV2aWV3ZWQsIHJlYmFzZWxpbmUgcGxhdGZvcm0vY2hyb21pdW0vY29tcG9z
aXRpbmcvM2QtY29ybmVycy5odG1sCkluZGV4OiBMYXlvdXRUZXN0cy9lZGl0aW5nL2luc2VydGlu
Zy9pbnNlcnQtdGV4dC1pbnRvLWZvbnQtZXhwZWN0ZWQudHh0Cj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91
dFRlc3RzL2VkaXRpbmcvaW5zZXJ0aW5nL2luc2VydC10ZXh0LWludG8tZm9udC1leHBlY3RlZC50
eHQJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9lZGl0aW5nL2luc2VydGluZy9pbnNlcnQt
dGV4dC1pbnRvLWZvbnQtZXhwZWN0ZWQudHh0CShyZXZpc2lvbiAwKQpAQCAtMCwwICsxIEBACitT
VUNDRVNTCkluZGV4OiBMYXlvdXRUZXN0cy9lZGl0aW5nL2luc2VydGluZy9pbnNlcnQtdGV4dC1p
bnRvLWZvbnQuaHRtbAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9lZGl0aW5nL2luc2VydGlu
Zy9pbnNlcnQtdGV4dC1pbnRvLWZvbnQuaHRtbAkocmV2aXNpb24gMCkKKysrIExheW91dFRlc3Rz
L2VkaXRpbmcvaW5zZXJ0aW5nL2luc2VydC10ZXh0LWludG8tZm9udC5odG1sCShyZXZpc2lvbiAw
KQpAQCAtMCwwICsxLDQzIEBACis8Ym9keSBjb250ZW50RWRpdGFibGU9InRydWUiPgorPGZvbnQg
aWQ9ImZvbnRzIj4KK0ZpcnN0IGxpbmUKKzxkaXYgaWQ9InNlY29uZERpdiI+CitTZWNvbmQgbGlu
ZQorPC9kaXY+Cis8L2ZvbnQ+Cis8L2JvZHk+Cis8c2NyaXB0IHNyYz0iLi4vZWRpdGluZy5qcyI+
PC9zY3JpcHQ+Cis8c2NyaXB0PgorICAgIGlmICh3aW5kb3cubGF5b3V0VGVzdENvbnRyb2xsZXIp
CisgICAgICAgIGxheW91dFRlc3RDb250cm9sbGVyLmR1bXBBc1RleHQoKTsKKworICAgIGZ1bmN0
aW9uIGZhaWwobXNnKSB7CisgICAgICAgIGNvbnNvbGUubG9nKG1zZyk7CisgICAgICAgIHRocm93
IG1zZzsKKyAgICB9CisKKyAgICAvLyBJbnNlcnRpbmcgSFRNTCB0byByZXBsYWNlIHRoZSAibGlu
ZSIgaW4gdGhlICJTZWNvbmQgbGluZSIgc2hvdWxkIG5vdCBpbnNlcnQgYW4gZXh0cmEgZGl2IChs
aW5lIGJyZWFrKS4KKyAgICB2YXIgdGFyZ2V0RGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQo
InNlY29uZERpdiIpOworICAgIHZhciB0YXJnZXRUZXh0ID0gdGFyZ2V0RGl2LmZpcnN0Q2hpbGQ7
CisgICAgZXhlY1NldFNlbGVjdGlvbkNvbW1hbmQodGFyZ2V0VGV4dCwgOCwgdGFyZ2V0VGV4dCwg
dGFyZ2V0VGV4dC50ZXh0Q29udGVudC5sZW5ndGgpOworICAgIGRvY3VtZW50LmV4ZWNDb21tYW5k
KCJpbnNlcnRodG1sIiwgZmFsc2UsICI8c3BhbiBpZD0ncmVkJyBzdHlsZT0nY29sb3I6cmVkJz5s
aW5lPC9zcGFuPiIpOworCisgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIGZvbnQgc3RpbGwgb25seSBo
YXMgb25lIGRpdi4KKyAgICB2YXIgZm9udCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJmb250
cyIpOworICAgIHZhciBkaXZzID0gZm9udC5xdWVyeVNlbGVjdG9yQWxsKCJkaXYiKTsKKyAgICBp
ZiAoZGl2cy5sZW5ndGggIT0gMSkKKyAgICAgICAgZmFpbCgiQW4gZXh0cmEgZGl2IGlzIGluc2Vy
dGVkIHdoaWNoIGlzIGluY29ycmVjdC4gVGhlcmUgYXJlICIgKyBkaXZzLmxlbmd0aCArICIgZGl2
cyBpbnNpZGUgZm9udCBlbGVtZW50LiIpOworCisgICAgLy8gSW5zZXJ0aW5nIEhUTUwgaW50byAi
U2Vjb25kIGxpbmUiIHNob3VsZCBub3QgaW5zZXJ0IGFuIGV4dHJhIGRpdiAobGluZSBicmVhayku
CisgICAgZXhlY1NldFNlbGVjdGlvbkNvbW1hbmQodGFyZ2V0VGV4dCwgOCwgdGFyZ2V0VGV4dCwg
OCk7CisgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoImluc2VydGh0bWwiLCBmYWxzZSwgIjxzcGFu
IGlkPSdncmVlbicgc3R5bGU9J2NvbG9yOmdyZWVuJz5ncmVlbjwvc3Bhbj4iKTsKKworICAgIC8v
IFZlcmlmeSB0aGF0IHRoZSBmb250IHN0aWxsIG9ubHkgaGFzIG9uZSBkaXYuCisgICAgdmFyIGZv
bnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZm9udHMiKTsKKyAgICB2YXIgZGl2cyA9IGZv
bnQucXVlcnlTZWxlY3RvckFsbCgiZGl2Iik7CisgICAgaWYgKGRpdnMubGVuZ3RoICE9IDEpCisg
ICAgICAgIGZhaWwoIkFuIGV4dHJhIGRpdiBpcyBpbnNlcnRlZCB3aGljaCBpcyBpbmNvcnJlY3Qu
IFRoZXJlIGFyZSAiICsgZGl2cy5sZW5ndGggKyAiIGRpdnMgaW5zaWRlIGZvbnQgZWxlbWVudC4i
KTsKKworICAgIC8vIFJlcGxhY2UgdGV4dCB3aXRoIFNVQ0NFU1MuCisgICAgZG9jdW1lbnQuYm9k
eS5pbm5lckhUTUwgPSAiU1VDQ0VTUyI7Cis8L3NjcmlwdD4K
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>134055</attachid>
            <date>2012-03-27 07:14:50 -0700</date>
            <delta_ts>2012-03-27 23:13:49 -0700</delta_ts>
            <desc>updated patch without using a help function</desc>
            <filename>71207v3.patch</filename>
            <type>text/plain</type>
            <size>5847</size>
            <attacher name="Yi Shen">max.hong.shen</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDExMjI2MSkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDIyIEBACiswMjAxMi0wMy0yNyAgWWkgU2hl
biAgPHlpLjQuc2hlbkBub2tpYS5jb20+LCAgUnlvc3VrZSBOaXdhICA8cm5pd2FAd2Via2l0Lm9y
Zz4KKworICAgICAgICBBbiBleHRyYSBsaW5lIGJyZWFrIGlzIGluc2VydGVkIHdoZW4gcGFzdGlu
ZyBpbnRvIGEgZm9udCBlbGVtZW50LgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9NzEyMDcKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMh
KS4KKworICAgICAgICBGaXggYW4gZWRpdGluZyBidWcgd2hlcmUgaW5zZXJ0aW5nIHRleHQgaW50
byBhIGZvbnQgZWxlbWVudCB3b3VsZAorICAgICAgICBjcmVhdGUgYW4gZXh0cmEgZGl2IGVsZW1l
bnQgaW4gdGhlIGRvbSB0cmVlLiBUaGUKKyAgICAgICAgV2ViQ29yZTo6cG9zaXRpb25Bdm9pZGlu
Z1ByZWNlZGluZ05vZGVzKCkgdHJpZXMgdG8gc2V0IHRoZSBjb3JyZWN0CisgICAgICAgIGRlc3Rp
bmF0aW9uIHBvc2l0aW9uIGJ5IGNoZWNraW5nIHRoZSBuZXh0IHZpc2libGUgcG9zaXRpb24sIGhv
d2V2ZXIsCisgICAgICAgIGl0IGNhdXNlcyB0aGUgcG9zaXRpb24gbW92ZXMgaW50byB0aGUgY2hp
bGQgZWxlbWVudCBpbiBzb21lY2FzZS4KKyAgICAgICAgSW5zdGVhZCwgd2Ugc2hvdWxkIG9ubHkg
Y2hlY2sgdGhlIHBvc2l0aW9uIGluIHBhcmVudCBhZnRlciBub2RlLgorCisgICAgICAgIFRlc3Q6
IGVkaXRpbmcvaW5zZXJ0aW5nL2luc2VydC10ZXh0LWludG8tZm9udC5odG1sCisKKyAgICAgICAg
KiBlZGl0aW5nL1JlcGxhY2VTZWxlY3Rpb25Db21tYW5kLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6
OnBvc2l0aW9uQXZvaWRpbmdQcmVjZWRpbmdOb2Rlcyk6CisKIDIwMTItMDMtMjcgIEFudHRpIEtv
aXZpc3RvICA8YW50dGlAYXBwbGUuY29tPgogCiAgICAgICAgIFJlbW92ZSBEb2N1bWVudDo6bWFw
cGVkRWxlbWVudFNoZWV0KCkgCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL1JlcGxhY2VT
ZWxlY3Rpb25Db21tYW5kLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9lZGl0aW5n
L1JlcGxhY2VTZWxlY3Rpb25Db21tYW5kLmNwcAkocmV2aXNpb24gMTEyMjU5KQorKysgU291cmNl
L1dlYkNvcmUvZWRpdGluZy9SZXBsYWNlU2VsZWN0aW9uQ29tbWFuZC5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTEyMSw5ICsxMjEsMTYgQEAgc3RhdGljIFBvc2l0aW9uIHBvc2l0aW9uQXZvaWRpbmdQ
cmVjZWRpbgogICAgIC8vIHNhbWUuICBFLmcuLAogICAgIC8vICAgPGRpdj5mb29ePC9kaXY+Xgog
ICAgIC8vIFRoZSB0d28gcG9zaXRpb25zIGFib3ZlIGFyZSB0aGUgc2FtZSB2aXN1YWwgcG9zaXRp
b24sIGJ1dCB3ZSB3YW50IHRvIHN0YXkgaW4gdGhlIHNhbWUgYmxvY2suCi0gICAgTm9kZSogc3Rv
cE5vZGUgPSBwb3MuZGVwcmVjYXRlZE5vZGUoKS0+ZW5jbG9zaW5nQmxvY2tGbG93RWxlbWVudCgp
OwotICAgIHdoaWxlIChzdG9wTm9kZSAhPSBwb3MuZGVwcmVjYXRlZE5vZGUoKSAmJiBWaXNpYmxl
UG9zaXRpb24ocG9zKSA9PSBWaXNpYmxlUG9zaXRpb24ocG9zLm5leHQoKSkpCi0gICAgICAgIHBv
cyA9IHBvcy5uZXh0KCk7CisgICAgTm9kZSogZW5jbG9zaW5nQmxvY2tOb2RlID0gZW5jbG9zaW5n
QmxvY2socG9zLmNvbnRhaW5lck5vZGUoKSk7CisgICAgZm9yIChQb3NpdGlvbiBuZXh0UG9zaXRp
b24gPSBwb3M7IG5leHRQb3NpdGlvbi5jb250YWluZXJOb2RlKCkgIT0gZW5jbG9zaW5nQmxvY2tO
b2RlOyBwb3MgPSBuZXh0UG9zaXRpb24pIHsKKyAgICAgICAgaWYgKHBvcy5jb250YWluZXJOb2Rl
KCktPm5vblNoYWRvd0JvdW5kYXJ5UGFyZW50Tm9kZSgpKQorICAgICAgICAgICAgbmV4dFBvc2l0
aW9uID0gcG9zaXRpb25JblBhcmVudEFmdGVyTm9kZShwb3MuY29udGFpbmVyTm9kZSgpKTsKKyAg
ICAgICAgCisgICAgICAgIGlmIChuZXh0UG9zaXRpb24gPT0gcG9zIAorICAgICAgICAgICAgfHwg
ZW5jbG9zaW5nQmxvY2sobmV4dFBvc2l0aW9uLmNvbnRhaW5lck5vZGUoKSkgIT0gZW5jbG9zaW5n
QmxvY2tOb2RlCisgICAgICAgICAgICB8fCBWaXNpYmxlUG9zaXRpb24ocG9zKSAhPSBWaXNpYmxl
UG9zaXRpb24obmV4dFBvc2l0aW9uKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KICAgICBy
ZXR1cm4gcG9zOwogfQogCkluZGV4OiBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCShyZXZpc2lvbiAxMTIyNjEpCisrKyBMYXlvdXRUZXN0
cy9DaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSwyMCBAQAorMjAxMi0wMy0yNyAg
WWkgU2hlbiAgPHlpLjQuc2hlbkBub2tpYS5jb20+CisKKyAgICAgICAgQW4gZXh0cmEgbGluZSBi
cmVhayBpcyBpbnNlcnRlZCB3aGVuIHBhc3RpbmcgaW50byBhIGZvbnQgZWxlbWVudC4KKyAgICAg
ICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTcxMjA3CisKKyAgICAg
ICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgRml4IGFuIGVkaXRpbmcg
YnVnIHdoZXJlIGluc2VydGluZyB0ZXh0IGludG8gYSBmb250IGVsZW1lbnQgd291bGQKKyAgICAg
ICAgY3JlYXRlIGFuIGV4dHJhIGRpdiBlbGVtZW50IGluIHRoZSBkb20gdHJlZS4gVGhlCisgICAg
ICAgIFdlYkNvcmU6OnBvc2l0aW9uQXZvaWRpbmdQcmVjZWRpbmdOb2RlcygpIHRyaWVzIHRvIHNl
dCB0aGUgY29ycmVjdAorICAgICAgICBkZXN0aW5hdGlvbiBwb3NpdGlvbiBieSBjaGVja2luZyB0
aGUgbmV4dCB2aXNpYmxlIHBvc2l0aW9uLCBob3dldmVyLAorICAgICAgICBpdCBjYXVzZXMgdGhl
IHBvc2l0aW9uIG1vdmVzIGludG8gdGhlIGNoaWxkIGVsZW1lbnQgaW4gc29tZWNhc2UuCisgICAg
ICAgIEluc3RlYWQsIHdlIHNob3VsZCBvbmx5IGNoZWNrIHRoZSBwb3NpdGlvbiBpbiBwYXJlbnQg
YWZ0ZXIgbm9kZS4KKworICAgICAgICAqIGVkaXRpbmcvaW5zZXJ0aW5nL2luc2VydC10ZXh0LWlu
dG8tZm9udC1leHBlY3RlZC50eHQ6IEFkZGVkLgorICAgICAgICAqIGVkaXRpbmcvaW5zZXJ0aW5n
L2luc2VydC10ZXh0LWludG8tZm9udC5odG1sOiBBZGRlZC4KKwogMjAxMi0wMy0yNyAgQWxleGlz
IE1lbmFyZCAgPGFsZXhpcy5tZW5hcmRAb3BlbmJvc3NhLm9yZz4KIAogICAgICAgICBJbmNyZWFz
ZSBjb2RlIHNoYXJpbmcgYmV0d2VlbiBDU1NDb21wdXRlZFN0eWxlRGVjbGFyYXRpb24gYW5kIENT
U1Byb3BlcnR5TG9uZ2hhbmQuCkluZGV4OiBMYXlvdXRUZXN0cy9lZGl0aW5nL2luc2VydGluZy9p
bnNlcnQtdGV4dC1pbnRvLWZvbnQtZXhwZWN0ZWQudHh0Cj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRl
c3RzL2VkaXRpbmcvaW5zZXJ0aW5nL2luc2VydC10ZXh0LWludG8tZm9udC1leHBlY3RlZC50eHQJ
KHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9lZGl0aW5nL2luc2VydGluZy9pbnNlcnQtdGV4
dC1pbnRvLWZvbnQtZXhwZWN0ZWQudHh0CShyZXZpc2lvbiAwKQpAQCAtMCwwICsxIEBACitTVUND
RVNTCkluZGV4OiBMYXlvdXRUZXN0cy9lZGl0aW5nL2luc2VydGluZy9pbnNlcnQtdGV4dC1pbnRv
LWZvbnQuaHRtbAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9lZGl0aW5nL2luc2VydGluZy9p
bnNlcnQtdGV4dC1pbnRvLWZvbnQuaHRtbAkocmV2aXNpb24gMCkKKysrIExheW91dFRlc3RzL2Vk
aXRpbmcvaW5zZXJ0aW5nL2luc2VydC10ZXh0LWludG8tZm9udC5odG1sCShyZXZpc2lvbiAwKQpA
QCAtMCwwICsxLDQzIEBACis8Ym9keSBjb250ZW50RWRpdGFibGU9InRydWUiPgorPGZvbnQgaWQ9
ImZvbnRzIj4KK0ZpcnN0IGxpbmUKKzxkaXYgaWQ9InNlY29uZERpdiI+CitTZWNvbmQgbGluZQor
PC9kaXY+Cis8L2ZvbnQ+Cis8L2JvZHk+Cis8c2NyaXB0IHNyYz0iLi4vZWRpdGluZy5qcyI+PC9z
Y3JpcHQ+Cis8c2NyaXB0PgorICAgIGlmICh3aW5kb3cubGF5b3V0VGVzdENvbnRyb2xsZXIpCisg
ICAgICAgIGxheW91dFRlc3RDb250cm9sbGVyLmR1bXBBc1RleHQoKTsKKworICAgIGZ1bmN0aW9u
IGZhaWwobXNnKSB7CisgICAgICAgIGNvbnNvbGUubG9nKG1zZyk7CisgICAgICAgIHRocm93IG1z
ZzsKKyAgICB9CisKKyAgICAvLyBJbnNlcnRpbmcgSFRNTCB0byByZXBsYWNlIHRoZSAibGluZSIg
aW4gdGhlICJTZWNvbmQgbGluZSIgc2hvdWxkIG5vdCBpbnNlcnQgYW4gZXh0cmEgZGl2IChsaW5l
IGJyZWFrKS4KKyAgICB2YXIgdGFyZ2V0RGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNl
Y29uZERpdiIpOworICAgIHZhciB0YXJnZXRUZXh0ID0gdGFyZ2V0RGl2LmZpcnN0Q2hpbGQ7Cisg
ICAgZXhlY1NldFNlbGVjdGlvbkNvbW1hbmQodGFyZ2V0VGV4dCwgOCwgdGFyZ2V0VGV4dCwgdGFy
Z2V0VGV4dC50ZXh0Q29udGVudC5sZW5ndGgpOworICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCJp
bnNlcnRodG1sIiwgZmFsc2UsICI8c3BhbiBpZD0ncmVkJyBzdHlsZT0nY29sb3I6cmVkJz5saW5l
PC9zcGFuPiIpOworCisgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIGZvbnQgc3RpbGwgb25seSBoYXMg
b25lIGRpdi4KKyAgICB2YXIgZm9udCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJmb250cyIp
OworICAgIHZhciBkaXZzID0gZm9udC5xdWVyeVNlbGVjdG9yQWxsKCJkaXYiKTsKKyAgICBpZiAo
ZGl2cy5sZW5ndGggIT0gMSkKKyAgICAgICAgZmFpbCgiQW4gZXh0cmEgZGl2IGlzIGluc2VydGVk
IHdoaWNoIGlzIGluY29ycmVjdC4gVGhlcmUgYXJlICIgKyBkaXZzLmxlbmd0aCArICIgZGl2cyBp
bnNpZGUgZm9udCBlbGVtZW50LiIpOworCisgICAgLy8gSW5zZXJ0aW5nIEhUTUwgaW50byAiU2Vj
b25kIGxpbmUiIHNob3VsZCBub3QgaW5zZXJ0IGFuIGV4dHJhIGRpdiAobGluZSBicmVhaykuCisg
ICAgZXhlY1NldFNlbGVjdGlvbkNvbW1hbmQodGFyZ2V0VGV4dCwgOCwgdGFyZ2V0VGV4dCwgOCk7
CisgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoImluc2VydGh0bWwiLCBmYWxzZSwgIjxzcGFuIGlk
PSdncmVlbicgc3R5bGU9J2NvbG9yOmdyZWVuJz5ncmVlbjwvc3Bhbj4iKTsKKworICAgIC8vIFZl
cmlmeSB0aGF0IHRoZSBmb250IHN0aWxsIG9ubHkgaGFzIG9uZSBkaXYuCisgICAgdmFyIGZvbnQg
PSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZm9udHMiKTsKKyAgICB2YXIgZGl2cyA9IGZvbnQu
cXVlcnlTZWxlY3RvckFsbCgiZGl2Iik7CisgICAgaWYgKGRpdnMubGVuZ3RoICE9IDEpCisgICAg
ICAgIGZhaWwoIkFuIGV4dHJhIGRpdiBpcyBpbnNlcnRlZCB3aGljaCBpcyBpbmNvcnJlY3QuIFRo
ZXJlIGFyZSAiICsgZGl2cy5sZW5ndGggKyAiIGRpdnMgaW5zaWRlIGZvbnQgZWxlbWVudC4iKTsK
KworICAgIC8vIFJlcGxhY2UgdGV4dCB3aXRoIFNVQ0NFU1MuCisgICAgZG9jdW1lbnQuYm9keS5p
bm5lckhUTUwgPSAiU1VDQ0VTUyI7Cis8L3NjcmlwdD4K
</data>
<flag name="review"
          id="138213"
          type_id="1"
          status="+"
          setter="rniwa"
    />
    <flag name="commit-queue"
          id="138214"
          type_id="3"
          status="-"
          setter="webkit.review.bot"
    />
          </attachment>
      

    </bug>

</bugzilla>