@@ -12,8 +12,18 @@ public class EmbeddedContent : ComponentBase
12
12
[ Inject ] IJSRuntime jSRuntime { get ; set ; }
13
13
[ Parameter ] protected bool Debug { get ; set ; } = false ;
14
14
[ Parameter ] protected Type BaseType { get ; set ; }
15
+ private bool PreRender { get ; set ; } = true ;
15
16
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 ( )
17
27
{
18
28
foreach ( var item in ListEmbeddedResources ( BaseType ) )
19
29
{
@@ -23,7 +33,7 @@ protected override async Task OnInitAsync()
23
33
{
24
34
case ".css" :
25
35
case ".js" :
26
- if ( ! ( await DoesLinkExist ( BaseType , item ) ) && ! ( await DoesScriptExist ( BaseType , item ) ) )
36
+ if ( ! ( await DoesLinkExist ( BaseType , item ) ) && ! ( await DoesScriptExist ( BaseType , item ) ) )
27
37
{
28
38
string content ;
29
39
using ( var stream = GetContentStream ( BaseType , item ) )
@@ -58,12 +68,9 @@ private void DebugLog(string message)
58
68
if ( Debug ) Console . WriteLine ( message ) ;
59
69
}
60
70
61
- protected override bool ShouldRender ( )
62
- {
63
- return Debug ;
64
- }
65
71
protected override void BuildRenderTree ( RenderTreeBuilder builder )
66
72
{
73
+
67
74
base . BuildRenderTree ( builder ) ;
68
75
if ( Debug )
69
76
{
@@ -83,6 +90,45 @@ protected override void BuildRenderTree(RenderTreeBuilder builder)
83
90
builder . AddContent ( 1 , "--- End Embedded Files ---" ) ;
84
91
builder . CloseElement ( ) ;
85
92
}
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
+ }
86
132
}
87
133
88
134
public async Task AttachStyleSheet ( string name , string content )
@@ -123,7 +169,17 @@ public async Task<bool> DoesLinkExist(Type type, string name)
123
169
}
124
170
string script = $ "document.head.querySelector(\" link[id='{ SafeFileName ( name ) } '],link[href='{ fileName } ']\" )";
125
171
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
+ }
127
183
bool found = ! ( result is null ) ;
128
184
DebugLog ( $ "DoesLinkExist { name } : { found } ") ;
129
185
return found ;
@@ -134,14 +190,24 @@ public async Task<bool> DoesScriptExist(Type type, string name)
134
190
// name will be blazor:js:somthing.js or AssemblyNameSpace.somthing.js
135
191
string [ ] parts = name . Split ( ':' ) ;
136
192
string fileName = parts [ parts . Length - 1 ] ;
137
- if ( parts . Length == 3 )
193
+ if ( parts . Length == 3 )
138
194
{
139
195
// the name is blazor:js:somthing.js
140
196
fileName = $ "_content/{ type . Assembly . GetName ( ) . Name } /{ fileName } ";
141
197
}
142
198
string script = $ "document.head.querySelector(\" script[id='{ SafeFileName ( name ) } '],script[src='{ fileName } ']\" )";
143
199
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
+ }
145
211
bool found = ! ( result is null ) ;
146
212
DebugLog ( $ "DoesScriptExist { name } : { found } ") ;
147
213
return found ;
@@ -150,7 +216,7 @@ public async Task<bool> DoesScriptExist(Type type, string name)
150
216
public IEnumerable < string > ListEmbeddedResources ( Type type )
151
217
{
152
218
var resources = type . Assembly . GetManifestResourceNames ( ) ;
153
- Console . WriteLine ( $ "Got resources: { string . Join ( ", " , resources ) } ") ;
219
+ Console . WriteLine ( $ "Got resources: { string . Join ( ", " , resources ) } ") ;
154
220
DebugLog ( $ "Using type: { type . Name } from { type . Assembly . GetName ( ) . Name } ") ;
155
221
foreach ( var item in resources )
156
222
{
@@ -165,7 +231,8 @@ public System.IO.Stream GetContentStream(Type type, string name)
165
231
}
166
232
167
233
string SafeFileName ( string name ) => name . Replace ( ":" , "_" ) ;
168
-
234
+
169
235
string SafeJsString ( string content ) => content . Replace ( @"\" , @"\\" ) . Replace ( "\r " , @"\r" ) . Replace ( "\n " , @"\n" ) . Replace ( "'" , @"\'" ) . Replace ( "\" " , @"\""" ) ;
236
+
170
237
}
171
238
}
0 commit comments