@@ -20,6 +20,7 @@ use crate::edge::EdgeManager;
2020use crate :: files:: compose_cache_folder;
2121use crate :: firefox:: FirefoxManager ;
2222use crate :: iexplorer:: IExplorerManager ;
23+ use crate :: safari:: { SafariManager , SAFARI } ;
2324use std:: fs;
2425
2526use crate :: config:: OS :: WINDOWS ;
@@ -37,6 +38,7 @@ use crate::logger::Logger;
3738use crate :: metadata:: {
3839 create_browser_metadata, get_browser_version_from_metadata, get_metadata, write_metadata,
3940} ;
41+ use crate :: safaritp:: SafariTPManager ;
4042
4143pub mod chrome;
4244pub mod config;
@@ -47,6 +49,8 @@ pub mod firefox;
4749pub mod iexplorer;
4850pub mod logger;
4951pub mod metadata;
52+ pub mod safari;
53+ pub mod safaritp;
5054
5155pub const REQUEST_TIMEOUT_SEC : u64 = 120 ; // The timeout is applied from when the request starts connecting until the response body has finished
5256pub const STABLE : & str = "stable" ;
@@ -57,6 +61,8 @@ pub const NIGHTLY: &str = "nightly";
5761pub const WMIC_COMMAND : & str = r#"wmic datafile where name='{}' get Version /value"# ;
5862pub const WMIC_COMMAND_ENV : & str = r#"wmic datafile where name='%{}:\=\\%{}' get Version /value"# ;
5963pub const REG_QUERY : & str = r#"REG QUERY {} /v version"# ;
64+ pub const PLIST_COMMAND : & str =
65+ r#"/usr/libexec/PlistBuddy -c "print :CFBundleShortVersionString" {}/Contents/Info.plist"# ;
6066pub const DASH_VERSION : & str = "{} -v" ;
6167pub const DASH_DASH_VERSION : & str = "{} --version" ;
6268pub const ENV_PROGRAM_FILES : & str = "PROGRAMFILES" ;
@@ -160,11 +166,12 @@ pub trait SeleniumManager {
160166 }
161167 break ;
162168 }
163-
164- metadata
165- . browsers
166- . push ( create_browser_metadata ( browser_name, & browser_version) ) ;
167- write_metadata ( & metadata, self . get_logger ( ) ) ;
169+ if !self . is_safari ( ) {
170+ metadata
171+ . browsers
172+ . push ( create_browser_metadata ( browser_name, & browser_version) ) ;
173+ write_metadata ( & metadata, self . get_logger ( ) ) ;
174+ }
168175 if !browser_version. is_empty ( ) {
169176 Some ( browser_version)
170177 } else {
@@ -179,12 +186,14 @@ pub trait SeleniumManager {
179186 if browser_version. is_empty ( ) || self . is_browser_version_unstable ( ) {
180187 match self . discover_browser_version ( ) {
181188 Some ( version) => {
182- self . get_logger ( ) . debug ( format ! (
183- "Detected browser: {} {}" ,
184- self . get_browser_name( ) ,
185- version
186- ) ) ;
187- self . set_browser_version ( version) ;
189+ if !self . is_safari ( ) {
190+ self . get_logger ( ) . debug ( format ! (
191+ "Detected browser: {} {}" ,
192+ self . get_browser_name( ) ,
193+ version
194+ ) ) ;
195+ self . set_browser_version ( version) ;
196+ }
188197 }
189198 None => {
190199 if self . is_browser_version_unstable ( ) {
@@ -247,6 +256,10 @@ pub trait SeleniumManager {
247256 }
248257 }
249258
259+ fn is_safari ( & self ) -> bool {
260+ self . get_browser_name ( ) . contains ( SAFARI )
261+ }
262+
250263 fn is_browser_version_unstable ( & self ) -> bool {
251264 let browser_version = self . get_browser_version ( ) ;
252265 browser_version. eq_ignore_ascii_case ( BETA )
@@ -261,34 +274,38 @@ pub trait SeleniumManager {
261274 self . set_driver_version ( driver_version) ;
262275 }
263276
264- let ( in_path_driver_version, in_path_driver_path) = self . find_driver_in_path ( ) ;
265- if let ( Some ( found_driver_version) , Some ( found_driver_path) ) =
266- ( in_path_driver_version, in_path_driver_path)
267- {
268- if found_driver_version. eq ( self . get_driver_version ( ) ) {
269- self . get_logger ( ) . debug ( format ! (
270- "Found {} {} in PATH: {}" ,
271- self . get_driver_name( ) ,
272- found_driver_version,
273- found_driver_path
274- ) ) ;
275- return Ok ( PathBuf :: from ( found_driver_path) ) ;
276- } else {
277- self . get_logger ( ) . warn ( format ! (
278- "Incompatible release of {} (version {}) detected in PATH: {}" ,
279- self . get_driver_name( ) ,
280- found_driver_version,
281- found_driver_path
282- ) ) ;
277+ if !self . is_safari ( ) {
278+ let ( in_path_driver_version, in_path_driver_path) = self . find_driver_in_path ( ) ;
279+ if let ( Some ( found_driver_version) , Some ( found_driver_path) ) =
280+ ( in_path_driver_version, in_path_driver_path)
281+ {
282+ if found_driver_version. eq ( self . get_driver_version ( ) ) {
283+ self . get_logger ( ) . debug ( format ! (
284+ "Found {} {} in PATH: {}" ,
285+ self . get_driver_name( ) ,
286+ found_driver_version,
287+ found_driver_path
288+ ) ) ;
289+ return Ok ( PathBuf :: from ( found_driver_path) ) ;
290+ } else {
291+ self . get_logger ( ) . warn ( format ! (
292+ "Incompatible release of {} (version {}) detected in PATH: {}" ,
293+ self . get_driver_name( ) ,
294+ found_driver_version,
295+ found_driver_path
296+ ) ) ;
297+ }
283298 }
284299 }
285300 let driver_path = self . get_driver_path_in_cache ( ) ;
286301 if driver_path. exists ( ) {
287- self . get_logger ( ) . debug ( format ! (
288- "{} {} already in the cache" ,
289- self . get_driver_name( ) ,
290- self . get_driver_version( )
291- ) ) ;
302+ if !self . is_safari ( ) {
303+ self . get_logger ( ) . debug ( format ! (
304+ "{} {} already in the cache" ,
305+ self . get_driver_name( ) ,
306+ self . get_driver_version( )
307+ ) ) ;
308+ }
292309 } else {
293310 self . download_driver ( ) ?;
294311 }
@@ -434,6 +451,17 @@ pub fn get_manager_by_browser(browser_name: String) -> Result<Box<dyn SeleniumMa
434451 . contains ( & browser_name_lower_case. as_str ( ) )
435452 {
436453 Ok ( IExplorerManager :: new ( ) )
454+ } else if browser_name. eq ( "safari" ) {
455+ Ok ( SafariManager :: new ( ) )
456+ } else if vec ! [
457+ "safari technology preview" ,
458+ r#"safari\ technology\ preview"# ,
459+ "safaritechnologypreview" ,
460+ "safaritp" ,
461+ ]
462+ . contains ( & browser_name_lower_case. as_str ( ) )
463+ {
464+ Ok ( SafariTPManager :: new ( ) )
437465 } else {
438466 Err ( format ! ( "Invalid browser name: {browser_name}" ) )
439467 }
@@ -448,6 +476,8 @@ pub fn get_manager_by_driver(driver_name: String) -> Result<Box<dyn SeleniumMana
448476 Ok ( EdgeManager :: new ( ) )
449477 } else if driver_name. eq_ignore_ascii_case ( "iedriverserver" ) {
450478 Ok ( IExplorerManager :: new ( ) )
479+ } else if driver_name. eq_ignore_ascii_case ( "safaridriver" ) {
480+ Ok ( SafariManager :: new ( ) )
451481 } else {
452482 Err ( format ! ( "Invalid driver name: {driver_name}" ) )
453483 }
0 commit comments