blob: 34c10bf8f12245b4fc9485d70330e7634e2bd6ce [file] [log] [blame]
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'chrome://resources/cr_elements/cr_dialog/cr_dialog.m.js';
import 'chrome://resources/cr_elements/cr_grid/cr_grid.js';
import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.m.js';
import 'chrome://resources/cr_elements/cr_splitter/cr_splitter.js';
import 'chrome://resources/cr_elements/icons.m.js';
import 'chrome://resources/polymer/v3_0/iron-pages/iron-pages.js';
import {CrGridElement} from 'chrome://resources/cr_elements/cr_grid/cr_grid.js';
import {CrSplitterElement} from 'chrome://resources/cr_elements/cr_splitter/cr_splitter.js';
import {assert} from 'chrome://resources/js/assert.m.js';
import {helloWorld} from 'chrome://resources/js/hello_world.js';
import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
import {getDeepActiveElement} from 'chrome://resources/js/util.m.js';
import {afterNextRender, html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
export class TsAppElement extends PolymerElement {
static get is() {
return 'ts-app';
}
static get template() {
return html`
<div>[[message]]</div>
<iron-pages attr-for-selected="id" selected="page0">
<div id="page0">Page0</div>
<div id="page1">Page1</div>
</iron-pages>
<cr-icon-button iron-icon="cr:clear"></cr-icon-button>
<cr-dialog show-on-attach>
<div slot="title">inner dialog title</div>
<div slot="body">body</div>
</cr-dialog>
`;
}
static get properties() {
return {
message: String,
};
}
private message: string;
constructor() {
super();
// Try helloWorld().
this.message = helloWorld() + ' from TypeScript!';
// <if expr="chromeos">
this.message = helloWorld() + ' from CrOS TypeScript!';
// </if>
// Try assert, getDeepActiveElement.
assert(getDeepActiveElement() === document.body);
// Try PromiseResolver with a string.
const stringResolver = new PromiseResolver<string>();
stringResolver.promise.then((result: string) => {
assert(result.includes('done'));
});
stringResolver.resolve('done');
// Try PromiseResolver with a number.
const numberResolver = new PromiseResolver<number>();
numberResolver.promise.then((result: number) => {
assert(Math.min(result, 0) === 0);
});
numberResolver.resolve(5);
}
ready() {
super.ready();
console.log(this.message);
console.log(afterNextRender);
}
connectedCallback() {
super.connectedCallback();
// Try a third_party/polymer dependency. Ensure that TypeScript infers
// correctly the type from createElement/querySelector without explicitly
// declaring IronPagesElement as the type.
const ironPages = this.shadowRoot!.querySelector('iron-pages');
console.log(ironPages!.selected);
// Try cr_elements/ Polymer dependencies, that use legacy Polymer syntax.
const iconButton = this.shadowRoot!.querySelector('cr-icon-button');
console.log(iconButton!.ironIcon);
const dialog = this.shadowRoot!.querySelector('cr-dialog');
console.log(dialog!.showOnAttach);
// Try cr_elements/ Polymer dependencies, that use class-based syntax.
const grid = document.createElement('cr-grid') as CrGridElement;
console.log(grid.columns);
this.shadowRoot!.appendChild(grid);
const splitter = document.createElement('cr-splitter') as CrSplitterElement;
console.log(splitter.resizeNextElement);
this.shadowRoot!.appendChild(splitter);
}
disconnectedCallback() {
super.disconnectedCallback();
}
}
customElements.define(TsAppElement.is, TsAppElement);