2014-05-05 11:58:55 -07:00
// {"request_idle_timeout_sec":10}
//
2014-05-04 21:33:13 -07:00
// vim:set sw=8 et:
2014-05-05 11:58:55 -07:00
//
// Scrolls to the bottom of the page. That's it at the moment.
//
2014-05-04 21:33:13 -07:00
2014-07-24 16:44:05 -07:00
var umbraAboveBelowOrOnScreen = function ( e ) {
var eTop = e . getBoundingClientRect ( ) . top ;
if ( eTop < window . scrollY ) {
return - 1 ; // above
} else if ( eTop > window . scrollY + window . innerHeight ) {
return 1 ; // below
} else {
return 0 ; // on screen
}
}
2014-05-04 21:33:13 -07:00
var umbraState = { 'idleSince' : null } ;
2014-07-24 16:44:05 -07:00
var umbraAlreadyClicked = { } ;
2014-09-12 09:56:41 -07:00
var UMBRA _IFRAME _SOUNDCLOUD _EMBEDDED _SELECTOR = "iframe[src^='http://w.soundcloud.com/player'], iframe[src^='https://w.soundcloud.com/player']" ;
2014-07-24 16:44:05 -07:00
var UMBRA _THINGS _TO _CLICK _SOUNDCLOUD _EMBEDDED _SELECTOR = "button.playButton" ;
2014-05-04 21:33:13 -07:00
var umbraFinished = false ;
var umbraIntervalFunc = function ( ) {
2014-07-24 16:44:05 -07:00
var umbraSoundCloudEmbeddedElements = getUmbraSoundCloudEmbeddedElements ( ) ;
var clickedSomething = false ;
var somethingLeftBelow = false ;
var somethingLeftAbove = false ;
var missedAbove = 0 ;
for ( var i = 0 ; i < umbraSoundCloudEmbeddedElements . length ; i ++ ) {
var targetId = umbraSoundCloudEmbeddedElements [ i ] . id ;
var target = umbraSoundCloudEmbeddedElements [ i ] . target ;
if ( ! ( targetId in umbraAlreadyClicked ) ) {
var where = umbraAboveBelowOrOnScreen ( target ) ;
if ( where == 0 ) { // on screen
// var pos = target.getBoundingClientRect().top;
// window.scrollTo(0, target.getBoundingClientRect().top - 100);
console . log ( "clicking at " + target . getBoundingClientRect ( ) . top + " on " + target . outerHTML ) ;
if ( target . click != undefined ) {
target . click ( ) ;
}
umbraAlreadyClicked [ targetId ] = true ;
clickedSomething = true ;
umbraState . idleSince = null ;
break ;
} else if ( where > 0 ) {
somethingLeftBelow = true ;
} else if ( where < 0 ) {
somethingLeftAbove = true ;
}
}
}
if ( ! clickedSomething ) {
if ( somethingLeftAbove ) {
console . log ( "scrolling UP because everything on this screen has been clicked but we missed something above" ) ;
window . scrollBy ( 0 , - 500 ) ;
umbraState . 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 ) ;
umbraState . 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 ) ;
umbraState . idleSince = null ;
} else if ( umbraState . idleSince == null ) {
2014-05-04 21:33:13 -07:00
umbraState . idleSince = Date . now ( ) ;
}
2014-07-24 16:44:05 -07:00
}
if ( umbraState . idleSince == null ) {
umbraState . idleSince = Date . now ( ) ;
}
}
//try to detect sound cloud "Play" buttons and return them as targets for clicking
var getUmbraSoundCloudEmbeddedElements = function ( ) {
var soundCloudEmbeddedElements = [ ] ;
var id = 0 ;
[ ] . forEach . call ( document . querySelectorAll ( UMBRA _IFRAME _SOUNDCLOUD _EMBEDDED _SELECTOR ) ,
function fn ( elem ) {
2014-09-12 09:56:41 -07:00
var button = elem . contentWindow . document . body . querySelectorAll ( UMBRA _THINGS _TO _CLICK _SOUNDCLOUD _EMBEDDED _SELECTOR ) ;
//use the iframe's src attribute as the key to the sound cloud player button. assumption is that each iframe created by the sound cloud widget
//contains only a single unique audio file on a given page
if ( button && button . length > 0 ) {
//get the Element from the NodeList
soundCloudEmbeddedElements . push ( { "id" : elem . src , "target" : button . item ( 0 ) } ) ;
id ++ ;
2014-07-24 16:44:05 -07:00
}
2014-09-12 09:56:41 -07:00
}
2014-07-24 16:44:05 -07:00
) ;
return soundCloudEmbeddedElements ;
2014-05-04 21:33:13 -07:00
}
2014-05-05 11:58:55 -07:00
// If we haven't had anything to do (scrolled, clicked, etc) in this amount of
// time, then we consider ourselves finished with the page.
var UMBRA _USER _ACTION _IDLE _TIMEOUT _SEC = 10 ;
// Called from outside of this script.
2014-05-04 21:33:13 -07:00
var umbraBehaviorFinished = function ( ) {
if ( umbraState . idleSince != null ) {
2014-05-05 11:58:55 -07:00
var idleTimeMs = Date . now ( ) - umbraState . idleSince ;
if ( idleTimeMs / 1000 > UMBRA _USER _ACTION _IDLE _TIMEOUT _SEC ) {
2014-05-04 21:33:13 -07:00
return true ;
}
}
return false ;
}
var umbraIntervalId = setInterval ( umbraIntervalFunc , 100 ) ;