Skip to content

Commit de794bb

Browse files
committed
add more firefox caps/prefs
Signed-off-by: Andrei Gherghescu <[email protected]>
1 parent 2eb41ff commit de794bb

File tree

3 files changed

+76
-1
lines changed

3 files changed

+76
-1
lines changed

.github/workflows/ci.yml

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,9 +134,22 @@ jobs:
134134
if: matrix.os == 'ubuntu-latest' && matrix.browser == 'chrome'
135135
run: cargo test --verbose --workspace --features ${{ matrix.features }} --exclude plotly_kaleido
136136

137+
# Install xvfb for Firefox WebGL support
138+
- name: Install xvfb
139+
if: matrix.os == 'ubuntu-latest' && matrix.browser == 'firefox'
140+
run: |
141+
sudo apt-get update
142+
sudo apt-get install -y xvfb
143+
137144
# Run save_png test with nocapture for detailed webdriver logs
138145
- name: Run save_png test with nocapture (${{ matrix.os }} - Firefox)
139146
if: matrix.os == 'ubuntu-latest' && matrix.browser == 'firefox'
147+
env:
148+
MOZ_HEADLESS: 1
149+
LIBGL_ALWAYS_SOFTWARE: 1
150+
MESA_GL_VERSION_OVERRIDE: 3.3
151+
MOZ_DISABLE_RDD_SANDBOX: 1
152+
MOZ_DISABLE_CONTENT_SANDBOX: 1
140153
run: |
141154
# Set environment variables for Firefox WebDriver
142155
export BROWSER_PATH="${{ steps.setup-firefox.outputs.firefox-path }}"
@@ -148,7 +161,7 @@ jobs:
148161
echo "RUST_LOG: $RUST_LOG"
149162
150163
# Run only the save_surface_to_png test with nocapture for full webdriver logs
151-
cargo test save_png -p plotly_static --features webdriver_download,geckodriver -- --nocapture
164+
xvfb-run -s "-screen 0 1920x1080x24" cargo test save_png -p plotly_static --features webdriver_download,geckodriver -- --nocapture
152165
153166
# Run tests on Ubuntu with Firefox
154167
- name: Run tests (${{ matrix.os }} - Firefox)

plotly/src/plot.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1077,6 +1077,7 @@ mod tests {
10771077
let dst = PathBuf::from("example.pdf");
10781078
let mut exporter = plotly_static::StaticExporterBuilder::default()
10791079
.webdriver_port(get_unique_port())
1080+
.pdf_export_timeout(750)
10801081
.build()
10811082
.unwrap();
10821083
plot.write_image_with_exporter(&mut exporter, &dst, ImageFormat::PDF, 1024, 680, 1.0)

plotly_static/src/lib.rs

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1080,6 +1080,59 @@ impl StaticExporter {
10801080
data.split_once(",").map(|d| d.1.to_string())
10811081
}
10821082

1083+
/// Get Firefox preferences optimized for CI environments.
1084+
///
1085+
/// These preferences force software rendering and enable WebGL in headless
1086+
/// mode to work around graphics/WebGL issues in CI environments.
1087+
#[cfg(feature = "geckodriver")]
1088+
fn get_firefox_ci_preferences() -> serde_json::Map<String, serde_json::Value> {
1089+
let mut prefs = serde_json::Map::new();
1090+
1091+
// Force software rendering and enable WebGL in headless mode
1092+
prefs.insert(
1093+
"layers.acceleration.disabled".to_string(),
1094+
serde_json::json!(true),
1095+
);
1096+
prefs.insert("gfx.webrender.all".to_string(), serde_json::json!(false));
1097+
prefs.insert(
1098+
"gfx.webrender.software".to_string(),
1099+
serde_json::json!(true),
1100+
);
1101+
prefs.insert("webgl.disabled".to_string(), serde_json::json!(false));
1102+
prefs.insert("webgl.force-enabled".to_string(), serde_json::json!(true));
1103+
prefs.insert("webgl.enable-webgl2".to_string(), serde_json::json!(true));
1104+
1105+
// Force software WebGL implementation
1106+
prefs.insert(
1107+
"webgl.software-rendering".to_string(),
1108+
serde_json::json!(true),
1109+
);
1110+
prefs.insert(
1111+
"webgl.software-rendering.force".to_string(),
1112+
serde_json::json!(true),
1113+
);
1114+
1115+
// Disable hardware acceleration completely
1116+
prefs.insert(
1117+
"gfx.canvas.azure.accelerated".to_string(),
1118+
serde_json::json!(false),
1119+
);
1120+
prefs.insert(
1121+
"gfx.canvas.azure.accelerated-layers".to_string(),
1122+
serde_json::json!(false),
1123+
);
1124+
prefs.insert(
1125+
"gfx.content.azure.backends".to_string(),
1126+
serde_json::json!("cairo"),
1127+
);
1128+
1129+
// Force software rendering for all graphics
1130+
prefs.insert("gfx.2d.force-enabled".to_string(), serde_json::json!(true));
1131+
prefs.insert("gfx.2d.force-software".to_string(), serde_json::json!(true));
1132+
1133+
prefs
1134+
}
1135+
10831136
fn build_webdriver_caps(&self) -> Result<Capabilities> {
10841137
// Define browser capabilities
10851138
let mut caps = JsonMap::new();
@@ -1101,6 +1154,14 @@ impl StaticExporter {
11011154
debug!("Added Firefox binary capability: {firefox_path}");
11021155
}
11031156

1157+
// Add Firefox-specific preferences for CI environments
1158+
#[cfg(feature = "geckodriver")]
1159+
{
1160+
let prefs = Self::get_firefox_ci_preferences();
1161+
browser_opts.insert("prefs".to_string(), serde_json::json!(prefs));
1162+
debug!("Added Firefox preferences for CI compatibility");
1163+
}
1164+
11041165
caps.insert(
11051166
"browserName".to_string(),
11061167
serde_json::json!(get_browser_name()),

0 commit comments

Comments
 (0)