<!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 <jonowells@apple.com> 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 <jonowells@apple.com>
</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 <jonowells@apple.com>
+
</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 + "px";
</span><span class="cx"> } else d.gutterFiller.style.display = "";
</span><span class="cx">
</span><del>- if (mac_geLion && scrollbarWidth(d.measure) === 0) {
- d.scrollbarV.style.minWidth = d.scrollbarH.style.minHeight = mac_geMountainLion ? "18px" : "12px";
- var barMouseDown = function(e) {
- if (e_target(e) != d.scrollbarV && e_target(e) != d.scrollbarH)
- operation(cm, onMouseDown)(e);
- };
- on(d.scrollbarV, "mousedown", barMouseDown);
- on(d.scrollbarH, "mousedown", barMouseDown);
</del><ins>+ if (!cm.state.checkedOverlayScrollbar && measure.clientHeight > 0) {
+ if (scrollbarWidth(d.measure) === 0) {
+ var w = mac && !mac_geMountainLion ? "12px" : "18px";
+ d.scrollbarV.style.minWidth = d.scrollbarH.style.minHeight = w;
+ var barMouseDown = function(e) {
+ if (e_target(e) != d.scrollbarV && e_target(e) != d.scrollbarH)
+ operation(cm, onMouseDown)(e);
+ };
+ on(d.scrollbarV, "mousedown", barMouseDown);
+ on(d.scrollbarH, "mousedown", 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 && options.origin && 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, "cursorActivity", 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("pre", "x"));
</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) && !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 < op.changeObjs.length; i++)
- signal(cm, "change", cm, op.changeObjs[i]);
</del><ins>+ if (op.changeObjs)
</ins><span class="cx"> signal(cm, "changes", cm, op.changeObjs);
</span><del>- }
- if (op.cursorActivity) signal(cm, "cursorActivity", cm, op.origin);
</del><span class="cx"> if (delayed) for (var i = 0; i < delayed.length; ++i) delayed[i]();
</span><ins>+ if (op.cursorActivityHandlers)
+ for (var i = 0; i < 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) && !prevInput) || isReadOnly(cm) || cm.options.disableInput)
+ return false;
+ // See paste handler for more on the fakedLastChar kludge
+ if (cm.state.pasteIncoming && 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 && !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, "paste", 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 && !cm.state.fakedLastChar && !(new Date - cm.state.lastMiddleDown < 200)) {
+ var start = d.input.selectionStart, end = d.input.selectionEnd;
+ d.input.value += "$";
+ 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 && coords.xRel == 1 && (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 && !e.shiftKey) {
</ins><span class="cx"> ourIndex = doc.sel.contains(start);
</span><span class="cx"> if (ourIndex > -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 > -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 && (!cm.state.draggingText || +new Date - lastDrop < 100)) { e_stop(e); return; }
</del><ins>+ if (ie && (!cm.state.draggingText || +new Date - lastDrop < 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("Text", cm.getSelection());
</span><span class="lines">@@ -3088,7 +3107,10 @@
</span><span class="cx"> signal(cm, "focus", cm);
</span><span class="cx"> cm.state.focused = true;
</span><span class="cx"> addClass(cm.display.wrapper, "CodeMirror-focused");
</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 && 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 "Select all" to context menu in FF
</span><span class="cx"> if (!cm.somethingSelected()) display.input.value = display.prevInput = " ";
</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 = "\u200b" + (cm.somethingSelected() ? display.input.value : "");
- display.prevInput = "\u200b";
</del><ins>+ var selected = cm.somethingSelected();
+ var extval = display.input.value = "\u200b" + (selected ? display.input.value : "");
+ display.prevInput = selected ? "" : "\u200b";
</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 == "\u200b" && display.input.selectionStart == 0)
</del><ins>+ var i = 0, poll = function() {
+ if (display.selForContextMenu == cm.doc.sel && display.input.selectionStart == 0)
</ins><span class="cx"> operation(cm, commands.selectAll)(cm);
</span><span class="cx"> else if (i++ < 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) > -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, "change") || hasHandler(cm, "changes"))
- (cm.curOp.changeObjs || (cm.curOp.changeObjs = [])).push({
</del><ins>+ var changesHandler = hasHandler(cm, "changes"), changeHandler = hasHandler(cm, "change");
+ 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, "change", 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) >> 1;
</span><span class="cx"> if ((mid ? styles[mid * 2 - 1] : 0) >= ch) after = mid;
</span><span class="cx"> else if (styles[mid * 2 + 1] < 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("cm-overlay ") : -1;
+ return cut < 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, "cm-overlay " + style);
</ins><span class="cx"> i = start + 2;
</span><span class="cx"> } else {
</span><span class="cx"> for (; start < i; start += 2) {
</span><span class="cx"> var cur = st[start+1];
</span><del>- st[start+1] = cur ? cur + " " + style : style;
</del><ins>+ st[start+1] = (cur ? cur + " " : "") + "cm-overlay " + 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 < this.sel.ranges.length; i++)
</span><span class="cx"> dup[i] = code;
</span><span class="cx"> this.replaceSelections(dup, collapse, origin || "+input");
</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 < 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, "undo");}),
</span><span class="cx"> redo: docMethodOp(function() {makeChangeFromHistory(this, "redo");}),
</span><span class="cx"> undoSelection: docMethodOp(function() {makeChangeFromHistory(this, "undo", 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 && cm._handlers.cursorActivity;
+ if (!arr) return;
+ var set = cm.curOp.cursorActivityHandlers || (cm.curOp.cursorActivityHandlers = []);
+ for (var i = 0; i < 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 && emitter._handlers[type];
</span><span class="cx"> return arr && arr.length > 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 = "4.0.4";
</del><ins>+ CodeMirror.version = "4.1.0";
</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*[\"\']/, false))
</del><ins>+ if (!stream.match(/\s*[\"\')]/, false))
</ins><span class="cx"> state.tokenize = tokenString(")");
</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"> "clip-path", "clip-rule", "mask", "enable-background", "filter", "flood-color",
</span><span class="cx"> "flood-opacity", "lighting-color", "stop-color", "stop-opacity", "pointer-events",
</span><del>- "color-interpolation", "color-interpolation-filters", "color-profile",
</del><ins>+ "color-interpolation", "color-interpolation-filters",
</ins><span class="cx"> "color-rendering", "fill", "fill-opacity", "fill-rule", "image-rendering",
</span><span class="cx"> "marker", "marker-end", "marker-mid", "marker-start", "shape-rendering", "stroke",
</span><span class="cx"> "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin",
</span><span class="cx"> "stroke-miterlimit", "stroke-opacity", "stroke-width", "text-rendering",
</span><span class="cx"> "baseline-shift", "dominant-baseline", "glyph-orientation-horizontal",
</span><del>- "glyph-orientation-vertical", "kerning", "text-anchor", "writing-mode"
</del><ins>+ "glyph-orientation-vertical", "text-anchor", "writing-mode"
</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 == "operator" || type == "spread") return cont(noComma ? expressionNoComma : expression);
</span><span class="cx"> if (type == "[") return cont(pushlex("]"), arrayLiteral, poplex, maybeop);
</span><span class="cx"> if (type == "{") return contCommasep(objprop, "}", null, maybeop);
</span><ins>+ if (type == "quasi") { 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 == "?") return cont(expression, expect(":"), expr);
</span><span class="cx"> return cont(expr);
</span><span class="cx"> }
</span><del>- if (type == "quasi") { cx.cc.push(me); return quasi(value); }
</del><ins>+ if (type == "quasi") { return pass(quasi, me); }
</ins><span class="cx"> if (type == ";") return;
</span><span class="cx"> if (type == "(") return contCommasep(expressionNoComma, ")", "call", me);
</span><span class="cx"> if (type == ".") return cont(property, me);
</span><span class="cx"> if (type == "[") return cont(pushlex("]"), maybeexpression, expect("]"), poplex, me);
</span><span class="cx"> }
</span><del>- function quasi(value) {
- if (value.slice(value.length - 2) != "${") return cont();
</del><ins>+ function quasi(type, value) {
+ if (type != "quasi") return pass();
+ if (value.slice(value.length - 2) != "${") 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 == "}") {
</span><span class="cx"> cx.marked = "string-2";
</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 + "px";
</span><span class="cx"> } else d.gutterFiller.style.display = "";
</span><span class="cx">
</span><del>- if (mac_geLion && scrollbarWidth(d.measure) === 0) {
- d.scrollbarV.style.minWidth = d.scrollbarH.style.minHeight = mac_geMountainLion ? "18px" : "12px";
- var barMouseDown = function(e) {
- if (e_target(e) != d.scrollbarV && e_target(e) != d.scrollbarH)
- operation(cm, onMouseDown)(e);
- };
- on(d.scrollbarV, "mousedown", barMouseDown);
- on(d.scrollbarH, "mousedown", barMouseDown);
</del><ins>+ if (!cm.state.checkedOverlayScrollbar && measure.clientHeight > 0) {
+ if (scrollbarWidth(d.measure) === 0) {
+ var w = mac && !mac_geMountainLion ? "12px" : "18px";
+ d.scrollbarV.style.minWidth = d.scrollbarH.style.minHeight = w;
+ var barMouseDown = function(e) {
+ if (e_target(e) != d.scrollbarV && e_target(e) != d.scrollbarH)
+ operation(cm, onMouseDown)(e);
+ };
+ on(d.scrollbarV, "mousedown", barMouseDown);
+ on(d.scrollbarH, "mousedown", 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 && options.origin && 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, "cursorActivity", 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("pre", "x"));
</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) && !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 < op.changeObjs.length; i++)
- signal(cm, "change", cm, op.changeObjs[i]);
</del><ins>+ if (op.changeObjs)
</ins><span class="cx"> signal(cm, "changes", cm, op.changeObjs);
</span><del>- }
- if (op.cursorActivity) signal(cm, "cursorActivity", cm, op.origin);
</del><span class="cx"> if (delayed) for (var i = 0; i < delayed.length; ++i) delayed[i]();
</span><ins>+ if (op.cursorActivityHandlers)
+ for (var i = 0; i < 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) && !prevInput) || isReadOnly(cm) || cm.options.disableInput)
+ return false;
+ // See paste handler for more on the fakedLastChar kludge
+ if (cm.state.pasteIncoming && 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 && !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, "paste", 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 && !cm.state.fakedLastChar && !(new Date - cm.state.lastMiddleDown < 200)) {
+ var start = d.input.selectionStart, end = d.input.selectionEnd;
+ d.input.value += "$";
+ 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 && coords.xRel == 1 && (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 && !e.shiftKey) {
</ins><span class="cx"> ourIndex = doc.sel.contains(start);
</span><span class="cx"> if (ourIndex > -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 > -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 && (!cm.state.draggingText || +new Date - lastDrop < 100)) { e_stop(e); return; }
</del><ins>+ if (ie && (!cm.state.draggingText || +new Date - lastDrop < 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("Text", cm.getSelection());
</span><span class="lines">@@ -3088,7 +3107,10 @@
</span><span class="cx"> signal(cm, "focus", cm);
</span><span class="cx"> cm.state.focused = true;
</span><span class="cx"> addClass(cm.display.wrapper, "CodeMirror-focused");
</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 && 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 "Select all" to context menu in FF
</span><span class="cx"> if (!cm.somethingSelected()) display.input.value = display.prevInput = " ";
</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 = "\u200b" + (cm.somethingSelected() ? display.input.value : "");
- display.prevInput = "\u200b";
</del><ins>+ var selected = cm.somethingSelected();
+ var extval = display.input.value = "\u200b" + (selected ? display.input.value : "");
+ display.prevInput = selected ? "" : "\u200b";
</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 == "\u200b" && display.input.selectionStart == 0)
</del><ins>+ var i = 0, poll = function() {
+ if (display.selForContextMenu == cm.doc.sel && display.input.selectionStart == 0)
</ins><span class="cx"> operation(cm, commands.selectAll)(cm);
</span><span class="cx"> else if (i++ < 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) > -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, "change") || hasHandler(cm, "changes"))
- (cm.curOp.changeObjs || (cm.curOp.changeObjs = [])).push({
</del><ins>+ var changesHandler = hasHandler(cm, "changes"), changeHandler = hasHandler(cm, "change");
+ 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, "change", 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) >> 1;
</span><span class="cx"> if ((mid ? styles[mid * 2 - 1] : 0) >= ch) after = mid;
</span><span class="cx"> else if (styles[mid * 2 + 1] < 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("cm-overlay ") : -1;
+ return cut < 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, "cm-overlay " + style);
</ins><span class="cx"> i = start + 2;
</span><span class="cx"> } else {
</span><span class="cx"> for (; start < i; start += 2) {
</span><span class="cx"> var cur = st[start+1];
</span><del>- st[start+1] = cur ? cur + " " + style : style;
</del><ins>+ st[start+1] = (cur ? cur + " " : "") + "cm-overlay " + 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 < this.sel.ranges.length; i++)
</span><span class="cx"> dup[i] = code;
</span><span class="cx"> this.replaceSelections(dup, collapse, origin || "+input");
</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 < 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, "undo");}),
</span><span class="cx"> redo: docMethodOp(function() {makeChangeFromHistory(this, "redo");}),
</span><span class="cx"> undoSelection: docMethodOp(function() {makeChangeFromHistory(this, "undo", 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 && cm._handlers.cursorActivity;
+ if (!arr) return;
+ var set = cm.curOp.cursorActivityHandlers || (cm.curOp.cursorActivityHandlers = []);
+ for (var i = 0; i < 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 && emitter._handlers[type];
</span><span class="cx"> return arr && arr.length > 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 = "4.0.4";
</del><ins>+ CodeMirror.version = "4.1.0";
</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*[\"\']/, false))
</del><ins>+ if (!stream.match(/\s*[\"\')]/, false))
</ins><span class="cx"> state.tokenize = tokenString(")");
</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"> "clip-path", "clip-rule", "mask", "enable-background", "filter", "flood-color",
</span><span class="cx"> "flood-opacity", "lighting-color", "stop-color", "stop-opacity", "pointer-events",
</span><del>- "color-interpolation", "color-interpolation-filters", "color-profile",
</del><ins>+ "color-interpolation", "color-interpolation-filters",
</ins><span class="cx"> "color-rendering", "fill", "fill-opacity", "fill-rule", "image-rendering",
</span><span class="cx"> "marker", "marker-end", "marker-mid", "marker-start", "shape-rendering", "stroke",
</span><span class="cx"> "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin",
</span><span class="cx"> "stroke-miterlimit", "stroke-opacity", "stroke-width", "text-rendering",
</span><span class="cx"> "baseline-shift", "dominant-baseline", "glyph-orientation-horizontal",
</span><del>- "glyph-orientation-vertical", "kerning", "text-anchor", "writing-mode"
</del><ins>+ "glyph-orientation-vertical", "text-anchor", "writing-mode"
</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 == "operator" || type == "spread") return cont(noComma ? expressionNoComma : expression);
</span><span class="cx"> if (type == "[") return cont(pushlex("]"), arrayLiteral, poplex, maybeop);
</span><span class="cx"> if (type == "{") return contCommasep(objprop, "}", null, maybeop);
</span><ins>+ if (type == "quasi") { 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 == "?") return cont(expression, expect(":"), expr);
</span><span class="cx"> return cont(expr);
</span><span class="cx"> }
</span><del>- if (type == "quasi") { cx.cc.push(me); return quasi(value); }
</del><ins>+ if (type == "quasi") { return pass(quasi, me); }
</ins><span class="cx"> if (type == ";") return;
</span><span class="cx"> if (type == "(") return contCommasep(expressionNoComma, ")", "call", me);
</span><span class="cx"> if (type == ".") return cont(property, me);
</span><span class="cx"> if (type == "[") return cont(pushlex("]"), maybeexpression, expect("]"), poplex, me);
</span><span class="cx"> }
</span><del>- function quasi(value) {
- if (value.slice(value.length - 2) != "${") return cont();
</del><ins>+ function quasi(type, value) {
+ if (type != "quasi") return pass();
+ if (value.slice(value.length - 2) != "${") 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 == "}") {
</span><span class="cx"> cx.marked = "string-2";
</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$ < len$; ++i$) {
</span><span class="cx"> r = nr[i$];
</span><span class="cx"> if (r.regex && (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 < 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 < e; ++i) {
</span><span class="cx"> if (i) callback("\n");
</span><span class="cx"> var stream = new CodeMirror.StringStream(lines[i]);
</span><ins>+ if (!stream.string && 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 && context.noIndent) return CodeMirror.Pass;
</span><span class="cx"> if (state.tokenize != inTag && state.tokenize != inText)
</span></span></pre>
</div>
</div>
</body>
</html>