From cf34c2bde89e1bf1415902b4975ac71870af04c7 Mon Sep 17 00:00:00 2001 From: Amr Bashir Date: Wed, 4 Oct 2023 10:43:19 +0300 Subject: [PATCH] refactor(webview): use the more efficent `SHCreateMemStream` (#1031) * refactor(webview): use the more efficent `SHCreateMemStream` ref: https://learn.microsoft.com/en-us/windows/win32/api/combaseapi/nf-combaseapi-createstreamonhglobal?redirectedfrom=MSDN * remove unused --- src/webview/webview2/mod.rs | 24 +++++------------------- 1 file changed, 5 insertions(+), 19 deletions(-) diff --git a/src/webview/webview2/mod.rs b/src/webview/webview2/mod.rs index 02616243a..bd644de9c 100644 --- a/src/webview/webview2/mod.rs +++ b/src/webview/webview2/mod.rs @@ -20,7 +20,6 @@ use std::{ collections::HashSet, fmt::Write, iter::once, - mem::MaybeUninit, os::windows::prelude::OsStrExt, path::PathBuf, rc::Rc, @@ -37,13 +36,13 @@ use windows::{ Globalization::{self, MAX_LOCALE_NAME}, Graphics::Gdi::{RedrawWindow, HRGN, RDW_INTERNALPAINT}, System::{ - Com::{IStream, StructuredStorage::CreateStreamOnHGlobal}, + Com::IStream, LibraryLoader::{GetProcAddress, LoadLibraryW}, SystemInformation::OSVERSIONINFOW, WinRT::EventRegistrationToken, }, UI::{ - Shell::{DefSubclassProc, SetWindowSubclass}, + Shell::{DefSubclassProc, SHCreateMemStream, SetWindowSubclass}, WindowsAndMessaging::{self as win32wm, PostMessageW, RegisterWindowMessageA}, }, }, @@ -992,28 +991,15 @@ unsafe fn prepare_web_request_response( } } - let mut body_sent = None; + let mut stream = None; if !content.is_empty() { - let stream = CreateStreamOnHGlobal(HGLOBAL(0), true)?; - stream.SetSize(content.len() as u64)?; - let mut cb_write = MaybeUninit::uninit(); - if stream - .Write( - content.as_ptr() as *const _, - content.len() as u32, - Some(cb_write.as_mut_ptr()), - ) - .is_ok() - && cb_write.assume_init() as usize == content.len() - { - body_sent = Some(stream); - } + stream = SHCreateMemStream(Some(content)); } // FIXME: Set http response version env.CreateWebResourceResponse( - body_sent.as_ref(), + stream.as_ref(), status_code.as_u16() as i32, PCWSTR::from_raw(encode_wide(status_code.canonical_reason().unwrap_or("OK")).as_ptr()), PCWSTR::from_raw(encode_wide(headers_map).as_ptr()),