Example #1
0
        public RequireSettings RegisterResource(string resourceType, string resourceName)
        {
            if (resourceType == null)
            {
                throw new ArgumentNullException(nameof(resourceType));
            }

            if (resourceName == null)
            {
                throw new ArgumentNullException(nameof(resourceName));
            }

            RequireSettings settings;
            var             key = new ResourceTypeName(resourceType, resourceName);

            if (!_required.TryGetValue(key, out settings))
            {
                settings = new RequireSettings(_options.Value)
                {
                    Type = resourceType, Name = resourceName
                };
                _required[key] = settings;
            }
            _builtResources[resourceType] = null;
            return(settings);
        }
Example #2
0
        private void WriteResources(TextWriter Output, string resourceType, ResourceLocation?includeLocation, ResourceLocation?excludeLocation)
        {
            var defaultSettings = new RequireSettings();

            var requiredResources = _resourceManager.Value.BuildRequiredResources(resourceType);
            var appPath           = _httpContextAccessor.Value.Current().Request.ApplicationPath;

            foreach (var context in requiredResources.Where(r =>
                                                            (includeLocation.HasValue ? r.Settings.Location == includeLocation.Value : true) &&
                                                            (excludeLocation.HasValue ? r.Settings.Location != excludeLocation.Value : true)))
            {
                var path       = context.GetResourceUrl(defaultSettings, appPath);
                var condition  = context.Settings.Condition;
                var attributes = context.Settings.HasAttributes ? context.Settings.Attributes : null;

                //需要判断是否用了cdn地址
                ResourceManager.WriteResource(Output, context.Resource, !context.Resource.Url.StartsWith("http") ? (context.Resource.BasePath + context.Resource.Url) : context.Resource.Url,
                                              condition, attributes);
                //if (resourceType == "stylesheet")
                //{
                //    context.Resource.TagBuilder.Attributes.Add(context.Resource.FilePathAttributeName, context.Resource.Url);

                //}
                //else if (resourceType == "script")
                //{
                //    result = Display.Script(Url: path, Condition: condition, Resource: context.Resource, TagAttributes: attributes);
                //}
                //else
                //{
                //    result = Display.Resource(Url: path, Condition: condition, Resource: context.Resource, TagAttributes: attributes);
                //}
                //Output.Write(result);
            }
        }
        private void VerifyPaths(string resourceType, RequireSettings defaultSettings, string expectedPaths, bool ssl)
        {
            defaultSettings = defaultSettings ?? new RequireSettings();
            var requiredResources = _resourceManager.BuildRequiredResources(resourceType);
            var renderedResources = string.Join(",", requiredResources.Select(context => context.GetResourceUrl(defaultSettings, _appPath, ssl)).ToArray());

            Assert.That(renderedResources, Is.EqualTo(expectedPaths));
        }
        private void WriteResources(dynamic Display, TextWriter Output, string resourceType, ResourceLocation?includeLocation, ResourceLocation?excludeLocation)
        {
            bool debugMode;
            var  site = _workContext.Value.CurrentSite;

            switch (site.ResourceDebugMode)
            {
            case ResourceDebugMode.Enabled:
                debugMode = true;
                break;

            case ResourceDebugMode.Disabled:
                debugMode = false;
                break;

            default:
                Debug.Assert(site.ResourceDebugMode == ResourceDebugMode.FromAppSetting, "Unknown ResourceDebugMode value.");
                var context = _httpContextAccessor.Value.Current();
                debugMode = context != null && context.IsDebuggingEnabled;
                break;
            }
            var defaultSettings = new RequireSettings {
                DebugMode    = debugMode,
                CdnMode      = site.UseCdn,
                FileHashMode = site.UseFileHash,
                Culture      = _workContext.Value.CurrentCulture,
            };
            var requiredResources = _resourceManager.Value.BuildRequiredResources(resourceType);
            var httpContext       = _httpContextAccessor.Value.Current();
            var appPath           = httpContext == null || httpContext.Request == null
                ? null
                : httpContext.Request.ApplicationPath;
            var ssl = httpContext != null && httpContext.Request != null && httpContext.Request.IsSecureConnection;

            foreach (var context in requiredResources.Where(r =>
                                                            (includeLocation.HasValue ? r.Settings.Location == includeLocation.Value : true) &&
                                                            (excludeLocation.HasValue ? r.Settings.Location != excludeLocation.Value : true)))
            {
                var         url        = context.GetResourceUrl(defaultSettings, appPath, ssl, _resourceFileHashProvider);
                var         condition  = context.Settings.Condition;
                var         attributes = context.Settings.HasAttributes ? context.Settings.Attributes : null;
                IHtmlString result;
                if (resourceType == "stylesheet")
                {
                    result = Display.Style(Url: url, Condition: condition, Resource: context.Resource, TagAttributes: attributes);
                }
                else if (resourceType == "script")
                {
                    result = Display.Script(Url: url, Condition: condition, Resource: context.Resource, TagAttributes: attributes);
                }
                else
                {
                    result = Display.Resource(Url: url, Condition: condition, Resource: context.Resource, TagAttributes: attributes);
                }
                Output.Write(result);
            }
        }
        public void GetScriptResourceWithInlineContent()
        {
            var resourceDefinition = _resourceManifest.DefineScript("foo")
                                     .SetInnerContent("console.log('foo');");

            var requireSettings = new RequireSettings();
            var tagBuilder      = resourceDefinition.GetTagBuilder(requireSettings, basePath, StubFileVersionProvider.Instance);

            Assert.Equal("script", tagBuilder.TagName);
            Assert.Equal("console.log('foo');", ReadIHtmlContent(tagBuilder.InnerHtml));
        }
