summaryrefslogtreecommitdiffstats
path: root/chrome/browser/extensions/extension_settings_api.cc
blob: 79bf586594a46a4434ab757aa599ed74ba4ac93b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "base/bind.h"
#include "base/values.h"
#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/extensions/extension_settings_api.h"
#include "chrome/browser/profiles/profile.h"
#include "content/browser/browser_thread.h"

namespace {
const char* kUnsupportedArgumentType = "Unsupported argument type";
}  // namespace

// SettingsFunction

bool SettingsFunction::RunImpl() {
  profile()->GetExtensionService()->extension_settings()->GetStorage(
      extension_id(),
      base::Bind(&SettingsFunction::RunOnUIThreadWithStorage, this));
  return true;
}

void SettingsFunction::RunOnUIThreadWithStorage(
    ExtensionSettingsStorage* storage) {
  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
  BrowserThread::PostTask(
      BrowserThread::FILE,
      FROM_HERE,
      base::Bind(&SettingsFunction::RunOnFileThreadWithStorage, this, storage));
}

void SettingsFunction::RunOnFileThreadWithStorage(
    ExtensionSettingsStorage* storage) {
  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
  bool success = RunOnFileThreadImpl(storage);
  BrowserThread::PostTask(
      BrowserThread::UI,
      FROM_HERE,
      base::Bind(&SettingsFunction::SendResponse, this, success));
}

bool SettingsFunction::UseResult(
    const ExtensionSettingsStorage::Result& storage_result) {
  if (storage_result.HasError()) {
    error_ = storage_result.GetError();
    return false;
  }
  DictionaryValue* settings = storage_result.GetSettings();
  result_.reset(settings == NULL ? NULL : settings->DeepCopy());
  return true;
}

// Concrete settings functions

// Adds all StringValues from a ListValue to a vector of strings.
static void AddAllStringValues(
    const ListValue& from, std::vector<std::string>* to) {
  DCHECK(to->empty());
  std::string as_string;
  for (ListValue::const_iterator it = from.begin(); it != from.end(); ++it) {
    if ((*it)->GetAsString(&as_string)) {
      to->push_back(as_string);
    }
  }
}

bool GetSettingsFunction::RunOnFileThreadImpl(
    ExtensionSettingsStorage* storage) {
  Value *input;
  EXTENSION_FUNCTION_VALIDATE(args_->Get(0, &input));
  std::string as_string;
  ListValue* as_list;
  if (input->IsType(Value::TYPE_NULL)) {
    return UseResult(storage->Get());
  } else if (input->GetAsString(&as_string)) {
    return UseResult(storage->Get(as_string));
  } else if (input->GetAsList(&as_list)) {
    std::vector<std::string> string_list;
    AddAllStringValues(*as_list, &string_list);
    return UseResult(storage->Get(string_list));
  }
  return UseResult(ExtensionSettingsStorage::Result(kUnsupportedArgumentType));
}

bool SetSettingsFunction::RunOnFileThreadImpl(
    ExtensionSettingsStorage* storage) {
  DictionaryValue *input;
  EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &input));
  return UseResult(storage->Set(*input));
}

bool RemoveSettingsFunction::RunOnFileThreadImpl(
    ExtensionSettingsStorage* storage) {
  Value *input;
  EXTENSION_FUNCTION_VALIDATE(args_->Get(0, &input));
  std::string as_string;
  ListValue* as_list;
  if (input->GetAsString(&as_string)) {
    return UseResult(storage->Remove(as_string));
  } else if (input->GetAsList(&as_list)) {
    std::vector<std::string> string_list;
    AddAllStringValues(*as_list, &string_list);
    return UseResult(storage->Remove(string_list));
  }
  return UseResult(ExtensionSettingsStorage::Result(kUnsupportedArgumentType));
}

bool ClearSettingsFunction::RunOnFileThreadImpl(
    ExtensionSettingsStorage* storage) {
  return UseResult(storage->Clear());
}