| <!-- | 
 | // Copyright 2015 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 src="/gen/mojo/services/keyboard/public/interfaces/keyboard.mojom.sky" as="keyboard" /> | 
 | <import src="shell.sky" as="shell" /> | 
 | <import src="sky-element/sky-element.sky" as="SkyElement" /> | 
 |  | 
 | <sky-element name="sky-input" attributes="value:string"> | 
 | <template> | 
 |   <style> | 
 |   :host { | 
 |     display: flex; | 
 |     border: 1px solid blue; | 
 |     margin: 5px; | 
 |     padding: 4px; | 
 |   } | 
 |   #control { | 
 |     flex: 1; | 
 |     align-self: center; | 
 |     height: 1.2em; | 
 |     white-space: nowrap; | 
 |     overflow: hidden; | 
 |   } | 
 |   </style> | 
 |   <div id="control" contenteditable | 
 |        on-focus="handleFocus" | 
 |        on-blur="handleBlur" | 
 |        on-keydown="handleKeyDown">{{ value }}</div> | 
 | </template> | 
 | <script> | 
 | var keyboard = shell.connectToService("mojo:keyboard", keyboard.Keyboard); | 
 | module.exports = class extends SkyElement { | 
 |   shadowRootReady() { | 
 |     var control = this.shadowRoot.getElementById('control'); | 
 |     var text = control.firstChild; | 
 |  | 
 |     var observer = new MutationObserver(function() { | 
 |       // contenteditable might remove the text node, but we need to keep it | 
 |       // since that's where the data binding is connected to. | 
 |       if (!text.parentNode) | 
 |         control.appendChild(text); | 
 |       if (this.value == control.textContent) | 
 |         return; | 
 |       this.value = control.textContent; | 
 |       this.dispatchEvent(new CustomEvent('change', { | 
 |         bubbles: true, | 
 |       })); | 
 |     }.bind(this)); | 
 |  | 
 |     observer.observe(control, { | 
 |       subtree: true, | 
 |       characterData: true, | 
 |       childList: true, | 
 |     }); | 
 |   } | 
 |   handleKeyDown(event) { | 
 |     // TODO(abarth): You can still get newlines if the user pastes them. | 
 |     if (event.key == 0xD) | 
 |       event.preventDefault(); | 
 |   } | 
 |   handleFocus(event) { | 
 |     keyboard.show(); | 
 |   } | 
 |   handleBlur(event) { | 
 |     keyboard.hide(); | 
 |   } | 
 | }.register(); | 
 | </script> | 
 | </sky-element> |