@@ -82,17 +82,36 @@ func (s *ApiService) ChromiumConfigure(ctx context.Context, request oapi.Chromiu
8282 return cfg400 ("no configuration fields provided" ), nil
8383 }
8484
85+ mode := chromiumConfigureModeFor (st , extensionLoadStrategy )
86+ var preparedExtensions * preparedExtensionBatch
87+ if mode == chromiumConfigureModePreferCDPExtensions {
88+ var reqMsg string
89+ var err error
90+ preparedExtensions , reqMsg , err = s .prepareExtensionZipItems (ctx , st .extItems )
91+ if preparedExtensions != nil {
92+ defer preparedExtensions .cleanup ()
93+ }
94+ if reqMsg != "" {
95+ return cfg400 (fmt .Sprintf ("%s: %s" , chromiumConfigureStepExtensions , reqMsg )), nil
96+ }
97+ if err != nil {
98+ return cfg500ConfigureStep (chromiumConfigureStepExtensions , err .Error ()), nil
99+ }
100+ }
101+
85102 s .chromiumConfigMu .Lock ()
86103 defer s .chromiumConfigMu .Unlock ()
87104
88105 var configureResp oapi.ChromiumConfigureResponseObject
89- switch chromiumConfigureModeFor ( st , extensionLoadStrategy ) {
106+ switch mode {
90107 case chromiumConfigureModeLive :
91108 configureResp = s .chromiumConfigureLive (ctx , st , spec )
92109 case chromiumConfigureModeRestart :
93- configureResp = s .chromiumConfigureRestart (ctx , st , spec , nil )
94- case chromiumConfigureModeCandidateCDPExtensions :
95- configureResp = s .chromiumConfigureCandidateCDPExtensions (ctx , st , spec )
110+ configureResp = s .chromiumConfigureRestart (ctx , st , spec , func () (string , error ) {
111+ return s .installExtensionZipItems (ctx , st .extItems )
112+ })
113+ case chromiumConfigureModePreferCDPExtensions :
114+ configureResp = s .chromiumConfigurePreferCDPExtensions (ctx , st , spec , preparedExtensions )
96115 default :
97116 return cfg500Configure ("unhandled configure mode" ), nil
98117 }
@@ -109,7 +128,7 @@ type chromiumConfigureMode uint8
109128const (
110129 chromiumConfigureModeLive chromiumConfigureMode = iota
111130 chromiumConfigureModeRestart
112- chromiumConfigureModeCandidateCDPExtensions
131+ chromiumConfigureModePreferCDPExtensions
113132)
114133
115134func chromiumConfigureExtensionLoadStrategy (params oapi.ChromiumConfigureParams ) (oapi.ChromiumConfigureParamsExtensionLoadStrategy , string ) {
@@ -130,7 +149,7 @@ func chromiumConfigureModeFor(st *chromiumConfigureState, strategy oapi.Chromium
130149 }
131150 if len (st .extItems ) > 0 {
132151 if strategy == oapi .PreferCdp {
133- return chromiumConfigureModeCandidateCDPExtensions
152+ return chromiumConfigureModePreferCDPExtensions
134153 }
135154 return chromiumConfigureModeRestart
136155 }
@@ -163,25 +182,18 @@ func chromiumConfigureNavigate(ctx context.Context, s *ApiService, spec startURL
163182 }
164183}
165184
166- func (s * ApiService ) chromiumConfigureCandidateCDPExtensions (ctx context.Context , st * chromiumConfigureState , spec startURLParsed ) oapi.ChromiumConfigureResponseObject {
167- prepared , reqMsg , err := s . prepareExtensionZipItems ( ctx , st . extItems )
168- if prepared != nil {
169- defer prepared . cleanup ()
185+ func (s * ApiService ) chromiumConfigurePreferCDPExtensions (ctx context.Context , st * chromiumConfigureState , spec startURLParsed , prepared * preparedExtensionBatch ) oapi.ChromiumConfigureResponseObject {
186+ commitExtensions := func () ( string , error ) {
187+ _ , reqMsg , err := s . commitPreparedExtensions ( ctx , prepared )
188+ return reqMsg , err
170189 }
171- if reqMsg != "" {
172- return cfg400 (fmt .Sprintf ("%s: %s" , chromiumConfigureStepExtensions , reqMsg ))
173- }
174- if err != nil {
175- return cfg500ConfigureStep (chromiumConfigureStepExtensions , err .Error ())
176- }
177-
178190 if prepared .requiresRestart {
179- return s .chromiumConfigureRestart (ctx , st , spec , prepared )
191+ return s .chromiumConfigureRestart (ctx , st , spec , commitExtensions )
180192 }
181193
182194 // Configure keeps the default restart path's non-transactional install semantics.
183195 // Rolling back after fallback verification would require a second restart.
184- _ , _ , reqMsg , err = s .commitPreparedExtensions (ctx , prepared )
196+ _ , reqMsg , err : = s .commitPreparedExtensions (ctx , prepared )
185197 if reqMsg != "" {
186198 return cfg400 (fmt .Sprintf ("%s: %s" , chromiumConfigureStepExtensions , reqMsg ))
187199 }
@@ -195,11 +207,9 @@ func (s *ApiService) chromiumConfigureCandidateCDPExtensions(ctx context.Context
195207 }
196208 logger .FromContext (ctx ).Warn ("CDP extension load failed during configure, restarting Chromium" , "error" , loadErr )
197209
198- restartState := * st
199210 // Extensions are already persisted. The fallback re-launches Chromium with
200211 // the merged flags and still applies any pending display change.
201- restartState .extItems = nil
202- if resp := s .chromiumConfigureRestart (ctx , & restartState , spec , nil ); resp != nil {
212+ if resp := s .chromiumConfigureRestart (ctx , st , spec , nil ); resp != nil {
203213 return resp
204214 }
205215 if err := s .verifyUnpackedExtensions (ctx , prepared .extensions ); err != nil {
@@ -208,7 +218,9 @@ func (s *ApiService) chromiumConfigureCandidateCDPExtensions(ctx context.Context
208218 return nil
209219}
210220
211- func (s * ApiService ) chromiumConfigureRestart (ctx context.Context , st * chromiumConfigureState , spec startURLParsed , preparedExtensions * preparedExtensionBatch ) (resp oapi.ChromiumConfigureResponseObject ) {
221+ type chromiumConfigureExtensionInstaller func () (string , error )
222+
223+ func (s * ApiService ) chromiumConfigureRestart (ctx context.Context , st * chromiumConfigureState , spec startURLParsed , installExtensions chromiumConfigureExtensionInstaller ) (resp oapi.ChromiumConfigureResponseObject ) {
212224 var stoppedRecordings []stoppedRecordingInfo
213225 chromiumStopped := false
214226 restartAfterStop := func () error {
@@ -251,18 +263,14 @@ func (s *ApiService) chromiumConfigureRestart(ctx context.Context, st *chromiumC
251263 return cfgResponseFromStepError (chromiumConfigureStepPolicies , err )
252264 }
253265
254- var extensionReqMsg string
255- var extensionErr error
256- if preparedExtensions == nil {
257- extensionReqMsg , extensionErr = chromiumApplyExtensions (ctx , s , st .extItems )
258- } else {
259- _ , _ , extensionReqMsg , extensionErr = s .commitPreparedExtensions (ctx , preparedExtensions )
260- }
261- if extensionReqMsg != "" {
262- return cfg400 (fmt .Sprintf ("%s: %s" , chromiumConfigureStepExtensions , extensionReqMsg ))
263- }
264- if extensionErr != nil {
265- return cfg500ConfigureStep (chromiumConfigureStepExtensions , extensionErr .Error ())
266+ if installExtensions != nil {
267+ extensionReqMsg , extensionErr := installExtensions ()
268+ if extensionReqMsg != "" {
269+ return cfg400 (fmt .Sprintf ("%s: %s" , chromiumConfigureStepExtensions , extensionReqMsg ))
270+ }
271+ if extensionErr != nil {
272+ return cfg500ConfigureStep (chromiumConfigureStepExtensions , extensionErr .Error ())
273+ }
266274 }
267275
268276 if st .displayJSON != nil && strings .TrimSpace (* st .displayJSON ) != "" {
@@ -880,14 +888,6 @@ func chromiumApplyPolicies(ctx context.Context, s *ApiService, overrides policy.
880888 return nil
881889}
882890
883- func chromiumApplyExtensions (ctx context.Context , s * ApiService , items []extensionZipItem ) (string , error ) {
884- if len (items ) == 0 {
885- return "" , nil
886- }
887- _ , reqMsg , err := s .applyExtensionZipItems (ctx , items )
888- return reqMsg , err
889- }
890-
891891func chromiumValidateFlags (raw * string ) (* chromiumFlagsPlan , error ) {
892892 if raw == nil || strings .TrimSpace (* raw ) == "" {
893893 return nil , nil
0 commit comments