2
2
* @module Android integration
3
3
* @category Content Scope Scripts Integrations
4
4
*/
5
- import { load , init } from '../src/content-scope-features.js'
5
+ import { load , init , update } from '../src/content-scope-features.js'
6
6
import { processConfig , isGloballyDisabled } from './../src/utils'
7
7
8
+ const allowedMessages = [
9
+ 'getClickToLoadState' ,
10
+ 'getYouTubeVideoDetails' ,
11
+ 'openShareFeedbackPage' ,
12
+ 'setYoutubePreviewsEnabled' ,
13
+ 'unblockClickToLoadContent' ,
14
+ 'updateYouTubeCTLAddedFlag'
15
+ ]
16
+
8
17
function initCode ( ) {
9
18
// @ts -expect-error https://app.asana.com/0/1201614831475344/1203979574128023/f
10
19
const processedConfig = processConfig ( $CONTENT_SCOPE$ , $USER_UNPROTECTED_DOMAINS$ , $USER_PREFERENCES$ )
@@ -16,10 +25,53 @@ function initCode () {
16
25
platform : processedConfig . platform
17
26
} )
18
27
28
+ const messageSecret = processedConfig . messageSecret
29
+ // Receives messages from the platform
30
+ const messageCallback = processedConfig . messageCallback
31
+ // Sends messages to the platform
32
+ const messageInterface = processedConfig . messageInterface
33
+
34
+ const wrappedUpdate = ( ( providedSecret , ...args ) => {
35
+ if ( providedSecret === messageSecret ) {
36
+ update ( ...args )
37
+ }
38
+ // eslint-disable-next-line no-extra-bind
39
+ } ) . bind ( this )
40
+
41
+ Object . defineProperty ( window , messageCallback , {
42
+ value : wrappedUpdate
43
+ } )
44
+
45
+ let sendMessageToAndroid
46
+ if ( Object . prototype . hasOwnProperty . call ( window , messageInterface ) ) {
47
+ // @ts -expect-error - Defined on the platform using WebView.addJavascriptInterface()
48
+ sendMessageToAndroid = window [ messageInterface ] . process . bind ( window [ messageInterface ] )
49
+ delete window [ messageInterface ]
50
+ } else {
51
+ sendMessageToAndroid = ( ) => { console . error ( 'Android messaging interface not available' ) }
52
+ }
53
+
19
54
init ( processedConfig )
20
55
21
- // Not supported:
22
- // update(message)
56
+ window . addEventListener ( 'sendMessageProxy' + messageSecret , event => {
57
+ event . stopImmediatePropagation ( )
58
+
59
+ if ( ! ( event instanceof CustomEvent ) || ! event ?. detail ) {
60
+ return console . warn ( 'no details in sendMessage proxy' , event )
61
+ }
62
+
63
+ const messageType = event . detail ?. messageType
64
+ if ( ! allowedMessages . includes ( messageType ) ) {
65
+ return console . warn ( 'Ignoring invalid sendMessage messageType' , messageType )
66
+ }
67
+
68
+ const message = {
69
+ type : messageType ,
70
+ options : event . detail ?. options
71
+ }
72
+ const stringifiedArgs = JSON . stringify ( message )
73
+ sendMessageToAndroid ( stringifiedArgs , messageSecret )
74
+ } )
23
75
}
24
76
25
77
initCode ( )
0 commit comments