Fix problem where gr-formatted-text would sometimes not display

There was an issue where gr-formatted-text would not display when the
config was not loaded yet.  This change adds a function to display text
as is, in the event that the config is not yet loaded. It also refactors
the existing functions to make it more clear where config is needed.

Bug: Issue 5690
Change-Id: I74896bd59793b26b2b8fe289c13e5762c60fe8df
This commit is contained in:
Becky Siegel
2017-03-06 09:38:05 -08:00
parent 2b822834e2
commit e76c79bc05
4 changed files with 74 additions and 3 deletions

View File

@@ -201,7 +201,7 @@ limitations under the License.
</div>
</div>
<template is="dom-if" if="[[comment.robot_id]]">
<div class="robotId" hidden$="[[collapsed]]"">
<div class="robotId" hidden$="[[collapsed]]">
[[comment.robot_id]]
</div>
</template>

View File

@@ -20,7 +20,10 @@
is: 'gr-formatted-text',
properties: {
content: String,
content: {
type: String,
observer: '_contentChanged',
},
config: Object,
noTrailingMargin: {
type: Boolean,
@@ -51,6 +54,14 @@
return this._blocksToText(this._computeBlocks(this.content));
},
_contentChanged: function(content) {
// In the case where the config may not be set (perhaps due to the
// request for it still being in flight), set the content anyway to
// prevent waiting on the config to display the text.
if (this.config) { return; }
this.$.container.textContent = content;
},
/**
* Given a source string, update the DOM inside #container.
*/
@@ -63,7 +74,8 @@
}
// Add new content.
this._computeNodes(this._computeBlocks(content)).forEach(function(node) {
this._computeNodes(this._computeBlocks(content))
.forEach(function(node) {
container.appendChild(node);
});
},

View File

@@ -32,6 +32,7 @@ limitations under the License.
<script>
suite('gr-formatted-text tests', function() {
var element;
var sandbox;
function assertBlock(result, index, type, text) {
assert.equal(result[index].type, type);
@@ -45,6 +46,11 @@ limitations under the License.
setup(function() {
element = fixture('basic');
sandbox = sinon.sandbox.create();
});
teardown(function() {
sandbox.restore();
});
test('parse null undefined and empty', function() {
@@ -354,5 +360,22 @@ limitations under the License.
var expected = 'Paragraph\n\n pre\n\nList\nOf\nItems\n\nQuote';
assert.equal(result, expected);
});
test('_contentOrConfigChanged not called without config', function() {
var contentStub = sandbox.stub(element, '_contentChanged');
var contentConfigStub = sandbox.stub(element, '_contentOrConfigChanged');
element.content = 'some text';
assert.isTrue(contentStub.called);
assert.isFalse(contentConfigStub.called);
});
test('_contentOrConfigChanged called with config', function() {
var contentStub = sandbox.stub(element, '_contentChanged');
var contentConfigStub = sandbox.stub(element, '_contentOrConfigChanged');
element.content = 'some text';
element.config = {};
assert.isTrue(contentStub.called);
assert.isTrue(contentConfigStub.called);
});
});
</script>

View File

@@ -35,9 +35,11 @@ limitations under the License.
<script>
suite('gr-linked-text tests', function() {
var element;
var sandbox;
setup(function() {
element = fixture('basic');
sandbox = sinon.sandbox.create();
element.config = {
ph: {
match: '([Bb]ug|[Ii]ssue)\\s*#?(\\d+)',
@@ -68,6 +70,10 @@ limitations under the License.
};
});
teardown(function() {
sandbox.restore();
});
test('URL pattern was parsed and linked.', function() {
// Reguar inline link.
var url = 'https://code.google.com/p/gerrit/issues/detail?id=3650';
@@ -207,5 +213,35 @@ limitations under the License.
assert.equal(links[1].href, 'ftp://foo/45');
assert.equal(links[1].textContent, '45');
});
test('_contentOrConfigChanged called with config', function() {
var contentStub = sandbox.stub(element, '_contentChanged');
var contentConfigStub = sandbox.stub(element, '_contentOrConfigChanged');
element.content = 'some text';
assert.isTrue(contentStub.called);
assert.isTrue(contentConfigStub.called);
});
});
suite('gr-linked-text with null config', function() {
var element;
var sandbox;
setup(function() {
element = fixture('basic');
sandbox = sinon.sandbox.create();
});
teardown(function() {
sandbox.restore();
});
test('_contentOrConfigChanged not called without config', function() {
var contentStub = sandbox.stub(element, '_contentChanged');
var contentConfigStub = sandbox.stub(element, '_contentOrConfigChanged');
element.content = 'some text';
assert.isTrue(contentStub.called);
assert.isFalse(contentConfigStub.called);
});
});
</script>