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