update components

This commit is contained in:
Luke Pulverenti 2016-03-28 13:41:48 -04:00
parent 4a4c20e7c6
commit ee03ef4f51
27 changed files with 1767 additions and 21 deletions

View file

@ -0,0 +1,26 @@
<!doctype html>
<!--
@license
Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
Code distributed by Google as part of the polymer project is also
subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-->
<html>
<head>
<meta charset="utf-8">
<script src="../../webcomponentsjs/webcomponents-lite.js"></script>
<script src="../../web-component-tester/browser.js"></script>
</head>
<body>
<script>
WCT.loadSuites([
'iron-location.html',
'iron-query-params.html',
'initialization-tests.html'
]);
</script>
</body>
</html>

View file

@ -0,0 +1,277 @@
<!--
@license
Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
Code distributed by Google as part of the polymer project is also
subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-->
<link rel='import' href='../iron-location.html'>
<link rel='import' href='../../polymer/polymer.html'>
<script>
Polymer({
is: 'default-value',
properties: {
val: {
type: String,
notify: true,
value: 'default-value'
}
},
});
Polymer({
is: 'on-attached',
properties: {
val: {
type: String,
notify: true,
value: 'on-attached-default-value'
}
},
attached: function() {
if (this.val === 'on-attached-default-value') {
this.val = 'on-attached';
}
}
});
Polymer({
is: 'on-ready',
properties: {
val: {
type: String,
notify: true,
value: 'on-ready-default-value'
}
},
ready: function() {
this.val = 'on-ready';
}
});
Polymer({
is: 'on-timeout',
properties: {
val: {
type: String,
notify: true,
value: 'on-timeout-default-value'
}
},
attached: function() {
setTimeout(function() {
this.val = 'on-timeout';
}.bind(this), 10);
}
})
</script>
<dom-module id='default-before'>
<template>
<default-value value='{{val}}'></default-value>
<iron-location query='{{val}}'></iron-location>
</template>
<script>Polymer({is: 'default-before', properties: {val: {type: String}}});</script>
</dom-module>
<dom-module id='attached-before'>
<template>
<on-attached val='{{val}}'></on-attached>
<iron-location query='{{val}}'></iron-location>
</template>
<script>Polymer({is: 'attached-before', properties: {val: {type: String}}});</script>
</dom-module>
<dom-module id='ready-before'>
<template>
<on-ready val='{{val}}'></on-ready>
<iron-location query='{{val}}'></iron-location>
</template>
<script>Polymer({is: 'ready-before', properties: {val: {type: String}}});</script>
</dom-module>
<dom-module id='timeout-before'>
<template>
<on-timeout val='{{val}}'></on-timeout>
<iron-location query='{{val}}'></iron-location>
</template>
<script>Polymer({is: 'timeout-before', properties: {val: {type: String}}});</script>
</dom-module>
<dom-module id='default-after'>
<template>
<iron-location query='{{val}}'></iron-location>
<default-value value='{{val}}'></default-value>
</template>
<script>Polymer({is: 'default-after', properties: {val: {type: String}}});</script>
</dom-module>
<dom-module id='attached-after'>
<template>
<iron-location query='{{val}}'></iron-location>
<on-attached val='{{val}}'></on-attached>
</template>
<script>Polymer({is: 'attached-after', properties: {val: {type: String}}});</script>
</dom-module>
<dom-module id='ready-after'>
<template>
<iron-location query='{{val}}'></iron-location>
<on-ready val='{{val}}'></on-ready>
</template>
<script>Polymer({is: 'ready-after', properties: {val: {type: String}}});</script>
</dom-module>
<dom-module id='timeout-after'>
<template>
<iron-location query='{{val}}'></iron-location>
<on-timeout val='{{val}}'></on-timeout>
</template>
<script>Polymer({is: 'timeout-after', properties: {val: {type: String}}});</script>
</dom-module>
<dom-module id='default-below'>
<template>
<iron-location query='{{val}}'>
<default-value value='{{val}}'></default-value>
</iron-location>
</template>
<script>Polymer({is: 'default-below', properties: {val: {type: String}}});</script>
</dom-module>
<dom-module id='attached-below'>
<template>
<iron-location query='{{val}}'>
<on-attached val='{{val}}'></on-attached>
</iron-location>
</template>
<script>Polymer({is: 'attached-below', properties: {val: {type: String}}});</script>
</dom-module>
<dom-module id='ready-below'>
<template>
<iron-location query='{{val}}'>
<on-ready val='{{val}}'></on-ready>
</iron-location>
</template>
<script>Polymer({is: 'ready-below', properties: {val: {type: String}}});</script>
</dom-module>
<dom-module id='timeout-below'>
<template>
<iron-location query='{{val}}'>
<on-timeout val='{{val}}'></on-timeout>
</iron-location>
</template>
<script>Polymer({is: 'timeout-below', properties: {val: {type: String}}});</script>
</dom-module>
<dom-module id='default-above'>
<template>
<default-value value='{{val}}'>
<iron-location query='{{val}}'></iron-location>
</default-value>
</template>
<script>Polymer({is: 'default-above', properties: {val: {type: String}}});</script>
</dom-module>
<dom-module id='attached-above'>
<template>
<on-attached val='{{val}}'>
<iron-location query='{{val}}'>
</iron-location>
</on-attached>
</template>
<script>Polymer({is: 'attached-above', properties: {val: {type: String}}});</script>
</dom-module>
<dom-module id='ready-above'>
<template>
<on-ready val='{{val}}'>
<iron-location query='{{val}}'>
</iron-location>
</on-ready>
</template>
<script>Polymer({is: 'ready-above', properties: {val: {type: String}}});</script>
</dom-module>
<dom-module id='timeout-above'>
<template>
<on-timeout val='{{val}}'>
<iron-location query='{{val}}'></iron-location>
</on-timeout>
</template>
<script>Polymer({is: 'timeout-above', properties: {val: {type: String}}});</script>
</dom-module>
<dom-module id='default-container'>
<template>
<iron-location query='{{val}}'></iron-location>
</template>
<script>
Polymer({
is: 'default-container',
properties: {val: {type: String, value: 'default-container-val'}}
});
</script>
</dom-module>
<dom-module id='attached-container'>
<template>
<iron-location query='{{val}}'></iron-location>
</template>
<script>
Polymer({
is: 'attached-container',
properties: {val: {type: String, value: 'container-attached-default-val'}},
attached: function() {
if (this.val === 'container-attached-default-val') {
this.val = 'attached-container-val';
}
}
});
</script>
</dom-module>
<dom-module id='ready-container'>
<template>
<iron-location query='{{val}}'></iron-location>
</template>
<script>
Polymer({
is: 'ready-container', properties: {val: {type: String}},
ready: function() {
this.val = 'ready-container-val';
}
});
</script>
</dom-module>
<dom-module id='timeout-container'>
<template>
<iron-location query='{{val}}'></iron-location>
</template>
<script>Polymer({
is: 'timeout-container',
properties: {
val: {
type: String,
notify: true
}
},
attached: function() {
setTimeout(function() {
this.val = 'on-timeout';
}.bind(this), 10);
}
});</script>
</dom-module>

