@@ -34,6 +34,9 @@ impl Plugin for CustomProtocolPlugin {
3434 }
3535}
3636
37+ #[ derive( Default , Component , Deref , DerefMut ) ]
38+ pub ( crate ) struct WryResponseHandles ( HashMap < AssetId < WryResponseBody > , WryResponseHandle > ) ;
39+
3740pub struct WryRequest {
3841 pub webview : Entity ,
3942 pub path : PathBuf ,
@@ -51,6 +54,7 @@ pub struct WryResponseMap(pub HashMap<WryRequestArgs, RequestAsyncResponder>);
5154fn start_load (
5255 mut commands : Commands ,
5356 mut map : NonSendMut < WryResponseMap > ,
57+ mut response_handles : Query < & mut WryResponseHandles > ,
5458 rx : NonSend < WryRequestReceiver > ,
5559 asset_server : Res < AssetServer > ,
5660) {
@@ -59,53 +63,66 @@ fn start_load(
5963 csp : request. csp ,
6064 path : request. path . clone ( ) ,
6165 } ;
62- commands. entity ( request. webview ) . try_insert ( (
63- args. clone ( ) ,
64- WryResponseHandle ( asset_server. load ( request. path . clone ( ) ) ) ,
65- ) ) ;
66+ let Ok ( mut handles) = response_handles. get_mut ( request. webview ) else {
67+ continue ;
68+ } ;
69+ let response_handle = WryResponseHandle ( asset_server. load ( request. path . clone ( ) ) ) ;
70+ handles. insert ( response_handle. 0 . id ( ) , response_handle. clone ( ) ) ;
71+ commands
72+ . entity ( request. webview )
73+ . with_child ( ( response_handle, args. clone ( ) ) ) ;
6674 map. 0 . insert ( args, request. responder ) ;
6775 }
6876}
6977
7078fn response (
7179 mut commands : Commands ,
72- responses : ResMut < Assets < WryResponseBody > > ,
73- mut handles : Query < ( Entity , & WryRequestArgs , & WryResponseHandle ) > ,
7480 mut map : NonSendMut < WryResponseMap > ,
81+ responses : ResMut < Assets < WryResponseBody > > ,
82+ requests : Query < ( Entity , & WryRequestArgs , & WryResponseHandle ) > ,
7583) {
76- for ( webview_entity , args, handle) in handles . iter_mut ( ) {
84+ for ( request_entity , args, handle) in requests . iter ( ) {
7785 let Some ( response_body) = responses. get ( handle. 0 . id ( ) ) else {
7886 continue ;
7987 } ;
8088 let Some ( responder) = map. 0 . remove ( args) else {
8189 continue ;
8290 } ;
8391 responder. respond ( convert_to_response ( response_body. 0 . clone ( ) , args) ) ;
84- commands
85- . entity ( webview_entity)
86- . try_remove :: < WryRequestArgs > ( ) ;
92+ commands. entity ( request_entity) . despawn ( ) ;
8793 }
8894}
8995
9096#[ cfg( feature = "hot-reload" ) ]
9197fn hot_reload (
9298 mut er : EventReader < AssetEvent < WryResponseBody > > ,
9399 wry_webviews : NonSend < crate :: prelude:: WryWebViews > ,
94- webviews : Query < ( Entity , & WryResponseHandle ) , With < Webview > > ,
100+ webviews : Query < ( Entity , & WryResponseHandles ) , With < Webview > > ,
95101 asset_server : Res < AssetServer > ,
96102) {
97- for event in er. read ( ) {
98- if let AssetEvent :: Modified { id } = event
99- && let Some ( webview_entity) = webviews
100- . iter ( )
101- . find_map ( |( entity, handle) | ( id == & handle. 0 . id ( ) ) . then_some ( entity) )
102- && let Some ( webview) = wry_webviews. get ( & webview_entity)
103- {
104- if let Some ( path) = asset_server. get_path ( * id) {
103+ let modified_ids = er
104+ . read ( )
105+ . filter_map ( |event| {
106+ if let AssetEvent :: Modified { id } = event {
107+ Some ( id)
108+ } else {
109+ None
110+ }
111+ } )
112+ . collect :: < Vec < _ > > ( ) ;
113+ for ( webview_entity, id) in webviews. iter ( ) . filter_map ( |( entity, handles) | {
114+ handles
115+ . keys ( )
116+ . find_map ( |id| modified_ids. contains ( & id) . then_some ( ( entity, id) ) )
117+ } ) {
118+ if let Some ( webview) = wry_webviews. get ( & webview_entity) {
119+ if let Some ( path) = asset_server. get_path ( id. untyped ( ) ) {
105120 info ! ( "Reloading webview {webview_entity}: {path:?}" ) ;
106121 }
107122 if let Err ( e) = webview. reload ( ) {
108123 warn ! ( "Failed to reload webview {webview_entity}: {e}" ) ;
124+ } else {
125+ info ! ( "Reloaded webview {webview_entity}" ) ;
109126 }
110127 }
111128 }
0 commit comments