| Index: remoting/client/extension/client.js
|
| diff --git a/remoting/client/extension/client.js b/remoting/client/extension/client.js
|
| index dd53cf3c0e70168bd52acc6bee10de7f859778da..138d0149d144e7a8b57c82d52500b1a22ada3fb6 100644
|
| --- a/remoting/client/extension/client.js
|
| +++ b/remoting/client/extension/client.js
|
| @@ -2,65 +2,100 @@
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| -function initParams() {
|
| - var hash;
|
| - var hashes = window.location.href.slice(
|
| - window.location.href.indexOf('?') + 1).split('&');
|
| -
|
| - // Prepopulate via cookies first.
|
| - document.getElementById('xmpp_auth').value = getCookie('xmpp_auth');
|
| - document.getElementById('chromoting_auth').value =
|
| - getCookie('chromoting_auth');
|
| - document.getElementById('username').value = getCookie('username');
|
| -
|
| - for(var i = 0; i < hashes.length; i++)
|
| - {
|
| - hash = hashes[i].split('=');
|
| - if (hash[0] == 'xmpp_auth') {
|
| - document.getElementById('xmpp_auth').value = hash[1];
|
| - setCookie('xmpp_auth', hash[1]);
|
| -
|
| - } else if (hash[0] == "chromoting_auth") {
|
| - document.getElementById('chromoting_auth').value = hash[1];
|
| - setCookie('chromoting_auth', hash[1]);
|
| -
|
| - } else if (hash[0] == 'username') {
|
| - document.getElementById('username').value = hash[1];
|
| - setCookie('username', hash[1]);
|
| -
|
| - } else if (hash[0] == 'password') {
|
| - document.getElementById('password').value = hash[1];
|
| -
|
| - } else if (hash[0] == 'host_jid') {
|
| - document.getElementById('host_jid').value = hash[1];
|
| - }
|
| - }
|
| +var BAD_AUTH_TOKEN = 'bad_token';
|
| +
|
| +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(listHosts, 100);
|
| }
|
|
|
| -function findHosts(form) {
|
| - // If either cookie is missing, login first.
|
| - if (getCookie('chromoting_auth') == null ||
|
| - getCookie('xmpp_auth') == null) {
|
| - doLogin(form.username.value, form.username.password, doListHosts);
|
| +// 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:window.open('login.html', 'Sign In', " +
|
| + "'width=400,height=200,scrollbars=no'); return false;");
|
| + signinLink.appendChild(document.createTextNode('Sign In'));
|
| + loginDiv.appendChild(signinLink);
|
| } else {
|
| - doListHosts();
|
| + 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:logout(this.form);');
|
| + signoutLink.appendChild(document.createTextNode('Sign Out'));
|
| + loginDiv.appendChild(signoutLink);
|
| }
|
| }
|
|
|
| +// Sign out the current user by erasing the auth cookies.
|
| +function logout(form) {
|
| + setCookie('username', '', 100);
|
| + setCookie('chromoting_auth', '', 100);
|
| + setCookie('xmpp_auth', '', 100);
|
| +
|
| + updateLoginStatus();
|
| + listHosts();
|
| +}
|
| +
|
| function login(form) {
|
| - doLogin(form.username.value, form.password.value);
|
| + var status = document.getElementById('login_status');
|
| + clear(status);
|
| + doLogin(form.username.value, form.password.value, checkLogin);
|
| }
|
|
|
| -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];
|
| +// 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.
|
| + var status = document.getElementById('login_status');
|
| + if (cauth == BAD_AUTH_TOKEN || xauth == BAD_AUTH_TOKEN) {
|
| + appendMessage(status, '', 'Sign in failed!');
|
| + if (username) {
|
| + setCookie('username', '', 100);
|
| }
|
| + } else {
|
| + appendMessage(status, '', 'Successfully signed in as ' + username);
|
| }
|
| +}
|
|
|
| - console.log('Could not parse auth token in : "' + message + '"');
|
| - return 'bad_token';
|
| +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, 100);
|
| + doGaiaLogin(username, password, 'chromoting',
|
| + function(cAuthToken) {
|
| + setCookie('chromoting_auth', cAuthToken, 100);
|
| + barrier();
|
| + });
|
| + doGaiaLogin(username, password, 'chromiumsync',
|
| + function(xAuthToken) {
|
| + setCookie('xmpp_auth', xAuthToken, 100);
|
| + barrier();
|
| + });
|
| }
|
|
|
| function doGaiaLogin(username, password, service, done) {
|
| @@ -82,54 +117,90 @@ function doGaiaLogin(username, password, service, done) {
|
| password + '&service=' + service + '&source=chromoclient');
|
| }
|
|
|
| -function doLogin(username, password, done) {
|
| - var count = 2;
|
| - var barrier = function() {
|
| - count--;
|
| - if (done && count == 0) {
|
| - done();
|
| +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];
|
| }
|
| }
|
| - setCookie('username', username, 100);
|
| - doGaiaLogin(username, password, 'chromoting',
|
| - function(token1) {
|
| - setCookie('chromoting_auth', token1, 100);
|
| - document.getElementById('chromoting_auth').value = token1;
|
| - barrier();
|
| - });
|
| - doGaiaLogin(username, password, 'chromiumsync',
|
| - function(token) {
|
| - setCookie('xmpp_auth', token, 100);
|
| - document.getElementById('xmpp_auth').value = token;
|
| - barrier();
|
| - });
|
| +
|
| + console.log('Could not parse auth token in : "' + message + '"');
|
| + return BAD_AUTH_TOKEN;
|
| +}
|
| +
|
| +// Open a chromoting connection in a new tab.
|
| +function openChromotingTab(host_jid) {
|
| + var background = chrome.extension.getBackgroundPage();
|
| + background.openChromotingTab(host_jid);
|
| +}
|
| +
|
| +// 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);
|
| }
|
|
|
| -function doListHosts() {
|
| +// 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 listHosts() {
|
| + 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.
|
| - var hostlist_div = document.getElementById('hostlist_div');
|
| - hostlist_div.style.display = "block";
|
| + hostlistDiv.style.display = "block";
|
|
|
| xhr.onreadystatechange = function() {
|
| if (xhr.readyState == 1) {
|
| - hostlist_div.appendChild(document.createTextNode('Finding..'));
|
| - hostlist_div.appendChild(document.createElement('br'));
|
| + displayMessage(hostlistDiv, 'message', 'Loading host list for ' +
|
| + username);
|
| }
|
| if (xhr.readyState != 4) {
|
| return;
|
| }
|
| if (xhr.status == 200) {
|
| - parsed_response = JSON.parse(xhr.responseText);
|
| - hostlist_div.appendChild(document.createTextNode('--Found Hosts--'));
|
| - hostlist_div.appendChild(document.createElement('br'));
|
| + var parsed_response = JSON.parse(xhr.responseText);
|
| appendHostLinks(parsed_response.data.items);
|
| } else {
|
| - console.log('bad status on host list query: "' + xhr.status + ' ' +
|
| - xhr.statusText);
|
| - hostlist_div.appendChild(document.createTextNode('!! Failed !!. :\'('));
|
| + 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);
|
| + 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);
|
| }
|
| };
|
|
|
| @@ -139,47 +210,64 @@ function doListHosts() {
|
| xhr.send(null);
|
| }
|
|
|
| +// Populate the 'hostlist_div' element with the list of hosts for this user.
|
| function appendHostLinks(hostlist) {
|
| - // A host link entry should look like:
|
| - // - Host: <a onclick="openChromotingTab(host_jid); return false;">
|
| - // NAME (JID) </a> <br />
|
| - var host;
|
| - var host_link;
|
| - var hostlist_div = document.getElementById('hostlist_div');
|
| + var hostlistDiv = document.getElementById('hostlist_div');
|
|
|
| - // Cleanup the div
|
| - hostlist_div.innerHTML = "";
|
| + // Clear the div before adding the host info.
|
| + clear(hostlistDiv);
|
|
|
| // Add the hosts.
|
| - for(var i = 0; i < hostlist.length; ++i) {
|
| - hostlist_div.appendChild(document.createTextNode('-*- Host: '));
|
| - host = hostlist[i];
|
| - host_link = document.createElement('a');
|
| - // TODO(ajwong): Reenable once we figure out how to control a new tab.
|
| - host_link.setAttribute('onclick', 'openChromotingTab(\'' + host.jabberId +
|
| - '\'); return false;');
|
| - host_link.setAttribute('href', 'javascript:void(0)');
|
| - host_link.appendChild(
|
| - document.createTextNode(host.hostName + ' (' + host.hostId + ', ' +
|
| - host.jabberId + ')'));
|
| - hostlist_div.appendChild(host_link);
|
| - hostlist_div.appendChild(document.createElement('br'));
|
| + // TODO(garykac): We should have some sort of MRU list here.
|
| + // 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]));
|
| + }
|
| + }
|
| + // Add non-online hosts at the end.
|
| + for (var i = 0; i < hostlist.length; ++i) {
|
| + if (hostlist[i].status != "ONLINE") {
|
| + hostlistDiv.appendChild(addHostInfo(hostlist[i]));
|
| + }
|
| }
|
| }
|
|
|
| -function connect(form) {
|
| - openChromotingTab(form.host_jid);
|
| -}
|
| +// Create a single host description element.
|
| +function addHostInfo(host) {
|
| + var hostEntry = document.createElement('div');
|
| + hostEntry.setAttribute('class', 'hostentry');
|
|
|
| -function openChromotingTab(host_jid) {
|
| - var background = chrome.extension.getBackgroundPage();
|
| - background.openChromotingTab(host_jid);
|
| -}
|
| + var hostIcon = document.createElement('img');
|
| + hostIcon.setAttribute('src', 'machine.png');
|
| + hostIcon.setAttribute('class', 'hosticon');
|
| + hostEntry.appendChild(hostIcon);
|
| +
|
| + 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.jabberId +
|
| + '\'); return false;');
|
| + span.appendChild(connect);
|
| + hostEntry.appendChild(span);
|
| +
|
| + var hostName = document.createElement('p');
|
| + hostName.setAttribute('class', 'hostname');
|
| + hostName.appendChild(document.createTextNode(host.hostName));
|
| + hostEntry.appendChild(hostName);
|
| +
|
| + var hostStatus = document.createElement('p');
|
| + hostStatus.setAttribute('class', 'hostinfo hoststatus_' +
|
| + ((host.status == 'ONLINE') ? 'good' : 'bad'));
|
| + hostStatus.appendChild(document.createTextNode(host.status));
|
| + hostEntry.appendChild(hostStatus);
|
|
|
| -function setAuthCookies(form) {
|
| - var now = new Date();
|
| - now.setTime(now.getTime() + 1000 * 60 * 60 * 24 * 365)
|
| + var hostInfo = document.createElement('p');
|
| + hostInfo.setAttribute('class', 'hostinfo');
|
| + hostInfo.appendChild(document.createTextNode(host.jabberId));
|
| + hostEntry.appendChild(hostInfo);
|
|
|
| - setCookie('xmpp_auth', form.xmpp_auth.value, 100);
|
| - setCookie('chromoting_auth', form.chromoting_auth.value, 100);
|
| + return hostEntry;
|
| }
|
|
|