diff --git a/Oqtane.Client/App.razor b/Oqtane.Client/App.razor
index 8a91c1c8..701faf81 100644
--- a/Oqtane.Client/App.razor
+++ b/Oqtane.Client/App.razor
@@ -1,6 +1,8 @@
+@using Microsoft.AspNetCore.Http
@inject IInstallationService InstallationService
@inject IJSRuntime JSRuntime
@inject SiteState SiteState
+@inject IServiceProvider ServiceProvider
@if (_initialized)
{
@@ -30,35 +32,47 @@
}
@code {
- [Parameter]
- public string AntiForgeryToken { get; set; }
+ [Parameter]
+ public string AntiForgeryToken { get; set; }
- [Parameter]
- public string Runtime { get; set; }
+ [Parameter]
+ public string Runtime { get; set; }
- [Parameter]
- public string RenderMode { get; set; }
+ [Parameter]
+ public string RenderMode { get; set; }
- [Parameter]
- public int VisitorId { get; set; }
+ [Parameter]
+ public int VisitorId { get; set; }
- [Parameter]
- public string RemoteIPAddress { get; set; }
+ [Parameter]
+ public string RemoteIPAddress { get; set; }
- [Parameter]
- public string AuthorizationToken { get; set; }
+ [Parameter]
+ public string AuthorizationToken { get; set; }
- private bool _initialized = false;
- private string _display = "display: none;";
- private Installation _installation = new Installation { Success = false, Message = "" };
+ private bool _initialized = false;
+ private string _display = "display: none;";
+ private Installation _installation = new Installation { Success = false, Message = "" };
- private PageState PageState { get; set; }
+ private PageState PageState { get; set; }
- protected override async Task OnParametersSetAsync()
- {
- SiteState.RemoteIPAddress = RemoteIPAddress;
- SiteState.AntiForgeryToken = AntiForgeryToken;
- SiteState.AuthorizationToken = AuthorizationToken;
+ private IHttpContextAccessor accessor;
+
+ protected override async Task OnParametersSetAsync()
+ {
+ SiteState.RemoteIPAddress = RemoteIPAddress;
+ SiteState.AntiForgeryToken = AntiForgeryToken;
+ SiteState.AuthorizationToken = AuthorizationToken;
+
+ accessor = (IHttpContextAccessor)ServiceProvider.GetService(typeof(IHttpContextAccessor));
+ if (accessor != null)
+ {
+ SiteState.IsPrerendering = !accessor.HttpContext.Response.HasStarted;
+ }
+ else
+ {
+ SiteState.IsPrerendering = true;
+ }
_installation = await InstallationService.IsInstalled();
if (_installation.Alias != null)
diff --git a/Oqtane.Client/Modules/ModuleBase.cs b/Oqtane.Client/Modules/ModuleBase.cs
index 75a1d6c8..6e3fc7cc 100644
--- a/Oqtane.Client/Modules/ModuleBase.cs
+++ b/Oqtane.Client/Modules/ModuleBase.cs
@@ -278,6 +278,7 @@ namespace Oqtane.Modules
SiteState.Properties.PageTitle = title;
}
+ // note - only supports links and meta tags - not scripts
public void AddHeadContent(string content)
{
if (string.IsNullOrEmpty(SiteState.Properties.HeadContent))
diff --git a/Oqtane.Client/UI/ThemeBuilder.razor b/Oqtane.Client/UI/ThemeBuilder.razor
index 49017206..f4f02565 100644
--- a/Oqtane.Client/UI/ThemeBuilder.razor
+++ b/Oqtane.Client/UI/ThemeBuilder.razor
@@ -6,9 +6,9 @@
@DynamicComponent
@code {
- [CascadingParameter] PageState PageState { get; set; }
+ [CascadingParameter] PageState PageState { get; set; }
- RenderFragment DynamicComponent { get; set; }
+ RenderFragment DynamicComponent { get; set; }
protected override void OnParametersSet()
{
@@ -38,21 +38,21 @@
favicon = Utilities.FileUrl(PageState.Alias, PageState.Site.FaviconFileId.Value);
}
headcontent += $"\n";
- // head content
- if (!string.IsNullOrEmpty(PageState.Site.HeadContent))
- {
- headcontent += ProcessHeadContent(PageState.Site.HeadContent, "site") + "\n";
- }
- if (!string.IsNullOrEmpty(PageState.Page.HeadContent))
- {
- headcontent += ProcessHeadContent(PageState.Page.HeadContent, $"page{PageState.Page.PageId}") + "\n";
- }
// stylesheets
foreach (Resource resource in PageState.Page.Resources.Where(item => item.ResourceType == ResourceType.Stylesheet))
{
var url = (resource.Url.Contains("://")) ? resource.Url : PageState.Alias.BaseUrl + resource.Url;
headcontent += CreateLink(url, resource.Integrity, resource.CrossOrigin) + "\n";
}
+ // head content
+ if (!string.IsNullOrEmpty(PageState.Site.HeadContent))
+ {
+ headcontent += PageState.Site.HeadContent + "\n";
+ }
+ if (!string.IsNullOrEmpty(PageState.Page.HeadContent))
+ {
+ headcontent += PageState.Page.HeadContent + "\n";
+ }
SiteState.Properties.HeadContent = headcontent;
DynamicComponent = builder =>
@@ -65,87 +65,75 @@
protected override async Task OnAfterRenderAsync(bool firstRender)
{
- if (!string.IsNullOrEmpty(PageState.Page.HeadContent) && PageState.Page.HeadContent.Contains("", index) + 9 - index);
- var attributes = script.Substring(0, script.IndexOf(">")).Replace("\"", "").Split(" ");
- string id = "";
- string src = "";
- string integrity = "";
- string crossorigin = "";
- string type = "";
- foreach (var attribute in attributes)
+ // inject scripts into page dynamically
+ var interop = new Interop(JSRuntime);
+ var scripts = new List