1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// found in the LICENSE file. 4cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/** 6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * @fileoverview A widget hosting an HTML snippet. 7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) */ 8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)goog.provide('cvox.OverlayWidget'); 10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)goog.require('cvox.DomUtil'); 12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)goog.require('cvox.SearchWidget'); 13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/** 16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * @param {string} snippet The HTML snippet to render. 17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * @constructor 18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * @extends {cvox.SearchWidget} 19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) */ 20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)cvox.OverlayWidget = function(snippet) { 21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) goog.base(this); 22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) this.snippet_ = snippet; 23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)goog.inherits(cvox.OverlayWidget, cvox.SearchWidget); 25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/** 28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * @override 29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) */ 30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)cvox.OverlayWidget.prototype.show = function() { 31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) goog.base(this, 'show'); 32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) var host = document.createElement('DIV'); 33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) host.innerHTML = this.snippet_; 34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Position the overlay over the current ChromeVox selection. 36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) var hitPoint = cvox.DomUtil.elementToPoint( 37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) cvox.ChromeVox.navigationManager.getCurrentNode()); 38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) host.style.position = 'absolute'; 39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) host.style.left = hitPoint.x; 40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) host.style.top = hitPoint.y; 41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) document.body.appendChild(host); 43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) cvox.ChromeVox.navigationManager.updateSelToArbitraryNode(host); 44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) this.host_ = host; 45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/** 49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * @override 50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) */ 51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)cvox.OverlayWidget.prototype.hide = function(opt_noSync) { 52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) this.host_.remove(); 53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) goog.base(this, 'hide'); 54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/** 58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * @override 59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) */ 60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)cvox.OverlayWidget.prototype.onKeyDown = function(evt) { 61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Allow the base class to handle all keys first. 62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) goog.base(this, 'onKeyDown', evt); 63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Do not interfere with any key that exits the widget. 65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (evt.keyCode == 13 || evt.keyCode == 27) { // Enter or escape. 66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return true; 67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Bound navigation within the snippet for any other key. 70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) var r = cvox.ChromeVox.navigationManager.isReversed(); 71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!cvox.DomUtil.isDescendantOfNode( 72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) cvox.ChromeVox.navigationManager.getCurrentNode(), this.host_)) { 73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (r) { 74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) cvox.ChromeVox.navigationManager.syncToBeginning(); 75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } else { 76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) cvox.ChromeVox.navigationManager.updateSelToArbitraryNode(this.host_); 77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) this.onNavigate(); 79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) cvox.ChromeVox.navigationManager.speakDescriptionArray( 80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) cvox.ChromeVox.navigationManager.getDescription(), 0, null); 81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 83