e79aa3c0ed
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
196 lines
6.5 KiB
C#
196 lines
6.5 KiB
C#
//------------------------------------------------------------------------------
|
|
// <copyright file="ScriptReferenceBase.cs" company="Microsoft">
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
// </copyright>
|
|
//------------------------------------------------------------------------------
|
|
|
|
namespace System.Web.UI {
|
|
using System;
|
|
using System.ComponentModel;
|
|
using System.Diagnostics.CodeAnalysis;
|
|
using System.Globalization;
|
|
using System.Web;
|
|
using System.Web.Resources;
|
|
using System.Web.UI.WebControls;
|
|
using Debug = System.Diagnostics.Debug;
|
|
|
|
[
|
|
DefaultProperty("Path"),
|
|
]
|
|
public abstract class ScriptReferenceBase {
|
|
private bool _alwaysLoadBeforeUI;
|
|
private IClientUrlResolver _clientUrlResolver;
|
|
private Control _containingControl;
|
|
private bool _isStaticReference;
|
|
private bool _notifyScriptLoaded = true;
|
|
private string _path;
|
|
private string[] _resourceUICultures;
|
|
private ScriptMode _scriptMode;
|
|
|
|
protected ScriptReferenceBase() {}
|
|
|
|
internal bool AlwaysLoadBeforeUI {
|
|
get {
|
|
return _alwaysLoadBeforeUI;
|
|
}
|
|
set {
|
|
_alwaysLoadBeforeUI = value;
|
|
}
|
|
}
|
|
|
|
// Used by ScriptManager to associate a ScriptReference with its url resolver
|
|
// (i.e. ScriptManager or ScriptManagerProxy)
|
|
internal IClientUrlResolver ClientUrlResolver {
|
|
get {
|
|
return _clientUrlResolver;
|
|
}
|
|
set {
|
|
_clientUrlResolver = value;
|
|
}
|
|
}
|
|
|
|
internal Control ContainingControl {
|
|
get {
|
|
return _containingControl;
|
|
}
|
|
set {
|
|
_containingControl = value;
|
|
}
|
|
}
|
|
|
|
// isStaticReference is true if the reference came from a ScriptManager or ScriptManagerProxy scripts collection,
|
|
// false if it came from an IScriptControl or ExtenderControl.
|
|
internal bool IsStaticReference {
|
|
get {
|
|
return _isStaticReference;
|
|
}
|
|
set {
|
|
_isStaticReference = value;
|
|
}
|
|
}
|
|
|
|
// True if this is a reference to a bundle
|
|
internal bool IsBundleReference {
|
|
get;
|
|
set;
|
|
}
|
|
|
|
[
|
|
Category("Behavior"),
|
|
DefaultValue(true),
|
|
NotifyParentProperty(true),
|
|
ResourceDescription("ScriptReference_NotifyScriptLoaded"),
|
|
Obsolete("NotifyScriptLoaded is no longer required in script references.")
|
|
]
|
|
public bool NotifyScriptLoaded {
|
|
get {
|
|
return _notifyScriptLoaded;
|
|
}
|
|
set {
|
|
_notifyScriptLoaded = value;
|
|
}
|
|
}
|
|
|
|
[
|
|
Category("Behavior"),
|
|
DefaultValue(""),
|
|
NotifyParentProperty(true),
|
|
ResourceDescription("ScriptReference_Path"),
|
|
UrlProperty("*.js")
|
|
]
|
|
public string Path {
|
|
get {
|
|
return (_path == null) ? String.Empty : _path;
|
|
}
|
|
set {
|
|
_path = value;
|
|
}
|
|
}
|
|
|
|
[
|
|
ResourceDescription("ScriptReference_ResourceUICultures"),
|
|
DefaultValue(null),
|
|
Category("Behavior"),
|
|
MergableProperty(false),
|
|
NotifyParentProperty(true),
|
|
TypeConverter(typeof(StringArrayConverter)),
|
|
SuppressMessage("Microsoft.Performance", "CA1819:PropertiesShouldNotReturnArrays",
|
|
Justification = "String[] has existing TypeConverter support, which we don't want to add for List<string> to the assembly just for this property and at this point in the product cycle.")
|
|
]
|
|
public string[] ResourceUICultures {
|
|
get {
|
|
return _resourceUICultures;
|
|
}
|
|
set {
|
|
_resourceUICultures = value;
|
|
}
|
|
}
|
|
|
|
[
|
|
Category("Behavior"),
|
|
DefaultValue(ScriptMode.Auto),
|
|
NotifyParentProperty(true),
|
|
ResourceDescription("ScriptReference_ScriptMode")
|
|
]
|
|
public ScriptMode ScriptMode {
|
|
get {
|
|
return _scriptMode;
|
|
}
|
|
set {
|
|
if (value < ScriptMode.Auto || value > ScriptMode.Release) {
|
|
throw new ArgumentOutOfRangeException("value");
|
|
}
|
|
_scriptMode = value;
|
|
}
|
|
}
|
|
|
|
[Obsolete("Use IsAjaxFrameworkScript(ScriptManager)")]
|
|
protected internal abstract bool IsFromSystemWebExtensions();
|
|
|
|
protected internal virtual bool IsAjaxFrameworkScript(ScriptManager scriptManager) {
|
|
return false;
|
|
}
|
|
|
|
internal virtual bool IsDefiningSys {
|
|
get;
|
|
set;
|
|
}
|
|
|
|
// Script path may contain a query string, while script name may not
|
|
// Release: foo.js?key=value
|
|
// Debug: foo.debug.js?key=value
|
|
internal static string GetDebugPath(string releasePath) {
|
|
// Per RFC 3986, the '?' delimits the query, regardless of the protocol. This overrides
|
|
// an earlier RFC, which stated that FTP protocol allows '?' as path characters.
|
|
string pathWithoutQuery;
|
|
string query;
|
|
if (releasePath.IndexOf('?') >= 0) {
|
|
int indexOfQuery = releasePath.IndexOf('?');
|
|
pathWithoutQuery = releasePath.Substring(0, indexOfQuery);
|
|
query = releasePath.Substring(indexOfQuery);
|
|
}
|
|
else {
|
|
pathWithoutQuery = releasePath;
|
|
query = null;
|
|
}
|
|
|
|
if (!pathWithoutQuery.EndsWith(".js", StringComparison.Ordinal)) {
|
|
throw new InvalidOperationException(
|
|
String.Format(CultureInfo.CurrentUICulture, AtlasWeb.ScriptReference_InvalidReleaseScriptPath, pathWithoutQuery));
|
|
}
|
|
|
|
return ReplaceExtension(pathWithoutQuery) + query;
|
|
}
|
|
|
|
[SuppressMessage("Microsoft.Design", "CA1055", Justification = "Consistent with other URL properties in ASP.NET.")]
|
|
protected internal abstract string GetUrl(ScriptManager scriptManager, bool zip);
|
|
|
|
// Assumes the input ends with ".js". Replaces the ".js" at the end of the input
|
|
// with ".debug.js".
|
|
protected static string ReplaceExtension(string pathOrName) {
|
|
Debug.Assert(pathOrName.EndsWith(".js", StringComparison.Ordinal));
|
|
return (pathOrName.Substring(0, pathOrName.Length - 2) + "debug.js");
|
|
}
|
|
}
|
|
}
|