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());
}
|