<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[167781] trunk/Source/WebInspectorUI</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/167781">167781</a></dd>
<dt>Author</dt> <dd>commit-queue@webkit.org</dd>
<dt>Date</dt> <dd>2014-04-24 17:06:46 -0700 (Thu, 24 Apr 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Web Inspector: Should update to CodeMirror 4.1
https://bugs.webkit.org/show_bug.cgi?id=132140

Patch by Jonathan Wells &lt;jonowells@apple.com&gt; on 2014-04-24
Reviewed by Timothy Hatcher.

Updated to CodeMirror 4.1, which contains several bugfixes.
Release notes: http://codemirror.net/doc/releases.html#v4

* Tools/PrettyPrinting/codemirror.js:
* Tools/PrettyPrinting/css.js:
* Tools/PrettyPrinting/javascript.js:
* UserInterface/External/CodeMirror/codemirror.js:
* UserInterface/External/CodeMirror/css.js:
* UserInterface/External/CodeMirror/javascript.js:
* UserInterface/External/CodeMirror/livescript.js:
* UserInterface/External/CodeMirror/runmode.js:
* UserInterface/External/CodeMirror/xml.js:
Updated to CodeMirror 4.1.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebInspectorUIChangeLog">trunk/Source/WebInspectorUI/ChangeLog</a></li>
<li><a href="#trunkSourceWebInspectorUIToolsPrettyPrintingcodemirrorjs">trunk/Source/WebInspectorUI/Tools/PrettyPrinting/codemirror.js</a></li>
<li><a href="#trunkSourceWebInspectorUIToolsPrettyPrintingcssjs">trunk/Source/WebInspectorUI/Tools/PrettyPrinting/css.js</a></li>
<li><a href="#trunkSourceWebInspectorUIToolsPrettyPrintingjavascriptjs">trunk/Source/WebInspectorUI/Tools/PrettyPrinting/javascript.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceExternalCodeMirrorcodemirrorjs">trunk/Source/WebInspectorUI/UserInterface/External/CodeMirror/codemirror.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceExternalCodeMirrorcssjs">trunk/Source/WebInspectorUI/UserInterface/External/CodeMirror/css.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceExternalCodeMirrorjavascriptjs">trunk/Source/WebInspectorUI/UserInterface/External/CodeMirror/javascript.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceExternalCodeMirrorlivescriptjs">trunk/Source/WebInspectorUI/UserInterface/External/CodeMirror/livescript.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceExternalCodeMirrorrunmodejs">trunk/Source/WebInspectorUI/UserInterface/External/CodeMirror/runmode.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceExternalCodeMirrorxmljs">trunk/Source/WebInspectorUI/UserInterface/External/CodeMirror/xml.js</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebInspectorUIChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/ChangeLog (167780 => 167781)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/ChangeLog        2014-04-24 22:48:32 UTC (rev 167780)
+++ trunk/Source/WebInspectorUI/ChangeLog        2014-04-25 00:06:46 UTC (rev 167781)
</span><span class="lines">@@ -1,5 +1,26 @@
</span><span class="cx"> 2014-04-24  Jonathan Wells  &lt;jonowells@apple.com&gt;
</span><span class="cx"> 
</span><ins>+        Web Inspector: Should update to CodeMirror 4.1
+        https://bugs.webkit.org/show_bug.cgi?id=132140
+
+        Reviewed by Timothy Hatcher.
+
+        Updated to CodeMirror 4.1, which contains several bugfixes.
+        Release notes: http://codemirror.net/doc/releases.html#v4
+
+        * Tools/PrettyPrinting/codemirror.js:
+        * Tools/PrettyPrinting/css.js:
+        * Tools/PrettyPrinting/javascript.js:
+        * UserInterface/External/CodeMirror/codemirror.js:
+        * UserInterface/External/CodeMirror/css.js:
+        * UserInterface/External/CodeMirror/javascript.js:
+        * UserInterface/External/CodeMirror/livescript.js:
+        * UserInterface/External/CodeMirror/runmode.js:
+        * UserInterface/External/CodeMirror/xml.js:
+        Updated to CodeMirror 4.1.
+
+2014-04-24  Jonathan Wells  &lt;jonowells@apple.com&gt;
+
</ins><span class="cx">         Web Inspector: CSS autofill suggests properties instead of values when values are needed
</span><span class="cx">         https://bugs.webkit.org/show_bug.cgi?id=132090
</span><span class="cx"> 
</span><span class="lines">@@ -10,7 +31,7 @@
</span><span class="cx">         with CSS autofill, CSS code coloring, and also
</span><span class="cx">         https://bugs.webkit.org/show_bug.cgi?id=131859. The main issue is that
</span><span class="cx">         CodeMirror 4's CSS mode (css.js) stores its parsing modes in a different
</span><del>-        data structure. All references to state.stack are obscelete. Many
</del><ins>+        data structure. All references to state.stack are obsolete. Many
</ins><span class="cx">         are fixed here and more will be in an upcoming patch.
</span><span class="cx"> 
</span><span class="cx">         * Tools/PrettyPrinting/CodeMirrorFormatters.js: Removed exception for checking state.stack properties.
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIToolsPrettyPrintingcodemirrorjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/Tools/PrettyPrinting/codemirror.js (167780 => 167781)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/Tools/PrettyPrinting/codemirror.js        2014-04-24 22:48:32 UTC (rev 167780)
+++ trunk/Source/WebInspectorUI/Tools/PrettyPrinting/codemirror.js        2014-04-25 00:06:46 UTC (rev 167781)
</span><span class="lines">@@ -33,7 +33,6 @@
</span><span class="cx">   var presto = /Opera\//.test(navigator.userAgent);
</span><span class="cx">   var safari = /Apple Computer/.test(navigator.vendor);
</span><span class="cx">   var khtml = /KHTML\//.test(navigator.userAgent);
</span><del>-  var mac_geLion = /Mac OS X 1\d\D([7-9]|\d\d)\D/.test(navigator.userAgent);
</del><span class="cx">   var mac_geMountainLion = /Mac OS X 1\d\D([8-9]|\d\d)\D/.test(navigator.userAgent);
</span><span class="cx">   var phantom = /PhantomJS/.test(navigator.userAgent);
</span><span class="cx"> 
</span><span class="lines">@@ -437,14 +436,18 @@
</span><span class="cx">       d.gutterFiller.style.width = d.gutters.offsetWidth + &quot;px&quot;;
</span><span class="cx">     } else d.gutterFiller.style.display = &quot;&quot;;
</span><span class="cx"> 
</span><del>-    if (mac_geLion &amp;&amp; scrollbarWidth(d.measure) === 0) {
-      d.scrollbarV.style.minWidth = d.scrollbarH.style.minHeight = mac_geMountainLion ? &quot;18px&quot; : &quot;12px&quot;;
-      var barMouseDown = function(e) {
-        if (e_target(e) != d.scrollbarV &amp;&amp; e_target(e) != d.scrollbarH)
-          operation(cm, onMouseDown)(e);
-      };
-      on(d.scrollbarV, &quot;mousedown&quot;, barMouseDown);
-      on(d.scrollbarH, &quot;mousedown&quot;, barMouseDown);
</del><ins>+    if (!cm.state.checkedOverlayScrollbar &amp;&amp; measure.clientHeight &gt; 0) {
+      if (scrollbarWidth(d.measure) === 0) {
+        var w = mac &amp;&amp; !mac_geMountainLion ? &quot;12px&quot; : &quot;18px&quot;;
+        d.scrollbarV.style.minWidth = d.scrollbarH.style.minHeight = w;
+        var barMouseDown = function(e) {
+          if (e_target(e) != d.scrollbarV &amp;&amp; e_target(e) != d.scrollbarH)
+            operation(cm, onMouseDown)(e);
+        };
+        on(d.scrollbarV, &quot;mousedown&quot;, barMouseDown);
+        on(d.scrollbarH, &quot;mousedown&quot;, barMouseDown);
+      }
+      cm.state.checkedOverlayScrollbar = true;
</ins><span class="cx">     }
</span><span class="cx">   }
</span><span class="cx"> 
</span><span class="lines">@@ -1131,7 +1134,6 @@
</span><span class="cx"> 
</span><span class="cx">   // Set a new selection.
</span><span class="cx">   function setSelection(doc, sel, options) {
</span><del>-    if (options &amp;&amp; options.origin &amp;&amp; doc.cm) doc.cm.curOp.origin = options.origin;
</del><span class="cx">     setSelectionNoUndo(doc, sel, options);
</span><span class="cx">     addSelectionToHistory(doc, doc.sel, doc.cm ? doc.cm.curOp.id : NaN, options);
</span><span class="cx">   }
</span><span class="lines">@@ -1152,9 +1154,10 @@
</span><span class="cx"> 
</span><span class="cx">     doc.sel = sel;
</span><span class="cx"> 
</span><del>-    if (doc.cm)
-      doc.cm.curOp.updateInput = doc.cm.curOp.selectionChanged =
-        doc.cm.curOp.cursorActivity = true;
</del><ins>+    if (doc.cm) {
+      doc.cm.curOp.updateInput = doc.cm.curOp.selectionChanged = true;
+      signalCursorActivity(doc.cm);
+    }
</ins><span class="cx">     signalLater(doc, &quot;cursorActivity&quot;, doc);
</span><span class="cx">   }
</span><span class="cx"> 
</span><span class="lines">@@ -1454,8 +1457,9 @@
</span><span class="cx">     if (display.cachedPaddingH) return display.cachedPaddingH;
</span><span class="cx">     var e = removeChildrenAndAdd(display.measure, elt(&quot;pre&quot;, &quot;x&quot;));
</span><span class="cx">     var style = window.getComputedStyle ? window.getComputedStyle(e) : e.currentStyle;
</span><del>-    return display.cachedPaddingH = {left: parseInt(style.paddingLeft),
-                                     right: parseInt(style.paddingRight)};
</del><ins>+    var data = {left: parseInt(style.paddingLeft), right: parseInt(style.paddingRight)};
+    if (!isNaN(data.left) &amp;&amp; !isNaN(data.right)) display.cachedPaddingH = data;
+    return data;
</ins><span class="cx">   }
</span><span class="cx"> 
</span><span class="cx">   // Ensure the lineView.wrapping.heights array is populated. This is
</span><span class="lines">@@ -1889,8 +1893,7 @@
</span><span class="cx">       updateInput: null,       // Whether to reset the input textarea
</span><span class="cx">       typing: false,           // Whether this reset should be careful to leave existing text (for compositing)
</span><span class="cx">       changeObjs: null,        // Accumulated changes, for firing change events
</span><del>-      origin: null,            // Selection's origin
-      cursorActivity: false,   // Whether to fire a cursorActivity event
</del><ins>+      cursorActivityHandlers: null, // Set of handlers to fire cursorActivity on
</ins><span class="cx">       selectionChanged: false, // Whether the selection needs to be redrawn
</span><span class="cx">       updateMaxLine: false,    // Set when the widest line needs to be determined anew
</span><span class="cx">       scrollLeft: null, scrollTop: null, // Intermediate scroll position, not pushed to DOM yet
</span><span class="lines">@@ -1955,13 +1958,12 @@
</span><span class="cx">       delayedCallbacks = null;
</span><span class="cx">     }
</span><span class="cx">     // Fire change events, and delayed event handlers
</span><del>-    if (op.changeObjs) {
-      for (var i = 0; i &lt; op.changeObjs.length; i++)
-        signal(cm, &quot;change&quot;, cm, op.changeObjs[i]);
</del><ins>+    if (op.changeObjs)
</ins><span class="cx">       signal(cm, &quot;changes&quot;, cm, op.changeObjs);
</span><del>-    }
-    if (op.cursorActivity) signal(cm, &quot;cursorActivity&quot;, cm, op.origin);
</del><span class="cx">     if (delayed) for (var i = 0; i &lt; delayed.length; ++i) delayed[i]();
</span><ins>+    if (op.cursorActivityHandlers)
+      for (var i = 0; i &lt; op.cursorActivityHandlers.length; i++)
+        op.cursorActivityHandlers[i](cm);
</ins><span class="cx">   }
</span><span class="cx"> 
</span><span class="cx">   // Run the given function in an operation
</span><span class="lines">@@ -2224,7 +2226,13 @@
</span><span class="cx">     // possible when it is clear that nothing happened. hasSelection
</span><span class="cx">     // will be the case when there is a lot of text in the textarea,
</span><span class="cx">     // in which case reading its value would be expensive.
</span><del>-    if (!cm.state.focused || hasSelection(input) || isReadOnly(cm) || cm.options.disableInput) return false;
</del><ins>+    if (!cm.state.focused || (hasSelection(input) &amp;&amp; !prevInput) || isReadOnly(cm) || cm.options.disableInput)
+      return false;
+    // See paste handler for more on the fakedLastChar kludge
+    if (cm.state.pasteIncoming &amp;&amp; cm.state.fakedLastChar) {
+      input.value = input.value.substring(0, input.value.length - 1);
+      cm.state.fakedLastChar = false;
+    }
</ins><span class="cx">     var text = input.value;
</span><span class="cx">     // If nothing changed, bail.
</span><span class="cx">     if (text == prevInput &amp;&amp; !cm.somethingSelected()) return false;
</span><span class="lines">@@ -2424,6 +2432,16 @@
</span><span class="cx">       fastPoll(cm);
</span><span class="cx">     });
</span><span class="cx">     on(d.input, &quot;paste&quot;, function() {
</span><ins>+      // Workaround for webkit bug https://bugs.webkit.org/show_bug.cgi?id=90206
+      // Add a char to the end of textarea before paste occur so that
+      // selection doesn't span to the end of textarea.
+      if (webkit &amp;&amp; !cm.state.fakedLastChar &amp;&amp; !(new Date - cm.state.lastMiddleDown &lt; 200)) {
+        var start = d.input.selectionStart, end = d.input.selectionEnd;
+        d.input.value += &quot;$&quot;;
+        d.input.selectionStart = start;
+        d.input.selectionEnd = end;
+        cm.state.fakedLastChar = true;
+      }
</ins><span class="cx">       cm.state.pasteIncoming = true;
</span><span class="cx">       fastPoll(cm);
</span><span class="cx">     });
</span><span class="lines">@@ -2492,7 +2510,7 @@
</span><span class="cx">     var coords = coordsChar(cm, x, y), line;
</span><span class="cx">     if (forRect &amp;&amp; coords.xRel == 1 &amp;&amp; (line = getLine(cm.doc, coords.line).text).length == coords.ch) {
</span><span class="cx">       var colDiff = countColumn(line, line.length, cm.options.tabSize) - line.length;
</span><del>-      coords = Pos(coords.line, Math.round((x - paddingH(cm.display).left) / charWidth(cm.display)) - colDiff);
</del><ins>+      coords = Pos(coords.line, Math.max(0, Math.round((x - paddingH(cm.display).left) / charWidth(cm.display)) - colDiff));
</ins><span class="cx">     }
</span><span class="cx">     return coords;
</span><span class="cx">   }
</span><span class="lines">@@ -2595,7 +2613,7 @@
</span><span class="cx">     e_preventDefault(e);
</span><span class="cx"> 
</span><span class="cx">     var ourRange, ourIndex, startSel = doc.sel;
</span><del>-    if (addNew) {
</del><ins>+    if (addNew &amp;&amp; !e.shiftKey) {
</ins><span class="cx">       ourIndex = doc.sel.contains(start);
</span><span class="cx">       if (ourIndex &gt; -1)
</span><span class="cx">         ourRange = doc.sel.ranges[ourIndex];
</span><span class="lines">@@ -2629,6 +2647,7 @@
</span><span class="cx">     if (!addNew) {
</span><span class="cx">       ourIndex = 0;
</span><span class="cx">       setSelection(doc, new Selection([ourRange], 0), sel_mouse);
</span><ins>+      startSel = doc.sel;
</ins><span class="cx">     } else if (ourIndex &gt; -1) {
</span><span class="cx">       replaceOneSelection(doc, ourIndex, ourRange, sel_mouse);
</span><span class="cx">     } else {
</span><span class="lines">@@ -2762,7 +2781,7 @@
</span><span class="cx">     if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e))
</span><span class="cx">       return;
</span><span class="cx">     e_preventDefault(e);
</span><del>-    if (ie_upto10) lastDrop = +new Date;
</del><ins>+    if (ie) lastDrop = +new Date;
</ins><span class="cx">     var pos = posFromMouse(cm, e, true), files = e.dataTransfer.files;
</span><span class="cx">     if (!pos || isReadOnly(cm)) return;
</span><span class="cx">     // Might be a file drop, in which case we simply extract the text
</span><span class="lines">@@ -2807,7 +2826,7 @@
</span><span class="cx">   }
</span><span class="cx"> 
</span><span class="cx">   function onDragStart(cm, e) {
</span><del>-    if (ie_upto10 &amp;&amp; (!cm.state.draggingText || +new Date - lastDrop &lt; 100)) { e_stop(e); return; }
</del><ins>+    if (ie &amp;&amp; (!cm.state.draggingText || +new Date - lastDrop &lt; 100)) { e_stop(e); return; }
</ins><span class="cx">     if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) return;
</span><span class="cx"> 
</span><span class="cx">     e.dataTransfer.setData(&quot;Text&quot;, cm.getSelection());
</span><span class="lines">@@ -3088,7 +3107,10 @@
</span><span class="cx">       signal(cm, &quot;focus&quot;, cm);
</span><span class="cx">       cm.state.focused = true;
</span><span class="cx">       addClass(cm.display.wrapper, &quot;CodeMirror-focused&quot;);
</span><del>-      if (!cm.curOp) {
</del><ins>+      // The prevInput test prevents this from firing when a context
+      // menu is closed (since the resetInput would kill the
+      // select-all detection hack)
+      if (!cm.curOp &amp;&amp; cm.display.selForContextMenu == cm.doc.sel) {
</ins><span class="cx">         resetInput(cm);
</span><span class="cx">         if (webkit) setTimeout(bind(resetInput, cm, true), 0); // Issue #1730
</span><span class="cx">       }
</span><span class="lines">@@ -3136,14 +3158,16 @@
</span><span class="cx">     resetInput(cm);
</span><span class="cx">     // Adds &quot;Select all&quot; to context menu in FF
</span><span class="cx">     if (!cm.somethingSelected()) display.input.value = display.prevInput = &quot; &quot;;
</span><ins>+    display.selForContextMenu = cm.doc.sel;
</ins><span class="cx"> 
</span><span class="cx">     // Select-all will be greyed out if there's nothing to select, so
</span><span class="cx">     // this adds a zero-width space so that we can later check whether
</span><span class="cx">     // it got selected.
</span><span class="cx">     function prepareSelectAllHack() {
</span><span class="cx">       if (display.input.selectionStart != null) {
</span><del>-        var extval = display.input.value = &quot;\u200b&quot; + (cm.somethingSelected() ? display.input.value : &quot;&quot;);
-        display.prevInput = &quot;\u200b&quot;;
</del><ins>+        var selected = cm.somethingSelected();
+        var extval = display.input.value = &quot;\u200b&quot; + (selected ? display.input.value : &quot;&quot;);
+        display.prevInput = selected ? &quot;&quot; : &quot;\u200b&quot;;
</ins><span class="cx">         display.input.selectionStart = 1; display.input.selectionEnd = extval.length;
</span><span class="cx">       }
</span><span class="cx">     }
</span><span class="lines">@@ -3157,8 +3181,8 @@
</span><span class="cx">       if (display.input.selectionStart != null) {
</span><span class="cx">         if (!ie || ie_upto8) prepareSelectAllHack();
</span><span class="cx">         clearTimeout(detectingSelectAll);
</span><del>-        var i = 0, poll = function(){
-          if (display.prevInput == &quot;\u200b&quot; &amp;&amp; display.input.selectionStart == 0)
</del><ins>+        var i = 0, poll = function() {
+          if (display.selForContextMenu == cm.doc.sel &amp;&amp; display.input.selectionStart == 0)
</ins><span class="cx">             operation(cm, commands.selectAll)(cm);
</span><span class="cx">           else if (i++ &lt; 10) detectingSelectAll = setTimeout(poll, 500);
</span><span class="cx">           else resetInput(cm);
</span><span class="lines">@@ -3434,7 +3458,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (doc.sel.contains(change.from, change.to) &gt; -1)
</span><del>-      cm.curOp.cursorActivity = true;
</del><ins>+      signalCursorActivity(cm);
</ins><span class="cx"> 
</span><span class="cx">     updateDoc(doc, change, spans, estimateHeight(cm));
</span><span class="cx"> 
</span><span class="lines">@@ -3462,13 +3486,17 @@
</span><span class="cx">     else
</span><span class="cx">       regChange(cm, from.line, to.line + 1, lendiff);
</span><span class="cx"> 
</span><del>-    if (hasHandler(cm, &quot;change&quot;) || hasHandler(cm, &quot;changes&quot;))
-      (cm.curOp.changeObjs || (cm.curOp.changeObjs = [])).push({
</del><ins>+    var changesHandler = hasHandler(cm, &quot;changes&quot;), changeHandler = hasHandler(cm, &quot;change&quot;);
+    if (changeHandler || changesHandler) {
+      var obj = {
</ins><span class="cx">         from: from, to: to,
</span><span class="cx">         text: change.text,
</span><span class="cx">         removed: change.removed,
</span><span class="cx">         origin: change.origin
</span><del>-      });
</del><ins>+      };
+      if (changeHandler) signalLater(cm, &quot;change&quot;, cm, obj);
+      if (changesHandler) (cm.curOp.changeObjs || (cm.curOp.changeObjs = [])).push(obj);
+    }
</ins><span class="cx">   }
</span><span class="cx"> 
</span><span class="cx">   function replaceRange(doc, code, from, to, origin) {
</span><span class="lines">@@ -3899,13 +3927,16 @@
</span><span class="cx">       pos = clipPos(this.doc, pos);
</span><span class="cx">       var styles = getLineStyles(this, getLine(this.doc, pos.line));
</span><span class="cx">       var before = 0, after = (styles.length - 1) / 2, ch = pos.ch;
</span><del>-      if (ch == 0) return styles[2];
-      for (;;) {
</del><ins>+      var type;
+      if (ch == 0) type = styles[2];
+      else for (;;) {
</ins><span class="cx">         var mid = (before + after) &gt;&gt; 1;
</span><span class="cx">         if ((mid ? styles[mid * 2 - 1] : 0) &gt;= ch) after = mid;
</span><span class="cx">         else if (styles[mid * 2 + 1] &lt; ch) before = mid + 1;
</span><del>-        else return styles[mid * 2 + 2];
</del><ins>+        else { type = styles[mid * 2 + 2]; break; }
</ins><span class="cx">       }
</span><ins>+      var cut = type ? type.indexOf(&quot;cm-overlay &quot;) : -1;
+      return cut &lt; 0 ? type : cut == 0 ? null : type.slice(0, cut - 1);
</ins><span class="cx">     },
</span><span class="cx"> 
</span><span class="cx">     getModeAt: function(pos) {
</span><span class="lines">@@ -5621,12 +5652,12 @@
</span><span class="cx">         }
</span><span class="cx">         if (!style) return;
</span><span class="cx">         if (overlay.opaque) {
</span><del>-          st.splice(start, i - start, end, style);
</del><ins>+          st.splice(start, i - start, end, &quot;cm-overlay &quot; + style);
</ins><span class="cx">           i = start + 2;
</span><span class="cx">         } else {
</span><span class="cx">           for (; start &lt; i; start += 2) {
</span><span class="cx">             var cur = st[start+1];
</span><del>-            st[start+1] = cur ? cur + &quot; &quot; + style : style;
</del><ins>+            st[start+1] = (cur ? cur + &quot; &quot; : &quot;&quot;) + &quot;cm-overlay &quot; + style;
</ins><span class="cx">           }
</span><span class="cx">         }
</span><span class="cx">       }, lineClasses);
</span><span class="lines">@@ -6229,13 +6260,13 @@
</span><span class="cx">       }
</span><span class="cx">       return parts;
</span><span class="cx">     },
</span><del>-    replaceSelection: docMethodOp(function(code, collapse, origin) {
</del><ins>+    replaceSelection: function(code, collapse, origin) {
</ins><span class="cx">       var dup = [];
</span><span class="cx">       for (var i = 0; i &lt; this.sel.ranges.length; i++)
</span><span class="cx">         dup[i] = code;
</span><span class="cx">       this.replaceSelections(dup, collapse, origin || &quot;+input&quot;);
</span><del>-    }),
-    replaceSelections: function(code, collapse, origin) {
</del><ins>+    },
+    replaceSelections: docMethodOp(function(code, collapse, origin) {
</ins><span class="cx">       var changes = [], sel = this.sel;
</span><span class="cx">       for (var i = 0; i &lt; sel.ranges.length; i++) {
</span><span class="cx">         var range = sel.ranges[i];
</span><span class="lines">@@ -6246,7 +6277,7 @@
</span><span class="cx">         makeChange(this, changes[i]);
</span><span class="cx">       if (newSel) setSelectionReplaceHistory(this, newSel);
</span><span class="cx">       else if (this.cm) ensureCursorVisible(this.cm);
</span><del>-    },
</del><ins>+    }),
</ins><span class="cx">     undo: docMethodOp(function() {makeChangeFromHistory(this, &quot;undo&quot;);}),
</span><span class="cx">     redo: docMethodOp(function() {makeChangeFromHistory(this, &quot;redo&quot;);}),
</span><span class="cx">     undoSelection: docMethodOp(function() {makeChangeFromHistory(this, &quot;undo&quot;, true);}),
</span><span class="lines">@@ -6896,6 +6927,14 @@
</span><span class="cx">     return e_defaultPrevented(e) || e.codemirrorIgnore;
</span><span class="cx">   }
</span><span class="cx"> 
</span><ins>+  function signalCursorActivity(cm) {
+    var arr = cm._handlers &amp;&amp; cm._handlers.cursorActivity;
+    if (!arr) return;
+    var set = cm.curOp.cursorActivityHandlers || (cm.curOp.cursorActivityHandlers = []);
+    for (var i = 0; i &lt; arr.length; ++i) if (indexOf(set, arr[i]) == -1)
+      set.push(arr[i]);
+  }
+
</ins><span class="cx">   function hasHandler(emitter, type) {
</span><span class="cx">     var arr = emitter._handlers &amp;&amp; emitter._handlers[type];
</span><span class="cx">     return arr &amp;&amp; arr.length &gt; 0;
</span><span class="lines">@@ -7481,7 +7520,7 @@
</span><span class="cx"> 
</span><span class="cx">   // THE END
</span><span class="cx"> 
</span><del>-  CodeMirror.version = &quot;4.0.4&quot;;
</del><ins>+  CodeMirror.version = &quot;4.1.0&quot;;
</ins><span class="cx"> 
</span><span class="cx">   return CodeMirror;
</span><span class="cx"> });
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIToolsPrettyPrintingcssjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/Tools/PrettyPrinting/css.js (167780 => 167781)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/Tools/PrettyPrinting/css.js        2014-04-24 22:48:32 UTC (rev 167780)
+++ trunk/Source/WebInspectorUI/Tools/PrettyPrinting/css.js        2014-04-25 00:06:46 UTC (rev 167781)
</span><span class="lines">@@ -92,7 +92,7 @@
</span><span class="cx"> 
</span><span class="cx">   function tokenParenthesized(stream, state) {
</span><span class="cx">     stream.next(); // Must be '('
</span><del>-    if (!stream.match(/\s*[\&quot;\']/, false))
</del><ins>+    if (!stream.match(/\s*[\&quot;\')]/, false))
</ins><span class="cx">       state.tokenize = tokenString(&quot;)&quot;);
</span><span class="cx">     else
</span><span class="cx">       state.tokenize = null;
</span><span class="lines">@@ -453,13 +453,13 @@
</span><span class="cx">     // SVG-specific
</span><span class="cx">     &quot;clip-path&quot;, &quot;clip-rule&quot;, &quot;mask&quot;, &quot;enable-background&quot;, &quot;filter&quot;, &quot;flood-color&quot;,
</span><span class="cx">     &quot;flood-opacity&quot;, &quot;lighting-color&quot;, &quot;stop-color&quot;, &quot;stop-opacity&quot;, &quot;pointer-events&quot;,
</span><del>-    &quot;color-interpolation&quot;, &quot;color-interpolation-filters&quot;, &quot;color-profile&quot;,
</del><ins>+    &quot;color-interpolation&quot;, &quot;color-interpolation-filters&quot;,
</ins><span class="cx">     &quot;color-rendering&quot;, &quot;fill&quot;, &quot;fill-opacity&quot;, &quot;fill-rule&quot;, &quot;image-rendering&quot;,
</span><span class="cx">     &quot;marker&quot;, &quot;marker-end&quot;, &quot;marker-mid&quot;, &quot;marker-start&quot;, &quot;shape-rendering&quot;, &quot;stroke&quot;,
</span><span class="cx">     &quot;stroke-dasharray&quot;, &quot;stroke-dashoffset&quot;, &quot;stroke-linecap&quot;, &quot;stroke-linejoin&quot;,
</span><span class="cx">     &quot;stroke-miterlimit&quot;, &quot;stroke-opacity&quot;, &quot;stroke-width&quot;, &quot;text-rendering&quot;,
</span><span class="cx">     &quot;baseline-shift&quot;, &quot;dominant-baseline&quot;, &quot;glyph-orientation-horizontal&quot;,
</span><del>-    &quot;glyph-orientation-vertical&quot;, &quot;kerning&quot;, &quot;text-anchor&quot;, &quot;writing-mode&quot;
</del><ins>+    &quot;glyph-orientation-vertical&quot;, &quot;text-anchor&quot;, &quot;writing-mode&quot;
</ins><span class="cx">   ], propertyKeywords = keySet(propertyKeywords_);
</span><span class="cx"> 
</span><span class="cx">   var nonStandardPropertyKeywords = [
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIToolsPrettyPrintingjavascriptjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/Tools/PrettyPrinting/javascript.js (167780 => 167781)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/Tools/PrettyPrinting/javascript.js        2014-04-24 22:48:32 UTC (rev 167780)
+++ trunk/Source/WebInspectorUI/Tools/PrettyPrinting/javascript.js        2014-04-25 00:06:46 UTC (rev 167781)
</span><span class="lines">@@ -366,6 +366,7 @@
</span><span class="cx">     if (type == &quot;operator&quot; || type == &quot;spread&quot;) return cont(noComma ? expressionNoComma : expression);
</span><span class="cx">     if (type == &quot;[&quot;) return cont(pushlex(&quot;]&quot;), arrayLiteral, poplex, maybeop);
</span><span class="cx">     if (type == &quot;{&quot;) return contCommasep(objprop, &quot;}&quot;, null, maybeop);
</span><ins>+    if (type == &quot;quasi&quot;) { return pass(quasi, maybeop); }
</ins><span class="cx">     return cont();
</span><span class="cx">   }
</span><span class="cx">   function maybeexpression(type) {
</span><span class="lines">@@ -390,21 +391,22 @@
</span><span class="cx">       if (value == &quot;?&quot;) return cont(expression, expect(&quot;:&quot;), expr);
</span><span class="cx">       return cont(expr);
</span><span class="cx">     }
</span><del>-    if (type == &quot;quasi&quot;) { cx.cc.push(me); return quasi(value); }
</del><ins>+    if (type == &quot;quasi&quot;) { return pass(quasi, me); }
</ins><span class="cx">     if (type == &quot;;&quot;) return;
</span><span class="cx">     if (type == &quot;(&quot;) return contCommasep(expressionNoComma, &quot;)&quot;, &quot;call&quot;, me);
</span><span class="cx">     if (type == &quot;.&quot;) return cont(property, me);
</span><span class="cx">     if (type == &quot;[&quot;) return cont(pushlex(&quot;]&quot;), maybeexpression, expect(&quot;]&quot;), poplex, me);
</span><span class="cx">   }
</span><del>-  function quasi(value) {
-    if (value.slice(value.length - 2) != &quot;${&quot;) return cont();
</del><ins>+  function quasi(type, value) {
+    if (type != &quot;quasi&quot;) return pass();
+    if (value.slice(value.length - 2) != &quot;${&quot;) return cont(quasi);
</ins><span class="cx">     return cont(expression, continueQuasi);
</span><span class="cx">   }
</span><span class="cx">   function continueQuasi(type) {
</span><span class="cx">     if (type == &quot;}&quot;) {
</span><span class="cx">       cx.marked = &quot;string-2&quot;;
</span><span class="cx">       cx.state.tokenize = tokenQuasi;
</span><del>-      return cont();
</del><ins>+      return cont(quasi);
</ins><span class="cx">     }
</span><span class="cx">   }
</span><span class="cx">   function arrowBody(type) {
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceExternalCodeMirrorcodemirrorjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/External/CodeMirror/codemirror.js (167780 => 167781)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/External/CodeMirror/codemirror.js        2014-04-24 22:48:32 UTC (rev 167780)
+++ trunk/Source/WebInspectorUI/UserInterface/External/CodeMirror/codemirror.js        2014-04-25 00:06:46 UTC (rev 167781)
</span><span class="lines">@@ -33,7 +33,6 @@
</span><span class="cx">   var presto = /Opera\//.test(navigator.userAgent);
</span><span class="cx">   var safari = /Apple Computer/.test(navigator.vendor);
</span><span class="cx">   var khtml = /KHTML\//.test(navigator.userAgent);
</span><del>-  var mac_geLion = /Mac OS X 1\d\D([7-9]|\d\d)\D/.test(navigator.userAgent);
</del><span class="cx">   var mac_geMountainLion = /Mac OS X 1\d\D([8-9]|\d\d)\D/.test(navigator.userAgent);
</span><span class="cx">   var phantom = /PhantomJS/.test(navigator.userAgent);
</span><span class="cx"> 
</span><span class="lines">@@ -437,14 +436,18 @@
</span><span class="cx">       d.gutterFiller.style.width = d.gutters.offsetWidth + &quot;px&quot;;
</span><span class="cx">     } else d.gutterFiller.style.display = &quot;&quot;;
</span><span class="cx"> 
</span><del>-    if (mac_geLion &amp;&amp; scrollbarWidth(d.measure) === 0) {
-      d.scrollbarV.style.minWidth = d.scrollbarH.style.minHeight = mac_geMountainLion ? &quot;18px&quot; : &quot;12px&quot;;
-      var barMouseDown = function(e) {
-        if (e_target(e) != d.scrollbarV &amp;&amp; e_target(e) != d.scrollbarH)
-          operation(cm, onMouseDown)(e);
-      };
-      on(d.scrollbarV, &quot;mousedown&quot;, barMouseDown);
-      on(d.scrollbarH, &quot;mousedown&quot;, barMouseDown);
</del><ins>+    if (!cm.state.checkedOverlayScrollbar &amp;&amp; measure.clientHeight &gt; 0) {
+      if (scrollbarWidth(d.measure) === 0) {
+        var w = mac &amp;&amp; !mac_geMountainLion ? &quot;12px&quot; : &quot;18px&quot;;
+        d.scrollbarV.style.minWidth = d.scrollbarH.style.minHeight = w;
+        var barMouseDown = function(e) {
+          if (e_target(e) != d.scrollbarV &amp;&amp; e_target(e) != d.scrollbarH)
+            operation(cm, onMouseDown)(e);
+        };
+        on(d.scrollbarV, &quot;mousedown&quot;, barMouseDown);
+        on(d.scrollbarH, &quot;mousedown&quot;, barMouseDown);
+      }
+      cm.state.checkedOverlayScrollbar = true;
</ins><span class="cx">     }
</span><span class="cx">   }
</span><span class="cx"> 
</span><span class="lines">@@ -1131,7 +1134,6 @@
</span><span class="cx"> 
</span><span class="cx">   // Set a new selection.
</span><span class="cx">   function setSelection(doc, sel, options) {
</span><del>-    if (options &amp;&amp; options.origin &amp;&amp; doc.cm) doc.cm.curOp.origin = options.origin;
</del><span class="cx">     setSelectionNoUndo(doc, sel, options);
</span><span class="cx">     addSelectionToHistory(doc, doc.sel, doc.cm ? doc.cm.curOp.id : NaN, options);
</span><span class="cx">   }
</span><span class="lines">@@ -1152,9 +1154,10 @@
</span><span class="cx"> 
</span><span class="cx">     doc.sel = sel;
</span><span class="cx"> 
</span><del>-    if (doc.cm)
-      doc.cm.curOp.updateInput = doc.cm.curOp.selectionChanged =
-        doc.cm.curOp.cursorActivity = true;
</del><ins>+    if (doc.cm) {
+      doc.cm.curOp.updateInput = doc.cm.curOp.selectionChanged = true;
+      signalCursorActivity(doc.cm);
+    }
</ins><span class="cx">     signalLater(doc, &quot;cursorActivity&quot;, doc);
</span><span class="cx">   }
</span><span class="cx"> 
</span><span class="lines">@@ -1454,8 +1457,9 @@
</span><span class="cx">     if (display.cachedPaddingH) return display.cachedPaddingH;
</span><span class="cx">     var e = removeChildrenAndAdd(display.measure, elt(&quot;pre&quot;, &quot;x&quot;));
</span><span class="cx">     var style = window.getComputedStyle ? window.getComputedStyle(e) : e.currentStyle;
</span><del>-    return display.cachedPaddingH = {left: parseInt(style.paddingLeft),
-                                     right: parseInt(style.paddingRight)};
</del><ins>+    var data = {left: parseInt(style.paddingLeft), right: parseInt(style.paddingRight)};
+    if (!isNaN(data.left) &amp;&amp; !isNaN(data.right)) display.cachedPaddingH = data;
+    return data;
</ins><span class="cx">   }
</span><span class="cx"> 
</span><span class="cx">   // Ensure the lineView.wrapping.heights array is populated. This is
</span><span class="lines">@@ -1889,8 +1893,7 @@
</span><span class="cx">       updateInput: null,       // Whether to reset the input textarea
</span><span class="cx">       typing: false,           // Whether this reset should be careful to leave existing text (for compositing)
</span><span class="cx">       changeObjs: null,        // Accumulated changes, for firing change events
</span><del>-      origin: null,            // Selection's origin
-      cursorActivity: false,   // Whether to fire a cursorActivity event
</del><ins>+      cursorActivityHandlers: null, // Set of handlers to fire cursorActivity on
</ins><span class="cx">       selectionChanged: false, // Whether the selection needs to be redrawn
</span><span class="cx">       updateMaxLine: false,    // Set when the widest line needs to be determined anew
</span><span class="cx">       scrollLeft: null, scrollTop: null, // Intermediate scroll position, not pushed to DOM yet
</span><span class="lines">@@ -1955,13 +1958,12 @@
</span><span class="cx">       delayedCallbacks = null;
</span><span class="cx">     }
</span><span class="cx">     // Fire change events, and delayed event handlers
</span><del>-    if (op.changeObjs) {
-      for (var i = 0; i &lt; op.changeObjs.length; i++)
-        signal(cm, &quot;change&quot;, cm, op.changeObjs[i]);
</del><ins>+    if (op.changeObjs)
</ins><span class="cx">       signal(cm, &quot;changes&quot;, cm, op.changeObjs);
</span><del>-    }
-    if (op.cursorActivity) signal(cm, &quot;cursorActivity&quot;, cm, op.origin);
</del><span class="cx">     if (delayed) for (var i = 0; i &lt; delayed.length; ++i) delayed[i]();
</span><ins>+    if (op.cursorActivityHandlers)
+      for (var i = 0; i &lt; op.cursorActivityHandlers.length; i++)
+        op.cursorActivityHandlers[i](cm);
</ins><span class="cx">   }
</span><span class="cx"> 
</span><span class="cx">   // Run the given function in an operation
</span><span class="lines">@@ -2224,7 +2226,13 @@
</span><span class="cx">     // possible when it is clear that nothing happened. hasSelection
</span><span class="cx">     // will be the case when there is a lot of text in the textarea,
</span><span class="cx">     // in which case reading its value would be expensive.
</span><del>-    if (!cm.state.focused || hasSelection(input) || isReadOnly(cm) || cm.options.disableInput) return false;
</del><ins>+    if (!cm.state.focused || (hasSelection(input) &amp;&amp; !prevInput) || isReadOnly(cm) || cm.options.disableInput)
+      return false;
+    // See paste handler for more on the fakedLastChar kludge
+    if (cm.state.pasteIncoming &amp;&amp; cm.state.fakedLastChar) {
+      input.value = input.value.substring(0, input.value.length - 1);
+      cm.state.fakedLastChar = false;
+    }
</ins><span class="cx">     var text = input.value;
</span><span class="cx">     // If nothing changed, bail.
</span><span class="cx">     if (text == prevInput &amp;&amp; !cm.somethingSelected()) return false;
</span><span class="lines">@@ -2424,6 +2432,16 @@
</span><span class="cx">       fastPoll(cm);
</span><span class="cx">     });
</span><span class="cx">     on(d.input, &quot;paste&quot;, function() {
</span><ins>+      // Workaround for webkit bug https://bugs.webkit.org/show_bug.cgi?id=90206
+      // Add a char to the end of textarea before paste occur so that
+      // selection doesn't span to the end of textarea.
+      if (webkit &amp;&amp; !cm.state.fakedLastChar &amp;&amp; !(new Date - cm.state.lastMiddleDown &lt; 200)) {
+        var start = d.input.selectionStart, end = d.input.selectionEnd;
+        d.input.value += &quot;$&quot;;
+        d.input.selectionStart = start;
+        d.input.selectionEnd = end;
+        cm.state.fakedLastChar = true;
+      }
</ins><span class="cx">       cm.state.pasteIncoming = true;
</span><span class="cx">       fastPoll(cm);
</span><span class="cx">     });
</span><span class="lines">@@ -2492,7 +2510,7 @@
</span><span class="cx">     var coords = coordsChar(cm, x, y), line;
</span><span class="cx">     if (forRect &amp;&amp; coords.xRel == 1 &amp;&amp; (line = getLine(cm.doc, coords.line).text).length == coords.ch) {
</span><span class="cx">       var colDiff = countColumn(line, line.length, cm.options.tabSize) - line.length;
</span><del>-      coords = Pos(coords.line, Math.round((x - paddingH(cm.display).left) / charWidth(cm.display)) - colDiff);
</del><ins>+      coords = Pos(coords.line, Math.max(0, Math.round((x - paddingH(cm.display).left) / charWidth(cm.display)) - colDiff));
</ins><span class="cx">     }
</span><span class="cx">     return coords;
</span><span class="cx">   }
</span><span class="lines">@@ -2595,7 +2613,7 @@
</span><span class="cx">     e_preventDefault(e);
</span><span class="cx"> 
</span><span class="cx">     var ourRange, ourIndex, startSel = doc.sel;
</span><del>-    if (addNew) {
</del><ins>+    if (addNew &amp;&amp; !e.shiftKey) {
</ins><span class="cx">       ourIndex = doc.sel.contains(start);
</span><span class="cx">       if (ourIndex &gt; -1)
</span><span class="cx">         ourRange = doc.sel.ranges[ourIndex];
</span><span class="lines">@@ -2629,6 +2647,7 @@
</span><span class="cx">     if (!addNew) {
</span><span class="cx">       ourIndex = 0;
</span><span class="cx">       setSelection(doc, new Selection([ourRange], 0), sel_mouse);
</span><ins>+      startSel = doc.sel;
</ins><span class="cx">     } else if (ourIndex &gt; -1) {
</span><span class="cx">       replaceOneSelection(doc, ourIndex, ourRange, sel_mouse);
</span><span class="cx">     } else {
</span><span class="lines">@@ -2762,7 +2781,7 @@
</span><span class="cx">     if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e))
</span><span class="cx">       return;
</span><span class="cx">     e_preventDefault(e);
</span><del>-    if (ie_upto10) lastDrop = +new Date;
</del><ins>+    if (ie) lastDrop = +new Date;
</ins><span class="cx">     var pos = posFromMouse(cm, e, true), files = e.dataTransfer.files;
</span><span class="cx">     if (!pos || isReadOnly(cm)) return;
</span><span class="cx">     // Might be a file drop, in which case we simply extract the text
</span><span class="lines">@@ -2807,7 +2826,7 @@
</span><span class="cx">   }
</span><span class="cx"> 
</span><span class="cx">   function onDragStart(cm, e) {
</span><del>-    if (ie_upto10 &amp;&amp; (!cm.state.draggingText || +new Date - lastDrop &lt; 100)) { e_stop(e); return; }
</del><ins>+    if (ie &amp;&amp; (!cm.state.draggingText || +new Date - lastDrop &lt; 100)) { e_stop(e); return; }
</ins><span class="cx">     if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) return;
</span><span class="cx"> 
</span><span class="cx">     e.dataTransfer.setData(&quot;Text&quot;, cm.getSelection());
</span><span class="lines">@@ -3088,7 +3107,10 @@
</span><span class="cx">       signal(cm, &quot;focus&quot;, cm);
</span><span class="cx">       cm.state.focused = true;
</span><span class="cx">       addClass(cm.display.wrapper, &quot;CodeMirror-focused&quot;);
</span><del>-      if (!cm.curOp) {
</del><ins>+      // The prevInput test prevents this from firing when a context
+      // menu is closed (since the resetInput would kill the
+      // select-all detection hack)
+      if (!cm.curOp &amp;&amp; cm.display.selForContextMenu == cm.doc.sel) {
</ins><span class="cx">         resetInput(cm);
</span><span class="cx">         if (webkit) setTimeout(bind(resetInput, cm, true), 0); // Issue #1730
</span><span class="cx">       }
</span><span class="lines">@@ -3136,14 +3158,16 @@
</span><span class="cx">     resetInput(cm);
</span><span class="cx">     // Adds &quot;Select all&quot; to context menu in FF
</span><span class="cx">     if (!cm.somethingSelected()) display.input.value = display.prevInput = &quot; &quot;;
</span><ins>+    display.selForContextMenu = cm.doc.sel;
</ins><span class="cx"> 
</span><span class="cx">     // Select-all will be greyed out if there's nothing to select, so
</span><span class="cx">     // this adds a zero-width space so that we can later check whether
</span><span class="cx">     // it got selected.
</span><span class="cx">     function prepareSelectAllHack() {
</span><span class="cx">       if (display.input.selectionStart != null) {
</span><del>-        var extval = display.input.value = &quot;\u200b&quot; + (cm.somethingSelected() ? display.input.value : &quot;&quot;);
-        display.prevInput = &quot;\u200b&quot;;
</del><ins>+        var selected = cm.somethingSelected();
+        var extval = display.input.value = &quot;\u200b&quot; + (selected ? display.input.value : &quot;&quot;);
+        display.prevInput = selected ? &quot;&quot; : &quot;\u200b&quot;;
</ins><span class="cx">         display.input.selectionStart = 1; display.input.selectionEnd = extval.length;
</span><span class="cx">       }
</span><span class="cx">     }
</span><span class="lines">@@ -3157,8 +3181,8 @@
</span><span class="cx">       if (display.input.selectionStart != null) {
</span><span class="cx">         if (!ie || ie_upto8) prepareSelectAllHack();
</span><span class="cx">         clearTimeout(detectingSelectAll);
</span><del>-        var i = 0, poll = function(){
-          if (display.prevInput == &quot;\u200b&quot; &amp;&amp; display.input.selectionStart == 0)
</del><ins>+        var i = 0, poll = function() {
+          if (display.selForContextMenu == cm.doc.sel &amp;&amp; display.input.selectionStart == 0)
</ins><span class="cx">             operation(cm, commands.selectAll)(cm);
</span><span class="cx">           else if (i++ &lt; 10) detectingSelectAll = setTimeout(poll, 500);
</span><span class="cx">           else resetInput(cm);
</span><span class="lines">@@ -3434,7 +3458,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (doc.sel.contains(change.from, change.to) &gt; -1)
</span><del>-      cm.curOp.cursorActivity = true;
</del><ins>+      signalCursorActivity(cm);
</ins><span class="cx"> 
</span><span class="cx">     updateDoc(doc, change, spans, estimateHeight(cm));
</span><span class="cx"> 
</span><span class="lines">@@ -3462,13 +3486,17 @@
</span><span class="cx">     else
</span><span class="cx">       regChange(cm, from.line, to.line + 1, lendiff);
</span><span class="cx"> 
</span><del>-    if (hasHandler(cm, &quot;change&quot;) || hasHandler(cm, &quot;changes&quot;))
-      (cm.curOp.changeObjs || (cm.curOp.changeObjs = [])).push({
</del><ins>+    var changesHandler = hasHandler(cm, &quot;changes&quot;), changeHandler = hasHandler(cm, &quot;change&quot;);
+    if (changeHandler || changesHandler) {
+      var obj = {
</ins><span class="cx">         from: from, to: to,
</span><span class="cx">         text: change.text,
</span><span class="cx">         removed: change.removed,
</span><span class="cx">         origin: change.origin
</span><del>-      });
</del><ins>+      };
+      if (changeHandler) signalLater(cm, &quot;change&quot;, cm, obj);
+      if (changesHandler) (cm.curOp.changeObjs || (cm.curOp.changeObjs = [])).push(obj);
+    }
</ins><span class="cx">   }
</span><span class="cx"> 
</span><span class="cx">   function replaceRange(doc, code, from, to, origin) {
</span><span class="lines">@@ -3899,13 +3927,16 @@
</span><span class="cx">       pos = clipPos(this.doc, pos);
</span><span class="cx">       var styles = getLineStyles(this, getLine(this.doc, pos.line));
</span><span class="cx">       var before = 0, after = (styles.length - 1) / 2, ch = pos.ch;
</span><del>-      if (ch == 0) return styles[2];
-      for (;;) {
</del><ins>+      var type;
+      if (ch == 0) type = styles[2];
+      else for (;;) {
</ins><span class="cx">         var mid = (before + after) &gt;&gt; 1;
</span><span class="cx">         if ((mid ? styles[mid * 2 - 1] : 0) &gt;= ch) after = mid;
</span><span class="cx">         else if (styles[mid * 2 + 1] &lt; ch) before = mid + 1;
</span><del>-        else return styles[mid * 2 + 2];
</del><ins>+        else { type = styles[mid * 2 + 2]; break; }
</ins><span class="cx">       }
</span><ins>+      var cut = type ? type.indexOf(&quot;cm-overlay &quot;) : -1;
+      return cut &lt; 0 ? type : cut == 0 ? null : type.slice(0, cut - 1);
</ins><span class="cx">     },
</span><span class="cx"> 
</span><span class="cx">     getModeAt: function(pos) {
</span><span class="lines">@@ -5621,12 +5652,12 @@
</span><span class="cx">         }
</span><span class="cx">         if (!style) return;
</span><span class="cx">         if (overlay.opaque) {
</span><del>-          st.splice(start, i - start, end, style);
</del><ins>+          st.splice(start, i - start, end, &quot;cm-overlay &quot; + style);
</ins><span class="cx">           i = start + 2;
</span><span class="cx">         } else {
</span><span class="cx">           for (; start &lt; i; start += 2) {
</span><span class="cx">             var cur = st[start+1];
</span><del>-            st[start+1] = cur ? cur + &quot; &quot; + style : style;
</del><ins>+            st[start+1] = (cur ? cur + &quot; &quot; : &quot;&quot;) + &quot;cm-overlay &quot; + style;
</ins><span class="cx">           }
</span><span class="cx">         }
</span><span class="cx">       }, lineClasses);
</span><span class="lines">@@ -6229,13 +6260,13 @@
</span><span class="cx">       }
</span><span class="cx">       return parts;
</span><span class="cx">     },
</span><del>-    replaceSelection: docMethodOp(function(code, collapse, origin) {
</del><ins>+    replaceSelection: function(code, collapse, origin) {
</ins><span class="cx">       var dup = [];
</span><span class="cx">       for (var i = 0; i &lt; this.sel.ranges.length; i++)
</span><span class="cx">         dup[i] = code;
</span><span class="cx">       this.replaceSelections(dup, collapse, origin || &quot;+input&quot;);
</span><del>-    }),
-    replaceSelections: function(code, collapse, origin) {
</del><ins>+    },
+    replaceSelections: docMethodOp(function(code, collapse, origin) {
</ins><span class="cx">       var changes = [], sel = this.sel;
</span><span class="cx">       for (var i = 0; i &lt; sel.ranges.length; i++) {
</span><span class="cx">         var range = sel.ranges[i];
</span><span class="lines">@@ -6246,7 +6277,7 @@
</span><span class="cx">         makeChange(this, changes[i]);
</span><span class="cx">       if (newSel) setSelectionReplaceHistory(this, newSel);
</span><span class="cx">       else if (this.cm) ensureCursorVisible(this.cm);
</span><del>-    },
</del><ins>+    }),
</ins><span class="cx">     undo: docMethodOp(function() {makeChangeFromHistory(this, &quot;undo&quot;);}),
</span><span class="cx">     redo: docMethodOp(function() {makeChangeFromHistory(this, &quot;redo&quot;);}),
</span><span class="cx">     undoSelection: docMethodOp(function() {makeChangeFromHistory(this, &quot;undo&quot;, true);}),
</span><span class="lines">@@ -6896,6 +6927,14 @@
</span><span class="cx">     return e_defaultPrevented(e) || e.codemirrorIgnore;
</span><span class="cx">   }
</span><span class="cx"> 
</span><ins>+  function signalCursorActivity(cm) {
+    var arr = cm._handlers &amp;&amp; cm._handlers.cursorActivity;
+    if (!arr) return;
+    var set = cm.curOp.cursorActivityHandlers || (cm.curOp.cursorActivityHandlers = []);
+    for (var i = 0; i &lt; arr.length; ++i) if (indexOf(set, arr[i]) == -1)
+      set.push(arr[i]);
+  }
+
</ins><span class="cx">   function hasHandler(emitter, type) {
</span><span class="cx">     var arr = emitter._handlers &amp;&amp; emitter._handlers[type];
</span><span class="cx">     return arr &amp;&amp; arr.length &gt; 0;
</span><span class="lines">@@ -7481,7 +7520,7 @@
</span><span class="cx"> 
</span><span class="cx">   // THE END
</span><span class="cx"> 
</span><del>-  CodeMirror.version = &quot;4.0.4&quot;;
</del><ins>+  CodeMirror.version = &quot;4.1.0&quot;;
</ins><span class="cx"> 
</span><span class="cx">   return CodeMirror;
</span><span class="cx"> });
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceExternalCodeMirrorcssjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/External/CodeMirror/css.js (167780 => 167781)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/External/CodeMirror/css.js        2014-04-24 22:48:32 UTC (rev 167780)
+++ trunk/Source/WebInspectorUI/UserInterface/External/CodeMirror/css.js        2014-04-25 00:06:46 UTC (rev 167781)
</span><span class="lines">@@ -92,7 +92,7 @@
</span><span class="cx"> 
</span><span class="cx">   function tokenParenthesized(stream, state) {
</span><span class="cx">     stream.next(); // Must be '('
</span><del>-    if (!stream.match(/\s*[\&quot;\']/, false))
</del><ins>+    if (!stream.match(/\s*[\&quot;\')]/, false))
</ins><span class="cx">       state.tokenize = tokenString(&quot;)&quot;);
</span><span class="cx">     else
</span><span class="cx">       state.tokenize = null;
</span><span class="lines">@@ -453,13 +453,13 @@
</span><span class="cx">     // SVG-specific
</span><span class="cx">     &quot;clip-path&quot;, &quot;clip-rule&quot;, &quot;mask&quot;, &quot;enable-background&quot;, &quot;filter&quot;, &quot;flood-color&quot;,
</span><span class="cx">     &quot;flood-opacity&quot;, &quot;lighting-color&quot;, &quot;stop-color&quot;, &quot;stop-opacity&quot;, &quot;pointer-events&quot;,
</span><del>-    &quot;color-interpolation&quot;, &quot;color-interpolation-filters&quot;, &quot;color-profile&quot;,
</del><ins>+    &quot;color-interpolation&quot;, &quot;color-interpolation-filters&quot;,
</ins><span class="cx">     &quot;color-rendering&quot;, &quot;fill&quot;, &quot;fill-opacity&quot;, &quot;fill-rule&quot;, &quot;image-rendering&quot;,
</span><span class="cx">     &quot;marker&quot;, &quot;marker-end&quot;, &quot;marker-mid&quot;, &quot;marker-start&quot;, &quot;shape-rendering&quot;, &quot;stroke&quot;,
</span><span class="cx">     &quot;stroke-dasharray&quot;, &quot;stroke-dashoffset&quot;, &quot;stroke-linecap&quot;, &quot;stroke-linejoin&quot;,
</span><span class="cx">     &quot;stroke-miterlimit&quot;, &quot;stroke-opacity&quot;, &quot;stroke-width&quot;, &quot;text-rendering&quot;,
</span><span class="cx">     &quot;baseline-shift&quot;, &quot;dominant-baseline&quot;, &quot;glyph-orientation-horizontal&quot;,
</span><del>-    &quot;glyph-orientation-vertical&quot;, &quot;kerning&quot;, &quot;text-anchor&quot;, &quot;writing-mode&quot;
</del><ins>+    &quot;glyph-orientation-vertical&quot;, &quot;text-anchor&quot;, &quot;writing-mode&quot;
</ins><span class="cx">   ], propertyKeywords = keySet(propertyKeywords_);
</span><span class="cx"> 
</span><span class="cx">   var nonStandardPropertyKeywords = [
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceExternalCodeMirrorjavascriptjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/External/CodeMirror/javascript.js (167780 => 167781)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/External/CodeMirror/javascript.js        2014-04-24 22:48:32 UTC (rev 167780)
+++ trunk/Source/WebInspectorUI/UserInterface/External/CodeMirror/javascript.js        2014-04-25 00:06:46 UTC (rev 167781)
</span><span class="lines">@@ -366,6 +366,7 @@
</span><span class="cx">     if (type == &quot;operator&quot; || type == &quot;spread&quot;) return cont(noComma ? expressionNoComma : expression);
</span><span class="cx">     if (type == &quot;[&quot;) return cont(pushlex(&quot;]&quot;), arrayLiteral, poplex, maybeop);
</span><span class="cx">     if (type == &quot;{&quot;) return contCommasep(objprop, &quot;}&quot;, null, maybeop);
</span><ins>+    if (type == &quot;quasi&quot;) { return pass(quasi, maybeop); }
</ins><span class="cx">     return cont();
</span><span class="cx">   }
</span><span class="cx">   function maybeexpression(type) {
</span><span class="lines">@@ -390,21 +391,22 @@
</span><span class="cx">       if (value == &quot;?&quot;) return cont(expression, expect(&quot;:&quot;), expr);
</span><span class="cx">       return cont(expr);
</span><span class="cx">     }
</span><del>-    if (type == &quot;quasi&quot;) { cx.cc.push(me); return quasi(value); }
</del><ins>+    if (type == &quot;quasi&quot;) { return pass(quasi, me); }
</ins><span class="cx">     if (type == &quot;;&quot;) return;
</span><span class="cx">     if (type == &quot;(&quot;) return contCommasep(expressionNoComma, &quot;)&quot;, &quot;call&quot;, me);
</span><span class="cx">     if (type == &quot;.&quot;) return cont(property, me);
</span><span class="cx">     if (type == &quot;[&quot;) return cont(pushlex(&quot;]&quot;), maybeexpression, expect(&quot;]&quot;), poplex, me);
</span><span class="cx">   }
</span><del>-  function quasi(value) {
-    if (value.slice(value.length - 2) != &quot;${&quot;) return cont();
</del><ins>+  function quasi(type, value) {
+    if (type != &quot;quasi&quot;) return pass();
+    if (value.slice(value.length - 2) != &quot;${&quot;) return cont(quasi);
</ins><span class="cx">     return cont(expression, continueQuasi);
</span><span class="cx">   }
</span><span class="cx">   function continueQuasi(type) {
</span><span class="cx">     if (type == &quot;}&quot;) {
</span><span class="cx">       cx.marked = &quot;string-2&quot;;
</span><span class="cx">       cx.state.tokenize = tokenQuasi;
</span><del>-      return cont();
</del><ins>+      return cont(quasi);
</ins><span class="cx">     }
</span><span class="cx">   }
</span><span class="cx">   function arrowBody(type) {
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceExternalCodeMirrorlivescriptjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/External/CodeMirror/livescript.js (167780 => 167781)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/External/CodeMirror/livescript.js        2014-04-24 22:48:32 UTC (rev 167780)
+++ trunk/Source/WebInspectorUI/UserInterface/External/CodeMirror/livescript.js        2014-04-25 00:06:46 UTC (rev 167781)
</span><span class="lines">@@ -24,7 +24,7 @@
</span><span class="cx">           for (i$ = 0, len$ = nr.length; i$ &lt; len$; ++i$) {
</span><span class="cx">             r = nr[i$];
</span><span class="cx">             if (r.regex &amp;&amp; (m = stream.match(r.regex))) {
</span><del>-              state.next = r.next;
</del><ins>+              state.next = r.next || state.next;
</ins><span class="cx">               return r.token;
</span><span class="cx">             }
</span><span class="cx">           }
</span><span class="lines">@@ -203,7 +203,7 @@
</span><span class="cx">         next: 'start'
</span><span class="cx">       }, {
</span><span class="cx">         token: 'text',
</span><del>-        regex: '.',
</del><ins>+        regex: '',
</ins><span class="cx">         next: 'start'
</span><span class="cx">       }
</span><span class="cx">     ],
</span><span class="lines">@@ -265,11 +265,11 @@
</span><span class="cx">     if (Array.isArray(r)) {
</span><span class="cx">       for (var i = 0, len = r.length; i &lt; len; ++i) {
</span><span class="cx">         var rr = r[i];
</span><del>-        if (rr.regex) {
</del><ins>+        if (typeof rr.regex === 'string') {
</ins><span class="cx">           Rules[idx][i].regex = new RegExp('^' + rr.regex);
</span><span class="cx">         }
</span><span class="cx">       }
</span><del>-    } else if (r.regex) {
</del><ins>+    } else if (typeof rr.regex === 'string') {
</ins><span class="cx">       Rules[idx].regex = new RegExp('^' + r.regex);
</span><span class="cx">     }
</span><span class="cx">   }
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceExternalCodeMirrorrunmodejs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/External/CodeMirror/runmode.js (167780 => 167781)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/External/CodeMirror/runmode.js        2014-04-24 22:48:32 UTC (rev 167780)
+++ trunk/Source/WebInspectorUI/UserInterface/External/CodeMirror/runmode.js        2014-04-25 00:06:46 UTC (rev 167781)
</span><span class="lines">@@ -57,6 +57,7 @@
</span><span class="cx">   for (var i = 0, e = lines.length; i &lt; e; ++i) {
</span><span class="cx">     if (i) callback(&quot;\n&quot;);
</span><span class="cx">     var stream = new CodeMirror.StringStream(lines[i]);
</span><ins>+    if (!stream.string &amp;&amp; mode.blankLine) mode.blankLine();
</ins><span class="cx">     while (!stream.eol()) {
</span><span class="cx">       var style = mode.token(stream, state);
</span><span class="cx">       callback(stream.current(), style, i, stream.start, state);
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceExternalCodeMirrorxmljs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/External/CodeMirror/xml.js (167780 => 167781)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/External/CodeMirror/xml.js        2014-04-24 22:48:32 UTC (rev 167780)
+++ trunk/Source/WebInspectorUI/UserInterface/External/CodeMirror/xml.js        2014-04-25 00:06:46 UTC (rev 167781)
</span><span class="lines">@@ -321,7 +321,10 @@
</span><span class="cx">       var context = state.context;
</span><span class="cx">       // Indent multi-line strings (e.g. css).
</span><span class="cx">       if (state.tokenize.isInAttribute) {
</span><del>-        return state.stringStartCol + 1;
</del><ins>+        if (state.tagStart == state.indented)
+          return state.stringStartCol + 1;
+        else
+          return state.indented + indentUnit;
</ins><span class="cx">       }
</span><span class="cx">       if (context &amp;&amp; context.noIndent) return CodeMirror.Pass;
</span><span class="cx">       if (state.tokenize != inTag &amp;&amp; state.tokenize != inText)
</span></span></pre>
</div>
</div>

</body>
</html>