Merge "Adds diff traversal helper and make diff object a builder property"
This commit is contained in:
commit
18af6cfdc4
|
@ -66,5 +66,17 @@
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
GrDiffBuilderSideBySide.prototype._getNextContentOnSide = function(
|
||||||
|
content, side) {
|
||||||
|
var tr = content.parentElement.parentElement;
|
||||||
|
var content;
|
||||||
|
while (tr = tr.nextSibling) {
|
||||||
|
content = tr.querySelector(
|
||||||
|
'td.content .contentText[data-side="' + side + '"]');
|
||||||
|
if (content) { return content; }
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
};
|
||||||
|
|
||||||
window.GrDiffBuilderSideBySide = GrDiffBuilderSideBySide;
|
window.GrDiffBuilderSideBySide = GrDiffBuilderSideBySide;
|
||||||
})(window, GrDiffBuilder);
|
})(window, GrDiffBuilder);
|
||||||
|
|
|
@ -59,5 +59,19 @@
|
||||||
return row;
|
return row;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
GrDiffBuilderUnified.prototype._getNextContentOnSide = function(
|
||||||
|
content, side) {
|
||||||
|
var tr = content.parentElement.parentElement;
|
||||||
|
var content;
|
||||||
|
while (tr = tr.nextSibling) {
|
||||||
|
if (tr.classList.contains('both') || (
|
||||||
|
(side === 'left' && tr.classList.contains('remove')) ||
|
||||||
|
(side === 'right' && tr.classList.contains('add')))) {
|
||||||
|
return tr.querySelector('.contentText');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
};
|
||||||
|
|
||||||
window.GrDiffBuilderUnified = GrDiffBuilderUnified;
|
window.GrDiffBuilderUnified = GrDiffBuilderUnified;
|
||||||
})(window, GrDiffBuilder);
|
})(window, GrDiffBuilder);
|
||||||
|
|
|
@ -55,6 +55,7 @@ limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
properties: {
|
properties: {
|
||||||
|
diff: Object,
|
||||||
viewMode: String,
|
viewMode: String,
|
||||||
comments: Object,
|
comments: Object,
|
||||||
isImageDiff: Boolean,
|
isImageDiff: Boolean,
|
||||||
|
@ -81,11 +82,11 @@ limitations under the License.
|
||||||
];
|
];
|
||||||
},
|
},
|
||||||
|
|
||||||
render: function(diff, comments, prefs) {
|
render: function(comments, prefs) {
|
||||||
// Stop the processor (if it's running).
|
// Stop the processor (if it's running).
|
||||||
this.$.processor.cancel();
|
this.$.processor.cancel();
|
||||||
|
|
||||||
this._builder = this._getDiffBuilder(diff, comments, prefs);
|
this._builder = this._getDiffBuilder(this.diff, comments, prefs);
|
||||||
|
|
||||||
this.$.processor.context = prefs.context;
|
this.$.processor.context = prefs.context;
|
||||||
this.$.processor.keyLocations = this._getCommentLocations(comments);
|
this.$.processor.keyLocations = this._getCommentLocations(comments);
|
||||||
|
@ -93,7 +94,7 @@ limitations under the License.
|
||||||
this._clearDiffContent();
|
this._clearDiffContent();
|
||||||
|
|
||||||
console.time('diff render');
|
console.time('diff render');
|
||||||
this.$.processor.process(diff.content).then(function() {
|
return this.$.processor.process(this.diff.content).then(function() {
|
||||||
if (this.isImageDiff) {
|
if (this.isImageDiff) {
|
||||||
this._builder.renderDiffImages();
|
this._builder.renderDiffImages();
|
||||||
}
|
}
|
||||||
|
|
|
@ -139,6 +139,7 @@
|
||||||
var groups = this.getGroupsByLineRange(start, end, opt_side);
|
var groups = this.getGroupsByLineRange(start, end, opt_side);
|
||||||
|
|
||||||
groups.forEach(function(group) {
|
groups.forEach(function(group) {
|
||||||
|
var content = null;
|
||||||
group.lines.forEach(function(line) {
|
group.lines.forEach(function(line) {
|
||||||
if ((opt_side === 'left' && line.type === GrDiffLine.Type.ADD) ||
|
if ((opt_side === 'left' && line.type === GrDiffLine.Type.ADD) ||
|
||||||
(opt_side === 'right' && line.type === GrDiffLine.Type.REMOVE)) {
|
(opt_side === 'right' && line.type === GrDiffLine.Type.REMOVE)) {
|
||||||
|
@ -150,8 +151,12 @@
|
||||||
|
|
||||||
if (out_lines) { out_lines.push(line); }
|
if (out_lines) { out_lines.push(line); }
|
||||||
if (out_elements) {
|
if (out_elements) {
|
||||||
var content = this.getContentByLine(lineNumber, opt_side,
|
if (content) {
|
||||||
group.element);
|
content = this._getNextContentOnSide(content, opt_side);
|
||||||
|
} else {
|
||||||
|
content = this.getContentByLine(lineNumber, opt_side,
|
||||||
|
group.element);
|
||||||
|
}
|
||||||
if (content) { out_elements.push(content); }
|
if (content) { out_elements.push(content); }
|
||||||
}
|
}
|
||||||
}.bind(this));
|
}.bind(this));
|
||||||
|
@ -537,5 +542,16 @@
|
||||||
this._renderContentByRange(start, end, side);
|
this._renderContentByRange(start, end, side);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Finds the next DIV.contentText element following the given element, and on
|
||||||
|
* the same side. Will only search within a group.
|
||||||
|
* @param {HTMLElement} content
|
||||||
|
* @param {String} side Either 'left' or 'right'
|
||||||
|
* @return {HTMLElement}
|
||||||
|
*/
|
||||||
|
GrDiffBuilder.prototype._getNextContentOnSide = function(content, side) {
|
||||||
|
throw Error('Subclasses must implement _getNextContentOnSide');
|
||||||
|
};
|
||||||
|
|
||||||
window.GrDiffBuilder = GrDiffBuilder;
|
window.GrDiffBuilder = GrDiffBuilder;
|
||||||
})(window, GrDiffGroup, GrDiffLine);
|
})(window, GrDiffGroup, GrDiffLine);
|
||||||
|
|
|
@ -459,7 +459,8 @@ limitations under the License.
|
||||||
};
|
};
|
||||||
return builder;
|
return builder;
|
||||||
});
|
});
|
||||||
element.render({content: content}, {left: [], right: []}, prefs);
|
element.diff = {content: content};
|
||||||
|
element.render({left: [], right: []}, prefs);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('renderSection', function() {
|
test('renderSection', function() {
|
||||||
|
@ -494,25 +495,23 @@ limitations under the License.
|
||||||
var element;
|
var element;
|
||||||
var builder;
|
var builder;
|
||||||
var diff;
|
var diff;
|
||||||
|
var prefs;
|
||||||
|
|
||||||
setup(function(done) {
|
setup(function(done) {
|
||||||
element = fixture('mock-diff');
|
element = fixture('mock-diff');
|
||||||
diff = document.createElement('mock-diff-response').diffResponse;
|
diff = document.createElement('mock-diff-response').diffResponse;
|
||||||
|
element.diff = diff;
|
||||||
|
|
||||||
var prefs = {
|
prefs = {
|
||||||
line_length: 80,
|
line_length: 80,
|
||||||
show_tabs: true,
|
show_tabs: true,
|
||||||
tab_size: 4,
|
tab_size: 4,
|
||||||
};
|
};
|
||||||
|
|
||||||
function doneHandler() {
|
element.render({left: [], right: []}, prefs).then(function() {
|
||||||
element.removeEventListener('render', doneHandler);
|
|
||||||
builder = element._builder;
|
builder = element._builder;
|
||||||
done();
|
done();
|
||||||
}
|
});
|
||||||
element.addEventListener('render', doneHandler);
|
|
||||||
|
|
||||||
element.render(diff, {left: [], right: []}, prefs);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
test('getContentByLine', function() {
|
test('getContentByLine', function() {
|
||||||
|
@ -566,6 +565,70 @@ limitations under the License.
|
||||||
|
|
||||||
spy.restore();
|
spy.restore();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('_getNextContentOnSide side-by-side left', function() {
|
||||||
|
var startElem = builder.getContentByLine(5, 'left',
|
||||||
|
element.$.diffTable);
|
||||||
|
var expectedStartString = diff.content[2].ab[0];
|
||||||
|
var expectedNextString = diff.content[2].ab[1];
|
||||||
|
assert.equal(startElem.textContent, expectedStartString);
|
||||||
|
|
||||||
|
var nextElem = builder._getNextContentOnSide(startElem,
|
||||||
|
'left');
|
||||||
|
assert.equal(nextElem.textContent, expectedNextString);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('_getNextContentOnSide side-by-side right', function() {
|
||||||
|
var startElem = builder.getContentByLine(5, 'right',
|
||||||
|
element.$.diffTable);
|
||||||
|
var expectedStartString = diff.content[1].b[0];
|
||||||
|
var expectedNextString = diff.content[1].b[1];
|
||||||
|
assert.equal(startElem.textContent, expectedStartString);
|
||||||
|
|
||||||
|
var nextElem = builder._getNextContentOnSide(startElem,
|
||||||
|
'right');
|
||||||
|
assert.equal(nextElem.textContent, expectedNextString);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('_getNextContentOnSide unified left', function(done) {
|
||||||
|
// Re-render as unified:
|
||||||
|
element.viewMode = 'UNIFIED_DIFF';
|
||||||
|
element.render({left: [], right: []}, prefs).then(function() {
|
||||||
|
builder = element._builder;
|
||||||
|
|
||||||
|
var startElem = builder.getContentByLine(5, 'left',
|
||||||
|
element.$.diffTable);
|
||||||
|
var expectedStartString = diff.content[2].ab[0];
|
||||||
|
var expectedNextString = diff.content[2].ab[1];
|
||||||
|
assert.equal(startElem.textContent, expectedStartString);
|
||||||
|
|
||||||
|
var nextElem = builder._getNextContentOnSide(startElem,
|
||||||
|
'left');
|
||||||
|
assert.equal(nextElem.textContent, expectedNextString);
|
||||||
|
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('_getNextContentOnSide unified right', function(done) {
|
||||||
|
// Re-render as unified:
|
||||||
|
element.viewMode = 'UNIFIED_DIFF';
|
||||||
|
element.render({left: [], right: []}, prefs).then(function() {
|
||||||
|
builder = element._builder;
|
||||||
|
|
||||||
|
var startElem = builder.getContentByLine(5, 'right',
|
||||||
|
element.$.diffTable);
|
||||||
|
var expectedStartString = diff.content[1].b[0];
|
||||||
|
var expectedNextString = diff.content[1].b[1];
|
||||||
|
assert.equal(startElem.textContent, expectedStartString);
|
||||||
|
|
||||||
|
var nextElem = builder._getNextContentOnSide(startElem,
|
||||||
|
'right');
|
||||||
|
assert.equal(nextElem.textContent, expectedNextString);
|
||||||
|
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -151,6 +151,7 @@ limitations under the License.
|
||||||
<gr-diff-builder
|
<gr-diff-builder
|
||||||
id="diffBuilder"
|
id="diffBuilder"
|
||||||
comments="[[_comments]]"
|
comments="[[_comments]]"
|
||||||
|
diff="[[_diff]]"
|
||||||
view-mode="[[viewMode]]"
|
view-mode="[[viewMode]]"
|
||||||
is-image-diff="[[isImageDiff]]"
|
is-image-diff="[[isImageDiff]]"
|
||||||
base-image="[[_baseImage]]"
|
base-image="[[_baseImage]]"
|
||||||
|
|
|
@ -336,7 +336,7 @@
|
||||||
},
|
},
|
||||||
|
|
||||||
_render: function() {
|
_render: function() {
|
||||||
this.$.diffBuilder.render(this._diff, this._comments, this.prefs);
|
this.$.diffBuilder.render(this._comments, this.prefs);
|
||||||
},
|
},
|
||||||
|
|
||||||
_clearDiffContent: function() {
|
_clearDiffContent: function() {
|
||||||
|
|
Loading…
Reference in New Issue