summaryrefslogtreecommitdiffstats
path: root/remoting/client/extension/client.js
diff options
context:
space:
mode:
authorajwong@chromium.org <ajwong@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-02-24 23:13:21 +0000
committerajwong@chromium.org <ajwong@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-02-24 23:13:21 +0000
commit999d862cc8675b78fdeab5b0a4b1689b0505f276 (patch)
tree316c8f12dc260addddf029fb249a286d3b68cc82 /remoting/client/extension/client.js
parent6ee62b63cec739d231bf451168219576df623e20 (diff)
downloadchromium_src-999d862cc8675b78fdeab5b0a4b1689b0505f276.zip
chromium_src-999d862cc8675b78fdeab5b0a4b1689b0505f276.tar.gz
chromium_src-999d862cc8675b78fdeab5b0a4b1689b0505f276.tar.bz2
Redo the Chromoting extension as an app-engine app.
This will allow for an easier develop/deploy cycle in the short term, which will facilitate development. BUG=none TEST=none Review URL: http://codereview.chromium.org/6580022 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@75987 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'remoting/client/extension/client.js')
-rw-r--r--remoting/client/extension/client.js368
1 files changed, 0 insertions, 368 deletions
diff --git a/remoting/client/extension/client.js b/remoting/client/extension/client.js
deleted file mode 100644
index 3ff12ac..0000000
--- a/remoting/client/extension/client.js
+++ /dev/null
@@ -1,368 +0,0 @@
-// Copyright (c) 2010 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.
-
-// Flag to indicate whether or not to show offline hosts in the host list.
-chromoting.showOfflineHosts = true;
-
-// String to identify bad auth tokens.
-var BAD_AUTH_TOKEN = 'bad_token';
-
-// Number of days before auth token cookies expire.
-// TODO(garykac): 21 days is arbitrary. Need to change this to the appropriate
-// value from security review.
-var AUTH_EXPIRES = 21;
-
-function init() {
- updateLoginStatus();
-
- // Defer getting the host list for a little bit so that we don't
- // block the display of the extension popup.
- window.setTimeout(populateHostList, 100);
-
- var showOff = getCookie('offline');
- chromoting.showOfflineHosts = (!showOff || showOff == '1');
- updateShowOfflineCheckbox();
-}
-
-function updateShowOfflineHosts(cbox) {
- chromoting.showOfflineHosts = cbox.checked;
-
- // Save pref in cookie with long expiration.
- setCookie('offline', chromoting.showOfflineHosts ? '1' : '0', 1000);
-
- populateHostList();
-}
-
-function updateShowOfflineCheckbox() {
- var cbox = document.getElementById('show_offline');
- cbox.checked = chromoting.showOfflineHosts;
-}
-
-// Update the login status region (at the bottom of the popup) with the
-// current account and links to sign in/out.
-function updateLoginStatus() {
- var username = getCookie('username');
-
- var loginDiv = document.getElementById('login_div');
- clear(loginDiv);
-
- if (!username) {
- var signinLink = document.createElement('a');
- signinLink.setAttribute('href', 'javascript:showDirectoryLogin();');
- signinLink.appendChild(document.createTextNode('Sign In'));
- loginDiv.appendChild(signinLink);
- } else {
- var email = document.createElement('span');
- email.setAttribute('class', 'login_email');
- email.appendChild(document.createTextNode(username));
- loginDiv.appendChild(email);
-
- loginDiv.appendChild(document.createTextNode(' | '));
-
- var signoutLink = document.createElement('a');
- signoutLink.setAttribute('href', 'javascript:logoutAndReload(this.form);');
- signoutLink.appendChild(document.createTextNode('Sign Out'));
- loginDiv.appendChild(signoutLink);
- }
-}
-
-// Sign out the current user and reload the host list.
-function logoutAndReload(form) {
- logout();
- populateHostList();
-}
-
-// Sign out the current user by erasing the auth cookies.
-function logout() {
- setCookie('username', '', AUTH_EXPIRES);
- setCookie('chromoting_auth', '', AUTH_EXPIRES);
- setCookie('xmpp_auth', '', AUTH_EXPIRES);
-
- updateLoginStatus();
-}
-
-// Sign in to Chromoting Directory services.
-function showDirectoryLogin() {
- document.getElementById("login_panel").style.display = "block";
-}
-
-function login() {
- var username = document.getElementById("username").value;
- var password = document.getElementById("password").value;
-
- doLogin(username, password, checkLogin);
-}
-
-// Check to see if the login was successful.
-function checkLogin() {
- var username = getCookie('username');
- var cauth = getCookie('chromoting_auth');
- var xauth = getCookie('xmpp_auth');
-
- // Verify login and show login status.
- if (cauth == BAD_AUTH_TOKEN || xauth == BAD_AUTH_TOKEN) {
- // Erase the username cookie.
- setCookie('username', '', AUTH_EXPIRES);
- showLoginError("Sign in failed!");
- } else {
- // Successful login - update status and update host list.
- updateLoginStatus();
- populateHostList();
-
- // Hide login dialog and clear out values.
- document.getElementById('login_panel').style.display = "none";
- document.getElementById('username').value = "";
- document.getElementById('password').value = "";
- }
-}
-
-function doLogin(username, password, done) {
- // Don't call |done| callback until both login requests have completed.
- var count = 2;
- var barrier = function() {
- count--;
- if (done && count == 0) {
- done();
- }
- }
- setCookie('username', username, AUTH_EXPIRES);
- doGaiaLogin(username, password, 'chromoting',
- function(cAuthToken) {
- setCookie('chromoting_auth', cAuthToken, AUTH_EXPIRES);
- barrier();
- });
- doGaiaLogin(username, password, 'chromiumsync',
- function(xAuthToken) {
- setCookie('xmpp_auth', xAuthToken, AUTH_EXPIRES);
- barrier();
- });
-}
-
-function doGaiaLogin(username, password, service, done) {
- var xhr = new XMLHttpRequest();
- xhr.open('POST', 'https://www.google.com/accounts/ClientLogin', true);
- xhr.onreadystatechange = function() {
- if (xhr.readyState != 4) {
- return;
- }
- if (xhr.status = 200) {
- done(extractAuthToken(xhr.responseText));
- } else {
- console.log('Bad status on auth: ' + xhr.statusText);
- }
- };
-
- xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
- xhr.send('accountType=HOSTED_OR_GOOGLE&Email=' +
- encodeURIComponent(username) + '&Passwd=' +
- encodeURIComponent(password) + '&service=' +
- encodeURIComponent(service) + '&source=chromoclient');
-}
-
-function showLoginError() {
- var errorDiv = document.getElementById('errormsg_div');
- clear(errorDiv);
-
- errorDiv.appendChild(document.createTextNode(
- "The username or password you entered is incorrect ["));
-
- var helpLink = document.createElement('a');
- helpLink.setAttribute('href',
- 'http://www.google.com/support/accounts/bin/answer.py?answer=27444');
- helpLink.setAttribute('target', '_blank');
- helpLink.appendChild(document.createTextNode('?'));
- errorDiv.appendChild(helpLink);
-
- errorDiv.appendChild(document.createTextNode("]"));
-}
-
-function extractAuthToken(message) {
- var lines = message.split('\n');
- for (var i = 0; i < lines.length; i++) {
- if (lines[i].match('^Auth=.*')) {
- return lines[i].split('=')[1];
- }
- }
-
- console.log('Could not parse auth token in : "' + message + '"');
- return BAD_AUTH_TOKEN;
-}
-
-// Open a chromoting connection in a new tab.
-function openChromotingTab(hostName, hostJid) {
- var background = chrome.extension.getBackgroundPage();
- background.openChromotingTab(hostName, hostJid);
-}
-
-// Erase the content of the specified element.
-function clear(e) {
- e.innerHTML = '';
-}
-
-// Clear out the specified element and show the message to the user.
-function displayMessage(e, classname, message) {
- clear(e);
- appendMessage(e, classname, message);
-}
-
-// Append the message text to the specified element.
-function appendMessage(e, classname, message) {
- var p = document.createElement('p');
- if (classname.length != 0) {
- p.setAttribute('class', classname);
- }
-
- p.appendChild(document.createTextNode(message));
-
- e.appendChild(p);
-}
-
-function populateHostList() {
- var username = getCookie('username');
-
- var hostlistDiv = document.getElementById('hostlist_div');
- if (!username) {
- displayMessage(hostlistDiv, 'message',
- 'Please sign in to see a list of available hosts.');
- return;
- }
-
- var xhr = new XMLHttpRequest();
- var token = getCookie('chromoting_auth');
-
- // Unhide host list.
- hostlistDiv.style.display = "block";
-
- xhr.onreadystatechange = function() {
- if (xhr.readyState == 1) {
- displayMessage(hostlistDiv, 'message', 'Loading host list for ' +
- username);
- }
- if (xhr.readyState != 4) {
- return;
- }
- if (xhr.status == 200) {
- var parsed_response = JSON.parse(xhr.responseText);
- appendHostLinks(parsed_response.data.items);
- } else {
- var errorResponse = JSON.parse(xhr.responseText);
-
- console.log('Error: Bad status on host list query: "' +
- xhr.status + ' ' + xhr.statusText);
- console.log('Error code ' + errorResponse.error.code);
- console.log('Error message ' + errorResponse.error.message);
-
- clear(hostlistDiv);
- if (errorResponse.error.message == "Token expired") {
- appendMessage(hostlistDiv, 'message',
- 'The authentication token for ' + username +
- ' has expired. Please sign in again.');
- logout();
- } else if (errorResponse.error.message == "Token invalid") {
- appendMessage(hostlistDiv, 'message',
- 'Invalid authentication token for ' + username + '. ' +
- 'Please sign in again.');
- logout();
- } else {
- appendMessage(hostlistDiv, 'message',
- 'Unable to load host list for ' + username + '. ' +
- 'Please try again later.');
- appendMessage(hostlistDiv, 'message',
- 'Error code: ' + errorResponse.error.code);
- appendMessage(hostlistDiv, 'message',
- 'Message: ' + errorResponse.error.message);
- }
- }
- };
-
- xhr.open('GET', 'https://www.googleapis.com/chromoting/v1/@me/hosts');
- xhr.setRequestHeader('Content-Type', 'text/plain;charset=UTF-8');
- xhr.setRequestHeader('Authorization', 'GoogleLogin auth=' + token);
- xhr.send(null);
-}
-
-// Populate the 'hostlist_div' element with the list of hosts for this user.
-function appendHostLinks(hostlist) {
- var hostlistDiv = document.getElementById('hostlist_div');
-
- // Clear the div before adding the host info.
- clear(hostlistDiv);
-
- var numHosts = 0;
- var numOfflineHosts = 0;
-
- // Add the hosts.
- // TODO(garykac): We should have some sort of MRU list here or have
- // the Chromoting Directory provide a MRU list.
- // First, add all of the connected hosts.
- for (var i = 0; i < hostlist.length; ++i) {
- if (hostlist[i].status == "ONLINE") {
- hostlistDiv.appendChild(addHostInfo(hostlist[i]));
- numHosts++;
- }
- }
- // Add non-online hosts at the end.
- for (var i = 0; i < hostlist.length; ++i) {
- if (hostlist[i].status != "ONLINE") {
- if (chromoting.showOfflineHosts == 1) {
- hostlistDiv.appendChild(addHostInfo(hostlist[i]));
- numHosts++;
- }
- numOfflineHosts++;
- }
- }
-
- if (numHosts == 0) {
- var message;
- if (numOfflineHosts == 0) {
- message = 'No hosts available.';
- } else {
- message = 'No online hosts available (' +
- numOfflineHosts + ' offline hosts).';
- }
- message += ' See LINK for info on how to set up a new host.';
- displayMessage(hostlistDiv, 'message', message);
- }
-}
-
-// Create a single host description element.
-function addHostInfo(host) {
- var hostEntry = document.createElement('div');
- hostEntry.setAttribute('class', 'hostentry');
-
- var hostIcon = document.createElement('img');
- hostIcon.setAttribute('src', 'machine.png');
- hostIcon.setAttribute('class', 'hosticon');
- hostEntry.appendChild(hostIcon);
-
- if (host.status == 'ONLINE') {
- var span = document.createElement('span');
- span.setAttribute('class', 'connect');
- var connect = document.createElement('input');
- connect.setAttribute('type', 'button');
- connect.setAttribute('value', 'Connect');
- connect.setAttribute('onclick', "openChromotingTab('" + host.hostName +
- "', '" + host.jabberId + "'); return false;");
- span.appendChild(connect);
- hostEntry.appendChild(span);
- }
-
- var hostName = document.createElement('p');
- hostName.setAttribute('class', 'hostindent hostname');
- hostName.appendChild(document.createTextNode(host.hostName));
- hostEntry.appendChild(hostName);
-
- var hostStatus = document.createElement('p');
- hostStatus.setAttribute('class', 'hostindent hostinfo hoststatus_' +
- ((host.status == 'ONLINE') ? 'good' : 'bad'));
- hostStatus.appendChild(document.createTextNode(host.status));
- hostEntry.appendChild(hostStatus);
-
- var hostInfo = document.createElement('p');
- hostInfo.setAttribute('class', 'hostindent hostinfo');
- hostInfo.appendChild(document.createTextNode(host.jabberId));
- hostEntry.appendChild(hostInfo);
-
- return hostEntry;
-}