Example #6
0
        public void GetStyleResourceWithInlineContent()
        {
            var resourceDefinition = _resourceManifest.DefineStyle("foo")
                                     .SetInnerContent("body { background-color: white; }");

            var requireSettings = new RequireSettings();
            var tagBuilder      = resourceDefinition.GetTagBuilder(requireSettings, basePath, StubFileVersionProvider.Instance);

            Assert.Equal("style", tagBuilder.TagName);
            Assert.Equal("text/css", tagBuilder.Attributes["type"]);
            Assert.Equal("body { background-color: white; }", ReadIHtmlContent(tagBuilder.InnerHtml));
        }
Example #7
0
        public void GetLocalScriptResourceWithCdnBaseUrl(string applicationPath, string url, string expected)
        {
            var resourceDefinition = _resourceManifest.DefineScript("foo")
                                     .SetUrl(url, url);

            var requireSettings = new RequireSettings {
                DebugMode = false, CdnMode = true, CdnBaseUrl = "https://hostcdn.net"
            };
            var tagBuilder = resourceDefinition.GetTagBuilder(requireSettings, applicationPath, StubFileVersionProvider.Instance);

            Assert.Equal("script", tagBuilder.TagName);
            Assert.Equal(expected, tagBuilder.Attributes["src"]);
        }
Example #8
0
        public static HtmlString Resource(ResourceDefinition resource, WorkContext context)
        {
            var defaultSettings = new RequireSettings
            {
                DebugMode = context.CurrentSite.ResourceDebugMode == ResourceDebugMode.Enabled,
                Culture   = context.CurrentCulture,
            };

            var appPath = context.HttpContext.Request.ApplicationPath;
            var url     = resource.ResolveUrl(defaultSettings, appPath);

            return(new HtmlString(File.ReadAllText(context.HttpContext.Server.MapPath(url))));
        }
Example #9
0
        public void GetScriptResourceWithBasePath(string basePath)
        {
            var resourceDefinition = _resourceManifest.DefineScript("foo")
                                     .SetUrl("~/foo.js", "~/foo.debug.js")
                                     .SetBasePath(basePath);

            var requireSettings = new RequireSettings {
                DebugMode = false, CdnMode = false
            };
            var tagBuilder = resourceDefinition.GetTagBuilder(requireSettings, String.Empty, StubFileVersionProvider.Instance);

            Assert.Equal("script", tagBuilder.TagName);
            Assert.Equal($"{basePath}/foo.js", tagBuilder.Attributes["src"]);
        }
Example #10
0
        public void GetScriptResourceWithCdnUrl(string applicationPath)
        {
            var resourceDefinition = _resourceManifest.DefineScript("foo")
                                     .SetUrl("~/foo.js", "~/foo.debug.js")
                                     .SetCdn("https://cdn.tld/foo.js", "https://cdn.tld/foo.debug.js");

            var requireSettings = new RequireSettings {
                DebugMode = false, CdnMode = true
            };
            var tagBuilder = resourceDefinition.GetTagBuilder(requireSettings, applicationPath, StubFileVersionProvider.Instance);

            Assert.Equal("script", tagBuilder.TagName);
            Assert.Equal("https://cdn.tld/foo.js", tagBuilder.Attributes["src"]);
        }
