From 330bf2857396b15752afadb030c981a1cb2848fe Mon Sep 17 00:00:00 2001 From: Allan Wang Date: Tue, 5 Feb 2019 22:13:41 -0500 Subject: Enhancement/js (#1344) * Attempt to add package json * Add initial typescript components * Convert remaining files * Remove some null checks * Reorganize folders * Add missing js and tests for file paths * Delete unused babelrc * Remove unused packages --- app/src/web/assets/js/notif_msg.js | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 app/src/web/assets/js/notif_msg.js (limited to 'app/src/web/assets/js/notif_msg.js') diff --git a/app/src/web/assets/js/notif_msg.js b/app/src/web/assets/js/notif_msg.js new file mode 100644 index 00000000..20a89e88 --- /dev/null +++ b/app/src/web/assets/js/notif_msg.js @@ -0,0 +1,26 @@ +"use strict"; +// Binds callback to an invisible webview to take in the search events +(function () { + var finished = false; + var x = new MutationObserver(function () { + var _f_thread = document.querySelector('#threadlist_rows'); + if (!_f_thread) { + return; + } + console.log("Found message threads " + _f_thread.outerHTML); + Frost.handleHtml(_f_thread.outerHTML); + finished = true; + x.disconnect(); + }); + x.observe(document, { + childList: true, + subtree: true + }); + setTimeout(function () { + if (!finished) { + finished = true; + console.log('Message thread timeout cancellation'); + Frost.handleHtml(""); + } + }, 20000); +}).call(undefined); -- cgit v1.2.3 From 87469aba96cee61b4252d9a6d023324598355244 Mon Sep 17 00:00:00 2001 From: Allan Wang Date: Tue, 5 Feb 2019 22:40:24 -0500 Subject: Strip images and update context handler --- app/src/main/res/xml/frost_changelog.xml | 4 +- app/src/web/assets/js/click_a.js | 9 --- app/src/web/assets/js/click_debugger.js | 2 - app/src/web/assets/js/context_a.js | 100 ++++++++++++++------------ app/src/web/assets/js/context_a.ts | 108 +++++++++++++++++++---------- app/src/web/assets/js/document_watcher.js | 1 - app/src/web/assets/js/header_badges.js | 1 - app/src/web/assets/js/media.js | 2 - app/src/web/assets/js/menu.js | 2 - app/src/web/assets/js/notif_msg.js | 1 - app/src/web/assets/js/textarea_listener.js | 8 --- app/src/web/tsconfig.json | 3 +- 12 files changed, 133 insertions(+), 108 deletions(-) (limited to 'app/src/web/assets/js/notif_msg.js') diff --git a/app/src/main/res/xml/frost_changelog.xml b/app/src/main/res/xml/frost_changelog.xml index f90ecf37..ed014604 100644 --- a/app/src/main/res/xml/frost_changelog.xml +++ b/app/src/main/res/xml/frost_changelog.xml @@ -8,8 +8,8 @@ - - + + diff --git a/app/src/web/assets/js/click_a.js b/app/src/web/assets/js/click_a.js index 7faafc15..be69bb8c 100644 --- a/app/src/web/assets/js/click_a.js +++ b/app/src/web/assets/js/click_a.js @@ -2,14 +2,12 @@ (function () { var prevented = false; var _frostAClick = function (e) { - // check for valid target var target = e.target || e.currentTarget || e.srcElement; if (!(target instanceof Element)) { console.log("No element found"); return; } var element = target; - // Notifications are two layers under for (var i = 0; i < 2; i++) { if (element.tagName !== 'A') { element = element.parentElement; @@ -22,7 +20,6 @@ return; } console.log("Click intercept " + url); - // If Frost is injected, check if loading the url through an overlay works if (Frost.loadUrl(url)) { e.stopPropagation(); e.preventDefault(); @@ -33,12 +30,6 @@ } } }; - /* - * On top of the click event, we must stop it for long presses - * Since that will conflict with the context menu - * Note that we only override it on conditions where the context menu - * Will occur - */ var _frostPreventClick = function () { console.log("Click _frostPrevented"); prevented = true; diff --git a/app/src/web/assets/js/click_debugger.js b/app/src/web/assets/js/click_debugger.js index aab4572d..16729899 100644 --- a/app/src/web/assets/js/click_debugger.js +++ b/app/src/web/assets/js/click_debugger.js @@ -1,8 +1,6 @@ "use strict"; -// For desktop only (function () { var _frostAContext = function (e) { - // Commonality; check for valid target var element = e.target || e.currentTarget || e.srcElement; if (!(element instanceof Element)) { console.log("No element found"); diff --git a/app/src/web/assets/js/context_a.js b/app/src/web/assets/js/context_a.js index 7e636cea..0573a17a 100644 --- a/app/src/web/assets/js/context_a.js +++ b/app/src/web/assets/js/context_a.js @@ -1,61 +1,75 @@ "use strict"; -/** - * Context menu for links - * Largely mimics click_a.js - */ (function () { var longClick = false; + var _frostCopyPost = function (e, target) { + if (target.tagName != 'A') { + return false; + } + var parent1 = target.parentElement; + if (!parent1 || parent1.tagName != 'DIV') { + return false; + } + var parent2 = parent1.parentElement; + if (!parent2 || !parent2.classList.contains('story_body_container')) { + return false; + } + var url = target.getAttribute('href'); + var text = parent1.innerText; + Frost.contextMenu(url, text); + return true; + }; + var _frostImage = function (e, target) { + var element = target; + for (var i = 0; i < 2; i++) { + if (element.tagName != 'A') { + element = element.parentElement; + } + } + if (element.tagName != 'A') { + return false; + } + var url = element.getAttribute('href'); + if (!url || url == '#') { + return false; + } + var text = element.parentElement.innerText; + var image = element.querySelector("[style*=\"background-image: url(\"]"); + if (!image) { + image = element.parentElement.querySelector("[style*=\"background-image: url(\"]"); + } + if (image) { + var imageUrl = window.getComputedStyle(image, null).backgroundImage.trim().slice(4, -1); + console.log("Context image: " + imageUrl); + Frost.loadImage(imageUrl, text); + return true; + } + var img = element.querySelector("img[src*=scontent]"); + if (img instanceof HTMLMediaElement) { + var imgUrl = img.src; + console.log("Context img: " + imgUrl); + Frost.loadImage(imgUrl, text); + return true; + } + console.log("Context content " + url + " " + text); + Frost.contextMenu(url, text); + return true; + }; + var handlers = [_frostCopyPost, _frostImage]; var _frostAContext = function (e) { Frost.longClick(true); longClick = true; - /* - * Commonality; check for valid target - */ var target = e.target || e.currentTarget || e.srcElement; if (!(target instanceof Element)) { console.log("No element found"); return; } - var element = target; - // Notifications are two layers under - for (var i = 0; i < 2; i++) { - if (element.tagName != 'A') { - element = element.parentElement; - } - } - if (element.tagName == 'A') { - var url = element.getAttribute('href'); - if (!url || url == '#') { - return; - } - var text = element.parentElement.innerText; - // Check if image item exists, first in children and then in parent - var image = element.querySelector("[style*=\"background-image: url(\"]"); - if (!image) { - image = element.parentElement.querySelector("[style*=\"background-image: url(\"]"); - } - if (image) { - var imageUrl = window.getComputedStyle(image, null).backgroundImage.trim().slice(4, -1); - console.log("Context image: " + imageUrl); - Frost.loadImage(imageUrl, text); - e.stopPropagation(); - e.preventDefault(); - return; - } - // Check if true img exists - var img = element.querySelector("img[src*=scontent]"); - if (img instanceof HTMLMediaElement) { - var imgUrl = img.src; - console.log("Context img: " + imgUrl); - Frost.loadImage(imgUrl, text); + for (var _i = 0, handlers_1 = handlers; _i < handlers_1.length; _i++) { + var h = handlers_1[_i]; + if (h(e, target)) { e.stopPropagation(); e.preventDefault(); return; } - console.log("Context content " + url + " " + text); - Frost.contextMenu(url, text); - e.stopPropagation(); - e.preventDefault(); } }; document.addEventListener('contextmenu', _frostAContext, true); diff --git a/app/src/web/assets/js/context_a.ts b/app/src/web/assets/js/context_a.ts index 16ed33a9..06d2f4a2 100644 --- a/app/src/web/assets/js/context_a.ts +++ b/app/src/web/assets/js/context_a.ts @@ -2,8 +2,78 @@ * Context menu for links * Largely mimics click_a.js */ + (function () { let longClick = false; + + /** + * Given event and target, return true if handled and false otherwise. + */ + type EventHandler = (e: Event, target: Element) => Boolean + + /** + * Posts should click a tag, with two parents up being div.story_body_container + */ + const _frostCopyPost: EventHandler = (e, target) => { + if (target.tagName != 'A') { + return false; + } + const parent1 = target.parentElement; + if (!parent1 || parent1.tagName != 'DIV') { + return false; + } + const parent2 = parent1.parentElement; + if (!parent2 || !parent2.classList.contains('story_body_container')) { + return false; + } + const url = target.getAttribute('href')!; + const text = parent1.innerText; + Frost.contextMenu(url, text); + return true; + }; + + const _frostImage: EventHandler = (e, target) => { + let element: Element = target; + // Notifications are two layers under + for (let i = 0; i < 2; i++) { + if (element.tagName != 'A') { + element = element.parentElement; + } + } + if (element.tagName != 'A') { + return false + } + const url = element.getAttribute('href'); + if (!url || url == '#') { + return false + } + const text = (element.parentElement).innerText; + // Check if image item exists, first in children and then in parent + let image = element.querySelector("[style*=\"background-image: url(\"]"); + if (!image) { + image = (element.parentElement).querySelector("[style*=\"background-image: url(\"]") + } + if (image) { + const imageUrl = (window.getComputedStyle(image, null).backgroundImage).trim().slice(4, -1); + console.log(`Context image: ${imageUrl}`); + Frost.loadImage(imageUrl, text); + return true + } + // Check if true img exists + const img = element.querySelector("img[src*=scontent]"); + if (img instanceof HTMLMediaElement) { + const imgUrl = img.src; + console.log(`Context img: ${imgUrl}`); + Frost.loadImage(imgUrl, text); + return true + } + console.log(`Context content ${url} ${text}`); + Frost.contextMenu(url, text); + return true + }; + + const handlers = [_frostCopyPost, _frostImage]; + const _frostAContext = (e: Event) => { Frost.longClick(true); longClick = true; @@ -16,46 +86,12 @@ console.log("No element found"); return } - let element: Element = target; - // Notifications are two layers under - for (let i = 0; i < 2; i++) { - if (element.tagName != 'A') { - element = element.parentElement; - } - } - if (element.tagName == 'A') { - const url = element.getAttribute('href'); - if (!url || url == '#') { - return - } - const text = (element.parentElement).innerText; - // Check if image item exists, first in children and then in parent - let image = element.querySelector("[style*=\"background-image: url(\"]"); - if (!image) { - image = (element.parentElement).querySelector("[style*=\"background-image: url(\"]") - } - if (image) { - const imageUrl = (window.getComputedStyle(image, null).backgroundImage).trim().slice(4, -1); - console.log(`Context image: ${imageUrl}`); - Frost.loadImage(imageUrl, text); - e.stopPropagation(); - e.preventDefault(); - return - } - // Check if true img exists - const img = element.querySelector("img[src*=scontent]"); - if (img instanceof HTMLMediaElement) { - const imgUrl = img.src; - console.log(`Context img: ${imgUrl}`); - Frost.loadImage(imgUrl, text); + for (const h of handlers) { + if (h(e, target)) { e.stopPropagation(); e.preventDefault(); return } - console.log(`Context content ${url} ${text}`); - Frost.contextMenu(url, text); - e.stopPropagation(); - e.preventDefault(); } }; diff --git a/app/src/web/assets/js/document_watcher.js b/app/src/web/assets/js/document_watcher.js index f3c4ab25..12252201 100644 --- a/app/src/web/assets/js/document_watcher.js +++ b/app/src/web/assets/js/document_watcher.js @@ -1,5 +1,4 @@ "use strict"; -// Emit key once half the viewport is covered (function () { var isReady = function () { return document.body.scrollHeight > innerHeight + 100; diff --git a/app/src/web/assets/js/header_badges.js b/app/src/web/assets/js/header_badges.js index daaf540a..b1ceee05 100644 --- a/app/src/web/assets/js/header_badges.js +++ b/app/src/web/assets/js/header_badges.js @@ -1,5 +1,4 @@ "use strict"; -// Fetches the header contents if it exists (function () { var header = document.getElementById('mJewelNav'); if (header) { diff --git a/app/src/web/assets/js/media.js b/app/src/web/assets/js/media.js index 571168d6..baeba0a1 100644 --- a/app/src/web/assets/js/media.js +++ b/app/src/web/assets/js/media.js @@ -1,5 +1,4 @@ "use strict"; -// Handles media events (function () { var _frostMediaClick = function (e) { var target = e.target || e.srcElement; @@ -30,7 +29,6 @@ return; } var url = dataStore.src; - // !startsWith; see https://stackoverflow.com/a/36876507/4407321 if (!url || url.lastIndexOf('http', 0) !== 0) { return; } diff --git a/app/src/web/assets/js/menu.js b/app/src/web/assets/js/menu.js index c30e93cf..b6a30209 100644 --- a/app/src/web/assets/js/menu.js +++ b/app/src/web/assets/js/menu.js @@ -1,5 +1,4 @@ "use strict"; -// Click menu and move contents to main view (function () { var viewport = document.querySelector("#viewport"); var root = document.querySelector("#root"); @@ -35,7 +34,6 @@ if (menu) { x.disconnect(); console.log("Found side menu"); - // Transfer elements while (root.firstChild) { root.removeChild(root.firstChild); } diff --git a/app/src/web/assets/js/notif_msg.js b/app/src/web/assets/js/notif_msg.js index 20a89e88..bcff697b 100644 --- a/app/src/web/assets/js/notif_msg.js +++ b/app/src/web/assets/js/notif_msg.js @@ -1,5 +1,4 @@ "use strict"; -// Binds callback to an invisible webview to take in the search events (function () { var finished = false; var x = new MutationObserver(function () { diff --git a/app/src/web/assets/js/textarea_listener.js b/app/src/web/assets/js/textarea_listener.js index 9a8783c1..02336382 100644 --- a/app/src/web/assets/js/textarea_listener.js +++ b/app/src/web/assets/js/textarea_listener.js @@ -1,12 +1,4 @@ "use strict"; -/* - * focus listener for textareas - * since swipe to refresh is quite sensitive, we will disable it - * when we detect a user typing - * note that this extends passed having a keyboard opened, - * as a user may still be reviewing his/her post - * swiping should automatically be reset on refresh - */ (function () { var _frostFocus = function (e) { var element = e.target || e.srcElement; diff --git a/app/src/web/tsconfig.json b/app/src/web/tsconfig.json index 711fdcbb..ea88e28e 100644 --- a/app/src/web/tsconfig.json +++ b/app/src/web/tsconfig.json @@ -16,7 +16,8 @@ "strictNullChecks": true, "noImplicitAny": true, "allowUnreachableCode": true, - "allowUnusedLabels": true + "allowUnusedLabels": true, + "removeComments": true }, "include": [ "assets/js", "assets/typings" -- cgit v1.2.3