View file

@ -0,0 +1,61 @@
<!--
@license
Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
Code distributed by Google as part of the polymer project is also
subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-->
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Base source for injecting into an iframe for tests</title>
<script src="../../webcomponentsjs/webcomponents.js"></script>
<link rel='import' href='./initialization-cases.html'>
</head>
<body>
<script>
window.addEventListener("message", messageReceived, false);
window.addEventListener('WebComponentsReady', function() {
window.parent.postMessage({
'type': 'ready'
}, '*');
});
var appendBodyReceived = false;
function messageReceived(msg) {
if (!msg.data) {
console.error('got invalid msg?');
}
// the parent can (at any time) ask for our URL.
if (msg.data.type === 'urlQuery') {
msg.source.postMessage({
'type': 'urlQueryResponse',
'href': window.location.href,
'pathname': window.location.pathname,
'hash': window.location.hash,
'search': window.location.search
}, '*');
} else if (msg.data.type === 'appendBody') {
if (appendBodyReceived) {
throw new Error('should only receive at most one appendBody call');
}
var element = document.createElement(msg.data.tagName);
document.body.appendChild(element);
appendBodyReceived = true;
}
}
window.addEventListener('error', function(e) {
window.parent.postMessage({
'type': 'error',
'error': e.message
}, '*');
});
</script>
</body>
</html>

View file

