| Index: ui/file_manager/file_manager/foreground/js/ui/suggest_apps_dialog.js
|
| diff --git a/ui/file_manager/file_manager/foreground/js/ui/suggest_apps_dialog.js b/ui/file_manager/file_manager/foreground/js/ui/suggest_apps_dialog.js
|
| index 3e3c23a73f8bbd107395e1e9f6b60df435c30d29..827b7672fcccd16014d6d7427d0d67fd309b3f5b 100644
|
| --- a/ui/file_manager/file_manager/foreground/js/ui/suggest_apps_dialog.js
|
| +++ b/ui/file_manager/file_manager/foreground/js/ui/suggest_apps_dialog.js
|
| @@ -7,33 +7,6 @@
|
| * with. This dialog should be used as action picker for file operations.
|
| */
|
|
|
| -/**
|
| - * The width of the widget (in pixel).
|
| - * @type {number}
|
| - * @const
|
| - */
|
| -var WEBVIEW_WIDTH = 735;
|
| -/**
|
| - * The height of the widget (in pixel).
|
| - * @type {number}
|
| - * @const
|
| - */
|
| -var WEBVIEW_HEIGHT = 480;
|
| -
|
| -/**
|
| - * The URL of the widget showing suggested apps.
|
| - * @type {string}
|
| - * @const
|
| - */
|
| -var CWS_WIDGET_URL =
|
| - 'https://clients5.google.com/webstore/wall/cros-widget-container';
|
| -
|
| -/**
|
| - * The origin of the widget.
|
| - * @type {string}
|
| - * @const
|
| - */
|
| -var CWS_WIDGET_ORIGIN = 'https://clients5.google.com';
|
|
|
| /**
|
| * Creates dialog in DOM tree.
|
| @@ -48,58 +21,28 @@ function SuggestAppsDialog(parentNode, state) {
|
|
|
| this.frame_.id = 'suggest-app-dialog';
|
|
|
| - this.webviewContainer_ = this.document_.createElement('div');
|
| - this.webviewContainer_.id = 'webview-container';
|
| - this.webviewContainer_.style.width = WEBVIEW_WIDTH + 'px';
|
| - this.webviewContainer_.style.height = WEBVIEW_HEIGHT + 'px';
|
| - this.frame_.insertBefore(this.webviewContainer_, this.text_.nextSibling);
|
| -
|
| - var spinnerLayer = this.document_.createElement('div');
|
| - spinnerLayer.className = 'spinner-layer';
|
| - this.webviewContainer_.appendChild(spinnerLayer);
|
| -
|
| - this.buttons_ = this.document_.createElement('div');
|
| - this.buttons_.id = 'buttons';
|
| - this.frame_.appendChild(this.buttons_);
|
| -
|
| - this.webstoreButton_ = this.document_.createElement('div');
|
| - this.webstoreButton_.hidden = true;
|
| - this.webstoreButton_.id = 'webstore-button';
|
| - this.webstoreButton_.setAttribute('role', 'button');
|
| - this.webstoreButton_.tabIndex = 0;
|
| -
|
| - var webstoreButtonIcon = this.document_.createElement('span');
|
| - webstoreButtonIcon.id = 'webstore-button-icon';
|
| - this.webstoreButton_.appendChild(webstoreButtonIcon);
|
| -
|
| - var webstoreButtonLabel = this.document_.createElement('span');
|
| - webstoreButtonLabel.id = 'webstore-button-label';
|
| - webstoreButtonLabel.textContent = str('SUGGEST_DIALOG_LINK_TO_WEBSTORE');
|
| - this.webstoreButton_.appendChild(webstoreButtonLabel);;
|
| -
|
| - this.webstoreButton_.addEventListener(
|
| - 'click', this.onWebstoreLinkActivated_.bind(this));
|
| - this.webstoreButton_.addEventListener(
|
| - 'keydown', this.onWebstoreLinkKeyDown_.bind(this));
|
| -
|
| - this.buttons_.appendChild(this.webstoreButton_);
|
| -
|
| - this.initialFocusElement_ = this.webviewContainer_;
|
| -
|
| - this.webview_ = null;
|
| - this.accessToken_ = null;
|
| - this.widgetUrl_ = state.overrideCwsContainerUrlForTest || CWS_WIDGET_URL;
|
| - this.widgetOrigin_ = state.overrideCwsContainerOriginForTest ||
|
| - CWS_WIDGET_ORIGIN;
|
| -
|
| - this.options_ = null;
|
| - this.installingItemId_ = null;
|
| - this.installedItemId_ = null;
|
| - this.state_ = SuggestAppsDialog.State.UNINITIALIZED;
|
| -
|
| - this.initializationTask_ = new AsyncUtil.Group();
|
| - this.initializationTask_.add(this.retrieveAuthorizeToken_.bind(this));
|
| - this.initializationTask_.run();
|
| + /**
|
| + * The root element for the Chrome Web Store widget container.
|
| + * @const {!HTMLElement}
|
| + */
|
| + var widgetRoot = this.document_.createElement('div');
|
| + this.frame_.insertBefore(widgetRoot, this.text_.nextSibling);
|
| +
|
| + /**
|
| + * The wrapper around Chrome Web Store widget.
|
| + * @const {!CWSWidgetContainer}
|
| + * @private
|
| + */
|
| + this.widget_ = new CWSWidgetContainer(this.document_, widgetRoot, state);
|
| +
|
| + this.initialFocusElement_ = this.widget_.getInitiallyFocusedElement();
|
| +
|
| + /**
|
| + * The reported widget result.
|
| + * @type {SuggestAppsDialog.Result}
|
| + * @private
|
| + */
|
| + this.result_ = SuggestAppsDialog.Result.FAILED;
|
| }
|
|
|
| SuggestAppsDialog.prototype = {
|
| @@ -108,80 +51,18 @@ SuggestAppsDialog.prototype = {
|
|
|
| /**
|
| * @enum {string}
|
| - * @const
|
| - */
|
| -SuggestAppsDialog.State = {
|
| - UNINITIALIZED: 'SuggestAppsDialog.State.UNINITIALIZED',
|
| - INITIALIZING: 'SuggestAppsDialog.State.INITIALIZING',
|
| - INITIALIZE_FAILED_CLOSING:
|
| - 'SuggestAppsDialog.State.INITIALIZE_FAILED_CLOSING',
|
| - INITIALIZED: 'SuggestAppsDialog.State.INITIALIZED',
|
| - INSTALLING: 'SuggestAppsDialog.State.INSTALLING',
|
| - INSTALLED_CLOSING: 'SuggestAppsDialog.State.INSTALLED_CLOSING',
|
| - OPENING_WEBSTORE_CLOSING: 'SuggestAppsDialog.State.OPENING_WEBSTORE_CLOSING',
|
| - CANCELED_CLOSING: 'SuggestAppsDialog.State.CANCELED_CLOSING'
|
| -};
|
| -Object.freeze(SuggestAppsDialog.State);
|
| -
|
| -/**
|
| - * @enum {string}
|
| - * @const
|
| */
|
| SuggestAppsDialog.Result = {
|
| // Install is done. The install app should be opened.
|
| - INSTALL_SUCCESSFUL: 'SuggestAppsDialog.Result.INSTALL_SUCCESSFUL',
|
| + SUCCESS: 'SuggestAppsDialog.Result.SUCCESS',
|
| // User cancelled the suggest app dialog. No message should be shown.
|
| - USER_CANCELL: 'SuggestAppsDialog.Result.USER_CANCELL',
|
| - // User clicked the link to web store so the dialog is closed.
|
| - WEBSTORE_LINK_OPENED: 'SuggestAppsDialog.Result.WEBSTORE_LINK_OPENED',
|
| + CANCELLED: 'SuggestAppsDialog.Result.CANCELLED',
|
| // Failed to load the widget. Error message should be shown.
|
| FAILED: 'SuggestAppsDialog.Result.FAILED'
|
| };
|
| Object.freeze(SuggestAppsDialog.Result);
|
|
|
| /**
|
| - * Injects headers into the passed request.
|
| - *
|
| - * @param {!Object} e Request event.
|
| - * @return {!{requestHeaders: Array.<!HttpHeader>}} Modified headers.
|
| - * @private
|
| - */
|
| -SuggestAppsDialog.prototype.authorizeRequest_ = function(e) {
|
| - e.requestHeaders.push({
|
| - name: 'Authorization',
|
| - value: 'Bearer ' + this.accessToken_
|
| - });
|
| - return {requestHeaders: e.requestHeaders};
|
| -};
|
| -
|
| -/**
|
| - * Retrieves the authorize token. This method should be called in
|
| - * initialization of the dialog.
|
| - *
|
| - * @param {function()} callback Called when the token is retrieved.
|
| - * @private
|
| - */
|
| -SuggestAppsDialog.prototype.retrieveAuthorizeToken_ = function(callback) {
|
| - if (window.IN_TEST) {
|
| - // In test, use a dummy string as token. This must be a non-empty string.
|
| - this.accessToken_ = 'DUMMY_ACCESS_TOKEN_FOR_TEST';
|
| - }
|
| -
|
| - if (this.accessToken_) {
|
| - callback();
|
| - return;
|
| - }
|
| -
|
| - // Fetch or update the access token.
|
| - chrome.fileManagerPrivate.requestWebStoreAccessToken(
|
| - function(accessToken) {
|
| - // In case of error, this.accessToken_ will be set to null.
|
| - this.accessToken_ = accessToken;
|
| - callback();
|
| - }.bind(this));
|
| -};
|
| -
|
| -/**
|
| * Dummy function for SuggestAppsDialog.show() not to be called unintentionally.
|
| */
|
| SuggestAppsDialog.prototype.show = function() {
|
| @@ -240,205 +121,73 @@ SuggestAppsDialog.prototype.showProviders = function(onDialogClosed) {
|
| */
|
| SuggestAppsDialog.prototype.showInternal_ =
|
| function(options, title, webStoreUrl, onDialogClosed) {
|
| - if (this.state_ != SuggestAppsDialog.State.UNINITIALIZED) {
|
| - console.error('Invalid state.');
|
| - return;
|
| - }
|
| -
|
| this.text_.hidden = true;
|
| - this.webstoreButton_.hidden = (webStoreUrl === null);
|
| this.dialogText_ = '';
|
|
|
| - this.webStoreUrl_ = webStoreUrl;
|
| - this.options_ = options;
|
| this.onDialogClosed_ = onDialogClosed;
|
| - this.state_ = SuggestAppsDialog.State.INITIALIZING;
|
| -
|
| - SuggestAppsDialog.Metrics.recordShowDialog();
|
| - SuggestAppsDialog.Metrics.startLoad();
|
| -
|
| - // Makes it sure that the initialization is completed.
|
| - this.initializationTask_.run(function() {
|
| - if (!this.accessToken_) {
|
| - this.state_ = SuggestAppsDialog.State.INITIALIZE_FAILED_CLOSING;
|
| - this.onHide_();
|
| - return;
|
| - }
|
| -
|
| - var show = this.dialogText_ ?
|
| - FileManagerDialogBase.prototype.showTitleAndTextDialog.call(
|
| - this, title, this.dialogText_) :
|
| - FileManagerDialogBase.prototype.showTitleOnlyDialog.call(
|
| - this, title);
|
| - if (!show) {
|
| - console.error('SuggestAppsDialog can\'t be shown');
|
| - this.state_ = SuggestAppsDialog.State.UNINITIALIZED;
|
| - this.onHide_();
|
| - return;
|
| - }
|
|
|
| - this.webview_ = this.document_.createElement('webview');
|
| - this.webview_.id = 'cws-widget';
|
| - this.webview_.partition = 'persist:cwswidgets';
|
| - this.webview_.style.width = WEBVIEW_WIDTH + 'px';
|
| - this.webview_.style.height = WEBVIEW_HEIGHT + 'px';
|
| - this.webview_.request.onBeforeSendHeaders.addListener(
|
| - this.authorizeRequest_.bind(this),
|
| - {urls: [this.widgetOrigin_ + '/*']},
|
| - ['blocking', 'requestHeaders']);
|
| - this.webview_.addEventListener('newwindow', function(event) {
|
| - event = /** @type {NewWindowEvent} */ (event);
|
| - // Discard the window object and reopen in an external window.
|
| - event.window.discard();
|
| - util.visitURL(event.targetUrl);
|
| - event.preventDefault();
|
| - });
|
| - this.webviewContainer_.appendChild(this.webview_);
|
| -
|
| - this.frame_.classList.add('show-spinner');
|
| -
|
| - this.webviewClient_ = new CWSContainerClient(
|
| - this.webview_,
|
| - WEBVIEW_WIDTH,
|
| - WEBVIEW_HEIGHT,
|
| - this.widgetUrl_,
|
| - this.widgetOrigin_,
|
| - this.options_);
|
| - this.webviewClient_.addEventListener(CWSContainerClient.Events.LOADED,
|
| - this.onWidgetLoaded_.bind(this));
|
| - this.webviewClient_.addEventListener(CWSContainerClient.Events.LOAD_FAILED,
|
| - this.onWidgetLoadFailed_.bind(this));
|
| - this.webviewClient_.addEventListener(
|
| - CWSContainerClient.Events.REQUEST_INSTALL,
|
| - this.onInstallRequest_.bind(this));
|
| - this.webviewClient_.load();
|
| + var dialogShown = false;
|
| +
|
| + this.widget_.ready()
|
| + .then(
|
| + /** @return {!Promise} */
|
| + function() {
|
| + return this.showDialog_(title);
|
| + }.bind(this))
|
| + .then(
|
| + /** @return {!Promise.<CWSWidgetContainer.ResolveReason>} */
|
| + function() {
|
| + dialogShown = true;
|
| + return this.widget_.start(options, webStoreUrl);
|
| + }.bind(this))
|
| + .then(
|
| + /** @param {CWSWidgetContainer.ResolveReason} reason */
|
| + function(reason) {
|
| + if (reason !== CWSWidgetContainer.ResolveReason.RESET)
|
| + this.hide();
|
| + }.bind(this))
|
| + .catch(
|
| + /** @param {string} error */
|
| + function(error) {
|
| + console.error('Failed to start CWS widget: ' + error);
|
| + this.result_ = SuggestAppsDialog.Result.FAILED;
|
| + if (dialogShown) {
|
| + this.hide();
|
| + } else {
|
| + this.onHide_();
|
| + }
|
| + }.bind(this));
|
| +};
|
| +
|
| +/**
|
| + * Internal method for showing the dialog in the file manager window.
|
| + * @param {string} title The dialog title.
|
| + * @return {Promise}
|
| + */
|
| +SuggestAppsDialog.prototype.showDialog_ = function(title) {
|
| + return new Promise(function(resolve, reject) {
|
| + var success = this.dialogText_ ?
|
| + FileManagerDialogBase.prototype.showTitleAndTextDialog.call(
|
| + this, title, this.dialogText_) :
|
| + FileManagerDialogBase.prototype.showTitleOnlyDialog.call(
|
| + this, title);
|
| + if (!success) {
|
| + reject('SuggestAppsDialog cannot be shown.');
|
| + return;
|
| + }
|
| + resolve();
|
| }.bind(this));
|
| };
|
|
|
| /**
|
| - * Called when the 'See more...' link is activated to be navigated to Webstore.
|
| - * @param {Event} e The event that activated the link. Either mouse click or
|
| - * key down event.
|
| - * @private
|
| - */
|
| -SuggestAppsDialog.prototype.onWebstoreLinkActivated_ = function(e) {
|
| - if (!this.webStoreUrl_)
|
| - return;
|
| - util.visitURL(this.webStoreUrl_);
|
| - this.state_ = SuggestAppsDialog.State.OPENING_WEBSTORE_CLOSING;
|
| - this.hide();
|
| -};
|
| -
|
| -/**
|
| - * Key down event handler for webstore link element. If the key is enter, it
|
| - * activates the link.
|
| - * @param {Event} e The event
|
| - * @private
|
| - */
|
| -SuggestAppsDialog.prototype.onWebstoreLinkKeyDown_ = function(e) {
|
| - if (e.keyCode != 13 /* Enter */)
|
| - return;
|
| - this.onWebstoreLinkActivated_(e);
|
| -};
|
| -
|
| -/**
|
| - * Called when the widget is loaded successfully.
|
| - * @param {Event} event Event.
|
| - * @private
|
| - */
|
| -SuggestAppsDialog.prototype.onWidgetLoaded_ = function(event) {
|
| - SuggestAppsDialog.Metrics.finishLoad();
|
| - SuggestAppsDialog.Metrics.recordLoad(
|
| - SuggestAppsDialog.Metrics.LOAD.SUCCEEDED);
|
| -
|
| - this.frame_.classList.remove('show-spinner');
|
| - this.state_ = SuggestAppsDialog.State.INITIALIZED;
|
| -
|
| - this.webview_.focus();
|
| -};
|
| -
|
| -/**
|
| - * Called when the widget is failed to load.
|
| - * @param {Event} event Event.
|
| - * @private
|
| - */
|
| -SuggestAppsDialog.prototype.onWidgetLoadFailed_ = function(event) {
|
| - SuggestAppsDialog.Metrics.recordLoad(SuggestAppsDialog.Metrics.LOAD.FAILED);
|
| -
|
| - this.frame_.classList.remove('show-spinner');
|
| - this.state_ = SuggestAppsDialog.State.INITIALIZE_FAILED_CLOSING;
|
| -
|
| - this.hide();
|
| -};
|
| -
|
| -/**
|
| * Called when the connection status is changed.
|
| * @param {VolumeManagerCommon.DriveConnectionType} connectionType Current
|
| * connection type.
|
| */
|
| SuggestAppsDialog.prototype.onDriveConnectionChanged =
|
| function(connectionType) {
|
| - if (this.state_ !== SuggestAppsDialog.State.UNINITIALIZED &&
|
| - connectionType === VolumeManagerCommon.DriveConnectionType.OFFLINE) {
|
| - this.state_ = SuggestAppsDialog.State.INITIALIZE_FAILED_CLOSING;
|
| - this.hide();
|
| - }
|
| -};
|
| -
|
| -/**
|
| - * Called when receiving the install request from the webview client.
|
| - * @param {Event} e Event.
|
| - * @private
|
| - */
|
| -SuggestAppsDialog.prototype.onInstallRequest_ = function(e) {
|
| - var itemId = e.itemId;
|
| - this.installingItemId_ = itemId;
|
| -
|
| - this.appInstaller_ = new AppInstaller(itemId);
|
| - this.appInstaller_.install(this.onInstallCompleted_.bind(this));
|
| -
|
| - this.frame_.classList.add('show-spinner');
|
| - this.state_ = SuggestAppsDialog.State.INSTALLING;
|
| -};
|
| -
|
| -/**
|
| - * Called when the installation is completed from the app installer.
|
| - * @param {AppInstaller.Result} result Result of the installation.
|
| - * @param {string} error Detail of the error.
|
| - * @private
|
| - */
|
| -SuggestAppsDialog.prototype.onInstallCompleted_ = function(result, error) {
|
| - var success = (result === AppInstaller.Result.SUCCESS);
|
| -
|
| - this.frame_.classList.remove('show-spinner');
|
| - this.state_ = success ?
|
| - SuggestAppsDialog.State.INSTALLED_CLOSING :
|
| - SuggestAppsDialog.State.INITIALIZED; // Back to normal state.
|
| - this.webviewClient_.onInstallCompleted(success, this.installingItemId_);
|
| - this.installedItemId_ = this.installingItemId_;
|
| - this.installingItemId_ = null;
|
| -
|
| - switch (result) {
|
| - case AppInstaller.Result.SUCCESS:
|
| - SuggestAppsDialog.Metrics.recordInstall(
|
| - SuggestAppsDialog.Metrics.INSTALL.SUCCEEDED);
|
| - this.hide();
|
| - break;
|
| - case AppInstaller.Result.CANCELLED:
|
| - SuggestAppsDialog.Metrics.recordInstall(
|
| - SuggestAppsDialog.Metrics.INSTALL.CANCELLED);
|
| - // User cancelled the installation. Do nothing.
|
| - break;
|
| - case AppInstaller.Result.ERROR:
|
| - SuggestAppsDialog.Metrics.recordInstall(
|
| - SuggestAppsDialog.Metrics.INSTALL.FAILED);
|
| - fileManager.ui.errorDialog.show(
|
| - str('SUGGEST_DIALOG_INSTALLATION_FAILED'),
|
| - null,
|
| - null,
|
| - null);
|
| - break;
|
| - }
|
| + if (connectionType === VolumeManagerCommon.DriveConnectionType.OFFLINE)
|
| + this.widget_.onConnectionLost();
|
| };
|
|
|
| /**
|
| @@ -447,44 +196,21 @@ SuggestAppsDialog.prototype.onInstallCompleted_ = function(result, error) {
|
| * @override
|
| */
|
| SuggestAppsDialog.prototype.hide = function(opt_originalOnHide) {
|
| - switch (this.state_) {
|
| - case SuggestAppsDialog.State.INSTALLING:
|
| - // Install is being aborted. Send the failure result.
|
| - // Cancels the install.
|
| - if (this.webviewClient_)
|
| - this.webviewClient_.onInstallCompleted(false, this.installingItemId_);
|
| - this.installingItemId_ = null;
|
| + var widgetResult = this.widget_.finalizeAndGetResult();
|
|
|
| - // Assumes closing the dialog as canceling the install.
|
| - this.state_ = SuggestAppsDialog.State.CANCELED_CLOSING;
|
| - break;
|
| - case SuggestAppsDialog.State.INITIALIZING:
|
| - SuggestAppsDialog.Metrics.recordLoad(
|
| - SuggestAppsDialog.Metrics.LOAD.CANCELLED);
|
| - this.state_ = SuggestAppsDialog.State.CANCELED_CLOSING;
|
| - break;
|
| - case SuggestAppsDialog.State.INSTALLED_CLOSING:
|
| - case SuggestAppsDialog.State.INITIALIZE_FAILED_CLOSING:
|
| - case SuggestAppsDialog.State.OPENING_WEBSTORE_CLOSING:
|
| - // Do nothing.
|
| + switch (widgetResult.result) {
|
| + case CWSWidgetContainer.Result.INSTALL_SUCCESSFUL:
|
| + this.result_ = SuggestAppsDialog.Result.SUCCESS;
|
| break;
|
| - case SuggestAppsDialog.State.INITIALIZED:
|
| - this.state_ = SuggestAppsDialog.State.CANCELED_CLOSING;
|
| + case CWSWidgetContainer.Result.WEBSTORE_LINK_OPENED:
|
| + case CWSWidgetContainer.Result.USER_CANCEL:
|
| + this.result_ = SuggestAppsDialog.Result.CANCELLED;
|
| break;
|
| default:
|
| - this.state_ = SuggestAppsDialog.State.CANCELED_CLOSING;
|
| - console.error('Invalid state.');
|
| + this.result_ = SuggestAppsDialog.Result.FAILED;
|
| }
|
|
|
| - if (this.webviewClient_) {
|
| - this.webviewClient_.dispose();
|
| - this.webviewClient_ = null;
|
| - }
|
| -
|
| - this.webviewContainer_.removeChild(this.webview_);
|
| - this.webview_ = null;
|
| - this.webStoreUrl_ = null;
|
| - this.options_ = null;
|
| + this.installedItemId_ = widgetResult.installedItemId;
|
|
|
| FileManagerDialogBase.prototype.hide.call(
|
| this,
|
| @@ -501,108 +227,5 @@ SuggestAppsDialog.prototype.onHide_ = function(opt_originalOnHide) {
|
| if (opt_originalOnHide)
|
| opt_originalOnHide();
|
|
|
| - var result;
|
| - switch (this.state_) {
|
| - case SuggestAppsDialog.State.INSTALLED_CLOSING:
|
| - result = SuggestAppsDialog.Result.INSTALL_SUCCESSFUL;
|
| - SuggestAppsDialog.Metrics.recordCloseDialog(
|
| - SuggestAppsDialog.Metrics.CLOSE_DIALOG.ITEM_INSTALLED);
|
| - break;
|
| - case SuggestAppsDialog.State.INITIALIZE_FAILED_CLOSING:
|
| - result = SuggestAppsDialog.Result.FAILED;
|
| - break;
|
| - case SuggestAppsDialog.State.CANCELED_CLOSING:
|
| - result = SuggestAppsDialog.Result.USER_CANCELL;
|
| - SuggestAppsDialog.Metrics.recordCloseDialog(
|
| - SuggestAppsDialog.Metrics.CLOSE_DIALOG.USER_CANCELLED);
|
| - break;
|
| - case SuggestAppsDialog.State.OPENING_WEBSTORE_CLOSING:
|
| - result = SuggestAppsDialog.Result.WEBSTORE_LINK_OPENED;
|
| - SuggestAppsDialog.Metrics.recordCloseDialog(
|
| - SuggestAppsDialog.Metrics.CLOSE_DIALOG.WEBSTORE_LINK_OPENED);
|
| - break;
|
| - default:
|
| - result = SuggestAppsDialog.Result.USER_CANCELL;
|
| - SuggestAppsDialog.Metrics.recordCloseDialog(
|
| - SuggestAppsDialog.Metrics.CLOSE_DIALOG.UNKNOWN_ERROR);
|
| - console.error('Invalid state.');
|
| - }
|
| - this.state_ = SuggestAppsDialog.State.UNINITIALIZED;
|
| -
|
| - this.onDialogClosed_(result, this.installedItemId_);
|
| -};
|
| -
|
| -/**
|
| - * Utility methods and constants to record histograms.
|
| - */
|
| -SuggestAppsDialog.Metrics = {};
|
| -
|
| -/**
|
| - * @enum {number}
|
| - * @const
|
| - */
|
| -SuggestAppsDialog.Metrics.LOAD = {
|
| - SUCCEEDED: 0,
|
| - CANCELLED: 1,
|
| - FAILED: 2,
|
| -};
|
| -
|
| -/**
|
| - * @enum {number}
|
| - * @const
|
| - */
|
| -SuggestAppsDialog.Metrics.CLOSE_DIALOG = {
|
| - UNKNOWN_ERROR: 0,
|
| - ITEM_INSTALLED: 1,
|
| - USER_CANCELLED: 2,
|
| - WEBSTORE_LINK_OPENED: 3,
|
| -};
|
| -
|
| -/**
|
| - * @enum {number}
|
| - * @const
|
| - */
|
| -SuggestAppsDialog.Metrics.INSTALL = {
|
| - SUCCEEDED: 0,
|
| - CANCELLED: 1,
|
| - FAILED: 2,
|
| -};
|
| -
|
| -/**
|
| - * @param {number} result Result of load, which must be defined in
|
| - * SuggestAppsDialog.Metrics.LOAD.
|
| - */
|
| -SuggestAppsDialog.Metrics.recordLoad = function(result) {
|
| - if (0 <= result && result < 3)
|
| - metrics.recordEnum('SuggestApps.Load', result, 3);
|
| -};
|
| -
|
| -/**
|
| - * @param {number} reason Reason of closing dialog, which must be defined in
|
| - * SuggestAppsDialog.Metrics.CLOSE_DIALOG.
|
| - */
|
| -SuggestAppsDialog.Metrics.recordCloseDialog = function(reason) {
|
| - if (0 <= reason && reason < 4)
|
| - metrics.recordEnum('SuggestApps.CloseDialog', reason, 4);
|
| -};
|
| -
|
| -/**
|
| - * @param {number} result Result of installation, which must be defined in
|
| - * SuggestAppsDialog.Metrics.INSTALL.
|
| - */
|
| -SuggestAppsDialog.Metrics.recordInstall = function(result) {
|
| - if (0 <= result && result < 3)
|
| - metrics.recordEnum('SuggestApps.Install', result, 3);
|
| -};
|
| -
|
| -SuggestAppsDialog.Metrics.recordShowDialog = function() {
|
| - metrics.recordUserAction('SuggestApps.ShowDialog');
|
| -};
|
| -
|
| -SuggestAppsDialog.Metrics.startLoad = function() {
|
| - metrics.startInterval('SuggestApps.LoadTime');
|
| -};
|
| -
|
| -SuggestAppsDialog.Metrics.finishLoad = function() {
|
| - metrics.recordInterval('SuggestApps.LoadTime');
|
| + this.onDialogClosed_(this.result_, this.installedItemId_);
|
| };
|
|
|