From 5552cb029e41e8cfd906b568b3526df598b6f94c Mon Sep 17 00:00:00 2001 From: Barbara Miller Date: Sun, 15 Oct 2017 20:42:00 -0700 Subject: [PATCH 1/4] refurb behaviors.yaml 171015 --- brozzler/behaviors.yaml | 39 ++++++++++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/brozzler/behaviors.yaml b/brozzler/behaviors.yaml index b9b4493..3e5b7c0 100644 --- a/brozzler/behaviors.yaml +++ b/brozzler/behaviors.yaml @@ -37,10 +37,26 @@ url_regex: '^https?://(?:www\.)?instagram\.com/.*$' behavior_js_template: instagram.js request_idle_timeout_sec: 10 +- + url_regex: '^https?://(?:www\.)?pm\.gc\.ca/.*$' + behavior_js_template: umbraBehavior.js.j2 + default_parameters: + actions: + - selector: div.teaser, li.pager__item a +- # https://webarchive.jira.com/browse/ARI-5389 + url_regex: '^https?://pitchfork\.com/.*$' + behavior_js_template: umbraBehavior.js.j2 + default_parameters: + actions: + - selector: div.teaser, li.pager__item a + closeSelector: .pmf-artist-modal__close-btn - url_regex: '^https?://(?:www\.)?huffingtonpost\.com/.*$' - behavior_js_template: huffpostslides.js - request_idle_timeout_sec: 10 + behavior_js_template: umbraBehavior.js.j2 + default_parameters: + actions: + - selector: .slideshow-card__overlay + - selector: .slideshow__next - url_regex: '^https?://(?:www\.)?brooklynmuseum\.org/exhibitions/.*$' behavior_js_template: simpleclicks.js.j2 @@ -108,6 +124,12 @@ url_regex: '^https?://(?:www\.)?fec.gov/data/.*$' behavior_js_template: fec_gov.js request_idle_timeout_sec: 10 +- url_regex: '^https?://(?:www\.)?news\.com\.au/.*$' + behavior_js_template: umbraBehavior.js.j2 + default_parameters: + actions: + - selector: .menu-item a + do: mouseover - url_regex: '^https?://(?:www\.)?news\.com\.au/.*$' behavior_js_template: mouseovers.js.j2 default_parameters: @@ -135,13 +157,6 @@ click_css_selector: button#ird3-button-next click_until_hard_timeout: True request_idle_timeout_sec: 10 -- # https://webarchive.jira.com/browse/ARI-5389 - url_regex: '^https?://pitchfork\.com/.*$' - behavior_js_template: pitchfork.js -- # https://webarchive.jira.com/browse/ARI-5379 - url_regex: '^https?://(?:www\.)?pm\.gc\.ca/.*$' - behavior_js_template: pm-ca.js - request_idle_timeout_sec: 10 - # https://webarchive.jira.com/browse/ARI-4960 url_regex: '^https?://(?:www\.)?fortstjames.ca/community-events-calendar/$' behavior_js_template: simpleclicks.js.j2 @@ -151,5 +166,7 @@ request_idle_timeout_sec: 10 - # default fallback behavior url_regex: '^.*$' - request_idle_timeout_sec: 10 - behavior_js_template: default.js + behavior_js_template: umbraBehavior.js.j2 + default_parameters: + actions: + - selector: button.sc-button-play, button.playButton, div.soundItem From 4356cc8e4f1c7f0d294caf1a2048e991d8de9199 Mon Sep 17 00:00:00 2001 From: Barbara Miller Date: Thu, 26 Oct 2017 12:39:37 -0700 Subject: [PATCH 2/4] update default selectors --- brozzler/behaviors.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/brozzler/behaviors.yaml b/brozzler/behaviors.yaml index 3e5b7c0..c860abe 100644 --- a/brozzler/behaviors.yaml +++ b/brozzler/behaviors.yaml @@ -169,4 +169,4 @@ behavior_js_template: umbraBehavior.js.j2 default_parameters: actions: - - selector: button.sc-button-play, button.playButton, div.soundItem + - selector: button.sc-button-play, .playButton, div.soundItem, .jwlist>a From 27aca120ce2741c6d9c9bda092a9f875956c437e Mon Sep 17 00:00:00 2001 From: Barbara Miller Date: Wed, 1 Nov 2017 23:54:54 -0700 Subject: [PATCH 3/4] WIP: class-based generalized behavior --- brozzler/behaviors.yaml | 2 +- .../js-templates/classUmbraBehavior.js.j2 | 199 ++++++++++++++++++ 2 files changed, 200 insertions(+), 1 deletion(-) create mode 100644 brozzler/js-templates/classUmbraBehavior.js.j2 diff --git a/brozzler/behaviors.yaml b/brozzler/behaviors.yaml index c860abe..40230ae 100644 --- a/brozzler/behaviors.yaml +++ b/brozzler/behaviors.yaml @@ -39,7 +39,7 @@ request_idle_timeout_sec: 10 - url_regex: '^https?://(?:www\.)?pm\.gc\.ca/.*$' - behavior_js_template: umbraBehavior.js.j2 + behavior_js_template: classUmbraBehavior.js.j2 default_parameters: actions: - selector: div.teaser, li.pager__item a diff --git a/brozzler/js-templates/classUmbraBehavior.js.j2 b/brozzler/js-templates/classUmbraBehavior.js.j2 new file mode 100644 index 0000000..8b21651 --- /dev/null +++ b/brozzler/js-templates/classUmbraBehavior.js.j2 @@ -0,0 +1,199 @@ +/* + * brozzler/js-templates/classUmbrabehavior.js.j2 - an umbra/brozzler behavior class + * + * Copyright (C) 2017 Internet Archive + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +class UmbraBehavior { + + constructor(actions) { + this.IDLE_TIMEOUT_SEC = 10; + this.actions = actions; + this.alreadyDone = []; + this.idleSince = null; + this.intervalId = null; + this.intervalTimeMs = 250; + this.state = null; // currently unused + this.index = 0; + } + + simpleIntervalFunc() { + var k = this.index; + var selector = this.actions[k].selector; + var action = this.actions[k].do ? this.actions[k].do : 'click'; + var closeSelector = this.actions[k].closeSelector ? this.actions[k].closeSelector : null; + + // var limit = this.actions[k].limit ? this.actions[k].limit : 0; + // if (limit && !(this.actions[k].alreadyDone)) { + // this.actions[k].alreadyDone = []; + // } + + // if (limit && this.actions[k].alreadyDone && this.actions[k].alreadyDone.length >= limit) { + // continue; + // } + + var didSomething = false; + var somethingLeftBelow = false; + var somethingLeftAbove = false; + + var iframes = document.querySelectorAll("iframe"); + iframesLength = iframes.length; + var documents = Array(iframesLength + 1); + documents[0] = document; + for (var i = 0; i < iframesLength; i++) { + documents[i+1] = iframes[i].contentWindow.document; + } + documentsLength = documents.length; + + for (var j = 0; j < documentsLength; j++) { + + if (closeSelector) { + var closeTargets = documents[j].querySelectorAll(closeSelector); + if (closeTargets != []) { + this.doTarget(closeTargets[0], 'click'); + didSomething = true; + } + } + + var doTargets = documents[j].querySelectorAll(selector); + if (doTargets == []) { + continue; + } + + doTargetsLength = doTargets.length; + for ( var i = 0; i < doTargetsLength; i++) { + if (this.alreadyDone.indexOf(doTargets[i]) > -1) { + continue; + } + if (!this.isVisible(doTargets[i])) { + continue; + } + // if using limits... + // if (limit && this.actions[k].alreadyDone && this.actions[k].alreadyDone.length >= limit) { + // break; + // } + + var where = this.aboveBelowOrOnScreen(doTargets[i]); + if (where == 0) { + this.doTarget(doTargets[i], action); + // if using limits... + // if (this.actions[k].alreadyDone) { + // this.actions[k].alreadyDone.push(doTargets[i]); + // } + didSomething = true; + break; // break from doTargets loop, but not from documents loop + } else if (where > 0) { + somethingLeftBelow = true; + } else if (where < 0) { + somethingLeftAbove = true; + } + } + } + if (!didSomething) { + if (somethingLeftAbove) { + // console.log("scrolling up"); + window.scrollBy(0, -500); + this.idleSince = null; + } else if (somethingLeftBelow) { + // console.log("scrolling"); document.body.clientHeight =+ document.body.clientHeight); + window.scrollBy(0, 200); + this.idleSince = null; + } else if (window.scrollY + window.innerHeight < document.documentElement.scrollHeight) { + // console.log("scrolling because we're not to the bottom yet"); + window.scrollBy(0, 200); + this.idleSince = null; + } else if (this.idleSince == null) { + this.idleSince = Date.now(); + } + } + if (!this.idleSince) { + this.idleSince = Date.now(); + } else { + var idleTimeMs = Date.now() - this.idleSince; + if ((idleTimeMs / 1000) > (this.IDLE_TIMEOUT_SEC - 1) && this.index < (this.actions.length - 1)) { + console.log("ready for next action"); + this.index += 1; + this.idleSince = null; + return; + } + + } + + aboveBelowOrOnScreen(elem) { + var eTop = elem.getBoundingClientRect().top; + if (eTop < window.scrollY) { + return -1; // above + } else if (eTop > window.scrollY + window.innerHeight) { + return 1; // below + } else { + return 0; // on screen + } + } + + isVisible(elem) { + return !!(elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length); + } + + doTarget(target, action) { + // console.log("doing " + action + target.outerHTML); + // do mouse over event on target + // since some urls are requsted only on + // this event - see + // https://webarchive.jira.com/browse/AITFIVE-451 + var mouseOverEvent = document.createEvent("Events"); + mouseOverEvent.initEvent("mouseover", true, false); + target.dispatchEvent(mouseOverEvent); + + if (action == "click") { + target.click(); + } // add new do's here! + + this.alreadyDone.push(target); + this.idleSince = null; + } + + start() { + var that = this; + this.intervalId = setInterval(function() { + that.simpleIntervalFunc() + }, this.intervalTimeMs); + } + + isFinished() { + if (this.idleSince != null) { + var idleTimeMs = Date.now() - this.idleSince; + if (idleTimeMs / 1000 > this.IDLE_TIMEOUT_SEC) { + clearInterval(this.intervalId); + return true; + } + } + return false; + } +} + +//actions : [{'selector': 'div.teaser, li.pager__item a'}], +//actions : [{'selector': '.slideshow-card__overlay'}, {'selector': '.slideshow__next'}], + +// var umbraBehavior = new UmbraBehavior( {{actions|json}} ) + +var umbraBehavior = new UmbraBehavior( [{'selector': 'div.teaser, li.pager__item a'}] ) + +// Called from outside of this script. +var umbraBehaviorFinished = function() { + return umbraBehavior.isFinished(); +}; + +umbraBehavior.start(); From abc39c0ef239969b4ff45da17ad3166994b4aee1 Mon Sep 17 00:00:00 2001 From: Barbara Miller Date: Tue, 7 Nov 2017 12:05:07 -0800 Subject: [PATCH 4/4] class-based generalized behavior --- ...lassUmbraBehavior.js.j2 => umbraBehavior.js} | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) rename brozzler/js-templates/{classUmbraBehavior.js.j2 => umbraBehavior.js} (93%) diff --git a/brozzler/js-templates/classUmbraBehavior.js.j2 b/brozzler/js-templates/umbraBehavior.js similarity index 93% rename from brozzler/js-templates/classUmbraBehavior.js.j2 rename to brozzler/js-templates/umbraBehavior.js index 8b21651..4a75312 100644 --- a/brozzler/js-templates/classUmbraBehavior.js.j2 +++ b/brozzler/js-templates/umbraBehavior.js @@ -50,16 +50,15 @@ class UmbraBehavior { var somethingLeftAbove = false; var iframes = document.querySelectorAll("iframe"); - iframesLength = iframes.length; + var iframesLength = iframes.length; var documents = Array(iframesLength + 1); documents[0] = document; for (var i = 0; i < iframesLength; i++) { documents[i+1] = iframes[i].contentWindow.document; } - documentsLength = documents.length; + var documentsLength = documents.length; for (var j = 0; j < documentsLength; j++) { - if (closeSelector) { var closeTargets = documents[j].querySelectorAll(closeSelector); if (closeTargets != []) { @@ -72,8 +71,7 @@ class UmbraBehavior { if (doTargets == []) { continue; } - - doTargetsLength = doTargets.length; + var doTargetsLength = doTargets.length; for ( var i = 0; i < doTargetsLength; i++) { if (this.alreadyDone.indexOf(doTargets[i]) > -1) { continue; @@ -128,8 +126,8 @@ class UmbraBehavior { this.index += 1; this.idleSince = null; return; + } } - } aboveBelowOrOnScreen(elem) { @@ -184,12 +182,9 @@ class UmbraBehavior { } } -//actions : [{'selector': 'div.teaser, li.pager__item a'}], -//actions : [{'selector': '.slideshow-card__overlay'}, {'selector': '.slideshow__next'}], +var umbraBehavior = new UmbraBehavior( {{actions|json}} ); -// var umbraBehavior = new UmbraBehavior( {{actions|json}} ) - -var umbraBehavior = new UmbraBehavior( [{'selector': 'div.teaser, li.pager__item a'}] ) +// var umbraBehavior = new UmbraBehavior( [{'selector': 'div.teaser, li.pager__item a'}] ); // Called from outside of this script. var umbraBehaviorFinished = function() {