Fix a bug ComponentBase that wrong content template may be used.
authordewei_zhu@apple.com <dewei_zhu@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 28 Jun 2018 22:14:39 +0000 (22:14 +0000)
committerdewei_zhu@apple.com <dewei_zhu@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 28 Jun 2018 22:14:39 +0000 (22:14 +0000)
https://bugs.webkit.org/show_bug.cgi?id=187159

Reviewed by Ryosuke Niwa.

ComponentBase uses '_parsed' to mark whether content and style templates of a class
is parsed. However, derived class parsing will be skipped as 'Derive._parsed' is available
via prototype chain whenever the base class is parsed.

* browser-tests/component-base-tests.js: Added unit tests.
* public/v3/components/base.js: Added 'hasOwnProperty' to make sure current class is parsed.
(ComponentBase.prototype._ensureShadowTree):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@233333 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Websites/perf.webkit.org/ChangeLog
Websites/perf.webkit.org/browser-tests/component-base-tests.js
Websites/perf.webkit.org/public/v3/components/base.js

index 9f7feb0..aa4dde1 100644 (file)
@@ -1,3 +1,18 @@
+2018-06-28  Dewei Zhu  <dewei_zhu@apple.com>
+
+        Fix a bug ComponentBase that wrong content template may be used.
+        https://bugs.webkit.org/show_bug.cgi?id=187159
+
+        Reviewed by Ryosuke Niwa.
+
+        ComponentBase uses '_parsed' to mark whether content and style templates of a class
+        is parsed. However, derived class parsing will be skipped as 'Derive._parsed' is available
+        via prototype chain whenever the base class is parsed.
+
+        * browser-tests/component-base-tests.js: Added unit tests.
+        * public/v3/components/base.js: Added 'hasOwnProperty' to make sure current class is parsed.
+        (ComponentBase.prototype._ensureShadowTree):
+
 2018-06-25  Dewei Zhu  <dewei_zhu@apple.com>
 
         MeasurementSetAnalyzer should check triggerable availability before creating confirming A/B tests.
index adef69f..4418f81 100644 (file)
@@ -195,6 +195,27 @@ describe('ComponentBase', function() {
             expect(container.textContent).to.be('hello, world');
         });
 
+        it('it must create content using derived class content template', async () => {
+            const context = new BrowsingContext();
+            const ComponentBase = await importComponentBase(context);
+
+            class BaseClass extends ComponentBase { };
+            BaseClass.contentTemplate = ['div', {id: 'container'}, 'base-class'];
+            const baseInstance = new BaseClass('base-class');
+
+            class DerivedClass extends BaseClass {};
+            DerivedClass.contentTemplate = ['div', {id: 'container'}, 'derived-class'];
+            const derivedInstance = new DerivedClass('derived-class');
+
+            const baseContainer = baseInstance.content('container');
+            expect(baseContainer).to.be.a(context.global.HTMLDivElement);
+            expect(baseContainer.textContent).to.be('base-class');
+
+            const derivedContainer = derivedInstance.content('container');
+            expect(derivedContainer).to.be.a(context.global.HTMLDivElement);
+            expect(derivedContainer.textContent).to.be('derived-class');
+        });
+
         it('it must create stylsheet from styleTemplate', async () => {
             const context = new BrowsingContext();
             const ComponentBase = await importComponentBase(context);
@@ -699,4 +720,28 @@ describe('ComponentBase', function() {
 
     });
 
+    describe('_ensureShadowTree', () => {
+        it('should parse derived component after parsing base component', async () => {
+            const context = new BrowsingContext();
+            const ComponentBase = await importComponentBase(context);
+            class DerivedComponent extends ComponentBase {};
+            const baseInstance = new ComponentBase;
+            expect(ComponentBase.hasOwnProperty('_parsed')).to.be(false);
+            expect(DerivedComponent.hasOwnProperty('_parsed')).to.be(false);
+
+            baseInstance._ensureShadowTree();
+            expect(ComponentBase.hasOwnProperty('_parsed')).to.be(true);
+            expect(DerivedComponent.hasOwnProperty('_parsed')).to.be(false);
+            expect(!!ComponentBase._parsed).to.be(true);
+            expect(!!DerivedComponent._parsed).to.be(true);
+
+            const derivedInstance = new DerivedComponent;
+            derivedInstance._ensureShadowTree();
+            expect(ComponentBase.hasOwnProperty('_parsed')).to.be(true);
+            expect(DerivedComponent.hasOwnProperty('_parsed')).to.be(true);
+            expect(!!ComponentBase._parsed).to.be(true);
+            expect(!!DerivedComponent._parsed).to.be(true);
+        });
+    });
+
 });
index 42ed8fe..f3a5e65 100644 (file)
@@ -154,7 +154,7 @@ class ComponentBase extends CommonComponentBase {
 
         let content;
         let stylesheet;
-        if (!thisClass._parsed) {
+        if (!thisClass.hasOwnProperty('_parsed') || !thisClass._parsed) {
             thisClass._parsed = true;
 
             const contentTemplate = thisClass['contentTemplate'];