2014-05-04 21:33:13 -07:00
// vim:set sw=8 et:
2014-05-05 11:58:55 -07:00
//
2015-02-02 14:52:56 -08:00
// Scrolls to the bottom of the page, and clicks on embedded soundcloud
// elements.
2014-05-05 11:58:55 -07:00
//
2015-02-02 14:52:56 -08: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
2014-09-12 16:07:32 -07:00
var UMBRA _IFRAME _SOUNDCLOUD _EMBEDDED _SELECTOR = "iframe" ;
var UMBRA _THINGS _TO _CLICK _SOUNDCLOUD _EMBEDDED _SELECTOR = "button.sc-button-play, button.playButton" ;
var MAX _IFRAME _RECURSE _DEPTH = 1 ; //0-based
2014-05-04 21:33:13 -07:00
var umbraState = { 'idleSince' : null } ;
2014-07-24 16:44:05 -07:00
var umbraAlreadyClicked = { } ;
2014-05-04 21:33:13 -07:00
var umbraFinished = false ;
var umbraIntervalFunc = function ( ) {
2014-09-22 14:21:00 -07:00
var umbraSoundCloudEmbeddedElements = [ ] ;
2014-09-12 16:07:32 -07:00
2014-09-22 14:21:00 -07:00
getUmbraSoundCloudEmbeddedElements ( umbraSoundCloudEmbeddedElements ) ;
2014-07-24 16:44:05 -07:00
var clickedSomething = false ;
var somethingLeftBelow = false ;
var somethingLeftAbove = false ;
var missedAbove = 0 ;
for ( var i = 0 ; i < umbraSoundCloudEmbeddedElements . length ; i ++ ) {
2014-09-22 14:22:52 -07:00
var targetId = umbraSoundCloudEmbeddedElements [ i ] . id ;
2014-07-24 16:44:05 -07:00
var target = umbraSoundCloudEmbeddedElements [ i ] . target ;
if ( ! ( targetId in umbraAlreadyClicked ) ) {
2014-09-12 16:07:32 -07:00
2014-07-24 16:44:05 -07:00
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
2015-01-21 16:28:29 -08:00
var getUmbraSoundCloudEmbeddedElements = function ( soundCloudEmbeddedElements , currentIframeDepth , currentDocument ,
iframeElement ) {
2014-07-24 16:44:05 -07:00
2014-09-12 16:07:32 -07:00
//set default values for parameters
currentIframeDepth = currentIframeDepth || 0 ;
currentDocument = currentDocument || document ;
2014-07-24 16:44:05 -07:00
2014-09-12 16:07:32 -07:00
if ( currentIframeDepth > MAX _IFRAME _RECURSE _DEPTH ) {
return ;
}
2014-07-24 16:44:05 -07:00
2014-09-12 16:07:32 -07:00
//collect all buttons on current document first
var button = [ ] ;
button = currentDocument . querySelectorAll ( UMBRA _THINGS _TO _CLICK _SOUNDCLOUD _EMBEDDED _SELECTOR ) ;
2015-01-21 16:28:29 -08:00
var cssPathIframe = iframeElement ? getElementCssPath ( iframeElement ) : "" ;
2014-09-12 16:07:32 -07:00
for ( var i = 0 ; i < button . length ; i ++ ) {
2015-01-21 16:28:29 -08:00
soundCloudEmbeddedElements . push ( { "id" : cssPathIframe + getElementCssPath ( button . item ( i ) ) , "target" : button . item ( i ) } ) ;
2014-09-12 16:07:32 -07:00
}
//now get all buttons in embedded iframes
var iframe = [ ] ;
2014-07-24 16:44:05 -07:00
2014-09-12 16:07:32 -07:00
iframe = currentDocument . querySelectorAll ( UMBRA _IFRAME _SOUNDCLOUD _EMBEDDED _SELECTOR ) ;
for ( var i = 0 ; i < iframe . length ; i ++ ) {
2015-01-21 16:28:29 -08:00
getUmbraSoundCloudEmbeddedElements ( soundCloudEmbeddedElements , currentIframeDepth + 1 , iframe [ i ] . contentWindow . document . body , iframe [ i ] ) ;
2014-09-12 16:07:32 -07:00
}
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 ;
}
2014-09-12 16:07:32 -07:00
//copied from http://stackoverflow.com/questions/4588119/get-elements-css-selector-without-element-id
var getElementCssPath = function ( element ) {
var names = [ ] ;
while ( element . parentNode ) {
if ( element . id ) {
names . unshift ( '#' + element . id ) ;
break ;
} else {
if ( element == element . ownerDocument . documentElement ) {
names . unshift ( element . tagName ) ;
}
else {
for ( var c = 1 , e = element ; e . previousElementSibling ; e = e . previousElementSibling , c ++ ) ;
names . unshift ( element . tagName + ":nth-child(" + c + ")" ) ;
}
element = element . parentNode ;
}
}
return names . join ( " > " ) ;
}
2014-05-04 21:33:13 -07:00
var umbraIntervalId = setInterval ( umbraIntervalFunc , 100 ) ;