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

Side by Side 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 unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 /** @typedef {!{lineNumber: number, index: number}} */
6 Changes.DiffState;
7
8 CodeMirror.defineMode('devtools-diff', function(config, parserConfig) {
lushnikov 2017/03/23 22:53:21 let's have jsdoc
9 var rows = parserConfig.rows || [];
10 var baselineLines = parserConfig.baselineLines;
11 var currentLines = parserConfig.currentLines;
12 var innerMode = CodeMirror.getMode({indentUnit: 2}, parserConfig.mimeType);
lushnikov 2017/03/23 22:53:21 we don't need indent here
13
14 function fastForward(state, baselineLineNumber, currentLineNumber) {
lushnikov 2017/03/23 22:53:21 jsdoc
15 if (baselineLineNumber > state.baselineLineNumber) {
16 fastForwardState(state.baselineState, state.baselineLineNumber, baselineLi neNumber, baselineLines);
17 state.baselineLineNumber = baselineLineNumber;
18 }
19 if (currentLineNumber > state.currentLineNumber) {
20 fastForwardState(state.currentState, state.currentLineNumber, currentLineN umber, currentLines);
21 state.currentLineNumber = currentLineNumber;
22 }
23 }
24
25 function fastForwardState(state, from, to, lines) {
lushnikov 2017/03/23 22:53:20 jsdoc
26 var lineNumber = from;
27 while (lineNumber < to && lineNumber < lines.length) {
28 var stream = new CodeMirror.StringStream(lines[lineNumber]);
29 while (!stream.eol()) {
30 innerMode.token(stream, state);
31 stream.start = stream.pos;
32 }
33 lineNumber++;
34 }
35 }
36
37 return {
38 /**
39 * @return {!Changes.DiffState}
40 */
41 startState: function() {
42 return {
43 lineNumber: 0,
44 index: 0,
45 currentLineNumber: 0,
46 baselineLineNumber: 0,
47 currentState: CodeMirror.startState(innerMode),
48 baselineState: CodeMirror.startState(innerMode),
49 mismatch: 0
50 };
51 },
52
53 /**
54 * @param {!{next: function()}} stream
55 * @param {!Changes.DiffState} state
56 * @return {string}
57 */
58 token: function(stream, state) {
59 var row = rows[state.lineNumber];
60 if (!row) {
61 stream.next();
62 return '';
63 }
64 fastForward(state, row.base - 1, row.current - 1);
65 var classes = '';
66 if (state.index === 0)
67 classes += ' line-background-' + row.className + ' line-' + row.classNam e;
68 var chars = row.content[state.index].text.length;
69 if (state.mismatch > 0)
70 chars = state.mismatch;
71 var pos = stream.pos;
72 var innerStyle = state.lastInnerStyle;
73 var innerPos = pos - state.mismatch;
74 if (state.mismatch >= 0) {
75 if (row.className === 'deletion' || row.className === 'addition' || row. className === 'equal') {
76 innerStyle = innerMode.token(stream, row.className === 'deletion' ? st ate.baselineState : state.currentState);
77 innerPos = stream.pos;
78 } else {
79 innerStyle = '';
80 innerPos = pos + chars;
81 }
82 }
83 stream.pos = Math.min(innerPos, pos + chars);
84 if (innerStyle)
85 classes += ' ' + innerStyle;
86 classes += ' ' + row.content[state.index].className;
87 state.mismatch = pos + chars - innerPos;
88 if (state.mismatch <= 0) {
89 state.index++;
90 state.lastInnerStyle = innerStyle;
91 }
92 if (state.index >= row.content.length) {
93 state.lineNumber++;
94 if (row.className === 'deletion')
95 state.baselineLineNumber++;
96 else
97 state.currentLineNumber++;
98 state.index = 0;
99 }
100 return classes;
101 },
102
103 /**
104 * @param {!Changes.DiffState} state
105 * @return {string}
106 */
107 blankLine: function(state) {
108 var row = rows[state.lineNumber];
109 state.lineNumber++;
110 state.mismatch = 0;
111 state.index = 0;
112 if (!row)
113 return '';
114 if (row.className === 'deletion')
115 state.baselineLineNumber++;
116 else
117 state.currentLineNumber++;
118 var style = '';
119 if (innerMode.blankLine)
120 style = innerMode.blankLine(row.className === 'deletion' ? state.baselin eState : state.currentState);
121 return style + ' line-background-' + row.className + ' line-' + row.classN ame;
122 },
123
124 /**
125 * @param {!Changes.DiffState} state
126 * @return {!Changes.DiffState}
127 */
128 copyState: function(state) {
129 var newState = /** @type {!Changes.DiffState} */ ({});
130 for (var i in state)
131 newState[i] = state[i];
132 newState.currentState = CodeMirror.copyState(innerMode, state.currentState );
133 newState.baselineState = CodeMirror.copyState(innerMode, state.baselineSta te);
134 return newState;
135 }
136 };
137 });
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698