Example #11
0
        private OutputCacheItemResource GetCacheItemResource(RequireSettings settings)
        {
            var definition = _resourceManager.FindResource(settings);

            return(new OutputCacheItemResource()
            {
                Location = settings.Location,
                Name = settings.Name,
                Type = settings.Type,
                Url = definition.Url,
                UrlDebug = definition.UrlDebug,
                BasePath = definition.BasePath
            });
        }
Example #12
0
        public void GetStyleResourceWithDebugCdnUrl()
        {
            var resourceDefinition = _resourceManifest.DefineStyle("foo")
                                     .SetUrl("~/foo.css", "~/foo.debug.css")
                                     .SetCdn("https://cdn.tld/foo.css", "https://cdn.tld/foo.debug.css");

            var requireSettings = new RequireSettings {
                DebugMode = true, CdnMode = true
            };
            var tagBuilder = resourceDefinition.GetTagBuilder(requireSettings, basePath, StubFileVersionProvider.Instance);

            Assert.Equal("link", tagBuilder.TagName);
            Assert.Equal("text/css", tagBuilder.Attributes["type"]);
            Assert.Equal("stylesheet", tagBuilder.Attributes["rel"]);
            Assert.Equal("https://cdn.tld/foo.debug.css", tagBuilder.Attributes["href"]);
        }
        private static string StringifyAttributes(this RequireSettings settings)
        {
            if (!settings.HasAttributes)
            {
                return("");
            }

            var sb = new StringBuilder();

            foreach (var item in settings.Attributes)
            {
                sb.Append(item);
            }

            return(sb.ToString());
        }
Example #14
0
        private void WriteResources(dynamic Display, TextWriter Output, string resourceType, ResourceLocation?includeLocation, ResourceLocation?excludeLocation)
        {
            bool debugMode;
            var  site = _workContext.Value.CurrentSite;

            switch (site.ResourceDebugMode)
            {
            case ResourceDebugMode.Enabled:
                debugMode = true;
                break;

            case ResourceDebugMode.Disabled:
                debugMode = false;
                break;

            default:
                Debug.Assert(site.ResourceDebugMode == ResourceDebugMode.FromAppSetting, "Unknown ResourceDebugMode value.");
                debugMode = _httpContextAccessor.Value.Current().IsDebuggingEnabled;
                break;
            }
            var defaultSettings = new RequireSettings {
                DebugMode = debugMode,
                Culture   = CultureInfo.CurrentUICulture.Name,
            };
            var requiredResources = _resourceManager.Value.BuildRequiredResources(resourceType);
            var appPath           = _httpContextAccessor.Value.Current().Request.ApplicationPath;

            foreach (var context in requiredResources.Where(r =>
                                                            (includeLocation.HasValue ? r.Settings.Location == includeLocation.Value : true) &&
                                                            (excludeLocation.HasValue ? r.Settings.Location != excludeLocation.Value : true)))
            {
                var         path       = context.GetResourceUrl(defaultSettings, appPath);
                var         condition  = context.Settings.Condition;
                var         attributes = context.Settings.HasAttributes ? context.Settings.Attributes : null;
                IHtmlString result;
                if (resourceType == "stylesheet")
                {
                    result = Display.Style(Url: path, Condition: condition, Resource: context.Resource, TagAttributes: attributes);
                }
                else
                {
                    result = Display.Resource(Url: path, Condition: condition, Resource: context.Resource, TagAttributes: attributes);
                }
                Output.Write(result);
            }
        }
Example #15
0
        public void GetStyleResourceWithAttributes(string applicationPath)
        {
            var resourceDefinition = _resourceManifest.DefineStyle("foo")
                                     .SetUrl("~/foo.css", "~/foo.debug.css")
                                     .SetAttribute("id", "foo")
                                     .SetAttribute("media", "all");

            var requireSettings = new RequireSettings {
                DebugMode = false, CdnMode = false
            };
            var tagBuilder = resourceDefinition.GetTagBuilder(requireSettings, applicationPath, StubFileVersionProvider.Instance);

            Assert.Equal("link", tagBuilder.TagName);
            Assert.Equal("text/css", tagBuilder.Attributes["type"]);
            Assert.Equal("stylesheet", tagBuilder.Attributes["rel"]);
            Assert.Equal("foo", tagBuilder.Attributes["id"]);
            Assert.Equal("all", tagBuilder.Attributes["media"]);
        }
