| Index: chrome/browser/policy/managed_bookmarks_policy_handler.cc
|
| diff --git a/chrome/browser/policy/managed_bookmarks_policy_handler.cc b/chrome/browser/policy/managed_bookmarks_policy_handler.cc
|
| index bf493ce83aeb6bc13ae63802d6973537e9728c29..e0370678a85e38b4f09575358b6b9a7e71b11617 100644
|
| --- a/chrome/browser/policy/managed_bookmarks_policy_handler.cc
|
| +++ b/chrome/browser/policy/managed_bookmarks_policy_handler.cc
|
| @@ -7,7 +7,7 @@
|
| #include "base/prefs/pref_value_map.h"
|
| #include "base/values.h"
|
| #include "chrome/common/net/url_fixer_upper.h"
|
| -#include "chrome/common/pref_names.h"
|
| +#include "components/bookmarks/common/bookmark_pref_names.h"
|
| #include "components/policy/core/browser/policy_error_map.h"
|
| #include "components/policy/core/common/policy_map.h"
|
| #include "grit/components_strings.h"
|
| @@ -16,88 +16,73 @@
|
|
|
| namespace policy {
|
|
|
| -namespace {
|
| -
|
| -bool GetBookmark(const base::Value& value,
|
| - std::string* name,
|
| - std::string* url) {
|
| - const base::DictionaryValue* dict = NULL;
|
| - if (!value.GetAsDictionary(&dict))
|
| - return false;
|
| - std::string url_string;
|
| - if (!dict->GetStringWithoutPathExpansion(ManagedBookmarksPolicyHandler::kName,
|
| - name) ||
|
| - !dict->GetStringWithoutPathExpansion(ManagedBookmarksPolicyHandler::kUrl,
|
| - &url_string)) {
|
| - return false;
|
| - }
|
| - GURL gurl = URLFixerUpper::FixupURL(url_string, "");
|
| - if (!gurl.is_valid())
|
| - return false;
|
| - *url = gurl.spec();
|
| - return true;
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| const char ManagedBookmarksPolicyHandler::kName[] = "name";
|
| const char ManagedBookmarksPolicyHandler::kUrl[] = "url";
|
| +const char ManagedBookmarksPolicyHandler::kChildren[] = "children";
|
|
|
| -ManagedBookmarksPolicyHandler::ManagedBookmarksPolicyHandler()
|
| - : TypeCheckingPolicyHandler(key::kManagedBookmarks,
|
| - base::Value::TYPE_LIST) {}
|
| +ManagedBookmarksPolicyHandler::ManagedBookmarksPolicyHandler(
|
| + Schema chrome_schema)
|
| + : SchemaValidatingPolicyHandler(
|
| + key::kManagedBookmarks,
|
| + chrome_schema.GetKnownProperty(key::kManagedBookmarks),
|
| + SCHEMA_ALLOW_INVALID) {}
|
|
|
| ManagedBookmarksPolicyHandler::~ManagedBookmarksPolicyHandler() {}
|
|
|
| -bool ManagedBookmarksPolicyHandler::CheckPolicySettings(
|
| - const PolicyMap& policies,
|
| - PolicyErrorMap* errors) {
|
| - const base::Value* value = NULL;
|
| - if (!CheckAndGetValue(policies, errors, &value))
|
| - return false;
|
| -
|
| - if (!value)
|
| - return true;
|
| -
|
| - const base::ListValue* list = NULL;
|
| - value->GetAsList(&list);
|
| - DCHECK(list);
|
| -
|
| - for (base::ListValue::const_iterator it = list->begin();
|
| - it != list->end(); ++it) {
|
| - std::string name;
|
| - std::string url;
|
| - if (!*it || !GetBookmark(**it, &name, &url)) {
|
| - size_t index = it - list->begin();
|
| - errors->AddError(policy_name(), index, IDS_POLICY_INVALID_BOOKMARK);
|
| - }
|
| - }
|
| -
|
| - return true;
|
| -}
|
| -
|
| void ManagedBookmarksPolicyHandler::ApplyPolicySettings(
|
| const PolicyMap& policies,
|
| PrefValueMap* prefs) {
|
| - const base::Value* value = policies.GetValue(policy_name());
|
| - const base::ListValue* list = NULL;
|
| + scoped_ptr<base::Value> value;
|
| + if (!CheckAndGetValue(policies, NULL, &value))
|
| + return;
|
| +
|
| + base::ListValue* list = NULL;
|
| if (!value || !value->GetAsList(&list))
|
| return;
|
|
|
| - base::ListValue* bookmarks = new base::ListValue();
|
| - for (base::ListValue::const_iterator it = list->begin();
|
| - it != list->end(); ++it) {
|
| + FilterBookmarks(list);
|
| + prefs->SetValue(prefs::kManagedBookmarks, value.release());
|
| +}
|
| +
|
| +void ManagedBookmarksPolicyHandler::FilterBookmarks(base::ListValue* list) {
|
| + // Remove any non-conforming values found.
|
| + base::ListValue::iterator it = list->begin();
|
| + while (it != list->end()) {
|
| + base::DictionaryValue* dict = NULL;
|
| + if (!*it || !(*it)->GetAsDictionary(&dict)) {
|
| + it = list->Erase(it, NULL);
|
| + continue;
|
| + }
|
| +
|
| std::string name;
|
| std::string url;
|
| - if (*it && GetBookmark(**it, &name, &url)) {
|
| - base::DictionaryValue* dict = new base::DictionaryValue();
|
| - dict->SetString(kName, name);
|
| - dict->SetString(kUrl, url);
|
| - bookmarks->Append(dict);
|
| + base::ListValue* children = NULL;
|
| + // Every bookmark must have a name, and then either a URL of a list of
|
| + // child bookmarks.
|
| + if (!dict->GetString(kName, &name) ||
|
| + (!dict->GetList(kChildren, &children) &&
|
| + !dict->GetString(kUrl, &url))) {
|
| + it = list->Erase(it, NULL);
|
| + continue;
|
| }
|
| - }
|
|
|
| - prefs->SetValue(prefs::kManagedBookmarks, bookmarks);
|
| + if (children) {
|
| + // Ignore the URL if this bookmark has child nodes.
|
| + dict->Remove(kUrl, NULL);
|
| + FilterBookmarks(children);
|
| + } else {
|
| + // Make sure the URL is valid before passing a bookmark to the pref.
|
| + dict->Remove(kChildren, NULL);
|
| + GURL gurl = URLFixerUpper::FixupURL(url, "");
|
| + if (!gurl.is_valid()) {
|
| + it = list->Erase(it, NULL);
|
| + continue;
|
| + }
|
| + dict->SetString(kUrl, gurl.spec());
|
| + }
|
| +
|
| + ++it;
|
| + }
|
| }
|
|
|
| } // namespace policy
|
|
|