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

Side by Side Diff: tools/turbolizer/text-view.js

Issue 2230083004: [turbolizer] Use locations rather than ranges everywhere (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Remove stray change Created 4 years, 4 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
« no previous file with comments | « tools/turbolizer/selection-broker.js ('k') | tools/turbolizer/turbo-visualizer.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 "use strict"; 5 "use strict";
6 6
7 class TextView extends View { 7 class TextView extends View {
8 constructor(id, broker, patterns, allowSpanSelection) { 8 constructor(id, broker, patterns, allowSpanSelection) {
9 super(id, broker); 9 super(id, broker);
10 let view = this; 10 let view = this;
11 view.sortedPositionList = []; 11 view.hide();
12 view.nodePositionMap = [];
13 view.positionNodeMap = [];
14 view.textListNode = view.divNode.getElementsByTagName('ul')[0]; 12 view.textListNode = view.divNode.getElementsByTagName('ul')[0];
15 view.fillerSvgElement = view.divElement.append("svg").attr('version','1.1'). attr("width", "0"); 13 view.fillerSvgElement = view.divElement.append("svg").attr('version','1.1'). attr("width", "0");
16 view.patterns = patterns; 14 view.patterns = patterns;
17 view.allowSpanSelection = allowSpanSelection; 15 view.allowSpanSelection = allowSpanSelection;
18 view.nodeToLineMap = []; 16 view.nodeToLineMap = [];
19 var selectionHandler = { 17 var selectionHandler = {
20 clear: function() { 18 clear: function() {
21 broker.clear(selectionHandler); 19 broker.clear(selectionHandler);
22 }, 20 },
23 select: function(items, selected) { 21 select: function(items, selected) {
24 for (let i of items) { 22 for (let i of items) {
25 if (selected) { 23 if (selected) {
26 i.classList.add("selected"); 24 i.classList.add("selected");
27 } else { 25 } else {
28 i.classList.remove("selected"); 26 i.classList.remove("selected");
29 } 27 }
30 } 28 }
31 broker.clear(selectionHandler); 29 broker.clear(selectionHandler);
32 broker.select(selectionHandler, view.getRanges(items), selected); 30 broker.select(selectionHandler, view.getLocations(items), selected);
33 }, 31 },
34 selectionDifference: function(span1, inclusive1, span2, inclusive2) { 32 selectionDifference: function(span1, inclusive1, span2, inclusive2) {
35 return null; 33 return null;
36 }, 34 },
37 brokeredSelect: function(ranges, selected) { 35 brokeredSelect: function(locations, selected) {
38 let locations = view.rangesToLocations(ranges);
39 view.selectLocations(locations, selected, true); 36 view.selectLocations(locations, selected, true);
40 }, 37 },
41 brokeredClear: function() { 38 brokeredClear: function() {
42 view.selection.clear(); 39 view.selection.clear();
43 } 40 }
44 }; 41 };
45 view.selection = new Selection(selectionHandler); 42 view.selection = new Selection(selectionHandler);
46 broker.addSelectionHandler(selectionHandler); 43 broker.addSelectionHandler(selectionHandler);
47 } 44 }
48 45
49 setPatterns(patterns) { 46 setPatterns(patterns) {
50 let view = this; 47 let view = this;
51 view.patterns = patterns; 48 view.patterns = patterns;
52 } 49 }
53 50
54 clearText() { 51 clearText() {
55 let view = this; 52 let view = this;
56 while (view.textListNode.firstChild) { 53 while (view.textListNode.firstChild) {
57 view.textListNode.removeChild(view.textListNode.firstChild); 54 view.textListNode.removeChild(view.textListNode.firstChild);
58 } 55 }
59 } 56 }
60 57
61 rangeToLocation(range) {
62 return range;
63 }
64
65 rangesToLocations(ranges) {
66 let view = this;
67 let nodes = new Set();
68 let result = [];
69 for (let range of ranges) {
70 let start = range[0];
71 let end = range[1];
72 let block_id = range[3];
73 let location = { pos_start: start, pos_end: end, block_id: block_id };
74 if (range[2] !== null && range[2] != -1) {
75 location.node_id = range[2];
76 if (range[0] == -1 && range[1] == -1) {
77 location.pos_start = view.nodePositionMap[location.node_id];
78 location.pos_end = location.pos_start + 1;
79 }
80 } else {
81 if (range[0] != undefined) {
82 location.pos_start = range[0];
83 location.pos_end = range[1];
84 }
85 }
86 result.push(location);
87 }
88 return result;
89 }
90
91 sameLocation(l1, l2) { 58 sameLocation(l1, l2) {
92 let view = this; 59 let view = this;
93 if (l1.block_id != undefined && l2.block_id != undefined && 60 if (l1.block_id != undefined && l2.block_id != undefined &&
94 l1.block_id == l2.block_id && l1.node_id === undefined) { 61 l1.block_id == l2.block_id && l1.node_id === undefined) {
95 return true; 62 return true;
96 } 63 }
97 64
98 if (l1.address != undefined && l1.address == l2.address) { 65 if (l1.address != undefined && l1.address == l2.address) {
99 return true; 66 return true;
100 } 67 }
101 68
102 let node1 = l1.node_id; 69 let node1 = l1.node_id;
103 let node2 = l2.node_id; 70 let node2 = l2.node_id;
104 71
105 if (node1 === undefined && node2 == undefined) { 72 if (node1 === undefined || node2 == undefined) {
106 if (l1.pos_start === undefined || l2.pos_start == undefined) { 73 if (l1.pos_start === undefined || l2.pos_start == undefined) {
107 return false; 74 return false;
108 } 75 }
109 if (l1.pos_start == -1 || l2.pos_start == -1) { 76 if (l1.pos_start == -1 || l2.pos_start == -1) {
110 return false; 77 return false;
111 } 78 }
112 if (l1.pos_start < l2.pos_start) { 79 if (l1.pos_start < l2.pos_start) {
113 return l1.pos_end > l2.pos_start; 80 return l1.pos_end > l2.pos_start;
114 } { 81 } {
115 return l1.pos_start < l2.pos_end; 82 return l1.pos_start < l2.pos_end;
116 } 83 }
117 } 84 }
118 85
119 if (node1 === undefined) {
120 let lower = lowerBound(view.positionNodeMap, l1.pos_start, undefined, func tion(a, b) {
121 var node = a[b];
122 return view.nodePositionMap[node];
123 } );
124 while (++lower < view.positionNodeMap.length &&
125 view.nodePositionMap[view.positionNodeMap[lower]] < l1.pos_end) {
126 if (view.positionNodeMap[lower] == node2) {
127 return true;
128 }
129 }
130 return false;
131 }
132
133 if (node2 === undefined) {
134 let lower = lowerBound(view.positionNodeMap, l2.pos_start, undefined, func tion(a, b) {
135 var node = a[b];
136 return view.nodePositionMap[node];
137 } );
138 while (++lower < view.positionNodeMap.length &&
139 view.nodePositionMap[view.positionNodeMap[lower]] < l2.pos_end) {
140 if (view.positionNodeMap[lower] == node1) {
141 return true;
142 }
143 }
144 return false;
145 }
146
147 return l1.node_id == l2.node_id; 86 return l1.node_id == l2.node_id;
148 } 87 }
149 88
150 setNodePositionMap(map) {
151 let view = this;
152 view.nodePositionMap = map;
153 view.positionNodeMap = [];
154 view.sortedPositionList = [];
155 let next = 0;
156 for (let i in view.nodePositionMap) {
157 view.sortedPositionList[next] = Number(view.nodePositionMap[i]);
158 view.positionNodeMap[next++] = i;
159 }
160 view.sortedPositionList = sortUnique(view.sortedPositionList,
161 function(a,b) { return a - b; });
162 this.positionNodeMap.sort(function(a,b) {
163 let result = view.nodePositionMap[a] - view.nodePositionMap[b];
164 if (result != 0) return result;
165 return a - b;
166 });
167 }
168
169 selectLocations(locations, selected, makeVisible) { 89 selectLocations(locations, selected, makeVisible) {
170 let view = this; 90 let view = this;
171 let s = new Set(); 91 let s = new Set();
172 for (let l of locations) { 92 for (let l of locations) {
173 for (let i = 0; i < view.textListNode.children.length; ++i) { 93 for (let i = 0; i < view.textListNode.children.length; ++i) {
174 let child = view.textListNode.children[i]; 94 let child = view.textListNode.children[i];
175 if (child.location != undefined && view.sameLocation(l, child.location)) { 95 if (child.location != undefined && view.sameLocation(l, child.location)) {
176 s.add(child); 96 s.add(child);
177 } 97 }
178 } 98 }
179 } 99 }
180 view.selectCommon(s, selected, makeVisible); 100 view.selectCommon(s, selected, makeVisible);
181 } 101 }
182 102
183 getRanges(items) { 103 getLocations(items) {
184 let result = []; 104 let result = [];
185 let lastObject = null; 105 let lastObject = null;
186 for (let i of items) { 106 for (let i of items) {
187 if (i.location) { 107 if (i.location) {
188 let location = i.location; 108 result.push(i.location);
189 let start = -1;
190 let end = -1;
191 let node_id = -1;
192 let block_id = -1;
193 if (location.node_id !== undefined) {
194 node_id = location.node_id;
195 }
196 if (location.block_id !== undefined) {
197 block_id = location.block_id;
198 }
199 if (location.pos_start !== undefined) {
200 start = location.pos_start;
201 end = location.pos_end;
202 } else {
203 if (this.nodePositionMap && this.nodePositionMap[node_id]) {
204 start = this.nodePositionMap[node_id];
205 end = start + 1;
206 }
207 }
208 if (lastObject == null ||
209 (lastObject[2] != node_id ||
210 lastObject[0] != start ||
211 lastObject[1] != end ||
212 lastObject[3] != block_id)) {
213 lastObject = [start, end, node_id, block_id];
214 result.push(lastObject);
215 }
216 } 109 }
217 } 110 }
218 return result; 111 return result;
219 } 112 }
220 113
221 createFragment(text, style) { 114 createFragment(text, style) {
222 let view = this; 115 let view = this;
223 let span = document.createElement("SPAN"); 116 let span = document.createElement("SPAN");
224 span.onmousedown = function(e) { 117 span.onmousedown = function(e) {
225 view.mouseDownSpan(span, e); 118 view.mouseDownSpan(span, e);
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
297 let child = view.textListNode.children[i]; 190 let child = view.textListNode.children[i];
298 if (child.location && s(child.location)) { 191 if (child.location && s(child.location)) {
299 if (firstSelect) { 192 if (firstSelect) {
300 makeContainerPosVisible(view.parentNode, child.offsetTop); 193 makeContainerPosVisible(view.parentNode, child.offsetTop);
301 firstSelect = false; 194 firstSelect = false;
302 } 195 }
303 view.selection.select(child, selected); 196 view.selection.select(child, selected);
304 } 197 }
305 } 198 }
306 } else if (typeof s[Symbol.iterator] === 'function') { 199 } else if (typeof s[Symbol.iterator] === 'function') {
307 for (let i of s) { 200 if (firstSelect) {
308 if (firstSelect) { 201 for (let i of s) {
309 makeContainerPosVisible(view.parentNode, i.offsetTop); 202 makeContainerPosVisible(view.parentNode, i.offsetTop);
310 firstSelect = false; 203 break;
311 } 204 }
312 view.selection.select(i, selected);
313 } 205 }
206 view.selection.select(s, selected);
314 } else { 207 } else {
315 if (firstSelect) { 208 if (firstSelect) {
316 makeContainerPosVisible(view.parentNode, s.offsetTop); 209 makeContainerPosVisible(view.parentNode, s.offsetTop);
317 } 210 }
318 view.selection.select(s, selected); 211 view.selection.select(s, selected);
319 } 212 }
320 } 213 }
321 214
322 mouseDownLine(li, e) { 215 mouseDownLine(li, e) {
323 let view = this; 216 let view = this;
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
394 lineLocation(li) { 287 lineLocation(li) {
395 let view = this; 288 let view = this;
396 for (let i = 0; i < li.children.length; ++i) { 289 for (let i = 0; i < li.children.length; ++i) {
397 let fragment = li.children[i]; 290 let fragment = li.children[i];
398 if (fragment.location != undefined && !view.allowSpanSelection) { 291 if (fragment.location != undefined && !view.allowSpanSelection) {
399 return fragment.location; 292 return fragment.location;
400 } 293 }
401 } 294 }
402 } 295 }
403 } 296 }
OLDNEW
« no previous file with comments | « tools/turbolizer/selection-broker.js ('k') | tools/turbolizer/turbo-visualizer.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698