@@ -259,7 +259,7 @@ var uBlockCollapser = (function() {
259259 if ( node . localName === 'iframe' ) {
260260 addIFrame ( node ) ;
261261 }
262- var iframes = node . querySelectorAll ( 'iframe' ) ;
262+ var iframes = node . getElementsByTagName ( 'iframe' ) ;
263263 var i = iframes . length ;
264264 while ( i -- ) {
265265 addIFrame ( iframes [ i ] ) ;
@@ -580,38 +580,47 @@ var uBlockCollapser = (function() {
580580 // - [href^="http"]
581581
582582 var processHighMediumGenerics = function ( generics , out ) {
583- var nodeList = selectNodes ( 'a[href^="http"]' ) ;
584- var iNode = nodeList . length ;
585- var node , href , pos , hash , selectors , selector , iSelector ;
583+ var doc = document ;
584+ var i = contextNodes . length ;
585+ var aa = [ null ] ;
586+ var node , nodes ;
587+ while ( i -- ) {
588+ node = contextNodes [ i ] ;
589+ if ( node . localName === 'a' ) {
590+ aa [ 0 ] = node ;
591+ processHighMediumGenericsForNodes ( aa , generics , out ) ;
592+ }
593+ nodes = node . getElementsByTagName ( 'a' ) ;
594+ if ( nodes . length === 0 ) { continue ; }
595+ processHighMediumGenericsForNodes ( nodes , generics , out ) ;
596+ if ( node === doc ) {
597+ break ;
598+ }
599+ }
600+ } ;
586601
587- while ( iNode -- ) {
588- node = nodeList [ iNode ] ;
602+ var processHighMediumGenericsForNodes = function ( nodes , generics , out ) {
603+ var i = nodes . length ;
604+ var node , href , pos , hash , selectors , j , selector ;
605+ var aa = [ '' ] ;
606+ while ( i -- ) {
607+ node = nodes [ i ] ;
589608 href = node . getAttribute ( 'href' ) ;
590609 if ( ! href ) { continue ; }
591-
592610 pos = href . indexOf ( '://' ) ;
593611 if ( pos === - 1 ) { continue ; }
594-
595612 hash = href . slice ( pos + 3 , pos + 11 ) ;
596613 selectors = generics [ hash ] ;
597614 if ( selectors === undefined ) { continue ; }
598-
599615 // A string.
600616 if ( typeof selectors === 'string' ) {
601- if (
602- href . lastIndexOf ( selectors . slice ( 8 , - 2 ) , 0 ) === 0 &&
603- injectedSelectors . hasOwnProperty ( selectors ) === false
604- ) {
605- injectedSelectors [ selectors ] = true ;
606- out . push ( selectors ) ;
607- }
608- continue ;
617+ aa [ 0 ] = selectors ;
618+ selectors = aa ;
609619 }
610-
611620 // An array of strings.
612- iSelector = selectors . length ;
613- while ( iSelector -- ) {
614- selector = selectors [ iSelector ] ;
621+ j = selectors . length ;
622+ while ( j -- ) {
623+ selector = selectors [ j ] ;
615624 if (
616625 href . lastIndexOf ( selector . slice ( 8 , - 2 ) , 0 ) === 0 &&
617626 injectedSelectors . hasOwnProperty ( selector ) === false
@@ -687,8 +696,7 @@ var uBlockCollapser = (function() {
687696 while ( i -- ) {
688697 node = nodes [ i ] ;
689698 if ( node . nodeType !== 1 ) { continue ; }
690- // id
691- v = nodes [ i ] . id ;
699+ v = node . id ;
692700 if ( typeof v !== 'string' ) { continue ; }
693701 v = v . trim ( ) ;
694702 if ( v === '' ) { continue ; }
@@ -891,20 +899,27 @@ var uBlockCollapser = (function() {
891899/******************************************************************************/
892900
893901// https://github.com/chrisaljoudi/uBlock/issues/7
894-
895- // Executed only once
902+ // Executed only once.
903+ // Preferring getElementsByTagName over querySelectorAll:
904+ // http://jsperf.com/queryselectorall-vs-getelementsbytagname/145
896905
897906( function ( ) {
898907 var collapser = uBlockCollapser ;
899908 var elems , i , elem ;
900909
901- elems = document . querySelectorAll ( 'embed, object ' ) ;
910+ elems = document . getElementsByTagName ( 'embed' ) ;
902911 i = elems . length ;
903912 while ( i -- ) {
904913 collapser . add ( elems [ i ] ) ;
905914 }
906915
907- elems = document . querySelectorAll ( 'img' ) ;
916+ elems = document . getElementsByTagName ( 'object' ) ;
917+ i = elems . length ;
918+ while ( i -- ) {
919+ collapser . add ( elems [ i ] ) ;
920+ }
921+
922+ elems = document . getElementsByTagName ( 'img' ) ;
908923 i = elems . length ;
909924 while ( i -- ) {
910925 elem = elems [ i ] ;
@@ -913,11 +928,12 @@ var uBlockCollapser = (function() {
913928 }
914929 }
915930
916- elems = document . querySelectorAll ( 'iframe' ) ;
931+ elems = document . getElementsByTagName ( 'iframe' ) ;
917932 i = elems . length ;
918933 while ( i -- ) {
919934 collapser . addIFrame ( elems [ i ] ) ;
920935 }
936+
921937 collapser . process ( 0 ) ;
922938} ) ( ) ;
923939
0 commit comments