diff --git a/browser.html b/browser.html index 20fcb77..4cbaf2d 100644 --- a/browser.html +++ b/browser.html @@ -1,9 +1,12 @@ - - - - + + + + + + +
@@ -19,8 +22,8 @@

Aw, Snap!

He's Dead, Jim!

-

Something went wrong while displaying this webpage. - To continue, reload or go to another page.

+

Something went wrong while displaying this webpage. To continue, reload or go to another page.

+ \ No newline at end of file diff --git a/browser.js b/browser.js index 41b56ef..c8bdc65 100644 --- a/browser.js +++ b/browser.js @@ -1,9 +1,9 @@ -var reload = chrome.runtime.reload +var reload = chrome.runtime.reload; +var storage = chrome.storage.local; window.onresize = doLayout; var isLoading = false; function ui_ready() { - if (window.webapp) { if (!(webapp.started || webapp.starting)) { // autostart ? @@ -18,37 +18,32 @@ function settings_ready(d) { ui_ready(); } -chrome.runtime.getBackgroundPage(function (bg) { +chrome.runtime.getBackgroundPage(function(bg) { window.bg = bg; - chrome.storage.local.get(null, settings_ready); -}) - + storage.get(null, settings_ready); +}); - -onload = function () { +onload = function() { getServerSettings(receivedServerSettings); var webview = document.querySelector('webview'); doLayout(); - document.querySelector('#reset').onclick = function () { + document.querySelector('#reset').onclick = function() { window.close(); }; - document.querySelector('#reload').onclick = function () { + document.querySelector('#reload').onclick = function() { if (isLoading) { webview.stop(); } else { webview.reload(); } }; - document.querySelector('#reload').addEventListener( - 'webkitAnimationIteration', - function () { - if (!isLoading) { - document.body.classList.remove('loading'); - } - }); - + document.querySelector('#reload').addEventListener('webkitAnimationIteration', function() { + if (!isLoading) { + document.body.classList.remove('loading'); + } + }); webview.addEventListener('exit', handleExit); webview.addEventListener('loadstart', handleLoadStart); @@ -57,44 +52,42 @@ onload = function () { webview.addEventListener('loadredirect', handleLoadRedirect); webview.addEventListener('loadcommit', handleLoadCommit); webview.addEventListener('permissionrequest', handleRequest); + webview.addEventListener('newwindow', handleNewWindow); }; - function getServerSettings(callback) { - chrome.storage.managed.get("serverSettings", function (results) { + storage.get('serverSettings', function(results) { if (chrome.runtime.lastError) { - console.log("error, returning empty. Error Message: " + chrome.runtime.lastError.message); + console.log('error, returning empty. Error Message: ' + chrome.runtime.lastError.message); return; } else { - console.log("got server settings, returning"); - callback(results.serverSettings) - + console.log('got server settings, returning'); + callback(results.serverSettings); } }); } function receivedServerSettings(serverSettings) { - console.log("got server settings"); + console.log('got server settings'); console.log(serverSettings); - chrome.storage.local.get('relativeLaunchUrl', function (obj) { + storage.get('relativeLaunchUrl', function(obj) { var relativeLaunchUrl = obj && obj.relativeLaunchUrl, url = convertServerSettingsToUrl(serverSettings, relativeLaunchUrl); if (url && url.length > 0) { - console.log("calling navigateTo url: " + url); + console.log('calling navigateTo url: ' + url); navigateTo(url); } }); } - function handleRequest(e) { - console.log("permission request"); + console.log('permission request'); if (e.permission === 'media') { - console.log("Audio permission request"); + console.log('Audio permission request'); e.request.allow(); } - console.log("Done with permission request"); + console.log('Done with permission request'); } function navigateTo(url) { @@ -142,7 +135,6 @@ function handleLoadCommit(event) { return; } - var webview = document.querySelector('webview'); } @@ -162,25 +154,27 @@ function handleLoadStop(event) { // finish, so that the spinner doesn't jerkily reset back to the 0 position. isLoading = false; - chrome.storage.sync.get(null, function (items) { + chrome.storage.sync.get(null, function(items) { settings = items; var webview = document.querySelector('webview'); //by sending this message the webview can then send messages back to the listener added above - webview.contentWindow.postMessage({ - command: 'handshake', - settings: settings - }, '*'); + webview.contentWindow.postMessage( + { + command: 'handshake', + settings: settings + }, + '*' + ); }); - window.addEventListener("message", function (event) { + window.addEventListener('message', function(event) { console.log('window received message:', event.data); processCommand(event.data); }); } function processCommand(data) { - if (data.command === 'handshakereply') { //ignore because this is just the client telling us it can talk back return; @@ -188,23 +182,19 @@ function processCommand(data) { if (data.command === 'deletePref') { delete settings[data.data.key]; - } - else if (data.command === 'setPref') { + } else if (data.command === 'setPref') { settings[data.data.key] = data.data; } - chrome.storage.sync.set(settings, function () { - + chrome.storage.sync.set(settings, function() { if (!chrome.runtime.lastError) { console.log('settings set'); } }); - - } function handleLoadAbort(event) { - console.log('oadAbort'); + console.log('loadAbort'); console.log(' url: ' + event.url); console.log(' isTopLevel: ' + event.isTopLevel); console.log(' type: ' + event.type); @@ -217,4 +207,72 @@ function handleLoadRedirect(event) { } document.querySelector('#location').value = event.newUrl; -} \ No newline at end of file +} + +function handleNewWindow(event) { + event.preventDefault(); + + // event.targetUrl contains the target URL of the original link click + // or window.open() call: use it to open your own window to it. + // See: https://stackoverflow.com/a/18452171/6326743 + var url = event.targetUrl; + + // `chrome.browser.openTab` with `browser` permission will open the link in the browser. + // See: https://stackoverflow.com/a/36530347/6326743 + chrome.browser.openTab({ url: url }); +} + +/** + * Handler for messages sent with `chrome.runtime.sendMessage` + * + * @param {any} message The message sent by the calling script + * @param {MessageSender} sender + * @param {function} sendResponse Function to call (at most once) when you have a response. + */ +function handleMessage(message, sender, sendResponse) { + console.log('handleMessage:', message); + if (message.command === 'settings.get') { + storage.get('serverSettings', function(items) { + if (sendResponse) { + var response = { + success: !chrome.runtime.lastError, + data: chrome.runtime.lastError + }; + if (response.success) { + var data = items.serverSettings || {}; + if (typeof message.data === 'string') { + response.data = data[message.data]; + } else if (Array.isArray(message.data)) { + response.data = message.data.reduce(function(aggregator, current) { + return (aggregator[current] = data[current]); + }, {}); + } else { + response.data = data; + } + } + console.log('response:', response); + sendResponse(response); + } + }); + return !!sendResponse; // wait for response + } else if (message.command === 'settings.patch') { + storage.get('serverSettings', function(items) { + var settings = { + serverSettings: _.extend(items.serverSettings || {}, message.data) + }; + storage.set(settings, function() { + if (sendResponse) { + var response = { + success: !chrome.runtime.lastError, + data: chrome.runtime.lastError + }; + console.log('response:', response); + sendResponse(response); + } + }); + }); + return !!sendResponse; // wait for response + } +} + +chrome.runtime.onMessageExternal.addListener(handleMessage); diff --git a/manifest.json b/manifest.json index 7ed009f..f252963 100644 --- a/manifest.json +++ b/manifest.json @@ -16,6 +16,7 @@ }, "permissions": [ "webview", + "browser", "alarms", "storage", "power", @@ -61,5 +62,8 @@ ], "title": "Open Imagine Learning" } + }, + "externally_connectable": { + "matches": ["*://localhost:*/*", "*://127.0.0.1:*/*", "*://*.imaginelearning.com/*"] } } \ No newline at end of file diff --git a/manifest_unityclient.json b/manifest_unityclient.json index d340678..74984f4 100644 --- a/manifest_unityclient.json +++ b/manifest_unityclient.json @@ -18,6 +18,7 @@ }, "permissions": [ "webview", + "browser", "alarms", "storage", "system.network", @@ -42,5 +43,8 @@ }, "icons": { "128": "images/ilandl_128.png" + }, + "externally_connectable": { + "matches": ["*://localhost:*/*", "*://127.0.0.1:*/*", "*://*.imaginelearning.com/*"] } } diff --git a/parseSettings.js b/parseSettings.js index 45e21cc..b13565e 100644 --- a/parseSettings.js +++ b/parseSettings.js @@ -1,5 +1,4 @@ -var baseUrl = "localhost:8887/"; - +var baseUrl = 'localhost:8887/'; function convertServerSettingsToUrl(serverSettings, launchUrl) { var url = 'http://' + baseUrl; @@ -8,35 +7,37 @@ function convertServerSettingsToUrl(serverSettings, launchUrl) { url += launchUrl.replace(/^\//, ''); } + var queryString = ['chromeappid=' + chrome.runtime.id]; + if (serverSettings) { - var queryString = []; - if (serverSettings && serverSettings.cloudSiteCode && serverSettings.cloudSiteCode.length > 0 && url.indexOf('sitecode') < 0) { - queryString.push('sitecode=' + serverSettings.cloudSiteCode); - } else if (serverSettings && serverSettings.engineAddress && serverSettings.engineAddress.length > 0) { + if ((serverSettings.sitecode || serverSettings.cloudSiteCode) && url.indexOf('sitecode') < 0) { + queryString.push('sitecode=' + serverSettings.sitecode || serverSettings.cloudSiteCode); + } else if (serverSettings.engineAddress) { queryString.push('engineaddress=' + serverSettings.engineAddress); } - - if (serverSettings && serverSettings.forceCloudLogUpload && serverSettings.forceCloudLogUpload === true) { + + if (serverSettings.forceCloudLogUpload && serverSettings.forceCloudLogUpload === true) { queryString.push('forceCloudLogUpload'); } - if (serverSettings && serverSettings.adaptive && serverSettings.adaptive === true) { + if (serverSettings.adaptive && serverSettings.adaptive === true) { queryString.push('adaptive'); } - if (serverSettings && serverSettings.env && serverSettings.env.length > 0) { + if (serverSettings.env) { queryString.push('env=' + serverSettings.env); } - - if (queryString.length) { - url += (url.indexOf('?') < 0 ? '?' : '&') + queryString.join('&'); - } } //if no environment set then default to production - if(url.indexOf("env") < 0) { - url += (url.indexOf('?') < 0 ? '?' : '&') + 'env=production'; + var envIndex = queryString.findIndex(function(item) { + return /^env=/.test(item); + }); + if (envIndex < 0) { + queryString.push('env=production'); } + url += (url.indexOf('?') < 0 ? '?' : '&') + queryString.join('&'); + return url; -} \ No newline at end of file +}