@ -0,0 +1,145 @@
<!--
@license
Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
Code distributed by Google as part of the polymer project is also
subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-->
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="../../webcomponentsjs/webcomponents.js"></script>
<script src="../../web-component-tester/browser.js"></script>
<script src="../../test-fixture/test-fixture-mocha.js"></script>
<link rel="import" href="../../polymer/polymer.html">
<link rel="import" href="../../promise-polyfill/promise-polyfill.html">
<link rel="import" href="../../test-fixture/test-fixture.html">
<link rel="import" href="../iron-location.html">
</head>
<body>
<script>
'use strict';
function getIframe() {
return new Promise(function(resolve, reject) {
var iframe = document.createElement('iframe');
var result = getMessageMatching(iframe, function(message) {
return message.type === 'ready';
});
iframe.src = './initialization-iframe.html';
document.body.appendChild(iframe);
iframe.addEventListener('error', reject);
result.then(function() {resolve(iframe)}, reject);
});
}
function onMessage(iframe, callback) {
var f = function(event) {
if (event.source === iframe.contentWindow) {
callback(event.data);
}
};
window.addEventListener('message', f, false);
return function() {
window.removeEventListener('message', f);
}
}
function getMessageMatching(iframe, predicate) {
var revoke = function() {};
var result = new Promise(function(resolve, reject) {
revoke = onMessage(iframe, function(message) {
if (predicate(message)) {
resolve(message);
}
});
});
result.then(revoke, revoke);
return result;
}
function getUrl(iframe) {
var result = getMessageMatching(iframe, function(message) {
return message.type === 'urlQueryResponse';
})
var revoke = function() {};
var result = new Promise(function(resolve, reject) {
revoke = onMessage(iframe, resolve);
});
result.then(revoke, revoke);
iframe.contentWindow.postMessage({type: 'urlQuery'}, '*');
return result;
}
function timePasses(ms) {
return new Promise(function(resolve) {
window.setTimeout(function() {
resolve();
}, ms);
});
}
suite('<iron-location>\'s initialization', function() {
var iframe;
var error;
setup(function() {
return getIframe().then(function(i) {
iframe = i;
function isError(m) {return m.type === 'error'}
getMessageMatching(iframe, isError).then(function(m) {
error = m.error;
});
});
});
teardown(function() {
if (iframe) {
document.body.removeChild(iframe);
}
var e = error;
iframe = null;
error = null;
if (e) {
throw new Error('Error message from contained iframe: ' + e);
}
});
var cases = [
'default-before', 'attached-before', 'ready-before',
'default-after', 'attached-after', 'ready-after',
'default-below', 'attached-below', 'ready-below',
'default-above', 'attached-above', 'ready-above',
'default-container', 'attached-container', 'ready-container'
];
cases.forEach(function(caseName) {
test('the url takes priority in ' + caseName + ' initialization', function() {
return getUrl(iframe).then(function(url) {
expect(url.search).to.be.eq('');
iframe.contentWindow.postMessage({type: 'appendBody', tagName: caseName}, '*');
return timePasses(10).then(function() {return getUrl(iframe)});
}).then(function(url) {
expect(url.search).to.be.eq('');
});
});
});
var expectedFailureCases = ['timeout-before', 'timeout-after', 'timeout-below', 'timeout-above', 'timeout-container'];
expectedFailureCases.forEach(function(caseName) {
test('the url does not take priority in ' + caseName + ' initialization', function() {
return getUrl(iframe).then(function(url) {
expect(url.search).to.be.eq('');
iframe.contentWindow.postMessage({type: 'appendBody', tagName: caseName}, '*');
return timePasses(60).then(function() {return getUrl(iframe)});
}).then(function(url) {
expect(url.search).to.be.eq('?on-timeout');
});
});
});
});
</script>
</body>
</html>

View file

