@@ -72,8 +72,10 @@ function generateAutoconsentRule(region, url, frame, button) {
7272 const ruleName = `auto_${ region } _${ topDomain } _${ Math . random ( ) . toString ( 36 ) . substring ( 2 , 5 ) } ` ;
7373 return {
7474 name : ruleName ,
75- vendorUrl : url ,
7675 cosmetic : false ,
76+ _metadata : {
77+ vendorUrl : url ,
78+ } ,
7779 runContext : {
7880 main : frame . isTop ,
7981 frame : ! frame . isTop ,
@@ -99,7 +101,7 @@ function generateAutoconsentRule(region, url, frame, button) {
99101 * @param {object } context - The context.
100102 * @param {import('./types').AutoConsentCMPRule } context.newRule
101103 * @param {import('./types').AutoConsentCMPRule[] } context.existingRulesWithSameRegion
102- * @param {string } context.url
104+ * @param {string } context.initialUrl
103105 * @param {string } context.region
104106 * @param {import('./types').AutoConsentCMPRule[] } context.matchingRules
105107 * @param {import('./types').AutoConsentCMPRule[] } context.rulesToOverride
@@ -109,16 +111,17 @@ function generateAutoconsentRule(region, url, frame, button) {
109111function overrideExistingRegionRules ( {
110112 newRule,
111113 existingRulesWithSameRegion,
112- url ,
114+ initialUrl ,
113115 region,
114116 matchingRules,
115117 rulesToOverride,
116118 newRules,
117119 reviewNotes,
118120} ) {
119121 if ( existingRulesWithSameRegion . length > 1 ) {
120- console . warn ( 'Multiple existing rules with the same region found for' , url , region ) ;
122+ console . warn ( 'Multiple existing rules with the same region found for' , initialUrl , region ) ;
121123 reviewNotes . push ( {
124+ needsReview : true ,
122125 note : 'Multiple existing rules with the same region found, consider removing all but one' ,
123126 ruleNames : existingRulesWithSameRegion . map ( ( rule ) => rule . name ) ,
124127 existingRules : matchingRules . map ( ( rule ) => rule . name ) ,
@@ -129,8 +132,9 @@ function overrideExistingRegionRules({
129132 // find an existing rule that we haven't overridden yet
130133 const ruleToOverride = existingRulesWithSameRegion . find ( ( rule ) => ! rulesToOverride . some ( ( r ) => r . name === rule . name ) ) ;
131134 if ( ! ruleToOverride ) {
132- console . warn ( 'Already overridden all existing rules for' , url , region , 'creating a new one' ) ;
135+ console . warn ( 'Already overridden all existing rules for' , initialUrl , region , 'creating a new one' ) ;
133136 reviewNotes . push ( {
137+ needsReview : true ,
134138 note : 'Already overridden all existing rules, creating a new one' ,
135139 ruleName : newRule . name ,
136140 existingRules : existingRulesWithSameRegion . map ( ( rule ) => rule . name ) ,
@@ -141,13 +145,25 @@ function overrideExistingRegionRules({
141145 rulesToOverride . push ( {
142146 ...newRule ,
143147 name : ruleToOverride . name , // keep the existing rule name
148+ _metadata : ruleToOverride . _metadata , // keep the existing metadata
144149 } ) ;
145- reviewNotes . push ( {
146- note : 'Overriding existing rule' ,
147- ruleName : ruleToOverride . name ,
148- existingRules : matchingRules . map ( ( rule ) => rule . name ) ,
149- region,
150- } ) ;
150+ if ( ruleToOverride . _metadata ?. manuallyReviewUpdates ) {
151+ reviewNotes . push ( {
152+ needsReview : true ,
153+ note : 'Updated rule that has been manually edited before' ,
154+ ruleName : ruleToOverride . name ,
155+ existingRules : matchingRules . map ( ( rule ) => rule . name ) ,
156+ region,
157+ } ) ;
158+ } else {
159+ reviewNotes . push ( {
160+ needsReview : false ,
161+ note : 'Overriding existing rule' ,
162+ ruleName : ruleToOverride . name ,
163+ existingRules : matchingRules . map ( ( rule ) => rule . name ) ,
164+ region,
165+ } ) ;
166+ }
151167 }
152168}
153169
@@ -156,27 +172,29 @@ function overrideExistingRegionRules({
156172 * override an existing one, or do nothing.
157173 * @param {object } context - The context for processing the button.
158174 * @param {string } context.region
159- * @param {string } context.url
175+ * @param {string } context.initialUrl
176+ * @param {string } context.finalUrl
160177 * @param {import('./types').ScrapeScriptResult } context.frame
161178 * @param {import('./types').ButtonData } context.button
162179 * @param {import('./types').AutoConsentCMPRule[] } context.matchingRules
163180 * @param {import('./types').AutoConsentCMPRule[] } context.newRules
164181 * @param {import('./types').AutoConsentCMPRule[] } context.rulesToOverride
165182 * @param {import('./types').ReviewNote[] } context.reviewNotes
166183 */
167- function processRejectButton ( { region, url , frame, button, matchingRules, newRules, rulesToOverride, reviewNotes } ) {
184+ function processRejectButton ( { region, initialUrl , frame, button, matchingRules, newRules, rulesToOverride, reviewNotes } ) {
168185 let newRule ;
169186 try {
170- newRule = generateAutoconsentRule ( region , url , frame , button ) ;
187+ newRule = generateAutoconsentRule ( region , initialUrl , frame , button ) ;
171188 } catch ( err ) {
172- console . error ( `Error generating rule for ${ url } (${ frame . origin } )` , err ) ;
189+ console . error ( `Error generating rule for ${ initialUrl } (${ frame . origin } )` , err ) ;
173190 return ;
174191 }
175192
176193 if ( matchingRules . length === 0 ) {
177194 // add the first rule for this site
178195 newRules . push ( newRule ) ;
179196 reviewNotes . push ( {
197+ needsReview : false ,
180198 note : 'New rule added' ,
181199 ruleName : newRule . name ,
182200 } ) ;
@@ -192,7 +210,7 @@ function processRejectButton({ region, url, frame, button, matchingRules, newRul
192210 overrideExistingRegionRules ( {
193211 newRule,
194212 existingRulesWithSameRegion,
195- url ,
213+ initialUrl ,
196214 region,
197215 matchingRules,
198216 rulesToOverride,
@@ -203,6 +221,7 @@ function processRejectButton({ region, url, frame, button, matchingRules, newRul
203221 // assume it's a new region-specific popup, but flag it for review
204222 newRules . push ( newRule ) ;
205223 reviewNotes . push ( {
224+ needsReview : false ,
206225 note : 'New region-specific popup' ,
207226 ruleName : newRule . name ,
208227 existingRules : matchingRules . map ( ( rule ) => rule . name ) ,
@@ -214,12 +233,13 @@ function processRejectButton({ region, url, frame, button, matchingRules, newRul
214233/**
215234 * Analyze existing rules and generate new rules when necessary.
216235 * @param {string } region
217- * @param {string } url - The URL being processed.
236+ * @param {string } initialUrl - The URL of the initial page.
237+ * @param {string } finalUrl - The URL of the final page (after load redirects).
218238 * @param {import('./types').CookiePopupsCollectorResult } collectorResult - The collector result.
219239 * @param {import('./types').AutoConsentCMPRule[] } matchingRules - Array of existing rules.
220240 * @returns {{newRules: import('./types').AutoConsentCMPRule[], rulesToOverride: import('./types').AutoConsentCMPRule[], reviewNotes: import('./types').ReviewNote[], keptCount: number} }
221241 */
222- function generateRulesForSite ( region , url , collectorResult , matchingRules ) {
242+ function generateRulesForSite ( region , initialUrl , finalUrl , collectorResult , matchingRules ) {
223243 /** @type {import('./types').AutoConsentCMPRule[] } */
224244 const newRules = [ ] ;
225245 /** @type {import('./types').AutoConsentCMPRule[] } */
@@ -230,10 +250,11 @@ function generateRulesForSite(region, url, collectorResult, matchingRules) {
230250
231251 const llmConfirmedPopups = collectorResult . scrapedFrames . flatMap ( ( frame ) => frame . potentialPopups ) . filter ( ( popup ) => popup . llmMatch ) ;
232252 if ( llmConfirmedPopups . length > 1 || llmConfirmedPopups [ 0 ] . rejectButtons . length > 1 ) {
233- console . warn ( 'Multiple cookie popups or reject buttons found in' , url ) ;
253+ console . warn ( 'Multiple cookie popups or reject buttons found in' , initialUrl ) ;
234254 reviewNotes . push ( {
255+ needsReview : false , // it's not a problem by itself, unless this leads to multiple _rules_ generated, but we check that separately.
235256 note : 'Multiple popups or reject buttons found' ,
236- url,
257+ url : initialUrl ,
237258 region,
238259 } ) ;
239260 }
@@ -247,13 +268,14 @@ function generateRulesForSite(region, url, collectorResult, matchingRules) {
247268 keptCount ++ ;
248269 continue ;
249270 }
250- processRejectButton ( { region, url , frame, button, matchingRules, newRules, rulesToOverride, reviewNotes } ) ;
271+ processRejectButton ( { region, initialUrl , finalUrl , frame, button, matchingRules, newRules, rulesToOverride, reviewNotes } ) ;
251272 }
252273 }
253274 }
254275
255276 if ( newRules . length > 1 ) {
256277 reviewNotes . push ( {
278+ needsReview : true ,
257279 note : 'Multiple new rules generated' ,
258280 ruleNames : newRules . map ( ( rule ) => rule . name ) ,
259281 } ) ;
0 commit comments