1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5cr.define('print_preview', function() { 6 'use strict'; 7 8 /** 9 * Object used to get and persist the print preview application state. 10 * @constructor 11 */ 12 function AppState() { 13 /** 14 * Internal representation of application state. 15 * @type {Object.<string: Object>} 16 * @private 17 */ 18 this.state_ = {}; 19 this.state_[AppState.Field.VERSION] = AppState.VERSION_; 20 this.state_[AppState.Field.IS_GCP_PROMO_DISMISSED] = true; 21 22 /** 23 * Whether the app state has been initialized. The app state will ignore all 24 * writes until it has been initialized. 25 * @type {boolean} 26 * @private 27 */ 28 this.isInitialized_ = false; 29 }; 30 31 /** 32 * Enumeration of field names for serialized app state. 33 * @enum {string} 34 */ 35 AppState.Field = { 36 VERSION: 'version', 37 SELECTED_DESTINATION_ID: 'selectedDestinationId', 38 SELECTED_DESTINATION_ORIGIN: 'selectedDestinationOrigin', 39 SELECTED_DESTINATION_CAPABILITIES: 'selectedDestinationCapabilities', 40 SELECTED_DESTINATION_NAME: 'selectedDestinationName', 41 IS_SELECTED_DESTINATION_LOCAL: 'isSelectedDestinationLocal', // Deprecated 42 IS_GCP_PROMO_DISMISSED: 'isGcpPromoDismissed', 43 MARGINS_TYPE: 'marginsType', 44 CUSTOM_MARGINS: 'customMargins', 45 IS_COLOR_ENABLED: 'isColorEnabled', 46 IS_DUPLEX_ENABLED: 'isDuplexEnabled', 47 IS_HEADER_FOOTER_ENABLED: 'isHeaderFooterEnabled', 48 IS_LANDSCAPE_ENABLED: 'isLandscapeEnabled', 49 IS_COLLATE_ENABLED: 'isCollateEnabled', 50 IS_CSS_BACKGROUND_ENABLED: 'isCssBackgroundEnabled' 51 }; 52 53 /** 54 * Current version of the app state. This value helps to understand how to 55 * parse earlier versions of the app state. 56 * @type {number} 57 * @const 58 * @private 59 */ 60 AppState.VERSION_ = 2; 61 62 /** 63 * Name of C++ layer function to persist app state. 64 * @type {string} 65 * @const 66 * @private 67 */ 68 AppState.NATIVE_FUNCTION_NAME_ = 'saveAppState'; 69 70 AppState.prototype = { 71 /** @return {?string} ID of the selected destination. */ 72 get selectedDestinationId() { 73 return this.state_[AppState.Field.SELECTED_DESTINATION_ID]; 74 }, 75 76 /** @return {?string} Origin of the selected destination. */ 77 get selectedDestinationOrigin() { 78 return this.state_[AppState.Field.SELECTED_DESTINATION_ORIGIN]; 79 }, 80 81 /** @return {?print_preview.Cdd} CDD of the selected destination. */ 82 get selectedDestinationCapabilities() { 83 return this.state_[AppState.Field.SELECTED_DESTINATION_CAPBILITIES]; 84 }, 85 86 /** @return {?string} Name of the selected destination. */ 87 get selectedDestinationName() { 88 return this.state_[AppState.Field.SELECTED_DESTINATION_NAME]; 89 }, 90 91 /** @return {boolean} Whether the GCP promotion has been dismissed. */ 92 get isGcpPromoDismissed() { 93 return this.state_[AppState.Field.IS_GCP_PROMO_DISMISSED]; 94 }, 95 96 /** 97 * @param {!print_preview.AppState.Field} field App state field to check if 98 * set. 99 * @return {boolean} Whether a field has been set in the app state. 100 */ 101 hasField: function(field) { 102 return this.state_.hasOwnProperty(field); 103 }, 104 105 /** 106 * @param {!print_preview.AppState.Field} field App state field to get. 107 * @return {Object} Value of the app state field. 108 */ 109 getField: function(field) { 110 if (field == AppState.Field.CUSTOM_MARGINS) { 111 return this.state_[field] ? 112 print_preview.Margins.parse(this.state_[field]) : null; 113 } else { 114 return this.state_[field]; 115 } 116 }, 117 118 /** 119 * Initializes the app state from a serialized string returned by the native 120 * layer. 121 * @param {?string} serializedAppStateStr Serialized string representation 122 * of the app state. 123 */ 124 init: function(serializedAppStateStr) { 125 if (serializedAppStateStr) { 126 var state = JSON.parse(serializedAppStateStr); 127 if (state[AppState.Field.VERSION] == AppState.VERSION_) { 128 if (state.hasOwnProperty( 129 AppState.Field.IS_SELECTED_DESTINATION_LOCAL)) { 130 state[AppState.Field.SELECTED_DESTINATION_ORIGIN] = 131 state[AppState.Field.IS_SELECTED_DESTINATION_LOCAL] ? 132 print_preview.Destination.Origin.LOCAL : 133 print_preview.Destination.Origin.COOKIES; 134 delete state[AppState.Field.IS_SELECTED_DESTINATION_LOCAL]; 135 } 136 this.state_ = state; 137 } 138 } else { 139 // Set some state defaults. 140 this.state_[AppState.Field.IS_GCP_PROMO_DISMISSED] = false; 141 } 142 }, 143 144 /** 145 * Sets to initialized state. Now object will accept persist requests. 146 */ 147 setInitialized: function() { 148 this.isInitialized_ = true; 149 }, 150 151 /** 152 * Persists the given value for the given field. 153 * @param {!print_preview.AppState.Field} field Field to persist. 154 * @param {Object} value Value of field to persist. 155 */ 156 persistField: function(field, value) { 157 if (!this.isInitialized_) 158 return; 159 if (field == AppState.Field.CUSTOM_MARGINS) { 160 this.state_[field] = value ? value.serialize() : null; 161 } else { 162 this.state_[field] = value; 163 } 164 this.persist_(); 165 }, 166 167 /** 168 * Persists the selected destination. 169 * @param {!print_preview.Destination} dest Destination to persist. 170 */ 171 persistSelectedDestination: function(dest) { 172 if (!this.isInitialized_) 173 return; 174 this.state_[AppState.Field.SELECTED_DESTINATION_ID] = dest.id; 175 this.state_[AppState.Field.SELECTED_DESTINATION_ORIGIN] = dest.origin; 176 this.state_[AppState.Field.SELECTED_DESTINATION_CAPBILITIES] = 177 dest.capabilities; 178 this.state_[AppState.Field.SELECTED_DESTINATION_NAME] = dest.displayName; 179 this.persist_(); 180 }, 181 182 /** 183 * Persists whether the GCP promotion has been dismissed. 184 * @param {boolean} isGcpPromoDismissed Whether the GCP promotion has been 185 * dismissed. 186 */ 187 persistIsGcpPromoDismissed: function(isGcpPromoDismissed) { 188 if (!this.isInitialized_) 189 return; 190 this.state_[AppState.Field.IS_GCP_PROMO_DISMISSED] = isGcpPromoDismissed; 191 this.persist_(); 192 }, 193 194 /** 195 * Calls into the native layer to persist the application state. 196 * @private 197 */ 198 persist_: function() { 199 chrome.send(AppState.NATIVE_FUNCTION_NAME_, 200 [JSON.stringify(this.state_)]); 201 } 202 }; 203 204 return { 205 AppState: AppState 206 }; 207}); 208