Commit fc9df5d5 authored by Dave Schuyler's avatar Dave Schuyler Committed by Commit Bot

[MD extensions] cr-lazy-render on pages so they are attached on demand

This CL wraps the MD extensions pages (details view, error
page, and shortcuts page) in cr-lazy-render to accelerate the initial page load.
The item list is not lazily rendered because it's the main page.

Bug: 770392
Cq-Include-Trybots: master.tryserver.chromium.linux:closure_compilation
Change-Id: I5cc1d58f42c7bf56463d222a9a2dda7e0aa494ce
Reviewed-on: https://chromium-review.googlesource.com/731884
Commit-Queue: Dave Schuyler <dschuyler@chromium.org>
Reviewed-by: default avatarDemetrios Papadopoulos <dpapad@chromium.org>
Cr-Commit-Position: refs/heads/master@{#512725}
parent d0aa2f4f
<link rel="import" href="chrome://resources/html/polymer.html"> <link rel="import" href="chrome://resources/html/polymer.html">
<link rel="import" href="chrome://resources/cr_elements/cr_drawer/cr_drawer.html"> <link rel="import" href="chrome://resources/cr_elements/cr_drawer/cr_drawer.html">
<link rel="import" href="chrome://resources/cr_elements/cr_lazy_render/cr_lazy_render.html">
<link rel="import" href="chrome://resources/cr_elements/cr_toolbar/cr_toolbar.html"> <link rel="import" href="chrome://resources/cr_elements/cr_toolbar/cr_toolbar.html">
<link rel="import" href="chrome://resources/cr_elements/hidden_style_css.html"> <link rel="import" href="chrome://resources/cr_elements/hidden_style_css.html">
<link rel="import" href="chrome://resources/html/assert.html"> <link rel="import" href="chrome://resources/html/assert.html">
...@@ -79,16 +80,21 @@ ...@@ -79,16 +80,21 @@
filter="[[filter]]" hidden$="[[!didInitPage_]]" slot="view" filter="[[filter]]" hidden$="[[!didInitPage_]]" slot="view"
apps="[[apps]]" extensions="[[extensions]]"> apps="[[apps]]" extensions="[[extensions]]">
</extensions-item-list> </extensions-item-list>
<extensions-detail-view id="details-view" delegate="[[delegate]]" <template id="details-view" is="cr-lazy-render">
in-dev-mode="[[inDevMode]]" data="[[detailViewItem_]]" <extensions-detail-view delegate="[[delegate]]" slot="view"
slot="view"> in-dev-mode="[[inDevMode]]" data="[[detailViewItem_]]">
</extensions-detail-view> </extensions-detail-view>
<extensions-keyboard-shortcuts delegate="[[delegate]]" </template>
id="keyboard-shortcuts" items="[[extensions]]" slot="view"> <template id="keyboard-shortcuts" is="cr-lazy-render">
<extensions-keyboard-shortcuts delegate="[[delegate]]" slot="view"
items="[[extensions]]">
</extensions-keyboard-shortcuts> </extensions-keyboard-shortcuts>
<extensions-error-page id="error-page" </template>
data="[[errorPageItem_]]" delegate="[[delegate]]" slot="view"> <template id="error-page" is="cr-lazy-render">
<extensions-error-page data="[[errorPageItem_]]" slot="view"
delegate="[[delegate]]" slot="view">
</extensions-error-page> </extensions-error-page>
</template>
</extensions-view-manager> </extensions-view-manager>
<template is="dom-if" if="[[showOptionsDialog_]]" restamp> <template is="dom-if" if="[[showOptionsDialog_]]" restamp>
<extensions-options-dialog id="options-dialog" <extensions-options-dialog id="options-dialog"
......
...@@ -71,19 +71,22 @@ cr.define('extensions', function() { ...@@ -71,19 +71,22 @@ cr.define('extensions', function() {
}, },
/** /**
* @param {!Element} element * @param {!Element} view
* @param {!string} animation * @param {string} animation
* @return {!Promise} * @return {!Promise}
* @private * @private
*/ */
enter_: function(element, animation) { enter_: function(view, animation) {
const animationFunction = extensions.viewAnimations.get(animation); const animationFunction = extensions.viewAnimations.get(animation);
assert(animationFunction); assert(animationFunction);
element.classList.add('active'); let effectiveView =
element.dispatchEvent(new CustomEvent('view-enter-start')); view.matches('[is=cr-lazy-render]') ? view.get() : view;
return animationFunction(element).then(function() {
element.dispatchEvent(new CustomEvent('view-enter-finish')); effectiveView.classList.add('active');
effectiveView.dispatchEvent(new CustomEvent('view-enter-start'));
return animationFunction(effectiveView).then(() => {
effectiveView.dispatchEvent(new CustomEvent('view-enter-finish'));
}); });
}, },
......
...@@ -22,8 +22,9 @@ cr.define('extension_manager_tests', function() { ...@@ -22,8 +22,9 @@ cr.define('extension_manager_tests', function() {
/** @type {extensions.Manager} */ /** @type {extensions.Manager} */
var manager; var manager;
function isActiveView(viewId) { /** @param {string} viewElement */
expectEquals(viewId, manager.$.viewManager.querySelector('.active').id); function assertViewActive(tagName) {
expectTrue(!!manager.$.viewManager.querySelector(`${tagName}.active`));
} }
setup(function() { setup(function() {
...@@ -122,34 +123,34 @@ cr.define('extension_manager_tests', function() { ...@@ -122,34 +123,34 @@ cr.define('extension_manager_tests', function() {
// We start on the item list. // We start on the item list.
MockInteractions.tap(manager.$$('#sidebar').$['sections-extensions']); MockInteractions.tap(manager.$$('#sidebar').$['sections-extensions']);
Polymer.dom.flush(); Polymer.dom.flush();
isActiveView(Page.LIST); assertViewActive('extensions-item-list');
// Switch: item list -> keyboard shortcuts. // Switch: item list -> keyboard shortcuts.
MockInteractions.tap(manager.$$('#sidebar').$['sections-shortcuts']); MockInteractions.tap(manager.$$('#sidebar').$['sections-shortcuts']);
Polymer.dom.flush(); Polymer.dom.flush();
isActiveView(Page.SHORTCUTS); assertViewActive('extensions-keyboard-shortcuts');
// Switch: item list -> detail view. // Switch: item list -> detail view.
var item = manager.$['items-list'].$$('extensions-item'); var item = manager.$['items-list'].$$('extensions-item');
assert(item); assert(item);
item.onDetailsTap_(); item.onDetailsTap_();
Polymer.dom.flush(); Polymer.dom.flush();
isActiveView(Page.DETAILS); assertViewActive('extensions-detail-view');
// Switch: detail view -> keyboard shortcuts. // Switch: detail view -> keyboard shortcuts.
MockInteractions.tap(manager.$$('#sidebar').$['sections-shortcuts']); MockInteractions.tap(manager.$$('#sidebar').$['sections-shortcuts']);
Polymer.dom.flush(); Polymer.dom.flush();
isActiveView(Page.SHORTCUTS); assertViewActive('extensions-keyboard-shortcuts');
// We get back on the item list. // We get back on the item list.
MockInteractions.tap(manager.$$('#sidebar').$['sections-extensions']); MockInteractions.tap(manager.$$('#sidebar').$['sections-extensions']);
Polymer.dom.flush(); Polymer.dom.flush();
isActiveView(Page.LIST); assertViewActive('extensions-item-list');
}); });
test(assert(TestNames.UrlNavigationToDetails), function() { test(assert(TestNames.UrlNavigationToDetails), function() {
isActiveView(Page.DETAILS); assertViewActive('extensions-detail-view');
var detailsView = manager.$['details-view']; var detailsView = manager.$$('extensions-detail-view');
expectEquals('ldnnhddmnhbkjipkidpdiheffobcpfmf', detailsView.data.id); expectEquals('ldnnhddmnhbkjipkidpdiheffobcpfmf', detailsView.data.id);
}); });
...@@ -165,11 +166,13 @@ cr.define('extension_manager_tests', function() { ...@@ -165,11 +166,13 @@ cr.define('extension_manager_tests', function() {
manager.addItem(extension); manager.addItem(extension);
manager.addItem(secondExtension); manager.addItem(secondExtension);
var data = manager.extensions[0]; var data = manager.extensions[0];
// The detail view is not present until navigation.
expectFalse(!!manager.$$('extensions-detail-view'));
// TODO(scottchen): maybe testing too many things in a single unit test. // TODO(scottchen): maybe testing too many things in a single unit test.
extensions.navigation.navigateTo( extensions.navigation.navigateTo(
{page: Page.DETAILS, extensionId: extension.id}); {page: Page.DETAILS, extensionId: extension.id});
Polymer.dom.flush(); var detailsView = manager.$$('extensions-detail-view');
var detailsView = manager.$['details-view']; expectTrue(!!detailsView); // View should now be present.
expectEquals(extension.id, detailsView.data.id); expectEquals(extension.id, detailsView.data.id);
expectEquals(oldDescription, detailsView.data.description); expectEquals(oldDescription, detailsView.data.description);
expectEquals( expectEquals(
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment