@@ -12,8 +12,18 @@ public class EmbeddedContent : ComponentBase
1212 [ Inject ] IJSRuntime jSRuntime { get ; set ; }
1313 [ Parameter ] protected bool Debug { get ; set ; } = false ;
1414 [ Parameter ] protected Type BaseType { get ; set ; }
15+ private bool PreRender { get ; set ; } = true ;
1516
16- protected override async Task OnInitAsync ( )
17+ protected override async Task OnAfterRenderAsync ( )
18+ {
19+ await base . OnAfterRenderAsync ( ) ;
20+ if ( ! PreRender )
21+ {
22+ await LoadEmbeddedResources ( ) ;
23+ }
24+
25+ }
26+ private async Task LoadEmbeddedResources ( )
1727 {
1828 foreach ( var item in ListEmbeddedResources ( BaseType ) )
1929 {
@@ -23,7 +33,7 @@ protected override async Task OnInitAsync()
2333 {
2434 case ".css" :
2535 case ".js" :
26- if ( ! ( await DoesLinkExist ( BaseType , item ) ) && ! ( await DoesScriptExist ( BaseType , item ) ) )
36+ if ( ! ( await DoesLinkExist ( BaseType , item ) ) && ! ( await DoesScriptExist ( BaseType , item ) ) )
2737 {
2838 string content ;
2939 using ( var stream = GetContentStream ( BaseType , item ) )
@@ -58,12 +68,9 @@ private void DebugLog(string message)
5868 if ( Debug ) Console . WriteLine ( message ) ;
5969 }
6070
61- protected override bool ShouldRender ( )
62- {
63- return Debug ;
64- }
6571 protected override void BuildRenderTree ( RenderTreeBuilder builder )
6672 {
73+
6774 base . BuildRenderTree ( builder ) ;
6875 if ( Debug )
6976 {
@@ -83,6 +90,45 @@ protected override void BuildRenderTree(RenderTreeBuilder builder)
8390 builder . AddContent ( 1 , "--- End Embedded Files ---" ) ;
8491 builder . CloseElement ( ) ;
8592 }
93+ DetectRenderMode ( builder ) ;
94+ }
95+
96+ private void DetectRenderMode ( RenderTreeBuilder builder )
97+ {
98+ try
99+ {
100+ var btype = builder . GetType ( ) ;
101+ var rendererFI = btype . GetField ( "_renderer" , System . Reflection . BindingFlags . NonPublic | System . Reflection . BindingFlags . Instance ) ;
102+ if ( rendererFI is null )
103+ {
104+ PreRender = false ;
105+ return ;
106+ }
107+ var renderer = rendererFI . GetValue ( builder ) ;
108+ if ( renderer is null )
109+ {
110+ PreRender = false ;
111+ return ;
112+ }
113+ var rendererType = renderer . GetType ( ) ;
114+ if ( rendererType is null )
115+ {
116+ PreRender = false ;
117+ return ;
118+ }
119+ var renderModeFI = rendererType . GetField ( "_prerenderMode" , System . Reflection . BindingFlags . NonPublic | System . Reflection . BindingFlags . Instance ) ;
120+ if ( renderModeFI is null )
121+ {
122+ PreRender = false ;
123+ return ;
124+ }
125+
126+ PreRender = ( bool ) renderModeFI . GetValue ( renderer ) ;
127+ }
128+ catch
129+ {
130+ // older previews didn't have pre-render
131+ }
86132 }
87133
88134 public async Task AttachStyleSheet ( string name , string content )
@@ -123,7 +169,17 @@ public async Task<bool> DoesLinkExist(Type type, string name)
123169 }
124170 string script = $ "document.head.querySelector(\" link[id='{ SafeFileName ( name ) } '],link[href='{ fileName } ']\" )";
125171 DebugLog ( $ "DoesLinkExist { name } : { script } ") ;
126- var result = await jSRuntime . InvokeAsync < object > ( "eval" , script ) ;
172+ object result = null ;
173+ try
174+ {
175+ result = await jSRuntime . InvokeAsync < object > ( "eval" , script ) ;
176+ }
177+ catch ( Exception ex )
178+ {
179+
180+ Console . WriteLine ( ex ) ;
181+
182+ }
127183 bool found = ! ( result is null ) ;
128184 DebugLog ( $ "DoesLinkExist { name } : { found } ") ;
129185 return found ;
@@ -134,14 +190,24 @@ public async Task<bool> DoesScriptExist(Type type, string name)
134190 // name will be blazor:js:somthing.js or AssemblyNameSpace.somthing.js
135191 string [ ] parts = name . Split ( ':' ) ;
136192 string fileName = parts [ parts . Length - 1 ] ;
137- if ( parts . Length == 3 )
193+ if ( parts . Length == 3 )
138194 {
139195 // the name is blazor:js:somthing.js
140196 fileName = $ "_content/{ type . Assembly . GetName ( ) . Name } /{ fileName } ";
141197 }
142198 string script = $ "document.head.querySelector(\" script[id='{ SafeFileName ( name ) } '],script[src='{ fileName } ']\" )";
143199 DebugLog ( $ "DoesScriptExist { name } : { script } ") ;
144- var result = await jSRuntime . InvokeAsync < object > ( "eval" , script ) ;
200+ object result = null ;
201+ try
202+ {
203+ result = await jSRuntime . InvokeAsync < object > ( "eval" , script ) ;
204+ }
205+ catch ( Exception ex )
206+ {
207+
208+ Console . WriteLine ( ex ) ;
209+
210+ }
145211 bool found = ! ( result is null ) ;
146212 DebugLog ( $ "DoesScriptExist { name } : { found } ") ;
147213 return found ;
@@ -150,7 +216,7 @@ public async Task<bool> DoesScriptExist(Type type, string name)
150216 public IEnumerable < string > ListEmbeddedResources ( Type type )
151217 {
152218 var resources = type . Assembly . GetManifestResourceNames ( ) ;
153- Console . WriteLine ( $ "Got resources: { string . Join ( ", " , resources ) } ") ;
219+ Console . WriteLine ( $ "Got resources: { string . Join ( ", " , resources ) } ") ;
154220 DebugLog ( $ "Using type: { type . Name } from { type . Assembly . GetName ( ) . Name } ") ;
155221 foreach ( var item in resources )
156222 {
@@ -165,7 +231,8 @@ public System.IO.Stream GetContentStream(Type type, string name)
165231 }
166232
167233 string SafeFileName ( string name ) => name . Replace ( ":" , "_" ) ;
168-
234+
169235 string SafeJsString ( string content ) => content . Replace ( @"\" , @"\\" ) . Replace ( "\r " , @"\r" ) . Replace ( "\n " , @"\n" ) . Replace ( "'" , @"\'" ) . Replace ( "\" " , @"\""" ) ;
236+
170237 }
171238}
0 commit comments