Skip to content

Commit 8fee675

Browse files
authored
[rust] Support for automatic management of Firefox ESR (#12946)
1 parent 0074a7c commit 8fee675

File tree

3 files changed

+37
-12
lines changed

3 files changed

+37
-12
lines changed

rust/src/firefox.rs

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ use crate::metadata::{
2828
};
2929
use crate::{
3030
create_http_client, format_three_args, format_two_args, Logger, SeleniumManager, BETA,
31-
DASH_VERSION, DEV, NIGHTLY, OFFLINE_REQUEST_ERR_MSG, REG_CURRENT_VERSION_ARG, STABLE,
31+
DASH_VERSION, DEV, ESR, NIGHTLY, OFFLINE_REQUEST_ERR_MSG, REG_CURRENT_VERSION_ARG, STABLE,
3232
};
3333
use anyhow::anyhow;
3434
use anyhow::Error;
@@ -49,6 +49,7 @@ const FIREFOX_STABLE_LABEL: &str = "LATEST_FIREFOX_VERSION";
4949
const FIREFOX_BETA_LABEL: &str = "LATEST_FIREFOX_RELEASED_DEVEL_VERSION";
5050
const FIREFOX_DEV_LABEL: &str = "FIREFOX_DEVEDITION";
5151
const FIREFOX_CANARY_LABEL: &str = "FIREFOX_NIGHTLY";
52+
const FIREFOX_ESR_LABEL: &str = "FIREFOX_ESR";
5253
const FIREFOX_VERSIONS_ENDPOINT: &str = "firefox_versions.json";
5354
const FIREFOX_HISTORY_ENDPOINT: &str = "firefox_history_stability_releases.json";
5455
const FIREFOX_HISTORY_DEV_ENDPOINT: &str = "firefox_history_development_releases.json";
@@ -146,6 +147,10 @@ impl SeleniumManager for FirefoxManager {
146147
BrowserPath::new(WINDOWS, NIGHTLY),
147148
r#"Firefox Nightly\firefox.exe"#,
148149
),
150+
(
151+
BrowserPath::new(WINDOWS, ESR),
152+
r#"Mozilla Firefox\firefox.exe"#,
153+
),
149154
(
150155
BrowserPath::new(MACOS, STABLE),
151156
r#"/Applications/Firefox.app/Contents/MacOS/firefox"#,
@@ -162,10 +167,15 @@ impl SeleniumManager for FirefoxManager {
162167
BrowserPath::new(MACOS, NIGHTLY),
163168
r#"/Applications/Firefox Nightly.app/Contents/MacOS/firefox"#,
164169
),
170+
(
171+
BrowserPath::new(MACOS, ESR),
172+
r#"/Applications/Firefox.app/Contents/MacOS/firefox"#,
173+
),
165174
(BrowserPath::new(LINUX, STABLE), "/usr/bin/firefox"),
166175
(BrowserPath::new(LINUX, BETA), "/usr/bin/firefox"),
167176
(BrowserPath::new(LINUX, DEV), "/usr/bin/firefox"),
168177
(BrowserPath::new(LINUX, NIGHTLY), "/usr/bin/firefox-trunk"),
178+
(BrowserPath::new(LINUX, ESR), "/usr/bin/firefox"),
169179
])
170180
}
171181

