blob: a1e3687faadfd53c0e67cb93d3f9cc2d8477f555 [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. */
cr.define('sync.confirmation', function() {
'use strict';
/**
* @param {!Array<!HTMLElement>} path Path of the click event. Must contain
* a consent confirmation element.
* @return {string} The text of the consent confirmation element.
* @private
*/
function getConsentConfirmation(path) {
let consentConfirmation;
for (const element of path) {
if (element.nodeType !== Node.DOCUMENT_FRAGMENT_NODE &&
element.hasAttribute('consent-confirmation')) {
return element.innerHTML.trim();
}
}
assertNotReached('No consent confirmation element found.');
return '';
}
/** @return {!Array<string>} Text of the consent description elements. */
function getConsentDescription() {
const consentDescription =
Array.from(document.querySelectorAll('[consent-description]'))
.filter(element => element.clientWidth * element.clientHeight > 0)
.map(element => element.innerHTML.trim());
assert(consentDescription);
return consentDescription;
}
function onConfirm(e) {
chrome.send(
'confirm', [getConsentDescription(), getConsentConfirmation(e.path)]);
}
function onUndo(e) {
chrome.send('undo');
}
function onGoToSettings(e) {
chrome.send(
'goToSettings',
[getConsentDescription(), getConsentConfirmation(e.path)]);
}
function initialize() {
document.addEventListener('keydown', onKeyDown);
$('confirmButton').addEventListener('click', onConfirm);
$('undoButton').addEventListener('click', onUndo);
if (loadTimeData.getBoolean('isSyncAllowed')) {
$('settingsLink').addEventListener('click', onGoToSettings);
$('profile-picture').addEventListener('load', onPictureLoaded);
$('syncDisabledDetails').hidden = true;
} else {
$('syncConfirmationDetails').hidden = true;
}
// Prefer using |document.body.offsetHeight| instead of
// |document.body.scrollHeight| as it returns the correct height of the
// even when the page zoom in Chrome is different than 100%.
chrome.send('initializedWithSize', [document.body.offsetHeight]);
}
function clearFocus() {
document.activeElement.blur();
}
function setUserImageURL(url) {
if (loadTimeData.getBoolean('isSyncAllowed')) {
$('profile-picture').src = url;
}
}
function onPictureLoaded(e) {
if (loadTimeData.getBoolean('isSyncAllowed')) {
$('picture-container').classList.add('loaded');
}
}
function onKeyDown(e) {
// If the currently focused element isn't something that performs an action
// on "enter" being pressed and the user hits "enter", perform the default
// action of the dialog, which is "OK, Got It".
if (e.key == 'Enter' &&
!/^(A|PAPER-(BUTTON|CHECKBOX))$/.test(document.activeElement.tagName)) {
$('confirmButton').click();
e.preventDefault();
}
}
// TODO(scottchen): clearFocus and setUserImageURL are called directly by the
// C++ handler. C++ handlers should not be calling JS functions by name
// anymore. They should be firing events with FireWebuiListener and have the
// page itself decide whether to listen or not listen to the event.
return {
clearFocus: clearFocus,
initialize: initialize,
setUserImageURL: setUserImageURL
};
});
document.addEventListener('DOMContentLoaded', sync.confirmation.initialize);