Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(530)

Unified Diff: third_party/WebKit/Source/devtools/front_end/changes/ChangesHighlighter.js

Issue 2772643002: DevTools: Changes View (Closed)
Patch Set: Add a test Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/devtools/front_end/changes/ChangesHighlighter.js
diff --git a/third_party/WebKit/Source/devtools/front_end/changes/ChangesHighlighter.js b/third_party/WebKit/Source/devtools/front_end/changes/ChangesHighlighter.js
new file mode 100644
index 0000000000000000000000000000000000000000..2e54a742bc6478bc3a94f52d84286ba403f68235
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/changes/ChangesHighlighter.js
@@ -0,0 +1,137 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/** @typedef {!{lineNumber: number, index: number}} */
+Changes.DiffState;
+
+CodeMirror.defineMode('devtools-diff', function(config, parserConfig) {
lushnikov 2017/03/23 22:53:21 let's have jsdoc
+ var rows = parserConfig.rows || [];
+ var baselineLines = parserConfig.baselineLines;
+ var currentLines = parserConfig.currentLines;
+ var innerMode = CodeMirror.getMode({indentUnit: 2}, parserConfig.mimeType);
lushnikov 2017/03/23 22:53:21 we don't need indent here
+
+ function fastForward(state, baselineLineNumber, currentLineNumber) {
lushnikov 2017/03/23 22:53:21 jsdoc
+ if (baselineLineNumber > state.baselineLineNumber) {
+ fastForwardState(state.baselineState, state.baselineLineNumber, baselineLineNumber, baselineLines);
+ state.baselineLineNumber = baselineLineNumber;
+ }
+ if (currentLineNumber > state.currentLineNumber) {
+ fastForwardState(state.currentState, state.currentLineNumber, currentLineNumber, currentLines);
+ state.currentLineNumber = currentLineNumber;
+ }
+ }
+
+ function fastForwardState(state, from, to, lines) {
lushnikov 2017/03/23 22:53:20 jsdoc
+ var lineNumber = from;
+ while (lineNumber < to && lineNumber < lines.length) {
+ var stream = new CodeMirror.StringStream(lines[lineNumber]);
+ while (!stream.eol()) {
+ innerMode.token(stream, state);
+ stream.start = stream.pos;
+ }
+ lineNumber++;
+ }
+ }
+
+ return {
+ /**
+ * @return {!Changes.DiffState}
+ */
+ startState: function() {
+ return {
+ lineNumber: 0,
+ index: 0,
+ currentLineNumber: 0,
+ baselineLineNumber: 0,
+ currentState: CodeMirror.startState(innerMode),
+ baselineState: CodeMirror.startState(innerMode),
+ mismatch: 0
+ };
+ },
+
+ /**
+ * @param {!{next: function()}} stream
+ * @param {!Changes.DiffState} state
+ * @return {string}
+ */
+ token: function(stream, state) {
+ var row = rows[state.lineNumber];
+ if (!row) {
+ stream.next();
+ return '';
+ }
+ fastForward(state, row.base - 1, row.current - 1);
+ var classes = '';
+ if (state.index === 0)
+ classes += ' line-background-' + row.className + ' line-' + row.className;
+ var chars = row.content[state.index].text.length;
+ if (state.mismatch > 0)
+ chars = state.mismatch;
+ var pos = stream.pos;
+ var innerStyle = state.lastInnerStyle;
+ var innerPos = pos - state.mismatch;
+ if (state.mismatch >= 0) {
+ if (row.className === 'deletion' || row.className === 'addition' || row.className === 'equal') {
+ innerStyle = innerMode.token(stream, row.className === 'deletion' ? state.baselineState : state.currentState);
+ innerPos = stream.pos;
+ } else {
+ innerStyle = '';
+ innerPos = pos + chars;
+ }
+ }
+ stream.pos = Math.min(innerPos, pos + chars);
+ if (innerStyle)
+ classes += ' ' + innerStyle;
+ classes += ' ' + row.content[state.index].className;
+ state.mismatch = pos + chars - innerPos;
+ if (state.mismatch <= 0) {
+ state.index++;
+ state.lastInnerStyle = innerStyle;
+ }
+ if (state.index >= row.content.length) {
+ state.lineNumber++;
+ if (row.className === 'deletion')
+ state.baselineLineNumber++;
+ else
+ state.currentLineNumber++;
+ state.index = 0;
+ }
+ return classes;
+ },
+
+ /**
+ * @param {!Changes.DiffState} state
+ * @return {string}
+ */
+ blankLine: function(state) {
+ var row = rows[state.lineNumber];
+ state.lineNumber++;
+ state.mismatch = 0;
+ state.index = 0;
+ if (!row)
+ return '';
+ if (row.className === 'deletion')
+ state.baselineLineNumber++;
+ else
+ state.currentLineNumber++;
+ var style = '';
+ if (innerMode.blankLine)
+ style = innerMode.blankLine(row.className === 'deletion' ? state.baselineState : state.currentState);
+ return style + ' line-background-' + row.className + ' line-' + row.className;
+ },
+
+ /**
+ * @param {!Changes.DiffState} state
+ * @return {!Changes.DiffState}
+ */
+ copyState: function(state) {
+ var newState = /** @type {!Changes.DiffState} */ ({});
+ for (var i in state)
+ newState[i] = state[i];
+ newState.currentState = CodeMirror.copyState(innerMode, state.currentState);
+ newState.baselineState = CodeMirror.copyState(innerMode, state.baselineState);
+ return newState;
+ }
+ };
+});

Powered by Google App Engine
This is Rietveld 408576698