4805
4805
if ( this . getFeatureSettingEnabled ( "modifyCookies" ) ) {
4806
4806
this . modifyCookies ( ) ;
4807
4807
}
4808
- if ( this . getFeatureSettingEnabled ( "disableDeviceEnumeration" ) ) {
4809
- this . preventDeviceEnumeration ( ) ;
4810
- }
4811
4808
if ( this . getFeatureSettingEnabled ( "enumerateDevices" ) ) {
4812
4809
this . deviceEnumerationFix ( ) ;
4813
4810
}
5364
5361
this . forceViewportTag ( viewportTag , newContent . join ( ", " ) ) ;
5365
5362
}
5366
5363
}
5367
- /**
5368
- * Prevents device enumeration by returning an empty array when enabled
5369
- */
5370
- preventDeviceEnumeration ( ) {
5371
- if ( ! window . MediaDevices ) {
5372
- return ;
5373
- }
5374
- let disableDeviceEnumeration = false ;
5375
- const isFrame = window . self !== window . top ;
5376
- if ( isFrame ) {
5377
- disableDeviceEnumeration = this . getFeatureSettingEnabled ( "disableDeviceEnumerationFrames" ) ;
5378
- } else {
5379
- disableDeviceEnumeration = this . getFeatureSettingEnabled ( "disableDeviceEnumeration" ) ;
5380
- }
5381
- if ( disableDeviceEnumeration ) {
5382
- const enumerateDevicesProxy = new DDGProxy ( this , MediaDevices . prototype , "enumerateDevices" , {
5383
- /**
5384
- * @returns {Promise<MediaDeviceInfo[]> }
5385
- */
5386
- apply ( ) {
5387
- return Promise . resolve ( [ ] ) ;
5388
- }
5389
- } ) ;
5390
- enumerateDevicesProxy . overload ( ) ;
5391
- }
5392
- }
5393
5364
/**
5394
5365
* Creates a valid MediaDeviceInfo or InputDeviceInfo object that passes instanceof checks
5395
5366
* @param {'videoinput' | 'audioinput' | 'audiooutput' } kind - The device kind
@@ -9617,6 +9588,7 @@ ul.messages {
9617
9588
this . log . info ( "Parsed page data:" , pageDataParsed ) ;
9618
9589
if ( pageDataParsed . content ) {
9619
9590
this . pageData = pageDataParsed ;
9591
+ this . promptTelemetry ?. sendContextPixelInfo ( pageDataParsed , DuckAiPromptTelemetry . CONTEXT_ATTACH_PIXEL_NAME ) ;
9620
9592
if ( this . contextPromiseResolve ) {
9621
9593
this . contextPromiseResolve ( true ) ;
9622
9594
this . contextPromiseResolve = null ;
@@ -9807,12 +9779,16 @@ ul.messages {
9807
9779
if ( this . textBox !== element ) {
9808
9780
this . textBox = element ;
9809
9781
this . log . info ( "Found AI text box" ) ;
9810
- element . addEventListener ( "keyup" , ( event ) => {
9811
- if ( event . key === "Enter" && ! event . shiftKey ) {
9812
- this . log . info ( "Enter key pressed" ) ;
9813
- this . handleSendMessage ( ) ;
9814
- }
9815
- } ) ;
9782
+ element . addEventListener (
9783
+ "keydown" ,
9784
+ ( event ) => {
9785
+ if ( event . key === "Enter" && ! event . shiftKey ) {
9786
+ this . log . info ( "Enter key pressed" ) ;
9787
+ this . handleSendMessage ( ) ;
9788
+ }
9789
+ } ,
9790
+ true
9791
+ ) ;
9816
9792
this . setupValuePropertyDescriptor ( element ) ;
9817
9793
}
9818
9794
} else if ( this . textBox ) {
@@ -10025,11 +10001,11 @@ ${truncatedWarning}
10025
10001
} ;
10026
10002
const telemetryData = {
10027
10003
totalPrompts : String ( totalPrompts ) ,
10028
- avgRawPromptSize : this . bucketSizeByThousands ( avgRawPromptSize ) ,
10004
+ avgRawPromptSize : this . bucketSize ( avgRawPromptSize ) ,
10029
10005
...createSizeFields ( "raw" , rawSizeBuckets ) ,
10030
- avgTotalPromptSize : this . bucketSizeByThousands ( avgTotalPromptSize ) ,
10006
+ avgTotalPromptSize : this . bucketSize ( avgTotalPromptSize ) ,
10031
10007
...createSizeFields ( "total" , totalSizeBuckets ) ,
10032
- avgContextSize : this . bucketSizeByThousands ( avgContextSize ) ,
10008
+ avgContextSize : this . bucketSize ( avgContextSize ) ,
10033
10009
contextUsageRate : String ( Math . round ( contextUsageRate * 100 ) )
10034
10010
} ;
10035
10011
this . log . info ( "Sending daily telemetry pixel:" , telemetryData ) ;
@@ -10057,7 +10033,8 @@ ${truncatedWarning}
10057
10033
if ( ! globalThis ?. DDG ?. pixel ) {
10058
10034
return ;
10059
10035
}
10060
- globalThis . DDG . pixel . _pixels [ _DuckAiPromptTelemetry . CONTEXT_PIXEL_NAME ] = { } ;
10036
+ globalThis . DDG . pixel . _pixels [ _DuckAiPromptTelemetry . CONTEXT_SEND_PIXEL_NAME ] = { } ;
10037
+ globalThis . DDG . pixel . _pixels [ _DuckAiPromptTelemetry . CONTEXT_ATTACH_PIXEL_NAME ] = { } ;
10061
10038
globalThis . DDG . pixel . _pixels [ _DuckAiPromptTelemetry . DAILY_PIXEL_NAME ] = { } ;
10062
10039
}
10063
10040
/**
@@ -10072,28 +10049,28 @@ ${truncatedWarning}
10072
10049
globalThis . DDG . pixel . fire ( pixelName , params ) ;
10073
10050
}
10074
10051
/**
10075
- * Bucket numbers by thousands for privacy-friendly reporting
10052
+ * Bucket numbers by hundreds for privacy-friendly reporting
10076
10053
* @param {number } number - Number to bucket
10077
- * @returns {string } Bucket lower bound (e.g., '0', '1000 ', '2000 ')
10054
+ * @returns {string } Bucket lower bound (e.g., '0', '100 ', '200 ')
10078
10055
*/
10079
- bucketSizeByThousands ( number ) {
10056
+ bucketSize ( number ) {
10080
10057
if ( number <= 0 ) {
10081
10058
return "0" ;
10082
10059
}
10083
- const bucketIndex = Math . floor ( number / 1e3 ) ;
10084
- return String ( bucketIndex * 1e3 ) ;
10060
+ const bucketIndex = Math . floor ( number / 100 ) ;
10061
+ return String ( bucketIndex * 100 ) ;
10085
10062
}
10086
10063
/**
10087
10064
* Send context pixel info when context is used
10088
10065
* @param {Object } contextData - Context data object
10089
10066
*/
10090
- sendContextPixelInfo ( contextData ) {
10091
- if ( ! contextData ?. content ) {
10067
+ sendContextPixelInfo ( contextData , pixelName ) {
10068
+ if ( ! contextData ?. content || contextData . content . length === 0 ) {
10092
10069
this . log . warn ( "sendContextPixelInfo: No content available for pixel tracking" ) ;
10093
10070
return ;
10094
10071
}
10095
- this . sendPixel ( _DuckAiPromptTelemetry . CONTEXT_PIXEL_NAME , {
10096
- contextLength : this . bucketSizeByThousands ( contextData . content . length )
10072
+ this . sendPixel ( pixelName , {
10073
+ contextLength : contextData . content . length
10097
10074
} ) ;
10098
10075
}
10099
10076
/**
@@ -10118,14 +10095,15 @@ ${truncatedWarning}
10118
10095
contextSize
10119
10096
} ;
10120
10097
if ( contextData && contextSize > 0 ) {
10121
- this . sendContextPixelInfo ( contextData ) ;
10098
+ this . sendContextPixelInfo ( contextData , _DuckAiPromptTelemetry . CONTEXT_SEND_PIXEL_NAME ) ;
10122
10099
}
10123
10100
this . checkShouldFireDailyTelemetry ( ) ;
10124
10101
this . storePromptTelemetry ( promptData ) ;
10125
10102
}
10126
10103
} ;
10127
10104
__publicField ( _DuckAiPromptTelemetry , "STORAGE_KEY" , "aiChatPageContextTelemetry" ) ;
10128
- __publicField ( _DuckAiPromptTelemetry , "CONTEXT_PIXEL_NAME" , "dc_contextInfo" ) ;
10105
+ __publicField ( _DuckAiPromptTelemetry , "CONTEXT_ATTACH_PIXEL_NAME" , "dc_contextInfoOnAttach" ) ;
10106
+ __publicField ( _DuckAiPromptTelemetry , "CONTEXT_SEND_PIXEL_NAME" , "dc_contextInfoOnSubmit" ) ;
10129
10107
__publicField ( _DuckAiPromptTelemetry , "DAILY_PIXEL_NAME" , "dc_pageContextDailyTelemetry" ) ;
10130
10108
__publicField ( _DuckAiPromptTelemetry , "ONE_DAY_MS" , 24 * 60 * 60 * 1e3 ) ;
10131
10109
var DuckAiPromptTelemetry = _DuckAiPromptTelemetry ;
0 commit comments