1// Copyright (c) 2010 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
5#ifndef CHROME_COMMON_WEB_APPS_H_
6#define CHROME_COMMON_WEB_APPS_H_
7#pragma once
8
9#include <string>
10#include <vector>
11
12#include "base/string16.h"
13#include "googleurl/src/gurl.h"
14#include "third_party/skia/include/core/SkBitmap.h"
15#include "ui/gfx/size.h"
16
17namespace WebKit {
18class WebDocument;
19class WebFrame;
20}
21
22class Value;
23
24// Structure used when installing a web page as an app.
25struct WebApplicationInfo {
26  struct IconInfo {
27    GURL url;
28    int width;
29    int height;
30    SkBitmap data;
31  };
32
33  static const char kInvalidDefinitionURL[];
34  static const char kInvalidLaunchURL[];
35  static const char kInvalidURL[];
36  static const char kInvalidIconSize[];
37  static const char kInvalidIconURL[];
38
39  WebApplicationInfo();
40  ~WebApplicationInfo();
41
42  // URL to a manifest that defines the application. If specified, all other
43  // attributes are derived from this manifest, and the manifest is the unique
44  // ID of the application.
45  GURL manifest_url;
46
47  // Title of the application.
48  string16 title;
49
50  // Description of the application.
51  string16 description;
52
53  // The launch URL for the app.
54  GURL app_url;
55
56  // Set of available icons.
57  std::vector<IconInfo> icons;
58
59  // The permissions the app requests. Only supported with manifest-based apps.
60  std::vector<std::string> permissions;
61
62  // Set of URLs that comprise the app. Only supported with manifest-based apps.
63  // All these must be of the same origin as manifest_url.
64  std::vector<GURL> urls;
65
66  // The type of launch container to use with the app. Currently supported
67  // values are 'tab' and 'panel'. Only supported with manifest-based apps.
68  std::string launch_container;
69};
70
71
72namespace web_apps {
73
74// Parses an icon size. An icon size must match the following regex:
75// [1-9][0-9]*x[1-9][0-9]*.
76// If the input couldn't be parsed, a size with a width/height == 0 is returned.
77gfx::Size ParseIconSize(const string16& text);
78
79// Parses the icon's size attribute as defined in the HTML 5 spec. Returns true
80// on success, false on errors. On success either all the sizes specified in
81// the attribute are added to sizes, or is_any is set to true.
82//
83// You shouldn't have a need to invoke this directly, it's public for testing.
84bool ParseIconSizes(const string16& text, std::vector<gfx::Size>* sizes,
85                    bool* is_any);
86
87// Parses |web_app| information out of the document in frame. Returns true on
88// success, or false and |error| on failure. Note that the document may contain
89// no web application information, in which case |web_app| is unchanged and the
90// function returns true.
91//
92// Documents can also contain a link to a application 'definition'. In this case
93// web_app will have manifest_url set and nothing else. The caller must fetch
94// this URL and pass the result to ParseWebAppFromDefinitionFile() for further
95// processing.
96bool ParseWebAppFromWebDocument(WebKit::WebFrame* frame,
97                                WebApplicationInfo* web_app,
98                                string16* error);
99
100// Parses |web_app| information out of |definition|. Returns true on success, or
101// false and |error| on failure. This function assumes that |web_app| has a
102// valid manifest_url.
103bool ParseWebAppFromDefinitionFile(Value* definition,
104                                   WebApplicationInfo* web_app,
105                                   string16* error);
106
107}  // namespace web_apps
108
109#endif  // CHROME_COMMON_WEB_APPS_H_
110