14
14
* See the License for the specific language governing permissions and
15
15
* limitations under the License.
16
16
*/
17
-
17
+ // Imports navigator.userAgentData types.
18
+ // The user-agent-data-types package isn't intended for modular imports.
19
+ // eslint-disable-next-line @typescript-eslint/triple-slash-reference
20
+ /// <reference types="user-agent-data-types" />
18
21
import { AIError } from '../errors' ;
19
22
import { expect , use } from 'chai' ;
20
23
import sinonChai from 'sinon-chai' ;
@@ -68,6 +71,7 @@ describe('ChromeAdapter', () => {
68
71
} as LanguageModelCreateOptions ;
69
72
const adapter = new ChromeAdapter (
70
73
languageModelProvider ,
74
+ undefined ,
71
75
'prefer_on_device' ,
72
76
{
73
77
createOptions
@@ -94,15 +98,19 @@ describe('ChromeAdapter', () => {
94
98
) . to . be . false ;
95
99
} ) ;
96
100
it ( 'returns false if mode is only cloud' , async ( ) => {
97
- const adapter = new ChromeAdapter ( undefined , 'only_in_cloud' ) ;
101
+ const adapter = new ChromeAdapter ( undefined , undefined , 'only_in_cloud' ) ;
98
102
expect (
99
103
await adapter . isAvailable ( {
100
104
contents : [ ]
101
105
} )
102
106
) . to . be . false ;
103
107
} ) ;
104
108
it ( 'returns false if LanguageModel API is undefined' , async ( ) => {
105
- const adapter = new ChromeAdapter ( undefined , 'prefer_on_device' ) ;
109
+ const adapter = new ChromeAdapter (
110
+ undefined ,
111
+ undefined ,
112
+ 'prefer_on_device'
113
+ ) ;
106
114
expect (
107
115
await adapter . isAvailable ( {
108
116
contents : [ ]
@@ -114,6 +122,7 @@ describe('ChromeAdapter', () => {
114
122
{
115
123
availability : async ( ) => Availability . available
116
124
} as LanguageModel ,
125
+ undefined ,
117
126
'prefer_on_device'
118
127
) ;
119
128
expect (
@@ -122,11 +131,59 @@ describe('ChromeAdapter', () => {
122
131
} )
123
132
) . to . be . false ;
124
133
} ) ;
134
+ it ( 'returns false if unsupported browser' , async ( ) => {
135
+ const adapter = new ChromeAdapter (
136
+ {
137
+ availability : async ( ) => Availability . available
138
+ } as LanguageModel ,
139
+ // Defines user agent, but no supported browser.
140
+ { brands : [ ] } as UADataValues ,
141
+ 'prefer_on_device'
142
+ ) ;
143
+ expect (
144
+ await adapter . isAvailable ( {
145
+ contents : [ ]
146
+ } )
147
+ ) . to . be . false ;
148
+ } ) ;
149
+ it ( 'returns true if supported browser' , async ( ) => {
150
+ const adapter = new ChromeAdapter (
151
+ {
152
+ availability : async ( ) => Availability . available
153
+ } as LanguageModel ,
154
+ {
155
+ brands : [ { brand : 'Google Chrome' , version : '138' } ]
156
+ } as UADataValues ,
157
+ 'prefer_on_device'
158
+ ) ;
159
+ for ( const mimeType of ChromeAdapter . SUPPORTED_MIME_TYPES ) {
160
+ expect (
161
+ await adapter . isAvailable ( {
162
+ contents : [
163
+ {
164
+ role : 'user' ,
165
+ parts : [
166
+ {
167
+ inlineData : {
168
+ mimeType,
169
+ data : ''
170
+ }
171
+ }
172
+ ]
173
+ }
174
+ ]
175
+ } )
176
+ ) . to . be . true ;
177
+ }
178
+ } ) ;
125
179
it ( 'returns false if request content has "function" role' , async ( ) => {
126
180
const adapter = new ChromeAdapter (
127
181
{
128
182
availability : async ( ) => Availability . available
129
183
} as LanguageModel ,
184
+ {
185
+ brands : [ { brand : 'Google Chrome' , version : '138' } ]
186
+ } as UADataValues ,
130
187
'prefer_on_device'
131
188
) ;
132
189
expect (
@@ -145,6 +202,9 @@ describe('ChromeAdapter', () => {
145
202
{
146
203
availability : async ( ) => Availability . available
147
204
} as LanguageModel ,
205
+ {
206
+ brands : [ { brand : 'Google Chrome' , version : '138' } ]
207
+ } as UADataValues ,
148
208
'prefer_on_device'
149
209
) ;
150
210
for ( const mimeType of ChromeAdapter . SUPPORTED_MIME_TYPES ) {
@@ -173,6 +233,9 @@ describe('ChromeAdapter', () => {
173
233
} as LanguageModel ;
174
234
const adapter = new ChromeAdapter (
175
235
languageModelProvider ,
236
+ {
237
+ brands : [ { brand : 'Google Chrome' , version : '138' } ]
238
+ } as UADataValues ,
176
239
'prefer_on_device'
177
240
) ;
178
241
expect (
@@ -202,6 +265,7 @@ describe('ChromeAdapter', () => {
202
265
} as LanguageModelCreateOptions ;
203
266
const adapter = new ChromeAdapter (
204
267
languageModelProvider ,
268
+ undefined ,
205
269
'prefer_on_device' ,
206
270
{ createOptions }
207
271
) ;
@@ -225,6 +289,7 @@ describe('ChromeAdapter', () => {
225
289
) ;
226
290
const adapter = new ChromeAdapter (
227
291
languageModelProvider ,
292
+ undefined ,
228
293
'prefer_on_device'
229
294
) ;
230
295
await adapter . isAvailable ( {
@@ -249,6 +314,7 @@ describe('ChromeAdapter', () => {
249
314
) ;
250
315
const adapter = new ChromeAdapter (
251
316
languageModelProvider ,
317
+ undefined ,
252
318
'prefer_on_device'
253
319
) ;
254
320
await adapter . isAvailable ( {
@@ -267,6 +333,9 @@ describe('ChromeAdapter', () => {
267
333
} as LanguageModel ;
268
334
const adapter = new ChromeAdapter (
269
335
languageModelProvider ,
336
+ {
337
+ brands : [ { brand : 'Google Chrome' , version : '138' } ]
338
+ } as UADataValues ,
270
339
'prefer_on_device'
271
340
) ;
272
341
expect (
@@ -285,6 +354,7 @@ describe('ChromeAdapter', () => {
285
354
) . resolves ( Availability . available ) ;
286
355
const adapter = new ChromeAdapter (
287
356
languageModelProvider ,
357
+ undefined ,
288
358
'prefer_on_device' ,
289
359
{
290
360
createOptions : {
@@ -311,7 +381,7 @@ describe('ChromeAdapter', () => {
311
381
} ) ;
312
382
describe ( 'generateContent' , ( ) => {
313
383
it ( 'throws if Chrome API is undefined' , async ( ) => {
314
- const adapter = new ChromeAdapter ( undefined , 'only_on_device' ) ;
384
+ const adapter = new ChromeAdapter ( undefined , undefined , 'only_on_device' ) ;
315
385
await expect (
316
386
adapter . generateContent ( {
317
387
contents : [ ]
@@ -342,6 +412,9 @@ describe('ChromeAdapter', () => {
342
412
} as LanguageModelCreateOptions ;
343
413
const adapter = new ChromeAdapter (
344
414
languageModelProvider ,
415
+ {
416
+ brands : [ { brand : 'Google Chrome' , version : '138' } ]
417
+ } as UADataValues ,
345
418
'prefer_on_device' ,
346
419
{ createOptions }
347
420
) ;
@@ -389,6 +462,9 @@ describe('ChromeAdapter', () => {
389
462
const promptStub = stub ( languageModel , 'prompt' ) . resolves ( promptOutput ) ;
390
463
const adapter = new ChromeAdapter (
391
464
languageModelProvider ,
465
+ {
466
+ brands : [ { brand : 'Google Chrome' , version : '138' } ]
467
+ } as UADataValues ,
392
468
'prefer_on_device'
393
469
) ;
394
470
const request = {
@@ -456,6 +532,7 @@ describe('ChromeAdapter', () => {
456
532
} ;
457
533
const adapter = new ChromeAdapter (
458
534
languageModelProvider ,
535
+ undefined ,
459
536
'prefer_on_device' ,
460
537
{ promptOptions }
461
538
) ;
@@ -489,6 +566,7 @@ describe('ChromeAdapter', () => {
489
566
} as LanguageModel ;
490
567
const adapter = new ChromeAdapter (
491
568
languageModelProvider ,
569
+ undefined ,
492
570
'prefer_on_device'
493
571
) ;
494
572
const request = {
@@ -525,6 +603,7 @@ describe('ChromeAdapter', () => {
525
603
526
604
const adapter = new ChromeAdapter (
527
605
languageModelProvider ,
606
+ undefined ,
528
607
'prefer_on_device'
529
608
) ;
530
609
@@ -534,6 +613,8 @@ describe('ChromeAdapter', () => {
534
613
535
614
try {
536
615
await adapter . countTokens ( countTokenRequest ) ;
616
+ // eslint-disable-next-line no-throw-literal
617
+ throw 'unthrown' ;
537
618
} catch ( e ) {
538
619
// the call to countToken should be rejected with Error
539
620
expect ( ( e as AIError ) . code ) . to . equal ( AIErrorCode . REQUEST_ERROR ) ;
@@ -569,6 +650,7 @@ describe('ChromeAdapter', () => {
569
650
} as LanguageModelCreateOptions ;
570
651
const adapter = new ChromeAdapter (
571
652
languageModelProvider ,
653
+ undefined ,
572
654
'prefer_on_device' ,
573
655
{ createOptions }
574
656
) ;
@@ -614,6 +696,7 @@ describe('ChromeAdapter', () => {
614
696
) ;
615
697
const adapter = new ChromeAdapter (
616
698
languageModelProvider ,
699
+ undefined ,
617
700
'prefer_on_device'
618
701
) ;
619
702
const request = {
@@ -674,6 +757,7 @@ describe('ChromeAdapter', () => {
674
757
} ;
675
758
const adapter = new ChromeAdapter (
676
759
languageModelProvider ,
760
+ undefined ,
677
761
'prefer_on_device' ,
678
762
{ promptOptions }
679
763
) ;
@@ -709,6 +793,7 @@ describe('ChromeAdapter', () => {
709
793
} as LanguageModel ;
710
794
const adapter = new ChromeAdapter (
711
795
languageModelProvider ,
796
+ undefined ,
712
797
'prefer_on_device'
713
798
) ;
714
799
const request = {
0 commit comments