| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2011 Google Inc. All rights reserved. | 2 * Copyright (C) 2011 Google Inc. All rights reserved. |
| 3 * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved. | 3 * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved. |
| 4 * Copyright (C) 2007 Matt Lilek (pewtermoose@gmail.com). | 4 * Copyright (C) 2007 Matt Lilek (pewtermoose@gmail.com). |
| 5 * Copyright (C) 2009 Joseph Pecoraro | 5 * Copyright (C) 2009 Joseph Pecoraro |
| 6 * | 6 * |
| 7 * Redistribution and use in source and binary forms, with or without | 7 * Redistribution and use in source and binary forms, with or without |
| 8 * modification, are permitted provided that the following conditions | 8 * modification, are permitted provided that the following conditions |
| 9 * are met: | 9 * are met: |
| 10 * | 10 * |
| (...skipping 1212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1223 }; | 1223 }; |
| 1224 | 1224 |
| 1225 /** | 1225 /** |
| 1226 * @param {string} localName | 1226 * @param {string} localName |
| 1227 * @param {string} typeExtension | 1227 * @param {string} typeExtension |
| 1228 * @param {!Object} prototype | 1228 * @param {!Object} prototype |
| 1229 * @return {function()} | 1229 * @return {function()} |
| 1230 * @suppressGlobalPropertiesCheck | 1230 * @suppressGlobalPropertiesCheck |
| 1231 * @template T | 1231 * @template T |
| 1232 */ | 1232 */ |
| 1233 function registerCustomElement(localName, typeExtension, prototype) { | 1233 UI.registerCustomElement = function(localName, typeExtension, prototype) { |
| 1234 return document.registerElement(typeExtension, {prototype: Object.create(proto
type), extends: localName}); | 1234 return document.registerElement(typeExtension, {prototype: Object.create(proto
type), extends: localName}); |
| 1235 } | 1235 }; |
| 1236 | 1236 |
| 1237 /** | 1237 /** |
| 1238 * @param {string} text | 1238 * @param {string} text |
| 1239 * @param {function(!Event)=} clickHandler | 1239 * @param {function(!Event)=} clickHandler |
| 1240 * @param {string=} className | 1240 * @param {string=} className |
| 1241 * @param {string=} title | 1241 * @param {string=} title |
| 1242 * @return {!Element} | 1242 * @return {!Element} |
| 1243 */ | 1243 */ |
| 1244 function createTextButton(text, clickHandler, className, title) { | 1244 UI.createTextButton = function(text, clickHandler, className, title) { |
| 1245 var element = createElementWithClass('button', className || '', 'text-button')
; | 1245 var element = createElementWithClass('button', className || '', 'text-button')
; |
| 1246 element.textContent = text; | 1246 element.textContent = text; |
| 1247 if (clickHandler) | 1247 if (clickHandler) |
| 1248 element.addEventListener('click', clickHandler, false); | 1248 element.addEventListener('click', clickHandler, false); |
| 1249 if (title) | 1249 if (title) |
| 1250 element.title = title; | 1250 element.title = title; |
| 1251 return element; | 1251 return element; |
| 1252 } | 1252 }; |
| 1253 | 1253 |
| 1254 /** | 1254 /** |
| 1255 * @param {string} name | 1255 * @param {string} name |
| 1256 * @param {string} title | 1256 * @param {string} title |
| 1257 * @param {boolean=} checked | 1257 * @param {boolean=} checked |
| 1258 * @return {!Element} | 1258 * @return {!Element} |
| 1259 */ | 1259 */ |
| 1260 function createRadioLabel(name, title, checked) { | 1260 UI.createRadioLabel = function(name, title, checked) { |
| 1261 var element = createElement('label', 'dt-radio'); | 1261 var element = createElement('label', 'dt-radio'); |
| 1262 element.radioElement.name = name; | 1262 element.radioElement.name = name; |
| 1263 element.radioElement.checked = !!checked; | 1263 element.radioElement.checked = !!checked; |
| 1264 element.createTextChild(title); | 1264 element.createTextChild(title); |
| 1265 return element; | 1265 return element; |
| 1266 } | 1266 }; |
| 1267 | 1267 |
| 1268 /** | 1268 /** |
| 1269 * @param {string} title | 1269 * @param {string} title |
| 1270 * @param {string} iconClass | 1270 * @param {string} iconClass |
| 1271 * @return {!Element} | 1271 * @return {!Element} |
| 1272 */ | 1272 */ |
| 1273 function createLabel(title, iconClass) { | 1273 UI.createLabel = function(title, iconClass) { |
| 1274 var element = createElement('label', 'dt-icon-label'); | 1274 var element = createElement('label', 'dt-icon-label'); |
| 1275 element.createChild('span').textContent = title; | 1275 element.createChild('span').textContent = title; |
| 1276 element.type = iconClass; | 1276 element.type = iconClass; |
| 1277 return element; | 1277 return element; |
| 1278 } | 1278 }; |
| 1279 | 1279 |
| 1280 /** | 1280 /** |
| 1281 * @param {string=} title | 1281 * @param {string=} title |
| 1282 * @param {boolean=} checked | 1282 * @param {boolean=} checked |
| 1283 * @param {string=} subtitle | 1283 * @param {string=} subtitle |
| 1284 * @return {!Element} | 1284 * @return {!Element} |
| 1285 */ | 1285 */ |
| 1286 function createCheckboxLabel(title, checked, subtitle) { | 1286 UI.createCheckboxLabel = function(title, checked, subtitle) { |
| 1287 var element = createElement('label', 'dt-checkbox'); | 1287 var element = createElement('label', 'dt-checkbox'); |
| 1288 element.checkboxElement.checked = !!checked; | 1288 element.checkboxElement.checked = !!checked; |
| 1289 if (title !== undefined) { | 1289 if (title !== undefined) { |
| 1290 element.textElement = element.createChild('div', 'dt-checkbox-text'); | 1290 element.textElement = element.createChild('div', 'dt-checkbox-text'); |
| 1291 element.textElement.textContent = title; | 1291 element.textElement.textContent = title; |
| 1292 if (subtitle !== undefined) { | 1292 if (subtitle !== undefined) { |
| 1293 element.subtitleElement = element.textElement.createChild('div', 'dt-check
box-subtitle'); | 1293 element.subtitleElement = element.textElement.createChild('div', 'dt-check
box-subtitle'); |
| 1294 element.subtitleElement.textContent = subtitle; | 1294 element.subtitleElement.textContent = subtitle; |
| 1295 } | 1295 } |
| 1296 } | 1296 } |
| 1297 return element; | 1297 return element; |
| 1298 } | 1298 }; |
| 1299 | 1299 |
| 1300 /** | 1300 /** |
| 1301 * @return {!Element} | 1301 * @return {!Element} |
| 1302 * @param {number} min | 1302 * @param {number} min |
| 1303 * @param {number} max | 1303 * @param {number} max |
| 1304 * @param {number} tabIndex | 1304 * @param {number} tabIndex |
| 1305 */ | 1305 */ |
| 1306 function createSliderLabel(min, max, tabIndex) { | 1306 UI.createSliderLabel = function(min, max, tabIndex) { |
| 1307 var element = createElement('label', 'dt-slider'); | 1307 var element = createElement('label', 'dt-slider'); |
| 1308 element.sliderElement.min = min; | 1308 element.sliderElement.min = min; |
| 1309 element.sliderElement.max = max; | 1309 element.sliderElement.max = max; |
| 1310 element.sliderElement.step = 1; | 1310 element.sliderElement.step = 1; |
| 1311 element.sliderElement.tabIndex = tabIndex; | 1311 element.sliderElement.tabIndex = tabIndex; |
| 1312 return element; | 1312 return element; |
| 1313 } | 1313 }; |
| 1314 | 1314 |
| 1315 /** | 1315 /** |
| 1316 * @param {!Node} node | 1316 * @param {!Node} node |
| 1317 * @param {string} cssFile | 1317 * @param {string} cssFile |
| 1318 * @suppressGlobalPropertiesCheck | 1318 * @suppressGlobalPropertiesCheck |
| 1319 */ | 1319 */ |
| 1320 UI.appendStyle = function(node, cssFile) { | 1320 UI.appendStyle = function(node, cssFile) { |
| 1321 var content = Runtime.cachedResources[cssFile] || ''; | 1321 var content = Runtime.cachedResources[cssFile] || ''; |
| 1322 if (!content) | 1322 if (!content) |
| 1323 console.error(cssFile + ' not preloaded. Check module.json'); | 1323 console.error(cssFile + ' not preloaded. Check module.json'); |
| 1324 var styleElement = createElement('style'); | 1324 var styleElement = createElement('style'); |
| 1325 styleElement.type = 'text/css'; | 1325 styleElement.type = 'text/css'; |
| 1326 styleElement.textContent = content; | 1326 styleElement.textContent = content; |
| 1327 node.appendChild(styleElement); | 1327 node.appendChild(styleElement); |
| 1328 | 1328 |
| 1329 var themeStyleSheet = UI.themeSupport.themeStyleSheet(cssFile, content); | 1329 var themeStyleSheet = UI.themeSupport.themeStyleSheet(cssFile, content); |
| 1330 if (themeStyleSheet) { | 1330 if (themeStyleSheet) { |
| 1331 styleElement = createElement('style'); | 1331 styleElement = createElement('style'); |
| 1332 styleElement.type = 'text/css'; | 1332 styleElement.type = 'text/css'; |
| 1333 styleElement.textContent = themeStyleSheet + '\n' + Runtime.resolveSourceURL
(cssFile + '.theme'); | 1333 styleElement.textContent = themeStyleSheet + '\n' + Runtime.resolveSourceURL
(cssFile + '.theme'); |
| 1334 node.appendChild(styleElement); | 1334 node.appendChild(styleElement); |
| 1335 } | 1335 } |
| 1336 }; | 1336 }; |
| 1337 | 1337 |
| 1338 (function() { | 1338 (function() { |
| 1339 registerCustomElement('button', 'text-button', { | 1339 UI.registerCustomElement('button', 'text-button', { |
| 1340 /** | 1340 /** |
| 1341 * @this {Element} | 1341 * @this {Element} |
| 1342 */ | 1342 */ |
| 1343 createdCallback: function() { | 1343 createdCallback: function() { |
| 1344 this.type = 'button'; | 1344 this.type = 'button'; |
| 1345 var root = UI.createShadowRootWithCoreStyles(this, 'ui/textButton.css'); | 1345 var root = UI.createShadowRootWithCoreStyles(this, 'ui/textButton.css'); |
| 1346 root.createChild('content'); | 1346 root.createChild('content'); |
| 1347 }, | 1347 }, |
| 1348 | 1348 |
| 1349 __proto__: HTMLButtonElement.prototype | 1349 __proto__: HTMLButtonElement.prototype |
| 1350 }); | 1350 }); |
| 1351 | 1351 |
| 1352 registerCustomElement('label', 'dt-radio', { | 1352 UI.registerCustomElement('label', 'dt-radio', { |
| 1353 /** | 1353 /** |
| 1354 * @this {Element} | 1354 * @this {Element} |
| 1355 */ | 1355 */ |
| 1356 createdCallback: function() { | 1356 createdCallback: function() { |
| 1357 this.radioElement = this.createChild('input', 'dt-radio-button'); | 1357 this.radioElement = this.createChild('input', 'dt-radio-button'); |
| 1358 this.radioElement.type = 'radio'; | 1358 this.radioElement.type = 'radio'; |
| 1359 var root = UI.createShadowRootWithCoreStyles(this, 'ui/radioButton.css'); | 1359 var root = UI.createShadowRootWithCoreStyles(this, 'ui/radioButton.css'); |
| 1360 root.createChild('content').select = '.dt-radio-button'; | 1360 root.createChild('content').select = '.dt-radio-button'; |
| 1361 root.createChild('content'); | 1361 root.createChild('content'); |
| 1362 this.addEventListener('click', radioClickHandler, false); | 1362 this.addEventListener('click', radioClickHandler, false); |
| 1363 }, | 1363 }, |
| 1364 | 1364 |
| 1365 __proto__: HTMLLabelElement.prototype | 1365 __proto__: HTMLLabelElement.prototype |
| 1366 }); | 1366 }); |
| 1367 | 1367 |
| 1368 /** | 1368 /** |
| 1369 * @param {!Event} event | 1369 * @param {!Event} event |
| 1370 * @suppressReceiverCheck | 1370 * @suppressReceiverCheck |
| 1371 * @this {Element} | 1371 * @this {Element} |
| 1372 */ | 1372 */ |
| 1373 function radioClickHandler(event) { | 1373 function radioClickHandler(event) { |
| 1374 if (this.radioElement.checked || this.radioElement.disabled) | 1374 if (this.radioElement.checked || this.radioElement.disabled) |
| 1375 return; | 1375 return; |
| 1376 this.radioElement.checked = true; | 1376 this.radioElement.checked = true; |
| 1377 this.radioElement.dispatchEvent(new Event('change')); | 1377 this.radioElement.dispatchEvent(new Event('change')); |
| 1378 } | 1378 } |
| 1379 | 1379 |
| 1380 registerCustomElement('label', 'dt-checkbox', { | 1380 UI.registerCustomElement('label', 'dt-checkbox', { |
| 1381 /** | 1381 /** |
| 1382 * @this {Element} | 1382 * @this {Element} |
| 1383 */ | 1383 */ |
| 1384 createdCallback: function() { | 1384 createdCallback: function() { |
| 1385 this._root = UI.createShadowRootWithCoreStyles(this, 'ui/checkboxTextLabel
.css'); | 1385 this._root = UI.createShadowRootWithCoreStyles(this, 'ui/checkboxTextLabel
.css'); |
| 1386 var checkboxElement = createElementWithClass('input', 'dt-checkbox-button'
); | 1386 var checkboxElement = createElementWithClass('input', 'dt-checkbox-button'
); |
| 1387 checkboxElement.type = 'checkbox'; | 1387 checkboxElement.type = 'checkbox'; |
| 1388 this._root.appendChild(checkboxElement); | 1388 this._root.appendChild(checkboxElement); |
| 1389 this.checkboxElement = checkboxElement; | 1389 this.checkboxElement = checkboxElement; |
| 1390 | 1390 |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1437 * @param {boolean} focus | 1437 * @param {boolean} focus |
| 1438 * @this {Element} | 1438 * @this {Element} |
| 1439 */ | 1439 */ |
| 1440 set visualizeFocus(focus) { | 1440 set visualizeFocus(focus) { |
| 1441 this.checkboxElement.classList.toggle('dt-checkbox-visualize-focus', focus
); | 1441 this.checkboxElement.classList.toggle('dt-checkbox-visualize-focus', focus
); |
| 1442 }, | 1442 }, |
| 1443 | 1443 |
| 1444 __proto__: HTMLLabelElement.prototype | 1444 __proto__: HTMLLabelElement.prototype |
| 1445 }); | 1445 }); |
| 1446 | 1446 |
| 1447 registerCustomElement('label', 'dt-icon-label', { | 1447 UI.registerCustomElement('label', 'dt-icon-label', { |
| 1448 /** | 1448 /** |
| 1449 * @this {Element} | 1449 * @this {Element} |
| 1450 */ | 1450 */ |
| 1451 createdCallback: function() { | 1451 createdCallback: function() { |
| 1452 var root = UI.createShadowRootWithCoreStyles(this); | 1452 var root = UI.createShadowRootWithCoreStyles(this); |
| 1453 this._iconElement = UI.Icon.create(); | 1453 this._iconElement = UI.Icon.create(); |
| 1454 this._iconElement.style.setProperty('margin-right', '4px'); | 1454 this._iconElement.style.setProperty('margin-right', '4px'); |
| 1455 root.appendChild(this._iconElement); | 1455 root.appendChild(this._iconElement); |
| 1456 root.createChild('content'); | 1456 root.createChild('content'); |
| 1457 }, | 1457 }, |
| 1458 | 1458 |
| 1459 /** | 1459 /** |
| 1460 * @param {string} type | 1460 * @param {string} type |
| 1461 * @this {Element} | 1461 * @this {Element} |
| 1462 */ | 1462 */ |
| 1463 set type(type) { | 1463 set type(type) { |
| 1464 this._iconElement.setIconType(type); | 1464 this._iconElement.setIconType(type); |
| 1465 }, | 1465 }, |
| 1466 | 1466 |
| 1467 __proto__: HTMLLabelElement.prototype | 1467 __proto__: HTMLLabelElement.prototype |
| 1468 }); | 1468 }); |
| 1469 | 1469 |
| 1470 registerCustomElement('label', 'dt-slider', { | 1470 UI.registerCustomElement('label', 'dt-slider', { |
| 1471 /** | 1471 /** |
| 1472 * @this {Element} | 1472 * @this {Element} |
| 1473 */ | 1473 */ |
| 1474 createdCallback: function() { | 1474 createdCallback: function() { |
| 1475 var root = UI.createShadowRootWithCoreStyles(this, 'ui/slider.css'); | 1475 var root = UI.createShadowRootWithCoreStyles(this, 'ui/slider.css'); |
| 1476 this.sliderElement = createElementWithClass('input', 'dt-range-input'); | 1476 this.sliderElement = createElementWithClass('input', 'dt-range-input'); |
| 1477 this.sliderElement.type = 'range'; | 1477 this.sliderElement.type = 'range'; |
| 1478 root.appendChild(this.sliderElement); | 1478 root.appendChild(this.sliderElement); |
| 1479 }, | 1479 }, |
| 1480 | 1480 |
| 1481 /** | 1481 /** |
| 1482 * @param {number} amount | 1482 * @param {number} amount |
| 1483 * @this {Element} | 1483 * @this {Element} |
| 1484 */ | 1484 */ |
| 1485 set value(amount) { | 1485 set value(amount) { |
| 1486 this.sliderElement.value = amount; | 1486 this.sliderElement.value = amount; |
| 1487 }, | 1487 }, |
| 1488 | 1488 |
| 1489 /** | 1489 /** |
| 1490 * @this {Element} | 1490 * @this {Element} |
| 1491 */ | 1491 */ |
| 1492 get value() { | 1492 get value() { |
| 1493 return this.sliderElement.value; | 1493 return this.sliderElement.value; |
| 1494 }, | 1494 }, |
| 1495 | 1495 |
| 1496 __proto__: HTMLLabelElement.prototype | 1496 __proto__: HTMLLabelElement.prototype |
| 1497 }); | 1497 }); |
| 1498 | 1498 |
| 1499 registerCustomElement('label', 'dt-small-bubble', { | 1499 UI.registerCustomElement('label', 'dt-small-bubble', { |
| 1500 /** | 1500 /** |
| 1501 * @this {Element} | 1501 * @this {Element} |
| 1502 */ | 1502 */ |
| 1503 createdCallback: function() { | 1503 createdCallback: function() { |
| 1504 var root = UI.createShadowRootWithCoreStyles(this, 'ui/smallBubble.css'); | 1504 var root = UI.createShadowRootWithCoreStyles(this, 'ui/smallBubble.css'); |
| 1505 this._textElement = root.createChild('div'); | 1505 this._textElement = root.createChild('div'); |
| 1506 this._textElement.className = 'info'; | 1506 this._textElement.className = 'info'; |
| 1507 this._textElement.createChild('content'); | 1507 this._textElement.createChild('content'); |
| 1508 }, | 1508 }, |
| 1509 | 1509 |
| 1510 /** | 1510 /** |
| 1511 * @param {string} type | 1511 * @param {string} type |
| 1512 * @this {Element} | 1512 * @this {Element} |
| 1513 */ | 1513 */ |
| 1514 set type(type) { | 1514 set type(type) { |
| 1515 this._textElement.className = type; | 1515 this._textElement.className = type; |
| 1516 }, | 1516 }, |
| 1517 | 1517 |
| 1518 __proto__: HTMLLabelElement.prototype | 1518 __proto__: HTMLLabelElement.prototype |
| 1519 }); | 1519 }); |
| 1520 | 1520 |
| 1521 registerCustomElement('div', 'dt-close-button', { | 1521 UI.registerCustomElement('div', 'dt-close-button', { |
| 1522 /** | 1522 /** |
| 1523 * @this {Element} | 1523 * @this {Element} |
| 1524 */ | 1524 */ |
| 1525 createdCallback: function() { | 1525 createdCallback: function() { |
| 1526 var root = UI.createShadowRootWithCoreStyles(this, 'ui/closeButton.css'); | 1526 var root = UI.createShadowRootWithCoreStyles(this, 'ui/closeButton.css'); |
| 1527 this._buttonElement = root.createChild('div', 'close-button'); | 1527 this._buttonElement = root.createChild('div', 'close-button'); |
| 1528 }, | 1528 }, |
| 1529 | 1529 |
| 1530 /** | 1530 /** |
| 1531 * @param {boolean} gray | 1531 * @param {boolean} gray |
| (...skipping 477 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2009 return new Promise(fulfill => { | 2009 return new Promise(fulfill => { |
| 2010 var image = new Image(); | 2010 var image = new Image(); |
| 2011 image.addEventListener('load', () => fulfill(image)); | 2011 image.addEventListener('load', () => fulfill(image)); |
| 2012 image.addEventListener('error', () => fulfill(null)); | 2012 image.addEventListener('error', () => fulfill(null)); |
| 2013 image.src = url; | 2013 image.src = url; |
| 2014 }); | 2014 }); |
| 2015 }; | 2015 }; |
| 2016 | 2016 |
| 2017 /** @type {!UI.ThemeSupport} */ | 2017 /** @type {!UI.ThemeSupport} */ |
| 2018 UI.themeSupport; | 2018 UI.themeSupport; |
| OLD | NEW |