Add new certificateProvider extension API.
[chromium-blink-merge.git] / chrome / browser / resources / print_preview / data / cloud_parsers.js
blobd4d032e4c4e4e5632cf4da945b4bbfd1f3d9ed92
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.
5 cr.define('cloudprint', function() {
6   'use strict';
8   /** Namespace which contains a method to parse cloud destinations directly. */
9   function CloudDestinationParser() {};
11   /**
12    * Enumeration of cloud destination field names.
13    * @enum {string}
14    * @private
15    */
16   CloudDestinationParser.Field_ = {
17     CAPABILITIES: 'capabilities',
18     CONNECTION_STATUS: 'connectionStatus',
19     DESCRIPTION: 'description',
20     DISPLAY_NAME: 'displayName',
21     ID: 'id',
22     IS_TOS_ACCEPTED: 'isTosAccepted',
23     LAST_ACCESS: 'accessTime',
24     TAGS: 'tags',
25     TYPE: 'type'
26   };
28   /**
29    * Special tag that denotes whether the destination has been recently used.
30    * @type {string}
31    * @const
32    * @private
33    */
34   CloudDestinationParser.RECENT_TAG_ = '^recent';
36   /**
37    * Special tag that denotes whether the destination is owned by the user.
38    * @type {string}
39    * @const
40    * @private
41    */
42   CloudDestinationParser.OWNED_TAG_ = '^own';
44   /**
45    * Enumeration of cloud destination types that are supported by print preview.
46    * @enum {string}
47    * @private
48    */
49   CloudDestinationParser.CloudType_ = {
50     ANDROID: 'ANDROID_CHROME_SNAPSHOT',
51     DOCS: 'DOCS',
52     IOS: 'IOS_CHROME_SNAPSHOT'
53   };
55   /**
56    * Parses a destination from JSON from a Google Cloud Print search or printer
57    * response.
58    * @param {!Object} json Object that represents a Google Cloud Print search or
59    *     printer response.
60    * @param {!print_preview.Destination.Origin} origin The origin of the
61    *     response.
62    * @param {string} account The account this destination is registered for or
63    *     empty string, if origin != COOKIES.
64    * @return {!print_preview.Destination} Parsed destination.
65    */
66   CloudDestinationParser.parse = function(json, origin, account) {
67     if (!json.hasOwnProperty(CloudDestinationParser.Field_.ID) ||
68         !json.hasOwnProperty(CloudDestinationParser.Field_.TYPE) ||
69         !json.hasOwnProperty(CloudDestinationParser.Field_.DISPLAY_NAME)) {
70       throw Error('Cloud destination does not have an ID or a display name');
71     }
72     var id = json[CloudDestinationParser.Field_.ID];
73     var tags = json[CloudDestinationParser.Field_.TAGS] || [];
74     var connectionStatus =
75         json[CloudDestinationParser.Field_.CONNECTION_STATUS] ||
76         print_preview.Destination.ConnectionStatus.UNKNOWN;
77     var optionalParams = {
78       account: account,
79       tags: tags,
80       isOwned: arrayContains(tags, CloudDestinationParser.OWNED_TAG_),
81       lastAccessTime: parseInt(
82           json[CloudDestinationParser.Field_.LAST_ACCESS], 10) || Date.now(),
83       isTosAccepted: (id == print_preview.Destination.GooglePromotedId.FEDEX) ?
84           json[CloudDestinationParser.Field_.IS_TOS_ACCEPTED] : null,
85       cloudID: id,
86       description: json[CloudDestinationParser.Field_.DESCRIPTION]
87     };
88     var cloudDest = new print_preview.Destination(
89         id,
90         CloudDestinationParser.parseType_(
91             json[CloudDestinationParser.Field_.TYPE]),
92         origin,
93         json[CloudDestinationParser.Field_.DISPLAY_NAME],
94         arrayContains(tags, CloudDestinationParser.RECENT_TAG_) /*isRecent*/,
95         connectionStatus,
96         optionalParams);
97     if (json.hasOwnProperty(CloudDestinationParser.Field_.CAPABILITIES)) {
98       cloudDest.capabilities = /** @type {!print_preview.Cdd} */(
99           json[CloudDestinationParser.Field_.CAPABILITIES]);
100     }
101     return cloudDest;
102   };
104   /**
105    * Parses the destination type.
106    * @param {string} typeStr Destination type given by the Google Cloud Print
107    *     server.
108    * @return {!print_preview.Destination.Type} Destination type.
109    * @private
110    */
111   CloudDestinationParser.parseType_ = function(typeStr) {
112     if (typeStr == CloudDestinationParser.CloudType_.ANDROID ||
113         typeStr == CloudDestinationParser.CloudType_.IOS) {
114       return print_preview.Destination.Type.MOBILE;
115     } else if (typeStr == CloudDestinationParser.CloudType_.DOCS) {
116       return print_preview.Destination.Type.GOOGLE_PROMOTED;
117     } else {
118       return print_preview.Destination.Type.GOOGLE;
119     }
120   };
122   /** Namespace which contains a method to parse printer sharing invitation. */
123   function InvitationParser() {};
125   /**
126    * Enumeration of invitation field names.
127    * @enum {string}
128    * @private
129    */
130   InvitationParser.Field_ = {
131     PRINTER: 'printer',
132     RECEIVER: 'receiver',
133     SENDER: 'sender'
134   };
136   /**
137    * Enumeration of cloud destination types that are supported by print preview.
138    * @enum {string}
139    * @private
140    */
141   InvitationParser.AclType_ = {
142     DOMAIN: 'DOMAIN',
143     GROUP: 'GROUP',
144     PUBLIC: 'PUBLIC',
145     USER: 'USER'
146   };
148   /**
149    * Parses printer sharing invitation from JSON from GCP invite API response.
150    * @param {!Object} json Object that represents a invitation search response.
151    * @param {string} account The account this invitation is sent for.
152    * @return {!print_preview.Invitation} Parsed invitation.
153    */
154   InvitationParser.parse = function(json, account) {
155     if (!json.hasOwnProperty(InvitationParser.Field_.SENDER) ||
156         !json.hasOwnProperty(InvitationParser.Field_.RECEIVER) ||
157         !json.hasOwnProperty(InvitationParser.Field_.PRINTER)) {
158       throw Error('Invitation does not have necessary info.');
159     }
161     var nameFormatter = function(name, scope) {
162       return name && scope ? (name + ' (' + scope + ')') : (name || scope);
163     };
165     var sender = json[InvitationParser.Field_.SENDER];
166     var senderName = nameFormatter(sender['name'], sender['email']);
168     var receiver = json[InvitationParser.Field_.RECEIVER];
169     var receiverName = '';
170     var receiverType = receiver['type'];
171     if (receiverType == InvitationParser.AclType_.USER) {
172       // It's a personal invitation, empty name indicates just that.
173     } else if (receiverType == InvitationParser.AclType_.GROUP ||
174                receiverType == InvitationParser.AclType_.DOMAIN) {
175       receiverName = nameFormatter(receiver['name'], receiver['scope']);
176     } else {
177       throw Error('Invitation of unsupported receiver type');
178     }
180     var destination = cloudprint.CloudDestinationParser.parse(
181         json[InvitationParser.Field_.PRINTER],
182         print_preview.Destination.Origin.COOKIES,
183         account);
185     return new print_preview.Invitation(
186         senderName, receiverName, destination, receiver, account);
187   };
189   // Export
190   return {
191     CloudDestinationParser: CloudDestinationParser,
192     InvitationParser: InvitationParser
193   };