diff --git a/appletvjs/appletvjs-tests.ts b/appletvjs/appletvjs-tests.ts
new file mode 100644
index 0000000000..ece6a00dbe
--- /dev/null
+++ b/appletvjs/appletvjs-tests.ts
@@ -0,0 +1,201 @@
+///
+
+//test the global app events and functions
+function test_AppEvents() {
+ App.onError = function (options: any) {
+ //do something
+ }
+
+ App.onExit = function (options: any) {
+ //do something
+ }
+
+ App.onLaunch = function (options: any) {
+ //do something
+ }
+
+ App.reload({ someProperty: 'Testing...' });
+}
+
+//test the global device object properties
+function test_DeviceProperties() {
+ var appIdentifier = Device.appIdentifier;
+ var appVersion = Device.appVersion;
+ var model = Device.model;
+ var productType = Device.productType;
+ var systemVersion = Device.systemVersion;
+ var vendorIdentifier = Device.vendorIdentifier;
+}
+
+function test_FeatureElement() {
+ var parser = new DOMParser();
+ var document = parser.parseFromString('', "application/xml");
+ var textField = document.getElementById("textField");
+ textField.addEventListener("change", function() {
+ change.call(this, textField);
+ });
+
+ var change = function (textField: AppleTVJS.FeatureElement){
+ var keyboard: AppleTVJS.Keyboard = textField.getFeature('Keyboard');
+
+ var text = keyboard.text;
+ };
+
+ var menuBar = document.getElementById("menuBar");
+ textField.addEventListener("change", function() {
+ change.call(this, textField);
+ });
+
+ var select = function (menuBar: AppleTVJS.FeatureElement) {
+ var menuBarDocument: AppleTVJS.MenuBarDocument = menuBar.getFeature('MenuBarDocument');
+
+ var document = menuBarDocument.getDocument(menuBar);
+ menuBarDocument.setDocument(document, menuBar);
+ menuBarDocument.setSelectedItem(menuBar);
+ };
+}
+
+function test_MediaItem() {
+ var mediaItem = new AppleTVJS.MediaItem('video', 'http://www.vidme.com/abc123');
+ mediaItem.artworkImageURL = "http://google.com/artwork.png";
+ mediaItem.contentRatingDomain = "movie";
+ mediaItem.contentRatingRanking = 1;
+ mediaItem.description = "Media Item";
+
+ var highlight = new AppleTVJS.Highlight();
+ highlight.description = "Highlight";
+ highlight.duration = 10;
+ highlight.imageURL = "http://google.com/img.png";
+ highlight.name = "Name of Highlight";
+ highlight.starttime = 10;
+
+ var highlightGroup = new AppleTVJS.HighlightGroup();
+ highlightGroup.name = "Highlight Group";
+ highlightGroup.hightlights.push(highlight);
+
+ mediaItem.highlightGroups.push(highlightGroup);
+
+ var interstitial = new AppleTVJS.Interstitial();
+ interstitial.duration = 10;
+ interstitial.starttime = 20;
+
+ mediaItem.interstitials.push(interstitial);
+
+ mediaItem.isExplicit = false;
+ mediaItem.resumeTime = 0;
+ mediaItem.subtitle = "Subtitle";
+
+ mediaItem.loadAssetID = function (url, callback) {
+ //do something
+ };
+ mediaItem.loadCertificate = function (url, callback) {
+ //do something
+ };
+ mediaItem.loadKey = function (url, callback) {
+ //do something
+ };
+}
+
+//test the global navigation document object
+function test_navigationDocument() {
+ var parser = new DOMParser();
+ var document = parser.parseFromString('', "application/xml");
+
+ var documents = navigationDocument.documents;
+
+ navigationDocument.clear();
+ navigationDocument.dismissModal();
+ navigationDocument.insertBeforeDocument(document);
+ navigationDocument.insertBeforeDocument(document, document);
+ navigationDocument.popDocument();
+ navigationDocument.popToDocument(document);
+ navigationDocument.popToRootDocument();
+ navigationDocument.presentModal(document);
+ navigationDocument.pushDocument(document);
+ navigationDocument.removeDocument(document);
+ navigationDocument.replaceDocument(document, document);
+}
+
+function test_Player() {
+ var playlist = new AppleTVJS.Playlist();
+
+ var mediaItem = new AppleTVJS.MediaItem('audio');
+ playlist.push(mediaItem);
+ playlist.pop();
+ var result: AppleTVJS.MediaItem[] = playlist.splice(0, 1, mediaItem);
+ var length: number = playlist.length;
+
+ var player = new AppleTVJS.Player();
+ player.playlist = playlist;
+
+ var parser = new DOMParser();
+ var document = parser.parseFromString('', "application/xml");
+ player.overlayDocument = document;
+
+ player.present();
+ player.pause();
+ player.play();
+
+ var playbackState: string = player.playbackState;
+ player.seekToTime(10);
+ player.setPlaybackRate(2);
+ player.stop();
+
+ var currentMediaItem: AppleTVJS.MediaItem = player.currentMediaItem;
+ var nextMediaItem: AppleTVJS.MediaItem = player.nextMediaItem;
+ var previousMediaItem: AppleTVJS.MediaItem = player.previousMediaItem;
+
+ player.mediaItemDidChange = function (reason: string) {
+ //do something
+ };
+
+ player.requestSeekToTime = function (result) {
+ //do something
+ };
+
+ player.shouldHandleStateChange = function (result: boolean) {
+ //do something
+ };
+
+ player.stateDidChange = function (){
+ //do something
+ };
+
+ player.stateWillChange = function (){
+ //do something
+ };
+
+ player.timeBoundaryDidCross = function (){
+ //do something
+ };
+
+ player.timeDidChange = function (){
+ //do something
+ };
+
+ player.timedMetadata = function (){
+ //do something
+ };
+}
+
+//test the global settings object
+function test_Settings() {
+ var language = Settings.language;
+ Settings.onRestrictionsChange = function () {
+ //do something
+ }
+ var restrictions = Settings.restrictions;
+ var allowsExplicit = restrictions.allowsExplicit;
+ var maxMovieRank = restrictions.maxMovieRank;
+ var maxMovieRatingForCountry = restrictions.maxMovieRatingForCountry('US');;
+ var allowsExplmaxTVShowRankicit = restrictions.maxTVShowRank;
+ var maxTVShowRatingForCountry = restrictions.maxTVShowRatingForCountry('US');
+ var storeFrontCountryCode = Settings.storefrontCountryCode;
+}
+
+function test_TVError() {
+ var tvError = new AppleTVJS.TVError();
+ tvError.code = "404";
+ tvError.description = "Not found";
+ tvError.domain = "NSMachErrorDomain";
+}
\ No newline at end of file
diff --git a/appletvjs/appletvjs.d.ts b/appletvjs/appletvjs.d.ts
index cfb44bde2b..c26ef5c172 100644
--- a/appletvjs/appletvjs.d.ts
+++ b/appletvjs/appletvjs.d.ts
@@ -6,6 +6,7 @@
declare var App: AppleTVJS.App;
declare var Device: AppleTVJS.Device;
declare var navigationDocument: AppleTVJS.NavigationDocument;
+declare var Settings: AppleTVJS.Settings;
declare function evaluateScripts(scripts: string[], complete: (success: boolean) => void): void;
@@ -13,34 +14,34 @@ declare module AppleTVJS {
interface App {
/**
- * The onError attribute is used to handle any errors sent from the device.
- * This attribute must be set to a function that accepts an “options” argument.
- * For example App.onError = function (options) {}.
- */
+ * The onError attribute is used to handle any errors sent from the device.
+ * This attribute must be set to a function that accepts an “options” argument.
+ * For example App.onError = function (options) {}.
+ * */
onError: (options: any) => void;
/**
- * The onExit attribute is used to complete any actions that need to be cleaned
- * up when the app has been exited. This attribute must be set to a function that
- * accepts an “options” argument. For example App.onExit = function (options) {}.
- */
+ * The onExit attribute is used to complete any actions that need to be cleaned
+ * up when the app has been exited. This attribute must be set to a function that
+ * accepts an “options” argument. For example App.onExit = function (options) {}.
+ * */
onExit: (options: any) => void;
/**
- * The onLaunch attribute is used to start any required actions when the app
- * launches. This attribute must be set to a function that accepts an “options”
- * argument. For example App.onLaunch = function (options) {}.
- */
+ * The onLaunch attribute is used to start any required actions when the app
+ * launches. This attribute must be set to a function that accepts an “options”
+ * argument. For example App.onLaunch = function (options) {}.
+ * */
onLaunch: (options: any) => void;
/**
- * This function reloads the initial JavaScript file without quitting the app.
- * The optional reloadData parameter provides developers with a way to capture
- * and restart the app in it’s current state. If the reloadData parameter is not
- * present, the app is restarted in its initial state. This attribute must be set
- * to a function that accepts an “options” argument.
- * For example App.onError = function (options) {}.
- */
+ * This function reloads the initial JavaScript file without quitting the app.
+ * The optional reloadData parameter provides developers with a way to capture
+ * and restart the app in it’s current state. If the reloadData parameter is not
+ * present, the app is restarted in its initial state. This attribute must be set
+ * to a function that accepts an “options” argument.
+ * For example App.onError = function (options) {}.
+ * */
reload(options?: any, reloadData?: any): void;
}
@@ -65,10 +66,11 @@ declare module AppleTVJS {
}
interface FeatureElement extends Element {
+ /** Gets a feature for a given element. */
getFeature(feature: string): any;
}
- interface Highlight {
+ class Highlight {
/** The name of the highlight. */
name: string;
@@ -85,7 +87,7 @@ declare module AppleTVJS {
imageURL: string;
}
- interface HighlightGroup {
+ class HighlightGroup {
/** The name of the highlight group. */
name: string;
@@ -93,8 +95,11 @@ declare module AppleTVJS {
hightlights: Highlight[];
}
- interface Interstitial {
+ class Interstitial {
+ /** The starttime of the interstitial. */
starttime: number;
+
+ /** The duration of the interstitial. */
duration: number;
}
@@ -103,23 +108,38 @@ declare module AppleTVJS {
text: string;
/**
- * A callback function that is called when the text inside
- * of searchField or textField element changes.
- */
+ * A callback function that is called when the text inside
+ * of searchField or textField element changes.
+ * */
onTextChange: () => void;
}
- interface MediaItem {
- /** Creates a new MediaItem object from the information stored in the URL location. */
- new(type: string, url?: string): MediaItem;
+ class MediaItem {
+ /**
+ * Creates a new MediaItem object from the information stored in the URL location.
+ * @type: Valid values are: audio, video. Defaults to video.
+ * @url: The URL pointing to the media item information.
+ * */
+ constructor(type: string, url?: string);
- /** The domain that the rating applies to. */
+ /**
+ * The domain that the rating applies to.
+ * There are three valid values for this property: movie, music, and tvshow.
+ * */
contentRatingDomain: string;
- /** The rating for a video item. */
+ /**
+ * The rating for a video item.
+ * The rating is a value from 0-1000. This value corresponds to a specific rating
+ * used by different countries. For example, a rating value can represent a PG-13
+ * rating in the United State and a MA15+ in Australia.
+ * */
contentRatingRanking: number;
- /** A value indicating whether the item has explicit lyrics. */
+ /**
+ * A value indicating whether the item has explicit lyrics.
+ * This property is ignored if the MediaItem object type is video.
+ * */
isExplicit: boolean;
/** The URL path to the artwork that accompanies the media item. */
@@ -134,7 +154,10 @@ declare module AppleTVJS {
/** The title of the media item. */
title: string;
- /** The type of media item. */
+ /**
+ * The type of media item.
+ * The valid values for this attribute are audio and video.
+ * */
type: string;
/** The URL path to the media item. */
@@ -146,7 +169,13 @@ declare module AppleTVJS {
/** An array of interstitial objects. */
interstitials: Interstitial[];
- /** The number, in seconds, that a media item starts playing at. */
+ /**
+ * The number, in seconds, that a media item starts playing at.
+ * Use this to begin playing a MediaItem object at a time other than
+ * at the beginning of the object. If this property contains anything
+ * other than 0, the player displays “Resume” instead of
+ * “Play from beginning” on playback.
+ * */
resumeTime: number;
/** A callback function used to load the asset identifier for an item. */
@@ -161,80 +190,77 @@ declare module AppleTVJS {
interface MenuBarDocument {
/**
- * Retrieves the document associated with the specified menu item.
- */
+ * Retrieves the document associated with the specified menu item.
+ * */
getDocument(menuItem: Element): Document;
/**
- * Associates a document with a menu item.
- */
- setDocument(document: Document, menuItem: any): void;
+ * Associates a document with a menu item.
+ * */
+ setDocument(document: Document, menuItem: Element): void;
/**
- * Sets the focus in a menu bar to the specified menu item.
- */
- setSelectedItem(menuItem: any): void;
+ * Sets the focus in a menu bar to the specified menu item.
+ * */
+ setSelectedItem(menuItem: Element): void;
}
interface NavigationDocument {
/**
- * Inserts a new document directly before a document currently on the stack.
- */
+ * Inserts a new document directly before a document currently on the stack.
+ * */
insertBeforeDocument(document: Document, beforeDocument?: Document): void;
/**
- * This function searches the stack for the first instance of the document
- * contained in the beforeDocument parameter and inserts the document contained
- * in the document parameter on top of it.
- */
+ * This function searches the stack for the first instance of the document
+ * contained in the beforeDocument parameter and inserts the document contained
+ * in the document parameter on top of it.
+ * */
pushDocument(document: Document): void;
/**
- * Replaces a document on the stack with a new document.
- */
+ * Replaces a document on the stack with a new document.
+ * */
replaceDocument(document: Document, beforeDocument?: Document): void;
/** Dismisses the document displayed in modal view. */
dismissModal(): void;
/**
- * Displays the passed document on top of the current document.
- */
+ * Displays the passed document on top of the current document.
+ * */
presentModal(document: Document): void;
/** The documents currently on the stack. */
documents: Document[];
/**
- * Removes all documents currently on the stack.
- */
+ * Removes all documents currently on the stack.
+ * */
clear(): void;
/**
- * Removes the top most document from the stack.
- */
+ * Removes the top most document from the stack.
+ * */
popDocument(): void;
/**
- * Removes all of the documents on the stack that are above the passed document.
- */
+ * Removes all of the documents on the stack that are above the passed document.
+ * */
popToDocument(document: Document): void;
/**
- * Removes all documents from the stack except for the bottom most document.
- */
+ * Removes all documents from the stack except for the bottom most document.
+ * */
popToRootDocument(): void;
/**
- * Removes the specified document from the stack.
- */
+ * Removes the specified document from the stack.
+ * */
removeDocument(document: Document): void;
}
- interface Player {
- /** Creates a new player object. */
- new(): Player;
-
+ class Player {
/** The annotations for a video created by placing a DOM document over the video. */
overlayDocument: Document;
@@ -251,16 +277,16 @@ declare module AppleTVJS {
play(): void;
/**
- * The current state of the player.
- *
- * This property can contain the following valid values:
- * begin
- * end
- * loading
- * playing
- * paused
- * scanning
- */
+ * The current state of the player.
+ *
+ * This property can contain the following valid values:
+ * begin
+ * end
+ * loading
+ * playing
+ * paused
+ * scanning
+ * */
playbackState: string;
/** Sets the playback point to a specified time. */
@@ -282,26 +308,26 @@ declare module AppleTVJS {
previousMediaItem: MediaItem;
/**
- * An event notifying the listener that the player is about to change media items.
- *
- * Valid values are:
- * errorDidOccur
- * fastForwardedToEndOfMediaItem
- * mannuallyChanged
- * newPlaylist
- * playerInvalidated
- * playedToEndOfMediaItem
- */
+ * An event notifying the listener that the player is about to change media items.
+ *
+ * Valid values are:
+ * errorDidOccur
+ * fastForwardedToEndOfMediaItem
+ * mannuallyChanged
+ * newPlaylist
+ * playerInvalidated
+ * playedToEndOfMediaItem
+ * */
mediaItemDidChange: (reason: string) => void;
/**
- * An event that indicates if a seek to time request was accomplished.
- *
- * The values for this attribute can be one of the following:
- * true — The seek performed as requested.
- * false or null— The seek was not performed.
- * An integer value — The seek will be performed to the stated value and not the initial requested value.
- */
+ * An event that indicates if a seek to time request was accomplished.
+ *
+ * The values for this attribute can be one of the following:
+ * true — The seek performed as requested.
+ * false or null— The seek was not performed.
+ * An integer value — The seek will be performed to the stated value and not the initial requested value.
+ * */
requestSeekToTime: (result?: any) => void;
/** An event that indicates a state change request has occurred. */
@@ -323,12 +349,21 @@ declare module AppleTVJS {
timedMetadata: () => void;
}
- interface Playlist extends Array {
- /** Creates a new playlist object. */
- new(): Playlist;
-
+ class Playlist {
/** Returns the MediaItem located in the indicated array index. */
item(index: number): MediaItem;
+
+ /** The number of items in the playlist. */
+ length: number;
+
+ /** Removes a media item from the end of a playlist. */
+ pop(): MediaItem;
+
+ /** Adds a media item to the end of a playlist. */
+ push(object: MediaItem): void;
+
+ /** Deletes the indicated array elements and replaces them with the specified elements. */
+ splice(index: number, howManu: number, object: MediaItem): MediaItem[];
}
interface Restrictions {
@@ -364,7 +399,7 @@ declare module AppleTVJS {
onRestrictionsChange: () => void;
}
- interface TVError {
+ class TVError {
/** The error code. */
code: string;
@@ -372,33 +407,33 @@ declare module AppleTVJS {
description: string;
/**
- * A string containing the error domain.
- *
- * The predefined error domains:
- * NSPOSIXErrorDomain - POSIX/BSD errors
- * NSOSStatusErrorDomain - OS X/Carbon errors
- * NSMachErrorDomain - Mach errors
- */
+ * A string containing the error domain.
+ *
+ * The predefined error domains:
+ * NSPOSIXErrorDomain - POSIX/BSD errors
+ * NSOSStatusErrorDomain - OS X/Carbon errors
+ * NSMachErrorDomain - Mach errors
+ * */
domain: string;
/**
- * The user info dictionary.
- *
- * These keys may exist in the user info dictionary:
- * NSLocalizedDesciptionKey
- * NSFilePathErrorKey
- * NSStringEncodingErrorKey
- * NSUnderlyingErrorKey
- * NSURLErrorKey
- * NSLocalizedFailureReasonErrorKey
- * NSLocalizedRecoverySuggestionErrorKey
- * NSLocalizedRecoveryOptionsErrorKey
- * NSRecoveryAttempterErrorKey
- * NSHelpAnchorErrorKey
- * NSURLErrorFailingURLErrorKey
- * NSURLErrorFailingURLStringErrorKey
- * NSURLErrorFailingURLPeerTrustErrorKey
- */
+ * The user info dictionary.
+ *
+ * These keys may exist in the user info dictionary:
+ * NSLocalizedDesciptionKey
+ * NSFilePathErrorKey
+ * NSStringEncodingErrorKey
+ * NSUnderlyingErrorKey
+ * NSURLErrorKey
+ * NSLocalizedFailureReasonErrorKey
+ * NSLocalizedRecoverySuggestionErrorKey
+ * NSLocalizedRecoveryOptionsErrorKey
+ * NSRecoveryAttempterErrorKey
+ * NSHelpAnchorErrorKey
+ * NSURLErrorFailingURLErrorKey
+ * NSURLErrorFailingURLStringErrorKey
+ * NSURLErrorFailingURLPeerTrustErrorKey
+ * */
userInfo: any;
}
}