Skip to content

Commit

Permalink
Fix for build race condition on ensureLoaded (#32979)
Browse files Browse the repository at this point in the history
  • Loading branch information
Dima Voytenko committed Mar 1, 2021
1 parent 6a74422 commit abcf9a4
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 25 deletions.
43 changes: 24 additions & 19 deletions src/custom-element.js
Expand Up @@ -602,26 +602,31 @@ function createBaseCustomElementClass(win) {
return this.whenLoaded();
}

// Very ugly! The "built" signal must be resolved from the Resource
// and not the element itself because the Resource has not correctly
// set its state for the downstream to process it correctly.
const resource = this.getResource_();
if (resource.getState() == ResourceState.LAYOUT_COMPLETE) {
return;
}
if (
resource.getState() != ResourceState.LAYOUT_SCHEDULED ||
resource.isMeasureRequested()
) {
resource.measure();
}
if (!resource.isDisplayed()) {
return;
}
this.getResources().scheduleLayoutOrPreload(
resource,
/* layout */ true,
opt_parentPriority,
/* forceOutsideViewport */ true
);
return this.whenLoaded();
return resource.whenBuilt().then(() => {
if (resource.getState() == ResourceState.LAYOUT_COMPLETE) {
return;
}
if (
resource.getState() != ResourceState.LAYOUT_SCHEDULED ||
resource.isMeasureRequested()
) {
resource.measure();
}
if (!resource.isDisplayed()) {
return;
}
this.getResources().scheduleLayoutOrPreload(
resource,
/* layout */ true,
opt_parentPriority,
/* forceOutsideViewport */ true
);
return this.whenLoaded();
});
});
}

Expand Down
21 changes: 15 additions & 6 deletions test/unit/test-custom-element.js
Expand Up @@ -1584,7 +1584,8 @@ describes.realWin('CustomElement', {amp: true}, (env) => {
.once();

const promise = element.ensureLoaded(parentPriority);
await element.buildInternal();
await resource.build();
await resource.whenBuilt();
await element.layoutCallback();

await promise;
Expand All @@ -1599,7 +1600,8 @@ describes.realWin('CustomElement', {amp: true}, (env) => {
container.appendChild(element);
const resource = element.getResource_();

await element.buildInternal();
await resource.build();
await resource.whenBuilt();
expect(element.isBuilt()).to.be.true;

const parentPriority = 1;
Expand All @@ -1626,7 +1628,8 @@ describes.realWin('CustomElement', {amp: true}, (env) => {
container.appendChild(element);
const resource = element.getResource_();

await element.buildInternal();
await resource.build();
await resource.whenBuilt();
resource.measure();
resource.layoutScheduled(Date.now());
await resource.startLayout();
Expand All @@ -1644,7 +1647,8 @@ describes.realWin('CustomElement', {amp: true}, (env) => {
container.appendChild(element);
const resource = element.getResource_();

await element.buildInternal();
await resource.build();
await resource.whenBuilt();
resource.measure();
resource.layoutScheduled(Date.now());
const layoutCallbackStub = env.sandbox.stub(
Expand Down Expand Up @@ -1678,7 +1682,10 @@ describes.realWin('CustomElement', {amp: true}, (env) => {
const element = new ElementClass();
element.setAttribute('layout', 'nodisplay');
container.appendChild(element);
await element.buildInternal();
const resource = element.getResource_();

await resource.build();
await resource.whenBuilt();

resourcesMock.expects('scheduleLayoutOrPreload').never();

Expand All @@ -1690,7 +1697,9 @@ describes.realWin('CustomElement', {amp: true}, (env) => {
element.setAttribute('layout', 'nodisplay');
container.appendChild(element);
const resource = element.getResource_();
await element.buildInternal();

await resource.build();
await resource.whenBuilt();

const measureSpy = env.sandbox.spy(resource, 'measure');
resourcesMock.expects('scheduleLayoutOrPreload').never();
Expand Down

0 comments on commit abcf9a4

Please sign in to comment.