| Index: chrome/browser/resources/login.js
|
| diff --git a/chrome/browser/resources/login.js b/chrome/browser/resources/login.js
|
| deleted file mode 100644
|
| index 9445b91711a18415b03978fbc5335b51476a5a7e..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/resources/login.js
|
| +++ /dev/null
|
| @@ -1,679 +0,0 @@
|
| -// Copyright (c) 2011 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.
|
| -
|
| -/**
|
| - * @fileoverview Login Screen
|
| - * This is the main code for the login screen.
|
| - */
|
| -
|
| -/**
|
| - * Simple common assertion API
|
| - * @param {*} condition The condition to test. Note that this may be used to
|
| - * test whether a value is defined or not, and we don't want to force a
|
| - * cast to Boolean.
|
| - * @param {string=} opt_message A message to use in any error.
|
| - */
|
| -function assert(condition, opt_message) {
|
| - if (condition)
|
| - return;
|
| -
|
| - var msg = 'Assertion failed';
|
| - if (opt_message)
|
| - msg = msg + ': ' + opt_message;
|
| - throw new Error(msg);
|
| -}
|
| -
|
| -var LoginScreen = (function() {
|
| - 'use strict';
|
| -
|
| - function LoginScreen() {
|
| - }
|
| -
|
| - LoginScreen.prototype = {
|
| - /**
|
| - * The guest card object
|
| - * @type {Slider|undefined}
|
| - * private
|
| - */
|
| - guestCard_: null,
|
| -
|
| - /**
|
| - * The Slider object to use for scrolling through users.
|
| - * @type {Slider|undefined}
|
| - */
|
| - slider_: null,
|
| -
|
| - /**
|
| - * Template to use for creating new 'user-card' elements
|
| - * @type {!Element|undefined}
|
| - */
|
| - userCardTemplate_: null,
|
| -
|
| - /**
|
| - * Indicates whether the shift key is down.
|
| - * @type {bool}
|
| - */
|
| - isShiftPressed_: false,
|
| -
|
| - /**
|
| - * Indicates whether the alt key is down.
|
| - * @type {bool}
|
| - */
|
| - isAltPressed_: false,
|
| -
|
| - /**
|
| - * Indicates whether the ctrl key is down.
|
| - * @type {bool}
|
| - */
|
| - isCtrlPressed_: false,
|
| -
|
| - /**
|
| - * Holds all event handlers tied to users (and so subject to removal when
|
| - * the user list is refreshed)
|
| - * @type {!EventTracker}
|
| - */
|
| - userEvents_: null,
|
| -
|
| - /**
|
| - * Removes all children of an element which have a given class in
|
| - * their classList.
|
| - * @param {!Element} element The parent element to examine.
|
| - * @param {string} className The class to look for.
|
| - */
|
| - removeChildrenByClassName_: function (element, className) {
|
| - var child = element.firstElementChild;
|
| - while (child) {
|
| - var prev = child;
|
| - child = child.nextElementSibling;
|
| - if (prev.classList.contains(className))
|
| - element.removeChild(prev);
|
| - }
|
| - },
|
| -
|
| - /**
|
| - * Search an elements ancestor chain for the nearest element that is a
|
| - * member of the specified class.
|
| - * @param {!Element} element The element to start searching from.
|
| - * @param {string} className The name of the class to locate.
|
| - * @return {Element} The first ancestor of the specified class or null.
|
| - */
|
| - getParentByClassName_: function(element, className) {
|
| - for (var e = element; e; e = e.parentElement) {
|
| - if (e.classList.contains(className))
|
| - return e;
|
| - }
|
| - return null;
|
| - },
|
| -
|
| - /**
|
| - * Create a new user element and attach it to the end of the slider.
|
| - * @param {!Element} parent The element where the user should be inserted.
|
| - * @param {!Object} user The user object to user box for.
|
| - */
|
| - addUser: function(parent, user, index) {
|
| - // Make a deep copy of the template and clear its ID
|
| - var containerElement = this.userCardTemplate_.cloneNode(true);
|
| - this.userCardTemplate_.id = null;
|
| -
|
| - var userElement = containerElement.getElementsByClassName('user')[0];
|
| - assert(userElement, 'Expected user-template to have a user child');
|
| - assert(typeof(user.name) == 'string',
|
| - 'Expected every user to have a name.');
|
| -
|
| - userElement.setAttribute('display-name', user.name);
|
| - userElement.setAttribute('user-name', user.emailAddress);
|
| - userElement.setAttribute('user-index', index);
|
| -
|
| - // Find the span element (if any) and fill it in with the app name
|
| - var span = userElement.querySelector('span');
|
| - if (span)
|
| - span.textContent = user.name;
|
| -
|
| - // Fill in the image
|
| - var userImg = userElement.getElementsByClassName('user-image')[0];
|
| - if (userImg) {
|
| - userImg.style.backgroundImage = "url('" + user.imageUrl + "')";
|
| - // We put a click handler just on the user image - so clicking on the
|
| - // margins between users doesn't do anything
|
| - var self = this;
|
| - this.userEvents_.add(userImg, 'click', function(e) {
|
| - self.userClick(e);
|
| - }, false);
|
| - }
|
| - var userLoginBox =
|
| - userElement.getElementsByClassName('user-login-box')[0];
|
| - var guestLoginBox =
|
| - userElement.getElementsByClassName('guest-login-box')[0];
|
| - var isGuest = !user.email_address;
|
| - if (!isGuest) {
|
| - containerElement.addEventListener(Slider.EventType.ACTIVATE,
|
| - this.userActivateCard);
|
| - containerElement.addEventListener(Slider.EventType.DEACTIVATE,
|
| - this.userDeactivateCard);
|
| -
|
| - var deleteButton =
|
| - userElement.getElementsByClassName('delete-button')[0];
|
| - deleteButton.addEventListener('click', this.userDeleteCard);
|
| -
|
| - userLoginBox.addEventListener('keypress', function(e) {
|
| - userLoginKeyPress(e, userElement);
|
| - });
|
| - } else {
|
| - this.guestCard_ = containerElement;
|
| -
|
| - containerElement.addEventListener(Slider.EventType.ACTIVATE,
|
| - this.guestActivateCard);
|
| - containerElement.addEventListener(Slider.EventType.DEACTIVATE,
|
| - this.guestDeactivateCard);
|
| -
|
| - userLoginBox.hidden = true;
|
| -
|
| - var loginButton =
|
| - guestLoginBox.getElementsByClassName('loginbutton')[0];
|
| - loginButton.addEventListener('click', function(e) {
|
| - chrome.send('launchIncognito', []);
|
| - // Don't allow the click to trigger a link or anything
|
| - e.preventDefault();
|
| - // Prevent the user-frame from receiving the event.
|
| - e.stopPropagation();
|
| - }, true);
|
| - }
|
| -
|
| - // Insert at the end of the provided page
|
| - parent.appendChild(containerElement);
|
| - // Display the container element
|
| - containerElement.hidden = false;
|
| - },
|
| -
|
| - /**
|
| - * Invoked when a user is clicked
|
| - * @param {Event} e The click event.
|
| - */
|
| - userClick: function(e) {
|
| - var target = e.currentTarget;
|
| - var user = this.getParentByClassName_(target, 'user');
|
| - assert(user, 'userClick should have been on a descendant of a user');
|
| -
|
| - var userIndex = user.getAttribute('user-index');
|
| - assert(userIndex, 'unexpected user without userIndex');
|
| -
|
| - if (this.slider.currentCardIndex == null) {
|
| - this.slider.currentCardIndex = userIndex;
|
| - } else {
|
| - // get out of user selected mode.
|
| - this.slider.currentCardIndex = null;
|
| - }
|
| -
|
| - // Don't allow the click to trigger a link or anything
|
| - e.preventDefault();
|
| - // Prevent the user-frame from receiving the event.
|
| - e.stopPropagation();
|
| - },
|
| -
|
| - /**
|
| - * Invoked when the selected user card changes
|
| - * @param {Event} e The selection changed event.
|
| - */
|
| - userFrameSelectionChanged: function(e) {
|
| - var userCards = $('user-list').getElementsByClassName('user-card');
|
| - for (var i = 0; i < userCards.length; i++) {
|
| - if (e.activeCardIndex == null || i == e.activeCardIndex) {
|
| - userCards[i].classList.remove('user-card-grayed');
|
| - } else {
|
| - userCards[i].classList.add('user-card-grayed');
|
| - }
|
| - }
|
| - },
|
| -
|
| - /**
|
| - * Invoked when the guest card is activated.
|
| - * @param {Event} e The Activate Card event
|
| - */
|
| - guestActivateCard: function(e) {
|
| - var card = e.target;
|
| - var user = card.getElementsByClassName('user')[0];
|
| -
|
| - // Focus the card.
|
| - user.classList.add('focus');
|
| -
|
| - assert(user, 'user element not found');
|
| -
|
| - // Hide the guest box.
|
| - var guestBox = user.querySelector('span');
|
| - guestBox.hidden = true;
|
| -
|
| - // This is a guest.
|
| - var guestLoginBox = user.getElementsByClassName('guest-login-box')[0];
|
| - assert(guestLoginBox, 'guest login box not found');
|
| - // Show the guest login box.
|
| - guestLoginBox.hidden = false;
|
| - },
|
| -
|
| - /**
|
| - * Invoked when the guest card is deactivated.
|
| - * @param {Event} e The Deactivate Card event
|
| - */
|
| - guestDeactivateCard: function(e) {
|
| - var card = e.target;
|
| - var user = card.getElementsByClassName('user')[0];
|
| - assert(user, 'user element not found');
|
| - // Show the guest box.
|
| - var guestBox = user.querySelector('span');
|
| - guestBox.hidden = false;
|
| - // Unfocus the card.
|
| - user.classList.remove('focus');
|
| - // Hide the guest login box
|
| - var guestLoginBox = user.getElementsByClassName('guest-login-box')[0];
|
| - assert(guestLoginBox, 'guest login box not found');
|
| - guestLoginBox.hidden = true;
|
| - },
|
| -
|
| - /**
|
| - * Invoked when the user card delete button is clicked
|
| - * @param {Event} e The Click event.
|
| - */
|
| - userDeleteCard: function(e) {
|
| - var deleteButton = e.target;
|
| - var userImageBorderBox = deleteButton.parentNode;
|
| - var userElement = userImageBorderBox.parentNode;
|
| - var userCard = userElement.parentNode;
|
| - $('user-list').removeChild(userCard);
|
| -
|
| - // Update the user indicies
|
| - var usersOnList = $('user-list').getElementsByClassName('user-card');
|
| - for (var userIndex = 0; userIndex < usersOnList.length; userIndex++) {
|
| - var uElement = usersOnList[userIndex].getElementsByClassName('user')[0];
|
| - uElement.setAttribute('user-index', userIndex);
|
| - }
|
| - this.updateSliderCards();
|
| -
|
| - chrome.send('removeUser', [getUserName(userElement)]);
|
| - },
|
| -
|
| - /**
|
| - * Invoked when the user card is activated.
|
| - * @param {Event} e The Activate Card event
|
| - */
|
| - userActivateCard: function(e) {
|
| - var card = e.target;
|
| - var user = card.getElementsByClassName('user')[0];
|
| - assert(user, 'user element not found');
|
| -
|
| - // Focus the card.
|
| - user.classList.add('focus');
|
| -
|
| - // Hide the email box.
|
| - var emailBox = user.querySelector('span');
|
| - emailBox.hidden = true;
|
| -
|
| - // Show the login box
|
| - var userLoginBox = user.getElementsByClassName('user-login-box')[0];
|
| - assert(userLoginBox, 'user login box not found');
|
| - userLoginBox.hidden = false;
|
| -
|
| - // Clear and focus the password box.
|
| - var passwordBox = userLoginBox.getElementsByClassName('passwordbox')[0];
|
| - assert(passwordBox, 'passwordBox element not found');
|
| - passwordBox.value = '';
|
| - passwordBox.focus();
|
| -
|
| - // Show the delete button.
|
| - var deleteButton = user.getElementsByClassName('delete-button')[0];
|
| - deleteButton.hidden = false;
|
| - },
|
| -
|
| - /**
|
| - * Invoked when the user card is deactivated.
|
| - * @param {Event} e The Deactivate Card event
|
| - */
|
| - userDeactivateCard: function(e) {
|
| - var card = e.target;
|
| - var user = card.getElementsByClassName('user')[0];
|
| - assert(user, 'user element not found');
|
| -
|
| - // Unfocus the card.
|
| - user.classList.remove('focus');
|
| -
|
| - // Hide the user login box
|
| - var userLoginBox = user.getElementsByClassName('user-login-box')[0];
|
| - assert(userLoginBox, 'user login box not found');
|
| - userLoginBox.hidden = true;
|
| -
|
| - // Show the email box.
|
| - var emailBox = user.querySelector('span');
|
| - emailBox.hidden = false;
|
| -
|
| - // Hide the delete button.
|
| - var deleteButton = user.getElementsByClassName('delete-button')[0];
|
| - deleteButton.hidden = true;
|
| - },
|
| -
|
| - /**
|
| - * Invoked whenever the users in user-list have changed so that
|
| - * the Slider knows about the new elements.
|
| - */
|
| - updateSliderCards: function() {
|
| - var userCards = $('user-list').getElementsByClassName('user-card');
|
| - var cardArray = [];
|
| - for (var i = 0; i < userCards.length; i++)
|
| - cardArray[i] = userCards[i];
|
| - this.slider.setCards(cardArray, 0);
|
| - },
|
| -
|
| - getUsersCallback: function(users) {
|
| - this.userEvents_.removeAll();
|
| - // grab the add-user-card before we remove it from the list.
|
| - var addUserCard = $('add-user-card');
|
| - // remove all user cards
|
| - this.removeChildrenByClassName_($('user-list'), 'user-card');
|
| -
|
| - // Add the "Add User" card to the user list.
|
| - $('user-list').appendChild(addUserCard);
|
| - // Add the users to the user list.
|
| - for (var i = 0; i < users.length; i++) {
|
| - var user = users[i];
|
| - this.addUser($('user-list'), user, i + 1);
|
| - }
|
| -
|
| - // Tell the slider about the pages
|
| - this.updateSliderCards();
|
| -
|
| - var dummy = $('user-frame').offsetWidth;
|
| - $('user-frame').style.visibility = 'visible';
|
| - },
|
| -
|
| - /**
|
| - * Returns the 'display-name' attribute of a 'user' element.
|
| - * @param {!Element} element The 'user' element.
|
| - */
|
| - getDisplayName: function(userElement) {
|
| - // TODO: verify type of user element
|
| - return userElement.getAttribute('display-name');
|
| - },
|
| -
|
| - /**
|
| - * Returns the 'user-name' attribute of a 'user' element.
|
| - * @param {!Element} element The 'user' element.
|
| - */
|
| - getUserName: function(userElement) {
|
| - // TODO: verify type of user element
|
| - return userElement.getAttribute('user-name');
|
| - },
|
| -
|
| - /**
|
| - * Handles keyboard navigation of the login screen.
|
| - * @param {!Event} element The keypress event.
|
| - */
|
| - userLoginKeyPress: function(e, userElement) {
|
| - if (e.keyCode == 13) {
|
| - e.preventDefault();
|
| - assert(userElement.classList.contains('user'),
|
| - 'The parent element is not a user element.');
|
| -
|
| - var userImg = userElement.getElementsByClassName('user-image')[0];
|
| - var userLoginBox =
|
| - userElement.getElementsByClassName('user-login-box')[0];
|
| - var passwordBox = userLoginBox.getElementsByClassName('passwordbox')[0];
|
| -
|
| - var userName = getUserName(userElement);
|
| - var password = passwordBox.value;
|
| - if (password.length > 0) {
|
| - chrome.send('authenticateUser', [userName, password]);
|
| - return false;
|
| - }
|
| - }
|
| - return true;
|
| - },
|
| -
|
| - loginKeyDown: function(e) {
|
| - switch (e.keyCode) {
|
| - // shift key down
|
| - case 16:
|
| - this.isShiftPressed_ = true;
|
| - break;
|
| - // ctrl key down
|
| - case 17:
|
| - this.isCtrlPressed_ = true;
|
| - break;
|
| - // alt key down
|
| - case 18:
|
| - this.isAltPressed_ = true;
|
| - break;
|
| - }
|
| - var keystroke = String.fromCharCode(e.keyCode);
|
| - switch (keystroke) {
|
| - case 'U':
|
| - if (this.isAltPressed_) {
|
| - this.slider.currentCardIndex = 0;
|
| - // focus the email box.
|
| - var emailBox =
|
| - $('add-user-card').getElementsByClassName('emailbox')[0];
|
| - assert(emailBox, 'Add User e-mail box not found');
|
| - emailBox.focus();
|
| - }
|
| - break;
|
| - case 'P':
|
| - if (this.isAltPressed_) {
|
| - if (this.slider.currentCard == null) {
|
| - this.slider.currentCardIndex = 0;
|
| - }
|
| - var passwordBox =
|
| - this.slider.currentCard.getElementsByClassName('passwordbox')[0];
|
| - assert(passwordBox, 'password box not found');
|
| - passwordBox.focus();
|
| - }
|
| - break;
|
| - case 'B':
|
| - if (this.isAltPressed_) {
|
| - var guestElement =
|
| - this.guestCard_.getElementsByClassName('user')[0];
|
| - var guestIndex = guestElement.getAttribute('user-index');
|
| - assert(guestIndex, 'unexpected user without userIndex');
|
| - this.slider.currentCardIndex = guestIndex;
|
| - setTimeout(function() {
|
| - // TODO(fsamuel): Make this call a common function.
|
| - chrome.send('launchIncognito', []);
|
| - }, 50);
|
| - }
|
| - break;
|
| - default:
|
| - switch (e.keyCode) {
|
| - // enter pressed.
|
| - case 13:
|
| - if (this.slider.currentCard == guestCard_) {
|
| - // TODO(fsamuel): Enter Incognito mode
|
| - }
|
| - break;
|
| - // escape pressed.
|
| - case 27:
|
| - // If we pressed the escape key then don't select any user.
|
| - this.slider.currentCardIndex = null;
|
| - break;
|
| - // left arrow pressed.
|
| - case 37:
|
| - if (this.slider.currentCardIndex == null) {
|
| - // TODO(fsamuel): This should be go to last active card + 1
|
| - this.slider.currentCardIndex = this.slider.cardCount() - 1;
|
| - } else if (this.slider.currentCardIndex > 0) {
|
| - this.slider.currentCardIndex -= 1;
|
| - }
|
| - break;
|
| - // right arrow pressed.
|
| - case 39:
|
| - if (this.slider.currentCardIndex == null) {
|
| - // TODO(fsamuel): This should be go to last active card - 1
|
| - this.slider.currentCardIndex = 0;
|
| - } else if (this.slider.currentCardIndex <
|
| - this.slider.cardCount() - 1) {
|
| - this.slider.currentCardIndex += 1;
|
| - }
|
| - break;
|
| - } // switch
|
| - } // switch
|
| - },
|
| -
|
| - loginKeyUp: function(e) {
|
| - switch (e.keyCode) {
|
| - // shift key up.
|
| - case 16:
|
| - this.isShiftPressed_ = false;
|
| - break;
|
| - // ctrl key up.
|
| - case 17:
|
| - this.isCtrlPressed_ = false;
|
| - break;
|
| - // alt key up.
|
| - case 18:
|
| - this.isAltPressed_ = false;
|
| - break;
|
| - }
|
| - },
|
| -
|
| - /**
|
| - * Creates the Add User card and inserts it into the slider.
|
| - * TODO(fsamuel): This is here only temporarily. We should eventually remove
|
| - * this card.
|
| - */
|
| - initializeAddUserCard: function(e) {
|
| - var emailBox = $('add-user-card').getElementsByClassName('emailbox')[0];
|
| - assert(emailBox, 'Add User e-mail box not found');
|
| - var passwordBox =
|
| - $('add-user-card').getElementsByClassName('passwordbox')[0];
|
| - assert(passwordBox, 'Add User password box not found');
|
| -
|
| - var user = $('add-user-card').getElementsByClassName('user')[0];
|
| - // Clicking the Add User icon hides the icon and shows
|
| - // the user name and password input boxes
|
| - var self = this;
|
| - $('add-user').addEventListener('click', function(e) {
|
| - self.userClick(e);
|
| - });
|
| - $('add-user-card').addEventListener(Slider.EventType.ACTIVATE,
|
| - function(e) {
|
| - //$('add-user-spacer').style.display = 'block';
|
| - // Focus the card.
|
| - user.classList.add('focus');
|
| -
|
| - // Hide the Add User Icon, and show the input boxes.
|
| - $('add-user').parentNode.hidden = true;
|
| - $('add-user-box').hidden = false;
|
| -
|
| - // Focus the email box and clear the password box.
|
| - emailBox.focus();
|
| - passwordBox.value = '';
|
| - }, false);
|
| -
|
| - $('add-user-card').addEventListener(Slider.EventType.DEACTIVATE,
|
| - function(e) {
|
| - //$('add-user-spacer').style.display = 'none';
|
| - // Unfocus the card.
|
| - user.classList.remove('focus');
|
| -
|
| - $('add-user').parentNode.hidden = false;
|
| - $('add-user-box').hidden = true;
|
| - document.body.focus();
|
| - }, false);
|
| -
|
| - // Prevent blurring of a textfield if focus is shifted to the body.
|
| - // This makes sure that the keyboard remains up until we hide the
|
| - // Add User box.
|
| - var focusedElement = null;
|
| - emailBox.addEventListener('focus', function(e) {
|
| - focusedElement = emailBox;
|
| - });
|
| - passwordBox.addEventListener('focus', function(e) {
|
| - focusedElement = passwordBox;
|
| - });
|
| - document.body.addEventListener('focus', function(e) {
|
| - if (focusedElement) {
|
| - focusedElement.focus();
|
| - e.preventDefault();
|
| - }
|
| - });
|
| -
|
| - // Prevent the slider from receiving click events and canceling
|
| - // the Add User card.
|
| - $('add-user-box').addEventListener('click', function(e) {
|
| - e.preventDefault();
|
| - e.stopPropagation();
|
| - }, false);
|
| -
|
| - emailBox.addEventListener('keypress', function(e) {
|
| - e.stopPropagation();
|
| - if (e.keyCode == 13) {
|
| - if (emailBox.value.length > 0) {
|
| - passwordBox.focus();
|
| - }
|
| - }
|
| - });
|
| -
|
| - passwordBox.addEventListener('keypress', function(e) {
|
| - if (e.keyCode == 13) {
|
| - chrome.send('authenticateUser', [emailBox.value, passwordBox.value]);
|
| - }
|
| - }, true);
|
| - },
|
| -
|
| - initialize: function() {
|
| - this.userEvents_ = new EventTracker();
|
| - // Request data on the users so we can fill them in.
|
| - // Note that this is kicked off asynchronously. 'getUsersCallback' will
|
| - // be invoked at some point after this function returns.
|
| - chrome.send('getUsers');
|
| -
|
| - // Prevent touch events from triggering any sort of native scrolling
|
| - document.addEventListener('touchmove', function(e) {
|
| - e.preventDefault();
|
| - }, true);
|
| -
|
| - this.userCardTemplate_ = $('user-template');
|
| - this.userCardTemplate_.id = null;
|
| - $('user-list').removeChild(this.userCardTemplate_);
|
| - $('user-frame').addEventListener(Slider.EventType.SELECTION_CHANGED,
|
| - this.userFrameSelectionChanged);
|
| -
|
| - // Initialize the slider without any cards at the moment
|
| - this.slider = new Slider($('user-frame'), $('user-list'), []);
|
| - this.slider.initialize();
|
| -
|
| - this.initializeAddUserCard();
|
| -
|
| - // Bind on bubble phase
|
| - var self = this;
|
| - $('user-frame').addEventListener('click', function() {
|
| - self.slider.currentCardIndex = null;
|
| - }, false);
|
| - document.addEventListener('keydown', function(e) {
|
| - self.loginKeyDown(e);
|
| - }, true);
|
| - document.addEventListener('keyup', function(e) {
|
| - self.loginKeyUp(e);
|
| - }, true);
|
| - }
|
| - };
|
| -
|
| - return LoginScreen;
|
| -})();
|
| -
|
| -
|
| -var getUsersCallback = null;
|
| -
|
| -document.addEventListener('DOMContentLoaded', function() {
|
| - var loginScreenObj = new LoginScreen();
|
| - getUsersCallback = function(users) {
|
| - // call with the appropriate this.
|
| - loginScreenObj.getUsersCallback(users);
|
| - }
|
| - loginScreenObj.initialize();
|
| -}, false);
|
| -
|
| -// Disable text selection.
|
| -document.onselectstart = function(e) {
|
| - e.preventDefault();
|
| -}
|
| -
|
| -// Disable dragging.
|
| -document.ondragstart = function(e) {
|
| - e.preventDefault();
|
| -}
|
|
|