| Index: runtime/bin/vmservice/observatory/deployed/web/packages/template_binding/js/node_bind.js
|
| diff --git a/runtime/bin/vmservice/observatory/deployed/web/packages/template_binding/js/node_bind.js b/runtime/bin/vmservice/observatory/deployed/web/packages/template_binding/js/node_bind.js
|
| deleted file mode 100644
|
| index 270c557b185ea8a36c5cabb97affeb865322e483..0000000000000000000000000000000000000000
|
| --- a/runtime/bin/vmservice/observatory/deployed/web/packages/template_binding/js/node_bind.js
|
| +++ /dev/null
|
| @@ -1,343 +0,0 @@
|
| -// Copyright (c) 2014 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
|
| -
|
| -(function(global) {
|
| - 'use strict';
|
| -
|
| - var filter = Array.prototype.filter.call.bind(Array.prototype.filter);
|
| -
|
| - function getTreeScope(node) {
|
| - while (node.parentNode) {
|
| - node = node.parentNode;
|
| - }
|
| -
|
| - return typeof node.getElementById === 'function' ? node : null;
|
| - }
|
| -
|
| - Node.prototype.bind = function(name, observable) {
|
| - console.error('Unhandled binding to Node: ', this, name, observable);
|
| - };
|
| -
|
| - Node.prototype.bindFinished = function() {};
|
| -
|
| - function updateBindings(node, name, binding) {
|
| - var bindings = node.bindings_;
|
| - if (!bindings)
|
| - bindings = node.bindings_ = {};
|
| -
|
| - if (bindings[name])
|
| - binding[name].close();
|
| -
|
| - return bindings[name] = binding;
|
| - }
|
| -
|
| - function returnBinding(node, name, binding) {
|
| - return binding;
|
| - }
|
| -
|
| - function sanitizeValue(value) {
|
| - return value == null ? '' : value;
|
| - }
|
| -
|
| - function updateText(node, value) {
|
| - node.data = sanitizeValue(value);
|
| - }
|
| -
|
| - function textBinding(node) {
|
| - return function(value) {
|
| - return updateText(node, value);
|
| - };
|
| - }
|
| -
|
| - var maybeUpdateBindings = returnBinding;
|
| -
|
| - Object.defineProperty(Platform, 'enableBindingsReflection', {
|
| - get: function() {
|
| - return maybeUpdateBindings === updateBindings;
|
| - },
|
| - set: function(enable) {
|
| - maybeUpdateBindings = enable ? updateBindings : returnBinding;
|
| - return enable;
|
| - },
|
| - configurable: true
|
| - });
|
| -
|
| - Text.prototype.bind = function(name, value, oneTime) {
|
| - if (name !== 'textContent')
|
| - return Node.prototype.bind.call(this, name, value, oneTime);
|
| -
|
| - if (oneTime)
|
| - return updateText(this, value);
|
| -
|
| - var observable = value;
|
| - updateText(this, observable.open(textBinding(this)));
|
| - return maybeUpdateBindings(this, name, observable);
|
| - }
|
| -
|
| - function updateAttribute(el, name, conditional, value) {
|
| - if (conditional) {
|
| - if (value)
|
| - el.setAttribute(name, '');
|
| - else
|
| - el.removeAttribute(name);
|
| - return;
|
| - }
|
| -
|
| - el.setAttribute(name, sanitizeValue(value));
|
| - }
|
| -
|
| - function attributeBinding(el, name, conditional) {
|
| - return function(value) {
|
| - updateAttribute(el, name, conditional, value);
|
| - };
|
| - }
|
| -
|
| - Element.prototype.bind = function(name, value, oneTime) {
|
| - var conditional = name[name.length - 1] == '?';
|
| - if (conditional) {
|
| - this.removeAttribute(name);
|
| - name = name.slice(0, -1);
|
| - }
|
| -
|
| - if (oneTime)
|
| - return updateAttribute(this, name, conditional, value);
|
| -
|
| -
|
| - var observable = value;
|
| - updateAttribute(this, name, conditional,
|
| - observable.open(attributeBinding(this, name, conditional)));
|
| -
|
| - return maybeUpdateBindings(this, name, observable);
|
| - };
|
| -
|
| - var checkboxEventType;
|
| - (function() {
|
| - // Attempt to feature-detect which event (change or click) is fired first
|
| - // for checkboxes.
|
| - var div = document.createElement('div');
|
| - var checkbox = div.appendChild(document.createElement('input'));
|
| - checkbox.setAttribute('type', 'checkbox');
|
| - var first;
|
| - var count = 0;
|
| - checkbox.addEventListener('click', function(e) {
|
| - count++;
|
| - first = first || 'click';
|
| - });
|
| - checkbox.addEventListener('change', function() {
|
| - count++;
|
| - first = first || 'change';
|
| - });
|
| -
|
| - var event = document.createEvent('MouseEvent');
|
| - event.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false,
|
| - false, false, false, 0, null);
|
| - checkbox.dispatchEvent(event);
|
| - // WebKit/Blink don't fire the change event if the element is outside the
|
| - // document, so assume 'change' for that case.
|
| - checkboxEventType = count == 1 ? 'change' : first;
|
| - })();
|
| -
|
| - function getEventForInputType(element) {
|
| - switch (element.type) {
|
| - case 'checkbox':
|
| - return checkboxEventType;
|
| - case 'radio':
|
| - case 'select-multiple':
|
| - case 'select-one':
|
| - return 'change';
|
| - case 'range':
|
| - if (/Trident|MSIE/.test(navigator.userAgent))
|
| - return 'change';
|
| - default:
|
| - return 'input';
|
| - }
|
| - }
|
| -
|
| - function updateInput(input, property, value, santizeFn) {
|
| - input[property] = (santizeFn || sanitizeValue)(value);
|
| - }
|
| -
|
| - function inputBinding(input, property, santizeFn) {
|
| - return function(value) {
|
| - return updateInput(input, property, value, santizeFn);
|
| - }
|
| - }
|
| -
|
| - function noop() {}
|
| -
|
| - function bindInputEvent(input, property, observable, postEventFn) {
|
| - var eventType = getEventForInputType(input);
|
| -
|
| - function eventHandler() {
|
| - observable.setValue(input[property]);
|
| - observable.discardChanges();
|
| - (postEventFn || noop)(input);
|
| - Platform.performMicrotaskCheckpoint();
|
| - }
|
| - input.addEventListener(eventType, eventHandler);
|
| -
|
| - return {
|
| - close: function() {
|
| - input.removeEventListener(eventType, eventHandler);
|
| - observable.close();
|
| - },
|
| -
|
| - observable_: observable
|
| - }
|
| - }
|
| -
|
| - function booleanSanitize(value) {
|
| - return Boolean(value);
|
| - }
|
| -
|
| - // |element| is assumed to be an HTMLInputElement with |type| == 'radio'.
|
| - // Returns an array containing all radio buttons other than |element| that
|
| - // have the same |name|, either in the form that |element| belongs to or,
|
| - // if no form, in the document tree to which |element| belongs.
|
| - //
|
| - // This implementation is based upon the HTML spec definition of a
|
| - // "radio button group":
|
| - // http://www.whatwg.org/specs/web-apps/current-work/multipage/number-state.html#radio-button-group
|
| - //
|
| - function getAssociatedRadioButtons(element) {
|
| - if (element.form) {
|
| - return filter(element.form.elements, function(el) {
|
| - return el != element &&
|
| - el.tagName == 'INPUT' &&
|
| - el.type == 'radio' &&
|
| - el.name == element.name;
|
| - });
|
| - } else {
|
| - var treeScope = getTreeScope(element);
|
| - if (!treeScope)
|
| - return [];
|
| - var radios = treeScope.querySelectorAll(
|
| - 'input[type="radio"][name="' + element.name + '"]');
|
| - return filter(radios, function(el) {
|
| - return el != element && !el.form;
|
| - });
|
| - }
|
| - }
|
| -
|
| - function checkedPostEvent(input) {
|
| - // Only the radio button that is getting checked gets an event. We
|
| - // therefore find all the associated radio buttons and update their
|
| - // check binding manually.
|
| - if (input.tagName === 'INPUT' &&
|
| - input.type === 'radio') {
|
| - getAssociatedRadioButtons(input).forEach(function(radio) {
|
| - var checkedBinding = radio.bindings_.checked;
|
| - if (checkedBinding) {
|
| - // Set the value directly to avoid an infinite call stack.
|
| - checkedBinding.observable_.setValue(false);
|
| - }
|
| - });
|
| - }
|
| - }
|
| -
|
| - HTMLInputElement.prototype.bind = function(name, value, oneTime) {
|
| - if (name !== 'value' && name !== 'checked')
|
| - return HTMLElement.prototype.bind.call(this, name, value, oneTime);
|
| -
|
| - this.removeAttribute(name);
|
| - var sanitizeFn = name == 'checked' ? booleanSanitize : sanitizeValue;
|
| - var postEventFn = name == 'checked' ? checkedPostEvent : noop;
|
| -
|
| - if (oneTime)
|
| - return updateInput(this, name, value, sanitizeFn);
|
| -
|
| -
|
| - var observable = value;
|
| - var binding = bindInputEvent(this, name, observable, postEventFn);
|
| - updateInput(this, name,
|
| - observable.open(inputBinding(this, name, sanitizeFn)),
|
| - sanitizeFn);
|
| -
|
| - // Checkboxes may need to update bindings of other checkboxes.
|
| - return updateBindings(this, name, binding);
|
| - }
|
| -
|
| - HTMLTextAreaElement.prototype.bind = function(name, value, oneTime) {
|
| - if (name !== 'value')
|
| - return HTMLElement.prototype.bind.call(this, name, value, oneTime);
|
| -
|
| - this.removeAttribute('value');
|
| -
|
| - if (oneTime)
|
| - return updateInput(this, 'value', value);
|
| -
|
| - var observable = value;
|
| - var binding = bindInputEvent(this, 'value', observable);
|
| - updateInput(this, 'value',
|
| - observable.open(inputBinding(this, 'value', sanitizeValue)));
|
| - return maybeUpdateBindings(this, name, binding);
|
| - }
|
| -
|
| - function updateOption(option, value) {
|
| - var parentNode = option.parentNode;;
|
| - var select;
|
| - var selectBinding;
|
| - var oldValue;
|
| - if (parentNode instanceof HTMLSelectElement &&
|
| - parentNode.bindings_ &&
|
| - parentNode.bindings_.value) {
|
| - select = parentNode;
|
| - selectBinding = select.bindings_.value;
|
| - oldValue = select.value;
|
| - }
|
| -
|
| - option.value = sanitizeValue(value);
|
| -
|
| - if (select && select.value != oldValue) {
|
| - selectBinding.observable_.setValue(select.value);
|
| - selectBinding.observable_.discardChanges();
|
| - Platform.performMicrotaskCheckpoint();
|
| - }
|
| - }
|
| -
|
| - function optionBinding(option) {
|
| - return function(value) {
|
| - updateOption(option, value);
|
| - }
|
| - }
|
| -
|
| - HTMLOptionElement.prototype.bind = function(name, value, oneTime) {
|
| - if (name !== 'value')
|
| - return HTMLElement.prototype.bind.call(this, name, value, oneTime);
|
| -
|
| - this.removeAttribute('value');
|
| -
|
| - if (oneTime)
|
| - return updateOption(this, value);
|
| -
|
| - var observable = value;
|
| - var binding = bindInputEvent(this, 'value', observable);
|
| - updateOption(this, observable.open(optionBinding(this)));
|
| - return maybeUpdateBindings(this, name, binding);
|
| - }
|
| -
|
| - HTMLSelectElement.prototype.bind = function(name, value, oneTime) {
|
| - if (name === 'selectedindex')
|
| - name = 'selectedIndex';
|
| -
|
| - if (name !== 'selectedIndex' && name !== 'value')
|
| - return HTMLElement.prototype.bind.call(this, name, value, oneTime);
|
| -
|
| - this.removeAttribute(name);
|
| -
|
| - if (oneTime)
|
| - return updateInput(this, name, value);
|
| -
|
| - var observable = value;
|
| - var binding = bindInputEvent(this, name, observable);
|
| - updateInput(this, name,
|
| - observable.open(inputBinding(this, name)));
|
| -
|
| - // Option update events may need to access select bindings.
|
| - return updateBindings(this, name, binding);
|
| - }
|
| -})(this);
|
|
|