1// Copyright 2013 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#include "extensions/common/manifest_handlers/offline_enabled_info.h"
6
7#include "base/memory/scoped_ptr.h"
8#include "base/strings/string16.h"
9#include "base/strings/string_util.h"
10#include "base/strings/utf_string_conversions.h"
11#include "base/values.h"
12#include "extensions/common/manifest_constants.h"
13#include "extensions/common/manifest_handlers/permissions_parser.h"
14#include "extensions/common/permissions/api_permission_set.h"
15
16namespace extensions {
17
18namespace keys = manifest_keys;
19
20OfflineEnabledInfo::OfflineEnabledInfo(bool is_offline_enabled)
21    : offline_enabled(is_offline_enabled) {
22}
23
24OfflineEnabledInfo::~OfflineEnabledInfo() {
25}
26
27// static
28bool OfflineEnabledInfo::IsOfflineEnabled(const Extension* extension) {
29  OfflineEnabledInfo* info = static_cast<OfflineEnabledInfo*>(
30      extension->GetManifestData(keys::kOfflineEnabled));
31  return info ? info->offline_enabled : false;
32}
33
34OfflineEnabledHandler::OfflineEnabledHandler() {
35}
36
37OfflineEnabledHandler::~OfflineEnabledHandler() {
38}
39
40bool OfflineEnabledHandler::Parse(Extension* extension, base::string16* error) {
41  if (!extension->manifest()->HasKey(keys::kOfflineEnabled)) {
42    // Only platform apps are provided with a default offline enabled value.
43    // A platform app is offline enabled unless it requests the webview
44    // permission. That is, offline_enabled is true when there is NO webview
45    // permission requested and false when webview permission is present.
46    DCHECK(extension->is_platform_app());
47
48    const bool has_webview_permission =
49        PermissionsParser::HasAPIPermission(extension, APIPermission::kWebView);
50    extension->SetManifestData(keys::kOfflineEnabled,
51                               new OfflineEnabledInfo(!has_webview_permission));
52    return true;
53  }
54
55  bool offline_enabled = false;
56
57  if (!extension->manifest()->GetBoolean(keys::kOfflineEnabled,
58                                         &offline_enabled)) {
59    *error = base::ASCIIToUTF16(manifest_errors::kInvalidOfflineEnabled);
60    return false;
61  }
62
63  extension->SetManifestData(keys::kOfflineEnabled,
64                             new OfflineEnabledInfo(offline_enabled));
65  return true;
66}
67
68bool OfflineEnabledHandler::AlwaysParseForType(Manifest::Type type) const {
69  return type == Manifest::TYPE_PLATFORM_APP;
70}
71
72const std::vector<std::string> OfflineEnabledHandler::Keys() const {
73  return SingleKey(keys::kOfflineEnabled);
74}
75
76}  // namespace extensions
77