diff --git a/brozzler/behaviors.yaml b/brozzler/behaviors.yaml index 9b61e33..212ae5c 100644 --- a/brozzler/behaviors.yaml +++ b/brozzler/behaviors.yaml @@ -52,8 +52,11 @@ 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 + - selector: .slideshow-overlay__container__left__nav__next - url_regex: '^https?://(?:www\.)?brooklynmuseum\.org/exhibitions/.*$' behavior_js_template: simpleclicks.js.j2 @@ -156,5 +159,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 diff --git a/brozzler/js-templates/umbraBehavior.js.j2 b/brozzler/js-templates/umbraBehavior.js.j2 index 6eb2482..9cdb03d 100644 --- a/brozzler/js-templates/umbraBehavior.js.j2 +++ b/brozzler/js-templates/umbraBehavior.js.j2 @@ -1,5 +1,5 @@ /* - * brozzler/js-templates/umbrabehavior.js.j2 - a library for umbra/brozzler behaviors + * brozzler/js-templates/umbrabehavior.js.j2 - a generalized umbra/brozzler behavior * * Copyright (C) 2017 Internet Archive * @@ -24,108 +24,146 @@ var umbraBehavior = { intervalId : null, state : null, - // actions : [{'selector': 'div.teaser, li.pager__item a'}], - actions : {{actions|json}}, + actions : [{'selector': 'div.teaser, li.pager__item a'}], + //actions : {{actions|json}}, + k : 0, intervalFunc: function() { if (!this.state) { this.state = this.actions.length === 1 ? "simple" : "fancy"; + } else if (this.actions.length === k + 1) { + // last action always uses simple block + this.state = "simple"; } - for (var k = 0; k < this.actions.length; k++) { - 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.length >= limit) { - continue; - } - if (limit && !(this.actions[k].alreadyDone)) { - this.actions[k].alreadyDone = []; + + var k = this.k; + 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; + + // need to figure out more about how to end more complex actions... + // var limit = this.actions[k].limit ? this.actions[k].limit : 0; + // if (limit && this.actions[k].alreadyDone && this.actions[k].alreadyDone.length >= limit) { + // continue; + // } + // if (limit && !(this.actions[k].alreadyDone)) { + // this.actions[k].alreadyDone = []; + // } + + if (this.state === "fancy") { + + var moreButton = document.querySelectorAll(selector); + if (moreButton.length > 0) { + console.log("clicking more button"); + this.doTarget(moreButton[0],action); + this.k++; // use next action at next run of interval function + return; } - if (this.state === "simple") { - var didSomething = false; - var somethingLeftBelow = false; - var somethingLeftAbove = false; + if (window.scrollY + window.innerHeight < document.documentElement.scrollHeight) { + window.scrollBy(0, 200); + this.idleSince = null; + return; + } - var iframes = document.querySelectorAll("iframe"); - var documents = Array(iframes.length + 1); - documents[0] = document; - - iframesLength = iframes.length; - for (var i = 0; i < iframesLength; i++) { - documents[i+1] = iframes[i].contentWindow.document; + if (this.idleSince === null) { + console.log("nothing to do at the moment, might be waiting for something to load, setting this.idleSince=Date.now()"); + this.idleSince = Date.now(); + return; + } else { + if ((Date.now() - this.idleSince) > 9000) { + console.log("finished loading-thumbs, it appears we have reached the bottom"); + this.state = "clicking-first-thumb"; + this.idleSince = null; } + return; + } + } - documentsLength = documents.length; - for (var j = 0; j < documentsLength; j++) { + if (this.state === "simple") { + var didSomething = false; + var somethingLeftBelow = false; + var somethingLeftAbove = false; - if (closeSelector) { - var closeTargets = documents[j].querySelectorAll(closeSelector); - if (closeTargets != []) { - for ( var i = 0; i < closeTargets.length; i++) { - this.doTarget(closeTargets[i], 'click'); - didSomething = true; - break; // break from closeTargets loop - } + var iframes = document.querySelectorAll("iframe"); + var documents = Array(iframes.length + 1); + documents[0] = document; + + iframesLength = iframes.length; + 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 != []) { + for ( var i = 0; i < closeTargets.length; i++) { + this.doTarget(closeTargets[i], 'click'); + didSomething = true; + break; // break from closeTargets loop } } + } - var doTargets = documents[j].querySelectorAll(selector); - if (doTargets == []) { + var doTargets = documents[j].querySelectorAll(selector); + if (doTargets == []) { + continue; + } + + doTargetsLength = doTargets.length; + for ( var i = 0; i < doTargetsLength; i++) { + // if using limits... + // if (limit && this.actions[k].alreadyDone && this.actions[k].alreadyDone.length >= limit) { + // break; + // } + + if (this.alreadyDone.indexOf(doTargets[i]) > -1) { continue; } - - doTargetsLength = doTargets.length; - for ( var i = 0; i < doTargetsLength; i++) { - if (limit && this.actions[k].alreadyDone && this.actions[k].alreadyDone.length >= limit) { - break; - } - if (this.alreadyDone.indexOf(doTargets[i]) > -1) { - continue; - } - if (!this.isVisible(doTargets[i])) { - continue; - } - var where = this.aboveBelowOrOnScreen(doTargets[i]); - if (where == 0) { - this.doTarget(doTargets[i], action); - 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 (!this.isVisible(doTargets[i])) { + continue; } - } - if (!didSomething) { - if (somethingLeftAbove) { - // console.log("scrolling UP because everything on this screen has been clicked but we missed something above"); - window.scrollBy(0, -500); - this.idleSince = null; - } else if (somethingLeftBelow) { - // console.log("scrolling because everything on this screen has been clicked but there's more below 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 document.body.clientHeight=" - // + document.body.clientHeight); - window.scrollBy(0, 200); - this.idleSince = null; - } else if (this.idleSince == null) { - this.idleSince = Date.now(); + var where = this.aboveBelowOrOnScreen(doTargets[i]); + if (where == 0) { + this.doTarget(doTargets[i], action); + // 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 (!this.idleSince) { - this.idleSince = Date.now(); + if (!didSomething) { + if (somethingLeftAbove) { + // console.log("scrolling UP because everything on this screen has been clicked but we missed something above"); + window.scrollBy(0, -500); + this.idleSince = null; + } else if (somethingLeftBelow) { + // console.log("scrolling because everything on this screen has been clicked but there's more below 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 document.body.clientHeight=" + // + document.body.clientHeight); + window.scrollBy(0, 200); + this.idleSince = null; + } else if (this.idleSince == null) { + this.idleSince = Date.now(); + } } } + if (!this.idleSince) { + this.idleSince = Date.now(); + } }, aboveBelowOrOnScreen : function(elem) {