Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(942)

Unified Diff: remoting/client/extension/client.js

Issue 3338014: Improve UI of Chromoting client UI to select available hosts. (Closed) Base URL: http://src.chromium.org/git/chromium.git
Patch Set: One more camel Created 10 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « remoting/client/extension/chromoticon.png ('k') | remoting/client/extension/icon.png » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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;
}
« no previous file with comments | « remoting/client/extension/chromoticon.png ('k') | remoting/client/extension/icon.png » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698