88 ArgumentAlreadyExistsInOptions ,
99 ArgumentNotFoundInOptions ,
1010 InvalidPreferencePath ,
11- InvalidPreferenceValue ,
1211 WrongPrefsDict ,
1312)
1413
@@ -152,7 +151,12 @@ def _set_pref_path(self, path: list, value):
152151 # validation will be handled in the updated implementation below
153152 # (kept for backward-compatibility if callers rely on signature)
154153 self ._validate_pref_path (path )
155- self ._validate_pref_value (path , value )
154+ node = PREFERENCE_SCHEMA
155+ for key in path [:- 1 ]:
156+ node = node [key ]
157+ final_key = path [- 1 ]
158+ expected = node [final_key ]
159+ self ._validate_pref_value (path , value , expected )
156160
157161 d = cast (dict [str , Any ], self ._browser_preferences )
158162 for key in path [:- 1 ]:
@@ -172,40 +176,25 @@ def _validate_pref_path(path: list[str]) -> None:
172176 else :
173177 raise InvalidPreferencePath (f'Invalid preference path: { "." .join (path )} ' )
174178
175- @staticmethod
176- def _validate_pref_value (path : list [str ], value : Any ) -> None :
179+ def _validate_pref_value (self , path : list [str ], value : Any , expected : Any ) -> None :
177180 """
178181 Validate the value type for the final segment in path against PREFERENCE_SCHEMA.
179182 Supports recursive validation for nested dictionaries.
180183 Raises InvalidPreferenceValue or InvalidPreferencePath on validation failure.
181184 """
182- node = PREFERENCE_SCHEMA
183- # Walk to the parent node (assumes path is valid from _validate_pref_path)
184- for key in path [:- 1 ]:
185- node = node [key ]
186-
187- final_key = path [- 1 ]
188- expected = node [final_key ]
189-
190185 if isinstance (expected , dict ):
191- # Expected is a subschema dict; value must be a dict and match the schema
192186 if not isinstance (value , dict ):
193- raise InvalidPreferenceValue (
194- f'Invalid value type for { "." .join (path )} : '
195- f'expected dict, got { type (value ).__name__ } '
196- )
197- # Recursively validate each key-value in the value dict
198- for k , v in value .items ():
199- if k not in expected :
200- raise InvalidPreferencePath (
201- f'Invalid key "{ k } " in preference path { "." .join (path )} '
202- )
203- ChromiumOptions ._validate_pref_value (path + [k ], v )
204- elif not isinstance (value , expected ):
205- # Expected is a primitive type; check isinstance
206- raise InvalidPreferenceValue (
207- f'Invalid value type for { "." .join (path )} : '
208- f'expected { expected .__name__ } , got { type (value ).__name__ } '
187+ raise TypeError (f"Expected dict for preference path { '.' .join (path )} " )
188+ for subkey , subval in value .items ():
189+ if subkey not in expected :
190+ raise KeyError (f"Invalid preference key: { '.' .join (path )} .{ subkey } " )
191+ self ._validate_pref_value ([* path , subkey ], subval , expected [subkey ])
192+ return
193+
194+ if not isinstance (value , expected ):
195+ raise TypeError (
196+ f"Invalid type at { '.' .join (path )} : "
197+ f"expected { expected .__name__ } , got { type (value ).__name__ } "
209198 )
210199
211200 def _get_pref_path (self , path : list ):
0 commit comments