diff --git a/.changes/header.md b/.changes/header.md new file mode 100644 index 000000000..73a0b6fca --- /dev/null +++ b/.changes/header.md @@ -0,0 +1,5 @@ +--- +"wry": patch +--- + +On Linux, add `linux-headers` feature flag to fix version regression. The minimum webkit2gtk version remains v2.22. diff --git a/Cargo.toml b/Cargo.toml index d5522291d..82811b21f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -31,6 +31,7 @@ tray = [ "tao/tray" ] devtools = [ ] transparent = [ ] fullscreen = [ ] +linux-headers = [ "webkit2gtk/v2_36" ] [dependencies] libc = "0.2" @@ -50,7 +51,7 @@ dirs = "4.0.0" base64 = "0.13.1" [target."cfg(any(target_os = \"linux\", target_os = \"dragonfly\", target_os = \"freebsd\", target_os = \"openbsd\", target_os = \"netbsd\"))".dependencies] -webkit2gtk = { version = "0.18.2", features = [ "v2_36" ] } +webkit2gtk = { version = "0.18.2", features = [ "v2_22" ] } webkit2gtk-sys = "0.18" gio = "0.15" glib = "0.15" diff --git a/src/lib.rs b/src/lib.rs index d0dfca1f0..439fb9c7e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -64,6 +64,8 @@ //! Avoid this in release build if your app needs to publish to App Store. //! - `dox`: Enables this in `package.metadata.docs.rs` section to skip linking some **Linux** //! libraries and prevent from building documentation on doc.rs fails. +//! - `linux-headers`: Enables headers support of custom protocol request on Linux. Requires +//! webkit2gtk v2.36 or above. //! //! [tao]: https://crates.io/crates/tao //! [`EventLoop`]: crate::application::event_loop::EventLoop diff --git a/src/webview/webkitgtk/web_context.rs b/src/webview/webkitgtk/web_context.rs index 431956b17..e4a5bbd80 100644 --- a/src/webview/webkitgtk/web_context.rs +++ b/src/webview/webkitgtk/web_context.rs @@ -6,11 +6,7 @@ use crate::{webview::web_context::WebContextData, Error}; use glib::FileError; -use http::{ - header::{HeaderName, CONTENT_TYPE}, - HeaderValue, Request, Response, -}; -use soup::{MessageHeaders, MessageHeadersType}; +use http::{header::CONTENT_TYPE, Request, Response}; use std::{ cell::RefCell, collections::{HashSet, VecDeque}, @@ -24,13 +20,9 @@ use std::{ }; use url::Url; use webkit2gtk::{ - traits::*, ApplicationInfo, CookiePersistentStorage, LoadEvent, URISchemeResponse, - UserContentManager, WebContext, WebContextBuilder, WebView, WebsiteDataManagerBuilder, + traits::*, ApplicationInfo, CookiePersistentStorage, LoadEvent, UserContentManager, WebContext, + WebContextBuilder, WebView, WebsiteDataManagerBuilder, }; -use webkit2gtk_sys::webkit_get_minor_version; - -// header support was introduced in webkit2gtk 2.36 -const HEADER_MINOR_RELEASE: u32 = 36; #[derive(Debug)] pub struct WebContextImpl { @@ -40,7 +32,6 @@ pub struct WebContextImpl { registered_protocols: HashSet, automation: bool, app_info: Option, - webkit2gtk_minor: u32, } impl WebContextImpl { @@ -87,8 +78,6 @@ impl WebContextImpl { .expect("invalid wry version patch"), ); - let webkit2gtk_minor = unsafe { webkit_get_minor_version() }; - Self { context, automation, @@ -96,7 +85,6 @@ impl WebContextImpl { registered_protocols: Default::default(), webview_uri_loader: Rc::default(), app_info: Some(app_info), - webkit2gtk_minor, } } @@ -290,7 +278,6 @@ where F: Fn(&Request>) -> crate::Result>> + 'static, { use webkit2gtk::traits::*; - let webkit2gtk_minor = context.os.webkit2gtk_minor; let context = &context.os.context; // Enable secure context context @@ -303,8 +290,12 @@ where let uri = uri.as_str(); // FIXME: Read the body (forms post) + #[allow(unused_mut)] let mut http_request = Request::builder().uri(uri).method("GET"); - if webkit2gtk_minor >= HEADER_MINOR_RELEASE { + #[cfg(feature = "linux-headers")] + { + use http::{header::HeaderName, HeaderValue}; + if let Some(mut headers) = request.http_headers() { if let Some(map) = http_request.headers_mut() { headers.foreach(move |k, v| { @@ -341,7 +332,11 @@ where .headers() .get(CONTENT_TYPE) .and_then(|h| h.to_str().ok()); - if webkit2gtk_minor >= HEADER_MINOR_RELEASE { + #[cfg(feature = "linux-headers")] + { + use soup::{MessageHeaders, MessageHeadersType}; + use webkit2gtk::URISchemeResponse; + let response = URISchemeResponse::new(&input, buffer.len() as i64); response.set_status(http_response.status().as_u16() as u32, None); if let Some(content_type) = content_type { @@ -355,9 +350,9 @@ where response.set_http_headers(&mut headers); request.finish_with_response(&response); - } else { - request.finish(&input, buffer.len() as i64, content_type) } + #[cfg(not(feature = "header"))] + request.finish(&input, buffer.len() as i64, content_type) } Err(_) => request.finish_error(&mut glib::Error::new( FileError::Exist,