blob: 87f593c13008971eabcceaa4eef48605bea5606e [file] [log] [blame]
<!--
// 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>