X-Git-Url: https://git.wh0rd.org/?a=blobdiff_plain;ds=sidebyside;f=popup.js;h=2f4bea59a758ca2896c0548277bc86404647103a;hb=HEAD;hp=a88ed9409e8f4b03250be05d99e6b20fae789d3a;hpb=a98f3ef6a42ca6883b68136d1e87246627f30a9e;p=chrome-ext%2Fweb-power-switch.git diff --git a/popup.js b/popup.js index a88ed94..2f4bea5 100644 --- a/popup.js +++ b/popup.js @@ -1,4 +1,4 @@ -// Written by Mike Frysinger . Released into the public domain. Suck it. +// Written by Mike Frysinger . Released into the public domain. var url_base, user, pass; @@ -14,7 +14,11 @@ function fetchpage(url, callback) { callback(xhr, state); } else { xhr.setstatus = true; - setstatus('Could not connect; check settings'); + setstatus( + 'Could not connect;
check your ' + + 'settings' + ); + document.getElementById('open-settings').onclick = open_settings_page; console.log('connect error', state); } } @@ -38,20 +42,38 @@ function fetchpage(url, callback) { } } +function get_css_var(key) { return getComputedStyle(document.documentElement).getPropertyValue(`--${key}`); } + function onoff(o) { - return o.toUpperCase() === 'ON' ? 'OFF' : 'ON'; + const data = o.toUpperCase(); + switch (data) { + case 'OFF': + return 'ON'; + case 'ON': + return 'OFF'; + default: + // For example, cycle uses CCL. + return data; + } } function toggleit(button) { - var outlet_num = button.id; + const outlet_num = button.id.split(':')[0]; var old_status = button.data; var new_status = onoff(button.data); var url = 'outlet?' + outlet_num + '=' + new_status; + if (!button.id.endsWith('cycle')) { + const cycler = document.getElementById(`${button.id}:cycle`); + cycler.style.display = new_status === 'ON' ? 'block' : 'none'; + } + fetchpage(url, function(xhr, state) { console.log('switch ' + outlet_num + ': ' + old_status + ' -> ' + new_status); - button.value = 'Switch ' + old_status; - button.data = new_status; + if (!button.id.endsWith('cycle')) { + button.value = 'Switch ' + old_status; + button.data = new_status; + } }); } function toggle() { @@ -75,8 +97,13 @@ function toggle_confirm() { }, 5000); } -function trim(str) { - return str.replace(/^\s+|\s+$/, ''); +/* Toggle the selected theme. */ +function toggle_theme() { + const theme = get_css_var('theme') == 'light' ? 'dark' : 'light'; + const css = $('link#theme-override'); + css.href = `css/${theme}.css`; + storage.set({theme}); + return false; } function initpopup(xhr, state) { @@ -88,29 +115,56 @@ function initpopup(xhr, state) { // There is no clean API for extracting the current state. // Example result: /* - 1 - Outlet 1 - OFF - Switch ON - - - + + + Controller: !!!Web Power Switch 6 + + */ + var th, ths = state.currentTarget.responseXML.querySelectorAll('th'); + for (var i = 0; th = ths[i]; ++i) { + if (th.bgColor != '#DDDDFF') + continue; + + var controller_name = th.innerText.trim(); + if (controller_name.slice(0, 12) != 'Controller: ') + continue; + + row = tbl.insertRow(-1); + cell = row.insertCell(-1); + cell.colSpan = 10; + cell.align = 'center'; + + const a = document.createElement('a'); + a.href = url_base; + a.target = '_blank'; + a.text = controller_name.slice(12).trim(); + cell.appendChild(a); + + const button = document.createElement('button'); + button.name = 'theme'; + button.onclick = toggle_theme; + cell.appendChild(button); + } + var tr, trs = state.currentTarget.responseXML.querySelectorAll('tr'); for (var i = 0; tr = trs[i]; ++i) { if (tr.bgColor != '#F4F4F4') continue; - var outlet_num = trim(tr.children[0].innerText); - var outlet_name = trim(tr.children[1].innerText); - var current_status = trim(tr.children[2].innerText); - var new_status = trim(tr.children[3].innerText); + var outlet_num = tr.children[0].innerText.trim(); + var outlet_name = tr.children[1].innerText.trim(); + var current_status = tr.children[2].innerText.trim(); + var new_status = tr.children[3].innerText.trim(); var confirmable = tr.children[3].children[0].hasAttribute('onclick'); row = tbl.insertRow(-1); cell = row.insertCell(-1); - cell.innerText = outlet_name + ':'; + if (outlet_name === '') + cell.innerHTML = 'unnamed'; + else + cell.innerText = outlet_name + ':'; cell = row.insertCell(-1); button = document.createElement('input'); button.type = 'button'; @@ -119,6 +173,21 @@ function initpopup(xhr, state) { button.data = current_status; button.onclick = confirmable ? toggle_confirm : toggle; cell.appendChild(button); + + // The switch only allows cycling when it's on. + cell = row.insertCell(-1); + button = document.createElement('input'); + button.type = 'button'; + button.id = `${outlet_num}:cycle`; + button.value = '🗘'; + button.data = 'CCL'; + button.title = 'Power cycle'; + button.onclick = confirmable ? toggle_confirm : toggle; + if (current_status.toUpperCase() === 'OFF') { + button.style.display = 'none'; + } + button.style.fontSize = 'smaller'; + cell.appendChild(button); } setstatus(); @@ -126,17 +195,41 @@ function initpopup(xhr, state) { function setstatus(msg) { var status = document.getElementById('status'); - status.innerText = msg; + status.innerHTML = msg; status.style.visibility = msg ? '' : 'hidden'; status.style.float = msg ? '' : 'left'; status.style.position = msg ? '' : 'absolute'; } +function open_settings_page() { + chrome.runtime.openOptionsPage(); +} + document.addEventListener('DOMContentLoaded', function() { - storage.get(settings_keys, function(settings) { - url_base = settings['url'] || settings_defaults['url']; - user = settings['user'] || settings_defaults['user']; - pass = settings['pass'] || settings_defaults['pass']; - fetchpage('index.htm', initpopup); + storage.get(settings_keys, function(settings_storage) { + const settings = Object.assign({}, settings_defaults, settings_storage); + url_base = settings['url']; + user = settings['user']; + pass = settings['pass']; + chrome.permissions.contains({ + origins: [url_base + '/*'] + }, function(granted) { + if (granted) { + fetchpage('index.htm', initpopup); + } else { + setstatus( + 'Missing permissions;
please visit the ' + + 'settings page' + + '
to grant access.
' + + '
' + ); + document.getElementById('open-settings').onclick = open_settings_page; + // Work around http://crbug.com/125706. + document.getElementById('retry').onclick = function() { + chrome.permissions.request({origins: [url_base + '/*']}); + fetchpage('index.htm', initpopup); + }; + } + }); }); });