@ -0,0 +1,140 @@
<!doctype html>
<!--
@license
Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
Code distributed by Google as part of the polymer project is also
subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-->
<html>
<head>
<title>iron-location</title>
<script src="../../webcomponentsjs/webcomponents.js"></script>
<script src="../../web-component-tester/browser.js"></script>
<link rel="import" href="../../polymer/polymer.html">
<link rel="import" href="../../promise-polyfill/promise-polyfill.html">
<link rel="import" href="../iron-location.html">
</head>
<body>
<test-fixture id='Solo'>
<template>
<iron-location></iron-location>
</template>
</test-fixture>
<test-fixture id='Together'>
<template>
<div>
<iron-location id='one'></iron-location>
<iron-location id='two'></iron-location>
</div>
</template>
</test-fixture>
<script>
'use strict';
function timePasses(ms) {
return new Promise(function(resolve) {
window.setTimeout(function() {
resolve();
}, ms);
});
}
suite('<iron-location>', function () {
var initialUrl;
setup(function() {
initialUrl = window.location.href;
});
teardown(function(){
window.history.replaceState({}, '', initialUrl);
});
suite('when used solo', function() {
var urlElem;
setup(function() {
urlElem = fixture('Solo');
});
test('basic functionality with #hash urls', function() {
// Initialized to the window location's hash.
expect(window.location.hash).to.be.equal(urlElem.hash);
// Changing the urlElem's hash changes the URL
urlElem.hash = '/lol/ok';
expect(window.location.hash).to.be.equal('#/lol/ok');
// Changing the hash via normal means changes the urlElem.
var anchor = document.createElement('a');
anchor.href = '#/wat';
document.body.appendChild(anchor);
anchor.click();
// In IE10 it appears that the hashchange event is asynchronous.
return timePasses(10).then(function() {
expect(urlElem.hash).to.be.equal('/wat');
});
});
test('basic functionality with paths', function() {
// Initialized to the window location's path.
expect(window.location.pathname).to.be.equal(urlElem.path);
// Changing the urlElem's path changes the URL
urlElem.path = '/foo/bar';
expect(window.location.pathname).to.be.equal('/foo/bar');
// Changing the path and sending a custom event on the window changes
// the urlElem.
window.history.replaceState({}, '', '/baz')
window.dispatchEvent(new CustomEvent('location-changed'));
expect(urlElem.path).to.be.equal('/baz');
});
test('basic functionality with ?key=value params', function() {
// Initialized to the window location's params.
expect(urlElem.query).to.be.eq('');
// Changing location.search and sending a custom event on the window
// changes the urlElem.
window.history.replaceState({}, '', '/?greeting=hello&target=world');
window.dispatchEvent(new CustomEvent('location-changed'));
expect(urlElem.query).to.be.equal('greeting=hello&target=world');
// Changing the urlElem's query changes the URL.
urlElem.query = 'greeting=hello&target=world&another=key';
expect(window.location.search).to.be.equal(
'?greeting=hello&target=world&another=key');
});
});
suite('when used with other iron-location elements', function() {
var otherUrlElem;
var urlElem;
setup(function() {
var elems = fixture('Together');
urlElem = elems.querySelector('#one');
otherUrlElem = elems.querySelector('#two');
});
function assertHaveSameUrls(urlElemOne, urlElemTwo) {
expect(urlElemOne.path).to.be.equal(urlElemTwo.path);
expect(urlElemOne.hash).to.be.equal(urlElemTwo.hash);
expect(urlElemOne.query).to.be.equal(urlElemTwo.query);
}
test('coordinate their changes (by firing events on window)', function() {
assertHaveSameUrls(urlElem, otherUrlElem);
urlElem.path = '/a/b/c';
assertHaveSameUrls(urlElem, otherUrlElem);
otherUrlElem.query = 'alsdkjflaksjfd=alksjfdlkajsdfl';
assertHaveSameUrls(urlElem, otherUrlElem);
urlElem.hash = 'lkjljifosjkldfjlksjfldsjf';
assertHaveSameUrls(urlElem, otherUrlElem);
});
});
});
</script>
</body>

View file

@ -0,0 +1,96 @@
<!doctype html>
<!--
@license
Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
Code distributed by Google as part of the polymer project is also
subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-->
<html>
<head>
<title>iron-location</title>
<script src="../../webcomponentsjs/webcomponents.js"></script>
<script src="../../web-component-tester/browser.js"></script>
<link rel="import" href="../../polymer/polymer.html">
<link rel="import" href="../../promise-polyfill/promise-polyfill.html">
<link rel="import" href="../iron-query-params.html">
</head>
<body>
<test-fixture id="BasicQueryParams">
<template>
<iron-query-params></iron-query-params>
</template>
</test-fixture>
<script>
'use strict';
suite('<iron-query-params>', function () {
var paramsElem;
setup(function() {
paramsElem = fixture('BasicQueryParams');
});
test('basic functionality with ?key=value params', function() {
// Check initialization
expect(paramsElem.paramsString).to.be.eq('');
expect(paramsElem.paramsObject).to.deep.eq({});
// Check the mapping from paramsString to paramsObject.
paramsElem.paramsString = 'greeting=hello&target=world';
expect(paramsElem.paramsObject).to.deep.equal(
{greeting: 'hello', target: 'world'});
// Check the mapping from paramsObject back to paramsString.
paramsElem.set('paramsObject.another', 'key');
expect(paramsElem.paramsString).to.be.equal(
'greeting=hello&target=world&another=key');
});
test('encoding of params', function() {
var mappings = [
{
string: 'a=b',
object: {'a': 'b'}
},
{
string: 'debug&ok',
object: {'debug': '', 'ok': ''}
},
{
string: 'monster%20kid%3A=%F0%9F%98%BF',
object: {'monster kid:': '😿'}
},
{
string: 'yes%2C%20ok%3F%20what%20is%20up%20with%20%CB%9Athiiis%CB%9A=%E2%98%83',
object: {'yes, ok? what is up with ˚thiiis˚': '☃'}
},
];
mappings.forEach(function(mapping) {
// Clear
paramsElem.paramsObject = {};
expect(paramsElem.paramsString).to.be.equal('');
// Test going from string to object
paramsElem.paramsString = mapping.string;
expect(paramsElem.paramsObject).to.deep.equal(mapping.object);
// Clear again.
paramsElem.paramsObject = {};
expect(paramsElem.paramsString).to.be.equal('');
// Test going from object to string
paramsElem.paramsObject = mapping.object;
expect(paramsElem.paramsString).to.be.equal(mapping.string);
});
});
});
</script>
</body>