Example #16
0
        protected virtual void ExpandDependencies(ResourceDefinition resource, RequireSettings settings, OrderedDictionary allResources)
        {
            if (resource == null)
            {
                return;
            }
            // Settings is given so they can cascade down into dependencies. For example, if Foo depends on Bar, and Foo's required
            // location is Head, so too should Bar's location.
            // forge the effective require settings for this resource
            // (1) If a require exists for the resource, combine with it. Last settings in gets preference for its specified values.
            // (2) If no require already exists, form a new settings object based on the given one but with its own type/name.
            settings = allResources.Contains(resource)
                ? ((RequireSettings)allResources[resource]).Combine(settings)
                : new RequireSettings(_options.Value)
            {
                Type = resource.Type, Name = resource.Name
            }.Combine(settings);
            if (resource.Dependencies != null)
            {
                var dependencies = from d in resource.Dependencies
                                   let segments                       = d.Split(':')
                                                             let name = segments[0]
                                                                        let version = segments.Length > 1 ? segments[1] : null
                                                                                      select FindResource(new RequireSettings { Type = resource.Type, Name = name, Version = version });

                foreach (var dependency in dependencies)
                {
                    if (dependency == null)
                    {
                        continue;
                    }
                    ExpandDependencies(dependency, settings, allResources);
                }
            }
            allResources[resource] = settings;
        }
 private void VerifyPaths(string resourceType, RequireSettings defaultSettings, string expectedPaths) {
     VerifyPaths(resourceType, defaultSettings, expectedPaths, false);
 }
 public static bool IsConditional(this RequireSettings settings)
 {
     return(!string.IsNullOrEmpty(settings.Condition));
 }
 public static bool AttributesEqual(this RequireSettings settings, RequireSettings other)
 {
     return(settings.StringifyAttributes() == other.StringifyAttributes());
 }
Example #20
0
 public ResourceDefinition FindResource(RequireSettings settings)
 {
     return(FindResource(settings, true));
 }
Example #21
0
        private ResourceDefinition FindResource(RequireSettings settings, bool resolveInlineDefinitions)
        {
            // find the resource with the given type and name
            // that has at least the given version number. If multiple,
            // return the resource with the greatest version number.
            // If not found and an inlineDefinition is given, define the resource on the fly
            // using the action.
            var name = settings.Name ?? "";
            var type = settings.Type;
            ResourceDefinition resource;

            var resources = (from p in ResourceManifests
                             from r in p.GetResources(type)
                             where name.Equals(r.Key, StringComparison.OrdinalIgnoreCase)
                             select r.Value).SelectMany(x => x);

            if (!String.IsNullOrEmpty(settings.Version))
            {
                // Specific version, filter
                var upper = GetUpperBoundVersion(settings.Version);
                var lower = GetLowerBoundVersion(settings.Version);
                resources = from r in resources
                            let version = r.Version != null ? new Version(r.Version) : null
                                          where lower <= version && version < upper
                                          select r;
            }

            // Use the highest version of all matches
            resource = (from r in resources
                        let version = r.Version != null ? new Version(r.Version) : null
                                      orderby version descending
                                      select r).FirstOrDefault();

            if (resource == null && _dynamicManifest != null)
            {
                resources = (from r in _dynamicManifest.GetResources(type)
                             where name.Equals(r.Key, StringComparison.OrdinalIgnoreCase)
                             select r.Value).SelectMany(x => x);

                if (!String.IsNullOrEmpty(settings.Version))
                {
                    // Specific version, filter
                    var upper = GetUpperBoundVersion(settings.Version);
                    var lower = GetLowerBoundVersion(settings.Version);
                    resources = from r in resources
                                let version = r.Version != null ? new Version(r.Version) : null
                                              where lower <= version && version < upper
                                              select r;
                }

                // Use the highest version of all matches
                resource = (from r in resources
                            let version = r.Version != null ? new Version(r.Version) : null
                                          orderby version descending
                                          select r).FirstOrDefault();
            }

            if (resolveInlineDefinitions && resource == null)
            {
                // Does not seem to exist, but it's possible it is being
                // defined by a Define() from a RequireSettings somewhere.
                if (ResolveInlineDefinitions(settings.Type))
                {
                    // if any were defined, now try to find it
                    resource = FindResource(settings, false);
                }
            }

            return(resource);
        }