Commit a16e3409 authored by rbpotter's avatar rbpotter Committed by Commit Bot

Web UI Polymer 3: Port cr-radio-group and event_tracker

- Autogenerate Polymer 3 version of cr-radio-group
- Add to the Polymer 3 demo page
- Add an autogenerated JS module version of event tracker, since this is
used by cr-radio-group
- Autogenerate cr-radio-group v3 automated test.

Bug: 965770
Change-Id: I41034878bb76a769da0c10b37fcf8a698a8f421d
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1775582
Commit-Queue: Rebekah Potter <rbpotter@chromium.org>
Reviewed-by: default avatarEsmael Elmoslimany <aee@chromium.org>
Cr-Commit-Position: refs/heads/master@{#692153}
parent 4e1755e4
...@@ -7,6 +7,7 @@ import 'chrome://resources/cr_elements/cr_checkbox/cr_checkbox.m.js'; ...@@ -7,6 +7,7 @@ import 'chrome://resources/cr_elements/cr_checkbox/cr_checkbox.m.js';
import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.m.js'; import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.m.js';
import 'chrome://resources/cr_elements/cr_input/cr_input.m.js'; import 'chrome://resources/cr_elements/cr_input/cr_input.m.js';
import 'chrome://resources/cr_elements/cr_radio_button/cr_radio_button.m.js'; import 'chrome://resources/cr_elements/cr_radio_button/cr_radio_button.m.js';
import 'chrome://resources/cr_elements/cr_radio_group/cr_radio_group.m.js';
import 'chrome://resources/cr_elements/cr_toast/cr_toast.m.js'; import 'chrome://resources/cr_elements/cr_toast/cr_toast.m.js';
import 'chrome://resources/cr_elements/cr_toggle/cr_toggle.m.js'; import 'chrome://resources/cr_elements/cr_toggle/cr_toggle.m.js';
import 'chrome://resources/cr_elements/icons.m.js'; import 'chrome://resources/cr_elements/icons.m.js';
...@@ -51,8 +52,13 @@ class HelloPolymer3Element extends PolymerElement { ...@@ -51,8 +52,13 @@ class HelloPolymer3Element extends PolymerElement {
<iron-icon icon="cr:error"></iron-icon> <iron-icon icon="cr:error"></iron-icon>
<cr-radio-button>one</cr-radio-button> <div>
<cr-radio-button>two</cr-radio-button> <cr-radio-group id="radioGroup" selected="cr">
<cr-radio-button name="cr">cr</cr-radio-button>
<cr-radio-button name="radio">radio</cr-radio-button>
<cr-radio-button name="buttons">buttons</cr-radio-button>
</cr-radio-group>
</div>
`; `;
} }
......
...@@ -162,6 +162,7 @@ js2gtest("browser_tests_js_webui") { ...@@ -162,6 +162,7 @@ js2gtest("browser_tests_js_webui") {
"$root_gen_dir/chrome/test/data/webui/cr_elements/cr_button_tests.m.js", "$root_gen_dir/chrome/test/data/webui/cr_elements/cr_button_tests.m.js",
"$root_gen_dir/chrome/test/data/webui/cr_elements/cr_icon_button_tests.m.js", "$root_gen_dir/chrome/test/data/webui/cr_elements/cr_icon_button_tests.m.js",
"$root_gen_dir/chrome/test/data/webui/cr_elements/cr_radio_button_test.m.js", "$root_gen_dir/chrome/test/data/webui/cr_elements/cr_radio_button_test.m.js",
"$root_gen_dir/chrome/test/data/webui/cr_elements/cr_radio_group_test.m.js",
"$root_gen_dir/chrome/test/data/webui/cr_elements/cr_toast_test.m.js", "$root_gen_dir/chrome/test/data/webui/cr_elements/cr_toast_test.m.js",
"$root_gen_dir/chrome/test/data/webui/cr_elements/cr_view_manager_test.m.js", "$root_gen_dir/chrome/test/data/webui/cr_elements/cr_view_manager_test.m.js",
"$root_gen_dir/chrome/test/data/webui/mock_timer.m.js", "$root_gen_dir/chrome/test/data/webui/mock_timer.m.js",
......
...@@ -12,6 +12,7 @@ js_modulizer("modulize") { ...@@ -12,6 +12,7 @@ js_modulizer("modulize") {
"cr_icon_button_focus_tests.js", "cr_icon_button_focus_tests.js",
"cr_input_test.js", "cr_input_test.js",
"cr_radio_button_test.js", "cr_radio_button_test.js",
"cr_radio_group_test.js",
"cr_toast_test.js", "cr_toast_test.js",
"cr_toggle_test.js", "cr_toggle_test.js",
"cr_view_manager_test.js", "cr_view_manager_test.js",
...@@ -24,6 +25,7 @@ js_modulizer("modulize") { ...@@ -24,6 +25,7 @@ js_modulizer("modulize") {
"MockInteractions.pressAndReleaseKeyOn|pressAndReleaseKeyOn", "MockInteractions.pressAndReleaseKeyOn|pressAndReleaseKeyOn",
"MockInteractions.tap|tap", "MockInteractions.tap|tap",
"Polymer.dom.flush|flush", "Polymer.dom.flush|flush",
"PolymerTest.importHtml|importHtml",
"test_util.eventToPromise|eventToPromise", "test_util.eventToPromise|eventToPromise",
"test_util.flushTasks|flushTasks", "test_util.flushTasks|flushTasks",
"test_util.isVisible|isVisible", "test_util.isVisible|isVisible",
......
...@@ -77,6 +77,18 @@ TEST_F('CrElementsRadioButtonV3Test', 'All', function() { ...@@ -77,6 +77,18 @@ TEST_F('CrElementsRadioButtonV3Test', 'All', function() {
mocha.run(); mocha.run();
}); });
// eslint-disable-next-line no-var
var CrElementsRadioGroupV3Test = class extends CrElementsV3BrowserTest {
/** @override */
get browsePreload() {
return 'chrome://test?module=cr_elements/cr_radio_group_test.m.js';
}
};
TEST_F('CrElementsRadioGroupV3Test', 'All', function() {
mocha.run();
});
// eslint-disable-next-line no-var // eslint-disable-next-line no-var
var CrElementsToastV3Test = class extends CrElementsV3BrowserTest { var CrElementsToastV3Test = class extends CrElementsV3BrowserTest {
/** @override */ /** @override */
......
...@@ -2,6 +2,15 @@ ...@@ -2,6 +2,15 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
// clang-format off
// #import 'chrome://resources/cr_elements/cr_radio_group/cr_radio_group.m.js';
// #import 'chrome://resources/cr_elements/cr_radio_button/cr_radio_button.m.js';
//
// #import {eventToPromise, importHtml} from 'chrome://test/test_util.m.js';
// #import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
// #import {pressAndReleaseKeyOn} from 'chrome://resources/polymer/v3_0/iron-test-helpers/mock-interactions.js';
// clang-format on
suite('cr-radio-group', () => { suite('cr-radio-group', () => {
let radioGroup; let radioGroup;
......
...@@ -127,12 +127,22 @@ cr.define('test_util', function() { ...@@ -127,12 +127,22 @@ cr.define('test_util', function() {
return !!rect && rect.width * rect.height > 0; return !!rect && rect.width * rect.height > 0;
} }
/**
* Dummy importHtml() for Polymer 3 tests, that does nothing since Polymer 3
* doesn't use HTML imports. To use, import from test_util.m.js and set
* PolymerTest.importHtml|importHtml in namespace_rewrites.
* @return {!Promise}
*/
/* #export */ function importHtml() {
return Promise.resolve();
}
// #cr_define_end // #cr_define_end
return { return {
eventToPromise: eventToPromise, eventToPromise: eventToPromise,
fakeDataBind: fakeDataBind, fakeDataBind: fakeDataBind,
flushTasks: flushTasks, flushTasks: flushTasks,
importHtml: importHtml,
isVisible: isVisible, isVisible: isVisible,
waitAfterNextRender: waitAfterNextRender, waitAfterNextRender: waitAfterNextRender,
waitBeforeNextRender: waitBeforeNextRender, waitBeforeNextRender: waitBeforeNextRender,
......
...@@ -34,6 +34,7 @@ group("closure_compile") { ...@@ -34,6 +34,7 @@ group("closure_compile") {
"cr_icon_button:closure_compile_module", "cr_icon_button:closure_compile_module",
"cr_input:closure_compile_module", "cr_input:closure_compile_module",
"cr_radio_button:closure_compile_module", "cr_radio_button:closure_compile_module",
"cr_radio_group:closure_compile_module",
"cr_toast:closure_compile_module", "cr_toast:closure_compile_module",
"cr_toggle:closure_compile_module", "cr_toggle:closure_compile_module",
"cr_view_manager:closure_compile_module", "cr_view_manager:closure_compile_module",
...@@ -123,6 +124,7 @@ group("polymer3_elements") { ...@@ -123,6 +124,7 @@ group("polymer3_elements") {
"cr_radio_button:cr_radio_button_module", "cr_radio_button:cr_radio_button_module",
"cr_radio_button:cr_radio_button_style_css_module", "cr_radio_button:cr_radio_button_style_css_module",
"cr_radio_button:modulize", "cr_radio_button:modulize",
"cr_radio_group:cr_radio_group_module",
"cr_toast:cr_toast_module", "cr_toast:cr_toast_module",
"cr_toggle:cr_toggle_module", "cr_toggle:cr_toggle_module",
"cr_view_manager:cr_view_manager_module", "cr_view_manager:cr_view_manager_module",
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
# found in the LICENSE file. # found in the LICENSE file.
import("//third_party/closure_compiler/compile_js.gni") import("//third_party/closure_compiler/compile_js.gni")
import("//tools/polymer/polymer.gni")
js_type_check("closure_compile") { js_type_check("closure_compile") {
deps = [ deps = [
...@@ -15,3 +16,34 @@ js_library("cr_radio_group") { ...@@ -15,3 +16,34 @@ js_library("cr_radio_group") {
"//ui/webui/resources/js:event_tracker", "//ui/webui/resources/js:event_tracker",
] ]
} }
# Targets for auto-generating and typechecking Polymer 3 JS modules
polymer_modulizer("cr_radio_group") {
js_file = "cr_radio_group.js"
html_file = "cr_radio_group.html"
html_type = "dom-module"
auto_imports = [
"ui/webui/resources/html/event_tracker.html|EventTracker",
"ui/webui/resources/html/polymer.html|Polymer,html,dom",
]
namespace_rewrites = [ "Polymer.dom|dom" ]
}
js_type_check("closure_compile_module") {
is_polymer3 = true
deps = [
":cr_radio_group.m",
]
}
js_library("cr_radio_group.m") {
sources = [
"$root_gen_dir/ui/webui/resources/cr_elements/cr_radio_group/cr_radio_group.m.js",
]
deps = [
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:event_tracker.m",
]
extra_deps = [ ":cr_radio_group_module" ]
}
...@@ -46,6 +46,11 @@ ...@@ -46,6 +46,11 @@
use_base_dir="false" use_base_dir="false"
type="BINDATA" type="BINDATA"
compress="gzip" /> compress="gzip" />
<include name="IDR_CR_ELEMENTS_CR_RADIO_GROUP_M_JS"
file="${root_gen_dir}/ui/webui/resources/cr_elements/cr_radio_group/cr_radio_group.m.js"
use_base_dir="false"
type="BINDATA"
compress="gzip" />
<include name="IDR_CR_ELEMENTS_CR_SHARED_STYLE_CSS_M_JS" <include name="IDR_CR_ELEMENTS_CR_SHARED_STYLE_CSS_M_JS"
file="${root_gen_dir}/ui/webui/resources/cr_elements/shared_style_css.m.js" file="${root_gen_dir}/ui/webui/resources/cr_elements/shared_style_css.m.js"
use_base_dir="false" use_base_dir="false"
......
...@@ -141,6 +141,7 @@ js_library("find_shortcut_behavior") { ...@@ -141,6 +141,7 @@ js_library("find_shortcut_behavior") {
js_modulizer("modulize") { js_modulizer("modulize") {
input_files = [ input_files = [
"assert.js", "assert.js",
"event_tracker.js",
"icon.js", "icon.js",
"i18n_behavior.js", "i18n_behavior.js",
"load_time_data.js", "load_time_data.js",
...@@ -158,6 +159,7 @@ js_type_check("closure_compile_modules") { ...@@ -158,6 +159,7 @@ js_type_check("closure_compile_modules") {
deps = [ deps = [
":assert.m", ":assert.m",
":cr.m", ":cr.m",
":event_tracker.m",
":i18n_behavior.m", ":i18n_behavior.m",
":icon.m", ":icon.m",
":load_time_data.m", ":load_time_data.m",
...@@ -182,6 +184,13 @@ js_library("cr.m") { ...@@ -182,6 +184,13 @@ js_library("cr.m") {
externs_list = [ "$externs_path/chrome_send.js" ] externs_list = [ "$externs_path/chrome_send.js" ]
} }
js_library("event_tracker.m") {
sources = [
"$root_gen_dir/ui/webui/resources/js/event_tracker.m.js",
]
extra_deps = [ ":modulize" ]
}
js_library("icon.m") { js_library("icon.m") {
sources = [ sources = [
"$root_gen_dir/ui/webui/resources/js/icon.m.js", "$root_gen_dir/ui/webui/resources/js/icon.m.js",
......
...@@ -11,31 +11,22 @@ ...@@ -11,31 +11,22 @@
* calling Function.bind. * calling Function.bind.
*/ */
/** // eslint-disable-next-line no-var
* Create an EventTracker to track a set of events. /* #export */ var EventTracker = class {
* EventTracker instances are typically tied 1:1 with other objects or
* DOM elements whose listeners should be removed when the object is disposed
* or the corresponding elements are removed from the DOM.
* @constructor
*/
function EventTracker() {
/** /**
* @type {Array<EventTracker.Entry>} * Create an EventTracker to track a set of events.
* @private * EventTracker instances are typically tied 1:1 with other objects or
* DOM elements whose listeners should be removed when the object is disposed
* or the corresponding elements are removed from the DOM.
*/ */
this.listeners_ = []; constructor() {
} /**
* @type {Array<EventTracker.Entry>}
/** * @private
* The type of the internal tracking entry. */
* @typedef {{target: !EventTarget, this.listeners_ = [];
* eventType: string, }
* listener: (EventListener|Function),
* capture: boolean}}
*/
EventTracker.Entry;
EventTracker.prototype = {
/** /**
* Add an event listener - replacement for EventTarget.addEventListener. * Add an event listener - replacement for EventTarget.addEventListener.
* @param {!EventTarget} target The DOM target to add a listener to. * @param {!EventTarget} target The DOM target to add a listener to.
...@@ -43,7 +34,7 @@ EventTracker.prototype = { ...@@ -43,7 +34,7 @@ EventTracker.prototype = {
* @param {EventListener|Function} listener The listener to add. * @param {EventListener|Function} listener The listener to add.
* @param {boolean=} opt_capture Whether to invoke during the capture phase. * @param {boolean=} opt_capture Whether to invoke during the capture phase.
*/ */
add: function(target, eventType, listener, opt_capture) { add(target, eventType, listener, opt_capture) {
const capture = !!opt_capture; const capture = !!opt_capture;
const h = { const h = {
target: target, target: target,
...@@ -53,38 +44,48 @@ EventTracker.prototype = { ...@@ -53,38 +44,48 @@ EventTracker.prototype = {
}; };
this.listeners_.push(h); this.listeners_.push(h);
target.addEventListener(eventType, listener, capture); target.addEventListener(eventType, listener, capture);
}, }
/** /**
* Remove any specified event listeners added with this EventTracker. * Remove any specified event listeners added with this EventTracker.
* @param {!EventTarget} target The DOM target to remove a listener from. * @param {!EventTarget} target The DOM target to remove a listener from.
* @param {?string} eventType The type of event to remove. * @param {?string} eventType The type of event to remove.
*/ */
remove: function(target, eventType) { remove(target, eventType) {
this.listeners_ = this.listeners_.filter(function(h) { this.listeners_ = this.listeners_.filter(listener => {
if (h.target == target && (!eventType || (h.eventType == eventType))) { if (listener.target == target &&
EventTracker.removeEventListener_(h); (!eventType || (listener.eventType == eventType))) {
EventTracker.removeEventListener(listener);
return false; return false;
} }
return true; return true;
}); });
}, }
/** Remove all event listeners added with this EventTracker. */
removeAll() {
this.listeners_.forEach(
listener => EventTracker.removeEventListener(listener));
this.listeners_ = [];
}
/** /**
* Remove all event listeners added with this EventTracker. * Remove a single event listener given it's tracking entry. It's up to the
* caller to ensure the entry is removed from listeners_.
* @param {EventTracker.Entry} entry The entry describing the listener to
* remove.
*/ */
removeAll: function() { static removeEventListener(entry) {
this.listeners_.forEach(EventTracker.removeEventListener_); entry.target.removeEventListener(
this.listeners_ = []; entry.eventType, entry.listener, entry.capture);
} }
}; };
/** /**
* Remove a single event listener given it's tracking entry. It's up to the * The type of the internal tracking entry.
* caller to ensure the entry is removed from listeners_. * @typedef {{target: !EventTarget,
* @param {EventTracker.Entry} h The entry describing the listener to remove. * eventType: string,
* @private * listener: (EventListener|Function),
* capture: boolean}}
*/ */
EventTracker.removeEventListener_ = function(h) { EventTracker.Entry;
h.target.removeEventListener(h.eventType, h.listener, h.capture);
};
...@@ -89,6 +89,9 @@ without changes to the corresponding grd file. --> ...@@ -89,6 +89,9 @@ without changes to the corresponding grd file. -->
<include name="IDR_WEBUI_JS_CR_UI_FOCUS_OUTLINE_MANAGER_M_JS" <include name="IDR_WEBUI_JS_CR_UI_FOCUS_OUTLINE_MANAGER_M_JS"
file="${root_gen_dir}/ui/webui/resources/js/cr/ui/focus_outline_manager.m.js" file="${root_gen_dir}/ui/webui/resources/js/cr/ui/focus_outline_manager.m.js"
use_base_dir="false" type="BINDATA" compress="gzip" /> use_base_dir="false" type="BINDATA" compress="gzip" />
<include name="IDR_WEBUI_JS_EVENT_TRACKER_M_JS"
file="${root_gen_dir}/ui/webui/resources/js/event_tracker.m.js"
use_base_dir="false" type="BINDATA" compress="gzip" />
<include name="IDR_WEBUI_JS_ICON_M_JS" <include name="IDR_WEBUI_JS_ICON_M_JS"
file="${root_gen_dir}/ui/webui/resources/js/icon.m.js" file="${root_gen_dir}/ui/webui/resources/js/icon.m.js"
use_base_dir="false" type="BINDATA" compress="gzip" /> use_base_dir="false" type="BINDATA" compress="gzip" />
......
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