Release History

Mike Lee edited this page Nov 16, 2016 · 30 revisions
  • 2013.07.18: ajile 2.1.7
    • Improved: cloak: Only cloaks com.ajile.* DOM script elements when debug is disabled.
    • Improved: cloak: Only cloaks JS objects when cloak is off or debug is disabled.
    • Improved: debug: More detailed import and notification logging.
    • Improved: debug: More legible log output via reformatted single-line entries.
    • Improved: override: Correctly applies override launch option during initialization.
    • Improved: Support: MSIE 4.01: Using synchronous calls since setTimeout() doesn't support function references.
    • Improved: Internal: AddImportListener(): Generic listener protected against spoofing.
    • Improved: Internal: AddImportListener(): Generic listener no longer creates an unnecessary ImportThread.
    • Improved: Internal: handleImported(): No longer sends notifications for internal and undefined aliases.
    • Improved: Internal: ImportThread: Avoids redundant listening by stopping existing threads before starting new ones.
    • Improved: Internal: ImportThread: Requests CPU time less frequently.
    • Improved: Internal: Fixed unintended exposure of cloakObjectToggler() to the global scope.
    • Improved: Internal: log() no longer requires the caller parameter.
    • Improved: Internal: Renamed completeImports() to handleImports() and moved closer to other handleImport*() functions.
    • Improved: Internal: Renamed notifyImportListeners() to notifyAll().
    • Improved: Internal: Renamed notifyImportListener() to notifyOne().
    • Improved: Internal: Renamed notifyImporter() to notifyOne().
    • Improved: Internal: Updated whitespace & other formatting in AddImportListener(), handleImport*(), and log*().

  • 2013.03.11: ajile 1.9.9
    • Improved: Ajile.AddImportListener(): Fixed bug that caused notifications for modules, namespaces and global properties that were removed without using Ajile.Unload().
    • Improved: Tests: Ajile.RemoveImportListener(): Fixed bug where modules not removed after their tests completed, were polluting subsequent tests and causing intermittent failures.

  • 2013.02.19: ajile 1.9.8
    • Improved: Compatibility: MSIE: Fixed bug caused by IE's disallowing deletion of global members.
    • Improved: Compatibility: MSIE 5.01: Replaced all non-for-in in statements.
    • Improved: Ajile.RemoveImportListener(): Fixed bug that caused listeners to not be removed.
    • Improved: Ajile.RemoveImportListener(): Fixed bug that caused listeners to be notified despite being removed.
    • Improved: Cloaked objects' toString() returns "cloaked".
    • Improved: Play: API Examples: Fixed bug in "Using a Wildcard Import" example.
    • Improved: Tests: Compatibility: MSIE: Ajile.RemoveImportListener() correctly handles single-level namespaces.
    • Improved: Tests: Compatibility: MSIE: Ajile.Unload() correctly handles single-level namespaces.
    • Improved: Tests: Compatibility: MSIE: Ajile.Unload() correctly handles Ajile namespace.
    • Improved: Tests: Compatibility: MSIE: Import() correctly handles single-level namespaces.
    • Improved: Tests: Compatibility: MSIE: Namespace() correctly handles single-level namespaces.

  • 2013.02.12: ajile 1.9.3
    • New: Ajile.AddImportListener(): Notifications provide an object that contains references to the imported module's name, value and [internal] callback plus an error field [not yet supported] for any errors that occurred. For backwards compatibility, the notification object evaluates to the imported item's name when treated as a string.
    • New: Tests: Upgraded to jasmine 1.3.1.
    • New: Tests: Ajile.RemoveImportListener(): Added tests for all listener types (global property, Import, ImportAs, Include, and multi-item).
    • New: Tests: Ajile.RemoveImportListener(): Moved to its own test suite module and added tests for all listener types (global property, Import, ImportAs, Include, and multi-item).
    • New: Tests: Ajile.Unload(): Added single-level namespaced module test.
    • Improved: Ajile.AddImportListener(): Fixed bug that added generic listeners as internal listeners when used as (alias = Ajile.AddImportListener)(...).
    • Improved: Ajile.AddImportListener(): Stops listening for an imported item immediately after it's successfully imported instead of waiting for the listener to timeout.
    • Improved: Compatibility: WebKit 125.4: Ajile.AddImportListener(): Refactored to support callback function names by not using function expressions.
    • Improved: Ajile.Unload(): Fixed bug with unloading single-level namespaces.
    • Improved: ImportAs(): Fixed bug with not detecting a module/namespace assigned to a falsey value.
    • Improved: ImportAs(): Fixed bug with not sending notifications when importing something that was previously imported.
    • Improved: Ajile.RemoveImportListener(): Fixed bug with not being able to remove multi-item listeners due to a mismatch between the external callback supplied and internal callback actually used.
    • Improved: Ajile.RemoveImportListener(): Handles new notification object sent to listeners during notification.
    • Improved: Ajile.RemoveImportListener(): Ensures cancellation of pending notifications by using notification thread ids stored via Ajile.AddImportListener().
    • Improved: Fixed bug with detecting DOM Level 1 & 2 support.
    • Improved: Minor code cleanup: API compatibility comments, cloaking, generic listeners, version setting logic, importing, and notifications.
    • Improved: Docs: Ajile-Help.htm: Added GitHub Issues link and set Yahoo! Group as "(archive)".
    • Improved: Docs: Ajile-Overview.htm: Added link to license.
    • Improved: Docs: Ajile-Overview.htm: Rewrote Description and updated Features and Supported Versions section.
    • Improved: Docs: Ajile-License.htm: Added links to MPL and ajile.net.
    • Improved: Tests: Refactored test suite to use multi-item listener and new listener notification object.
    • Improved: Tests: Fixed bug that caused an error when trying to auto-switch from error to full results.
    • Improved: Tests: Ajile, Import, ImportAs, Include, Namespace: Updated messages to be simple and user-friendly; BDD-style.
    • Improved: Tests: Ajile, Import, ImportAs, Include, Namespace: Updated "is a method" tests to test for Function type.
    • Improved: Tests: Ajile.AddImportListener(): Rewrote tests to be more robust and jasmine-compliant.
    • Improved: Tests: Minor code cleanup.

  • 2013.02.06: ajile 1.7.3
    • Improved: Initialization: Faster and simplified incompatibility detection.
    • Improved: Initialization: Simplified re-initialization detection.
    • Improved: Initialization: Removed unnecessary attempt to cloak ajile's instance object.
    • Improved: Minor code cleanup.

  • 2013.02.05: ajile 1.6.8
    • Improved: Compatibility: WebKit 125.4: Commented-out un-parsable callback function names.
    • Improved: Minor refactoring and cleanup of import listener removal and notification logic.

  • 2013.02.04: ajile 1.6.1
    • New: Supports Ajile.AddImportListener (["Module","globalProperty","namespaced.Module"], function(){});.
    • New: Tests: Ajile.AddImportListener (["Module","globalProperty","namespaced.Module"], function(){});.
    • Improved: Ajile.AddImportListener(): All listeners now added before dispatching instant notifications.
    • Improved: Ajile.AddImportListener(): All notifications now sent asynchronously and tracked for canceling.
    • Improved: Ajile.RemoveImportListener(): Cancels all pending dispatched notifications.
    • Improved: Tests: Ajile.AddImportListener(): All tests moved out of net...Ajile suite into new net...Ajile.AddImportListener test suite module.
    • Improved: Tests: Fixed Ajile.AddImportListener ("something.existing", function...); Import ("something.existing"); test.
    • Improved: Build: build/stage: Created to store staging resources.
    • Improved: Build: build.sh: Updated to use resources in /build/stage plus minor cleanup.
    • Improved: Build: Removed unused build tools (crunchinator, packer, and custom_rhino.jar).
    • Improved: Default module path set to /use/ for environments unable to auto-detect ajile's path.
    • Improved: Added internal isArray() to help with Array detection, falls back to Array.isArray() where available.

  • 2013.02.01: ajile 1.5.5
    • New: Tests: Added Ajile.Unload() test case to verify fix for ajile 1.4.5's regression.
    • Improved: Fixed Ajile.Unload() regression caused by ajile 1.4.5's new global reference.
    • Improved: Tests: Major code cleanup; clarified messages and reordered Ajile.AddImportListener() tests.
    • Improved: Minor cloaking code cleanup.

  • 2013.01.29: ajile 1.5.3
    • Improved: Refactored cloaking to correctly decide when modules can and should be cloaked.
    • Improved: Enables automatic cloaking during ajile's creation.
    • Improved: Disables automatic cloaking when ajile is unloaded.

  • 2013.01.28: ajile 1.5.0
    • Improved: Fixed bug where aggressive cloaking stopped modules from being evaluated.
    • Improved: Fixed bug that caused cloaking of JavaScript's core Object and Function types.
    • Improved: Fixed bug in detecting a namespace's load-time options.

  • 2013.01.27: ajile 1.4.5
    • New: Ensures the execution order of loaded and imported scripts in modern browsers via script.async=false.
    • Improved: Fixed bug that skipped notifying internal import listeners.
    • Improved: Compatibility: WebWorkers and nodeJS: Removed unnecessary window reference from all window.clear* and window.set* timer statements.
    • Improved: Compatibility: WebKit 125.4: Commented-out un-parsable callback function names.
    • Improved: Added a "global" scope reference to ajile's closure.
    • Improved: Replaced all non-window-specific window references with the global reference.
    • Improved: Minor Code Cleanup: Load()

  • 2013.01.27: ajile 1.3.8
    • New: Supports Ajile.AddImportListener ("<any-global-property-name>", ...);.
    • New: Supports Ajile.AddImportListener ("ShortName", ...);
    • Improved: Fixed bug that broke Ajile.AddImportListener (function listener (moduleName){...});.
    • Improved: Faster and more stable import notifications.
    • Improved: Faster namespace-to-path resolution via 98% less comparisons on average, 30% less in worst case.
    • Improved: Import(), ImportAs() and Include() looks for the module/namespace in memory before attempting to load its script.
    • Improved: Import(), ImportAs() and Include() used after Ajile.Unload() will re-load the module/namespace's script.
    • Improved: Import(), ImportAs() and Include() auto-resolves module and namespace paths using their namespace notation.
    • Improved: Minor Code Cleanup: Load() and internal import methods.

  • 2007.12.30: ajile 1.2.1
    • New: iCab 3.0.3+, OmniWeb 5.6+, Opera 5+, and SeaMonkey 1.0+ support.
    • New: Firebug, YUI, & Mochikit log level (info, warn, error) support.
    • New: SyntaxHighlighter JScript Brush with on-demand loading.
    • New: Ajile's re-initialization is now auto-detected and handled.
    • New: Ajile's version preserved even when removed from file name.
    • New: Global undefined for pre-JavaScript 1.3 browsers.
    • Improved: Fixed script double-loading bug seen in IE browsers.
    • Improved: Fixed log output corruption bug.
    • Improved: IE detection using JScript conditional compilation.
    • Improved: Ajile's runtime instance is now a light object literal.
    • Improved: Ajile's runtime source is now DOM invisible.
    • Improved: Faster & more efficient directive fail-safes.
    • Improved: More robust Import & Include listener notification.
    • Improved: More robust & efficient Ajile.ShowLog().
    • Improved: Performance boost via fail-fasts, variable caching, & less strings.
    • Improved: Updated Examples page content, layout & keyboard navigation.

  • 2007.12.25: ajile 1.1.5
    • New: Supports iCab via Load() with document.write().
    • Improved: ajile's definition closure is now a self-executing function.
    • Improved: ajile's version is available as a parameter to its self-executing closure.
    • Improved: ajile's version is set to the closure's parameter when not detectable or available.
    • Improved: ajile's version added its attribution message.
    • Improved: Early ajile initialization and/or incompatibility detection and avoid's re-initialization unless overriding is enabled.
    • Improved: Attempts to cloak ajile's instance during initialization.
    • Improved: Detects Internet Explorer using conditional compilation comment.
    • Improved: Fixed Internet Explorer & WebKit double-load bug.
    • Improved: Load(): Better script container detection.
    • Improved: SetLegacy(): Ensures that Ajile is an object.
    • Improved: Logging: Fixed regular expression used to detect calling functions' names.
    • Improved: Logging: Enabled levels (i.e error, info, warn).
    • Improved: Adds undefined property to global scope for pre-ECMAScript 3 environments.
    • Improved: Replaced all null comparisons and default values with undefined.
    • Improved: Minor whitespace code cleanup and refactoring of internal SimpleSet type.

  • 2007.10.05: ajile 0.9.9.2
    • Improved: Fixed Internet Explorer support via refactored Ajile.Unload().
    • Improved: Fixed logging typo caused by ajile 0.9.9's refactoring.
    • Improved: Safari support of Examples page via Namespace in SyntaxHighlighter.

  • 2007.09.28: ajile 0.9.9.1
    • Improved: Fixed MVC bug observed when "." is in a page's query string.
    • Improved: Fixed minor regression caused by ajile 0.9.9's refactoring.
    • Improved: Code cleanup on Examples page.
    • Improved: Fixed errors in Directives & Options API documentation.

  • 2007.09.16: ajile 0.9.9
    • Improved: Faster Import via code refactoring.
    • Improved: Fixed bug with versioned Imports and Includes.
    • Improved: Fixed bug with wildcard Includes.
    • Improved: Code cleanup and refactoring for improved performance.
    • Improved: Fixed debug log/Firebug compatibility issue.
    • Improved: Fixed Directives API documentation typos

  • 2007.09.04: ajile 0.9.8
    • New: Now supports Mozilla 0.9.1+ browsers.
    • New: Cloaking now supported in IE 5.01+.
    • New: Now uses YUI Compressor for code compression (~25K).
    • New: Examples page now use SyntaxHighlighter 1.5.1 for code highlighting.
    • Improved: Ajile.Unload() now unloads empty com.iskitz.ajile namespace.
    • Improved: Ajile.Unload() now unloads all legacy directives.
    • Improved: Updated Ajile.Unload() description in API docs.
    • Improved: Naming conflict warning provides more alternatives.
    • Improved: Code cleanup and refactoring for better cross-browser support.
    • Improved: Examples page clean-up and LoadExample correction.
    • Improved: Restored Examples page support for Blazer 3.0 on Treo 600.
    • Improved: Fixed month error in debug log's date-time stamp.

  • 2007.07.30: ajile 0.9.5
    • New: Include directive for importing without short-name access.
    • New: Now supports Camino 1.0+ browsers.
    • Improved: Cloaking now degrades gracefully for older browsers.
    • Improved: Cleaner log output with shorter timestamp & better grouping.
    • Improved: Added protection for improper instantiation of custom data types.
    • Improved: Better support for older browsers.
    • Improved: General code cleanup.

  • 2007.07.24: ajile 0.9
    • New: Supports all Firefox, Internet Explorer 4.01+, and Netscape 6.0.1+ browsers.
    • New: Ajile.Unload([ns|module]) for namespace & module unloading.
    • New: Now uses jsUnit as testing framework.
    • New: Debug log integration with Firebug, MochiKit, & YUI loggers.
    • Improved: Full API backwards compatibility to JSPackaging 1.0 using legacy option.
    • Improved: Stronger defense against external Object.prototype changes.
    • Improved: Simplified examples & updated Examples page with unobtrusive scripting.
    • Improved: Compressed using custom_rhino.jar.
    • Improved: Discontinued packer use; broke working code & incompatible with IE 4 & 5

  • 2007.03.11: ajile 0.7.9
    • New: legacy load-time option to control backwards compatibility.
    • New: Ajile.EnableLegacy() to control backwards compatibility.
    • New: Legacy support is disabled by default.
    • New: Added documentation for all load-time options.
    • Improved: Ajile.EnableOverride() now works as intended.
    • Improved: Added packed version to download; used Dean Edward's Packer.
    • Improved: Removed documentation for deprecated features.

  • 2006.12.29: ajile 0.7.8
    • New: Safari supported added.
    • Improved: Import handling of circular references.

  • 2006.12.16: ajile 0.7.5
    • New: Active defense against external Object.prototype changes.
    • Improved: Treo 600 Blazer 3.0 browser support restored.
    • Improved: Import behavior stabilized for supported browsers.
    • Improved: Import more reliable for slow connections.
    • Improved: Import("some.namespace.*") leakage stopped.
    • Improved: More accurate Import & Load event logging.
    • Improved: General code cleanup & other minor fixes.

  • 2006.09.28: ajile 0.7
    • New: refresh load-time option to manipulate script caching.
    • New: Ajile.EnableRefresh() to manipulate script caching.
    • Improved: More efficient & reliable Import for supported browsers.
    • Improved: More compatible cloaking for varied Import scenarios.
    • Improved: More accurate and informative debug logging.
    • Improved: Logging of Import listener notifications.
    • Improved: Logging of Namespace load-time options.
    • Improved: Removed status bar message.
    • Improved: General code cleanup and other minor fixes.

  • 2006.09.11: ajile 0.6.5
    • New: mvcshare load-time option to manipulate shared auto-loader.
    • New: Simultaneous per-page & shared auto-loader use by default.
    • Improved: MVC: Reintroduced ajile 0.5.5's shared auto-loader.
    • Improved: MVC: Fixed dot-delimited per-page auto-loader loading.
    • Improved: Import listeners only notify after dependency validation.
    • Improved: General code cleanup and other minor fixes.

  • 2006.08.02: ajile 0.6.2
    • New: Versioned Imports.
    • New: Configurable name conflict handling.
    • New: Configurable runtime source code cloaking.
    • New: Load-time option setting (set options in Ajile's src tag).
    • New: Import event notification.
    • New: Version detection from filename.
    • Improved: MVC support with per-page auto-loaders that replace version 0.5.5's shared auto-loader (i.e. for MyPage.htm auto-load MyPage.js).
    • Improved: Support wildcard imports for single file namespaces.
    • Improved: Programmatic option setting.
    • Improved: Greater packaging flexibility (not just '.' or '/')
    • Improved: More informative debug log output.
    • Improved: Faster Import path resolution.

  • 2006.07.11: ajile 0.5.5
    • Improved: Restored browser support for Blazer 3.0 on Treo 600.
    • Improved: Fixed wild-card imports: Import("com.mydomain.*");
    • Improved: More user-friendly debug log viewing via Ajile.ShowLog().
    • Improved: Better runtime source code cloaking.
    • Improved: Modified Load to circumvent MSIE 6 DOM incompatibility.
    • Improved: Removed enhanced window.alert() due to MSIE 6 DOM conflicts.

  • 2006.06.08: ajile 0.5
    • New: Now supports Opera 7.54+.
    • New: Automatic runtime source code cloaking.
    • New: Simplified use via shared auto-loader (index.js).
      • Simplifies use by making the com.iskitz.ajile.<version>.js script file the only one that needs to be specified in the web page. All other script/module dependencies can be defined within the file without modifying the web page, great for MVC implementations!.
    • New: Debug log viewing via Ajile.ShowLog() function.
    • New: Memory management via Ajile.Unload() function.
    • New: HTML DOM Insertion of inline JavaScript.
    • Improved: Faster importing with no window.onload dependency.
    • Improved: Debug logging via enhanced window.alert() function.
    • Improved: Renamed Ajile.DOT_NAMESPACE property to Ajile.USE_NAME.
    • Improved: Renamed Ajile.DIR_NAMESPACE property to Ajile.USE_PATH.
    • Improved: Backwards compatibility for renamed properties.

  • 2006.01.22: ajile 0.4
    • New: API: ImportAs directive:
      • ImportAs ("MyAlias", "com.yoursite.SpecialType");
      • Increases the developer's ability to control imported types or objects and is an excellent means for handling type ambiguities.
    • New: API: Renamed Package directive to Namespace.
    • New: API: Renamed PackageException to NamespaceException.
    • New: Ambiguity example showcasing ImportAs.
    • Improved: Backwards compatibility for Package and PackageException.
    • Improved: Better auto-detection of script path and packaging style.
    • Improved: Better resource cleanup when unloaded.

  • 2005.11.01: ajile 0.3.7
    • New: API: com.iskitz.ajile is ajile's new namespace.
    • Improved: Fixed bug with automatic path detection for imports.
    • Improved: Single module for DOM 2 EventTarget emulation.
    • Improved: Compressed ajile and DOM 2 EventTarget modules.
      • ajile and the DOM 2 EventTarget modules are now 50% smaller. The reduced footprint results in significantly faster load times when used in the Internet environment.
    • Improved: General cleanup (dead code removal, etc.).

  • 2005.09.30: ajile 0.3.6b
    • New: Renamed JSPackaging to ajile, a play on the word agile, meaning fast, light and nimble.
    • New: Supports Microsoft Internet Explorer 6+, Mozilla FireFox 1.0+, Blazer 3.0 on Treo 600, requires JavaScript 1.4+, ECMA-262, Edition 3+, or JScript 5.0.
    • New: API: com.iskitz.js.ajile is ajile's new namespace.
    • New: API: JSImport() is now Import().
    • New: API: JSLoad() is now Load().
    • New: API: JSPackage() is now Package().
    • New: API: JSPackageException() is now PackageException().
    • New: API: JSPackaging.CompleteImports() has been removed.
    • New: API: JSPackaging.JSPacked() has been removed.
    • New: API: JSPackaging.SetBasePath() has been removed.
    • New: API: Ajile.DIR_NAMESPACE for specifying folder-style packaging when using Import().
    • New: API: Ajile.DOT_NAMESPACE for specifying dot-delimited file-style packaging when using Import().
    • New: API: Ajile.EnableDebugging ([boolean]) toggles on/off ajile's logging to the window's status bar.
    • New: API: Ajile.GetVersion() returns ajile's version.
    • New: API: Import() allows using wildcards (i.e. Import ("com.iskitz.js.examples.*");).
    • New: API: Package() allows specifying a default path and packaging style to be used for loading all scripts within that package.
    • New: Adds window.addEventListener() functionality in environments [IE] where that API is unsupported via custom DOM 2 EventTarget modules.
    • New: Automatically detects and uses ajile's own path as the base path from which to load imported scripts. If that detection fails it uses the location of the first import.
    • New: Automatically detects and uses ajile's packaging style as the default for imports. If that detection fails, it defaults to dot-delimited file style packaging.
    • New: Logs information about various steps to the window's status bar if debugging is enabled.
    • New: Ensures that loaded script's language property is always set, default is JavaScript.
    • Improved: Uses window's onload event to complete pending imports, no longer using timer to poll.
    • Improved: Uses window's onerror event to suppress [IE's] javascript error popup dialogs.
    • Improved: Uses window's onunload event to unload ajile from the window's context and remove window.addEventListener augmentation.
    • Improved: Aborts initialization if the environment's DOM doesn't support dynamic script element insertion (i.e. document.createElement ("script");).
    • Improved: Cache's the document's HEAD to avoid re-querying the DOM for it on every Load() and Import().
    • Improved: Load() uses document.write in environments that don't support DOM script insertion (i.e. Blazer 3.0 on Treo 600).
    • Improved: Import() protects against overriding core DOM types (e.g. Node, NodeList, MouseEvent).

  • 2004.05.05: JSPackaging 2.1
    • New: API: com.iskitz.js.packaging is JSPackaging's new namespace.
    • New: API: JSBasePath() is now JSPackaging.SetBasePath().
    • New: API: JSPackaging.CompleteImports() is now public; moved from within JSImport().
    • New: API: __JSBasePath has been removed.
    • New: API: __JSPacked has been removed.
    • New: Encapsulated all of JSPackaging within its object-based namespace singleton.
    • Improved: Encapsulated API publishing within an internal method.
    • Improved: Added argument API documentation for JSImport(), JSLoad(), and JSPackage().
    • Improved: Renamed many internal variables to improve code legibility and comprehension.

  • 2004.02.08: JSPackaging 2.0
    • New: API: com.iskitz.jspackaging is JSPackaging's new namespace.
    • New: API: com.iskitz.jspackaging.jsBasePath preserves JSPackaging's load-time location.
    • New: API: JSBasePath(): Sets the default location from which to load external scripts.
    • New: API: __JSBasePath: Saves the default location from which to load external scripts.
    • New: API: JSPacked(): Specifies use of filename-packed vs. directory-expanded (default) packaging.
    • New: API: __JSPacked: Remembers use of filename-packed vs. directory-expanded (default) packaging.
    • New: API: JSImport(): Added packed argument to support filename-packaging.
    • Improved: JSImport(): No longer uses eval() to create namespaced modules.
    • Improved: Suppresses error popup windows for less disruptive user experience.
    • ...

  • 2003.11.19: JSPackaging 1.0
    • Michael Lee (iskitz) created JSPackaging to bring simple programatic script loading to JavaScript and to eliminate global scope name conflicts that can quickly, quietly, and easily happen when including multiple script files or snippets within a single HTML document. JSPackaging achieves this by providing an API for:
      • Defining namespaces to encapsulate data and functionality,
      • Defining script dependencies, and
      • Simplifying external script loading via:
        • HTML DOM Insertion of local JavaScript files.
        • HTML DOM Insertion of remote JavaScript files without Same-origin policy restrictions.