1+ /*
2+ The idea implemented from
3+ https://issues.adblockplus.org/ticket/6969
4+ */
5+
6+ ( function ( ) {
7+ let createProxy = function ( object , property , descriptor ) {
8+ let pos = property . indexOf ( "." ) ;
9+ if ( pos === - 1 ) {
10+ let objDescriptor = Object . getOwnPropertyDescriptor ( object , property ) ;
11+ if ( objDescriptor && ! objDescriptor . configurable )
12+ return ;
13+
14+ Object . defineProperty ( object , property , Object . assign ( { } , descriptor , { configurable : true } ) ) ;
15+ return true ;
16+ } else {
17+ let property1 = property . slice ( 0 , pos ) ;
18+ let propertyRemaining = property . slice ( pos + 1 ) ;
19+ let value = object [ property1 ] ;
20+ if ( value && ( value instanceof Object ) ) {
21+ createProxy ( value , propertyRemaining , descriptor ) ;
22+ return ;
23+ }
24+
25+ let objDescriptor = Object . getOwnPropertyDescriptor ( object , property1 ) ;
26+ if ( objDescriptor && ! objDescriptor . configurable )
27+ return ;
28+
29+ Object . defineProperty ( object , property1 , {
30+ get ( ) { return value ; } ,
31+ set ( newValue ) { value = newValue ; if ( newValue instanceof Object ) {
32+ createProxy ( newValue , propertyRemaining , descriptor ) ;
33+ } } ,
34+ configurable : true
35+ } ) ;
36+ }
37+ }
38+
39+ let randomNo = Math . floor ( Math . random ( ) * 2116316160 + 60466176 ) . toString ( 36 ) ;
40+ let abort = function ( ) {
41+ throw new ReferenceError ( randomNo ) ;
42+ }
43+ var onerror = window . onerror ;
44+ window . onerror = function ( message , source , lineno , colno , error ) {
45+ if ( typeof message === 'string' && message . indexOf ( randomNo ) !== - 1 ) {
46+ return true ;
47+ }
48+ if ( typeof onerror == "function" )
49+ return onerror ( message , source , lineno , colno , error ) ;
50+ } ;
51+ createProxy ( window , '{{1}}' , { get : abort , set : function ( ) { } } ) ;
52+ } ) ( ) ;
0 commit comments