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 114 115 116 117 118 119 120 121 122 123 124 125 126
|
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/extensions/api/bookmarks_core/bookmarks_function.h"
#include <string>
#include <utility>
#include "base/feature_list.h"
#include "base/strings/string_number_conversions.h"
#include "build/build_config.h"
#include "chrome/browser/bookmarks/bookmark_model_factory.h"
#include "chrome/browser/bookmarks/managed_bookmark_service_factory.h"
#include "chrome/browser/extensions/api/bookmarks/bookmarks_api_watcher.h"
#include "chrome/browser/extensions/bookmarks/bookmarks_error_constants.h"
#include "chrome/browser/extensions/bookmarks/bookmarks_features.h"
#include "chrome/browser/profiles/profile.h"
#include "components/bookmarks/browser/bookmark_model.h"
#include "components/bookmarks/browser/bookmark_node.h"
#include "components/bookmarks/browser/bookmark_utils.h"
#include "components/bookmarks/common/bookmark_pref_names.h"
#include "components/bookmarks/managed/managed_bookmark_service.h"
#include "components/prefs/pref_service.h"
#include "components/user_prefs/user_prefs.h"
using bookmarks::BookmarkModel;
using bookmarks::BookmarkNode;
using bookmarks::ManagedBookmarkService;
namespace extensions {
ExtensionFunction::ResponseAction BookmarksFunction::Run() {
BookmarkModel* model =
BookmarkModelFactory::GetForBrowserContext(GetProfile());
if (!model->loaded()) {
// Bookmarks are not ready yet. We'll wait.
model->AddObserver(this);
AddRef(); // Balanced in BookmarkModelLoaded().
return RespondLater();
}
ResponseValue response = RunOnReady();
return RespondNow(std::move(response));
}
BookmarkModel* BookmarksFunction::GetBookmarkModel() {
return BookmarkModelFactory::GetForBrowserContext(GetProfile());
}
ManagedBookmarkService* BookmarksFunction::GetManagedBookmarkService() {
return ManagedBookmarkServiceFactory::GetForProfile(GetProfile());
}
const BookmarkNode* BookmarksFunction::GetBookmarkNodeFromId(
const std::string& id_string,
std::string* error) {
int64_t id;
if (!base::StringToInt64(id_string, &id)) {
*error = bookmarks_errors::kInvalidIdError;
return nullptr;
}
BookmarkModel* model =
BookmarkModelFactory::GetForBrowserContext(GetProfile());
const BookmarkNode* node = bookmarks::GetBookmarkNodeByID(model, id);
if (!node || (base::FeatureList::IsEnabled(
kEnforceBookmarkVisibilityOnExtensionsAPI) &&
!node->IsVisible())) {
*error = bookmarks_errors::kNoNodeError;
return nullptr;
}
return node;
}
bool BookmarksFunction::EditBookmarksEnabled() {
PrefService* prefs = user_prefs::UserPrefs::Get(GetProfile());
return prefs->GetBoolean(bookmarks::prefs::kEditBookmarksEnabled);
}
bool BookmarksFunction::CanBeModified(const BookmarkNode* node,
std::string* error) {
if (!node || (base::FeatureList::IsEnabled(
kEnforceBookmarkVisibilityOnExtensionsAPI) &&
!node->IsVisible())) {
*error = bookmarks_errors::kNoParentError;
return false;
}
if (node->is_root()) {
*error = bookmarks_errors::kModifySpecialError;
return false;
}
ManagedBookmarkService* managed = GetManagedBookmarkService();
if (bookmarks::IsDescendantOf(node, managed->managed_node())) {
*error = bookmarks_errors::kModifyManagedError;
return false;
}
return true;
}
Profile* BookmarksFunction::GetProfile() {
return Profile::FromBrowserContext(browser_context());
}
void BookmarksFunction::OnResponded() {
DCHECK(response_type());
if (*response_type() == ResponseType::kSucceeded) {
BookmarksApiWatcher::GetForBrowserContext(browser_context())
->NotifyApiInvoked(this);
}
}
void BookmarksFunction::BookmarkModelChanged() {}
void BookmarksFunction::BookmarkModelLoaded(bool ids_reassigned) {
GetBookmarkModel()->RemoveObserver(this);
ResponseValue response = RunOnReady();
Respond(std::move(response));
Release(); // Balanced in Run().
}
} // namespace extensions
|