diff options
Diffstat (limited to 'html')
-rw-r--r-- | html/settings.html | 95 | ||||
-rw-r--r-- | html/settings.js | 50 |
2 files changed, 116 insertions, 29 deletions
diff --git a/html/settings.html b/html/settings.html index 7abb870..e33f112 100644 --- a/html/settings.html +++ b/html/settings.html @@ -35,6 +35,15 @@ #LOADCSS html/base.css #LOADCSS html/grid.css <style> + #loader, #indexeddb_error { + margin: auto; + padding: 1em; + max-width: 800px; + } + #indexeddb_error p { + margin-bottom: 1em; + } + /* Style top menu items. */ #tab_heads>* { background-color: #70AF70; @@ -114,34 +123,72 @@ #INCLUDE html/item_preview.html #INCLUDE html/text_entry_list.html #INCLUDE html/payload_create.html - <ul id="tab_heads"> - <li id="blocking_head"> Blocking </li> - <li id="mappings_head"> Mappings </li> - <li id="resources_head"> Resources </li> - <li id="new_payload_head" class="active_head"> New payload </li> - <li id="repos_head"> Repositories </li> - </ul> - <div id="top_menu_line" class="top_line"></div> - <div id="blocking_tab" class="tab"> - <div id="blocking_editable_container" class="grid_2"> - <div id="blocking_list_container"> - <h3>Block scripts on</h3> - </div> - <div id="allowing_list_container"> - <h3>Allow scripts on</h3> + <div id="loader"> + Loading settings page... + </div> + <div id="indexeddb_error" class="hide"> + <p> + Cannot display settings page. + </p> + <p> + Haketilo could not access IndexedDB. IndexedDB is an in-browser + database in which Haketilo stores all its configuration. Without it, the + settings page is non-operational. + <p> +#IF MOZILLA + <div id="indexeddb_private_mode_explanation" class="hide"> + <p> + This issue is the result of using Haketilo in Private Browsing mode. + For privacy reasons your browser blocks access to IndexedDB in + private windows and this unfortunately also affects Haketilo's + settings page. + </p> + <p> + You can sacrifice this single privacy feature and enable IndexedDB + access in private windows by navigating to "about:config" in the URL + bar, agreeing to accept the risk and setting the + "dom.indexedDB.privateBrowsing.enabled" preference to "true". Those + pages that have their scripts blocked will still be unable to access + IndexedDB. + </p> + <p> + Alternatively, you can open Haketilo's settings in a separate, + non-private window. The configuration you make there will take + effect on pages opened in Private Browsing mode as well. + </p> </div> - <div id="default_policy_dialog" class="grid_col_both text_center"> +#ENDIF + </div> + <div id="main_view" class="hide"> + <ul id="tab_heads"> + <li id="blocking_head"> Blocking </li> + <li id="mappings_head"> Mappings </li> + <li id="resources_head"> Resources </li> + <li id="new_payload_head" class="active_head"> New payload </li> + <li id="repos_head"> Repositories </li> + </ul> + <div id="top_menu_line" class="top_line"></div> + <div id="blocking_tab" class="tab"> + <div id="blocking_editable_container" class="grid_2"> + <div id="blocking_list_container"> + <h3>Block scripts on</h3> + </div> + <div id="allowing_list_container"> + <h3>Allow scripts on</h3> + </div> + <div id="default_policy_dialog" class="grid_col_both text_center"> #INCLUDE html/default_blocking_policy.html + </div> </div> + <div id="blocking_dialog_container" class="hide"></div> + </div> + <div id="mappings_tab" class="tab"></div> + <div id="resources_tab" class="tab"></div> + <div id="new_payload_tab" class="tab active_tab"></div> + <div id="repos_tab" class="tab"> + <div id="repos_list_container"></div> + <div id="repos_dialog_container" class="hide"></div> </div> - <div id="blocking_dialog_container" class="hide"></div> - </div> - <div id="mappings_tab" class="tab"></div> - <div id="resources_tab" class="tab"></div> - <div id="new_payload_tab" class="tab active_tab"></div> - <div id="repos_tab" class="tab"> - <div id="repos_list_container"></div> - <div id="repos_dialog_container" class="hide"></div> </div> #LOADJS html/settings.js </body> diff --git a/html/settings.js b/html/settings.js index 36eeb47..686cc11 100644 --- a/html/settings.js +++ b/html/settings.js @@ -41,8 +41,13 @@ * proprietary program, I am not going to enforce this in court. */ +#IMPORT common/indexeddb.js AS haketilodb #IMPORT html/dialog.js +#IF MOZILLA +#FROM common/browser.js IMPORT browser +#ENDIF + #FROM html/DOM_helpers.js IMPORT by_id #FROM html/text_entry_list.js IMPORT blocking_allowing_lists, repo_list #FROM html/item_list.js IMPORT mapping_list, resource_list @@ -118,8 +123,43 @@ async function set_up_repos_tab() { containers[0].append((await repo_list(dialog_ctx)).main_div); } -set_up_blocking_tab(); -set_up_mappings_tab(); -set_up_resources_tab(); -set_up_new_payload_tab(); -set_up_repos_tab(); +function set_up_settings_view() { + by_id("loader").remove(); + by_id("main_view").classList.remove("hide"); + + set_up_blocking_tab(); + set_up_mappings_tab(); + set_up_resources_tab(); + set_up_new_payload_tab(); + set_up_repos_tab(); +} + +#IF MOZILLA +async function show_indexeddb_error() { + const this_tab = await browser.tabs.getCurrent(); + if (this_tab.incognito) + by_id("indexeddb_private_mode_explanation").classList.remove("hide"); +#ELSE +function show_indexeddb_error() { +#ENDIF + by_id("loader").remove(); + by_id("indexeddb_error").classList.remove("hide"); +} + +async function init_settings_page() { + try { + await haketilodb.get(); + } catch(e) { + console.error(e); + show_indexeddb_error(); + return; + } + + set_up_settings_view(); +} + +#IF UNIT_TEST +window.init_settings_page = init_settings_page; +#ELSE +init_settings_page(); +#ENDIF |