@@ -358,32 +368,33 @@ impl SeleniumManager for FirefoxManager {
358368

359369
fn request_fixed_browser_version_from_online(
360370
&mut self,
361-
_browser_version: &str,
371+
browser_version: &str,
362372
) -> Result<String, Error> {
363373
let browser_name = self.browser_name;
364-
let browser_version = self.get_browser_version().to_string();
365374
self.get_logger().trace(format!(
366375
"Using Firefox endpoints to find out {} {}",
367376
browser_name, browser_version
368377
));
369378

370-
if self.is_browser_version_unstable() {
379+
if self.is_unstable(browser_version) {
371380
let firefox_versions_url = self.create_firefox_details_url(FIREFOX_VERSIONS_ENDPOINT);
372381
let firefox_versions =
373382
parse_generic_json_from_url(self.get_http_client(), firefox_versions_url)?;
374-
let version_label = if browser_version.eq_ignore_ascii_case(BETA) {
383+
let version_label = if self.is_beta(browser_version) {
375384
FIREFOX_BETA_LABEL
376-
} else if browser_version.eq_ignore_ascii_case(DEV) {
385+
} else if self.is_dev(browser_version) {
377386
FIREFOX_DEV_LABEL
387+
} else if self.is_esr(browser_version) {
388+
FIREFOX_ESR_LABEL
378389
} else {
379390
FIREFOX_CANARY_LABEL
380391
};
381-
let browser_version = firefox_versions
392+
let discovered_browser_version = firefox_versions
382393
.get(version_label)
383394
.unwrap()
384395
.as_str()
385396
.unwrap();
386-
Ok(browser_version.to_string())
397+
Ok(discovered_browser_version.to_string())
387398
} else {
388399
let major_browser_version = self
389400
.get_major_browser_version()
@@ -395,7 +406,7 @@ impl SeleniumManager for FirefoxManager {
395406
return Err(anyhow!(format_three_args(
396407
UNAVAILABLE_DOWNLOAD_ERROR_MESSAGE,
397408
browser_name,
398-
&browser_version,
409+
browser_version,
399410
&min_downloadable_version.to_string(),
400411
)));
401412
}

rust/src/lib.rs

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ pub const BETA: &str = "beta";
6868
pub const DEV: &str = "dev";
6969
pub const CANARY: &str = "canary";
7070
pub const NIGHTLY: &str = "nightly";
71+
pub const ESR: &str = "esr";
7172
pub const WMIC_COMMAND: &str = r#"wmic datafile where name='{}' get Version /value"#;
7273
pub const WMIC_COMMAND_OS: &str = r#"wmic os get osarchitecture"#;
7374
pub const REG_VERSION_ARG: &str = "version";
@@ -202,7 +203,10 @@ pub trait SeleniumManager {
202203
}
203204
}
204205

205-
fn download_browser(&mut self) -> Result<Option<PathBuf>, Error> {
206+
fn download_browser(
207+
&mut self,
208+
original_browser_version: String,
209+
) -> Result<Option<PathBuf>, Error> {
206210
if WINDOWS.is(self.get_os()) && self.is_edge() && !self.is_windows_admin() {
207211
return Err(anyhow!(format_one_arg(
208212
NOT_ADMIN_FOR_EDGE_INSTALLER_ERR_MSG,
@@ -211,7 +215,6 @@ pub trait SeleniumManager {
211215
}
212216

213217
let browser_version;
214-
let original_browser_version = self.get_config().browser_version.clone();
215218
let cache_path = self.get_cache_path()?;
216219
let mut metadata = get_metadata(self.get_logger(), &cache_path);
217220
let major_browser_version = self.get_major_browser_version();
@@ -421,6 +424,7 @@ pub trait SeleniumManager {
421424
fn discover_driver_version_and_download_browser_if_necessary(
422425
&mut self,
423426
) -> Result<String, Error> {
427+
let original_browser_version = self.get_config().browser_version.clone();
424428
let mut download_browser = self.is_force_browser_download();
425429
let major_browser_version = self.get_major_browser_version();
426430

@@ -498,7 +502,7 @@ pub trait SeleniumManager {
498502
&& !self.is_safari()
499503
&& !self.is_webview2()
500504
{
501-
let browser_path = self.download_browser()?;
505+
let browser_path = self.download_browser(original_browser_version)?;
502506
if browser_path.is_some() {
503507
self.get_logger().debug(format!(
504508
"{} {} is available at {}",
@@ -669,11 +673,20 @@ pub trait SeleniumManager {
669673
|| browser_version.eq_ignore_ascii_case(CANARY)
670674
}
671675

676+
fn is_browser_version_esr(&self) -> bool {
677+
self.is_esr(self.get_browser_version())
678+
}
679+
680+
fn is_esr(&self, browser_version: &str) -> bool {
681+
browser_version.eq_ignore_ascii_case(ESR)
682+
}
683+
672684
fn is_unstable(&self, browser_version: &str) -> bool {
673685
browser_version.eq_ignore_ascii_case(BETA)
674686
|| browser_version.eq_ignore_ascii_case(DEV)
675687
|| browser_version.eq_ignore_ascii_case(NIGHTLY)
676688
|| browser_version.eq_ignore_ascii_case(CANARY)
689+
|| browser_version.eq_ignore_ascii_case(ESR)
677690
}
678691

679692
fn is_browser_version_unstable(&self) -> bool {

rust/tests/browser_download_tests.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ fn browser_latest_download_test(#[case] browser: String) {
5151
#[case("chrome", "beta")]
5252
#[case("firefox", "116")]
5353
#[case("firefox", "beta")]
54+
#[case("firefox", "esr")]
5455
#[case("edge", "beta")]
5556
fn browser_version_download_test(#[case] browser: String, #[case] browser_version: String) {
5657
let mut cmd = Command::new(env!("CARGO_BIN_EXE_selenium-manager"));

0 commit comments

Comments
 (0)