Chromium Code Reviews| Index: chrome/browser/extensions/api/bookmarks/bookmarks_api.cc |
| diff --git a/chrome/browser/extensions/api/bookmarks/bookmarks_api.cc b/chrome/browser/extensions/api/bookmarks/bookmarks_api.cc |
| index 2d59d6286b42ed1aed30691067677f1eb1028885..14be9e1827102378117618e60afa986aec12d2d4 100644 |
| --- a/chrome/browser/extensions/api/bookmarks/bookmarks_api.cc |
| +++ b/chrome/browser/extensions/api/bookmarks/bookmarks_api.cc |
| @@ -2,6 +2,8 @@ |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| +#include <algorithm> |
| + |
| #include "chrome/browser/extensions/api/bookmarks/bookmarks_api.h" |
| #include "base/bind.h" |
| @@ -13,6 +15,7 @@ |
| #include "base/memory/scoped_ptr.h" |
| #include "base/path_service.h" |
| #include "base/prefs/pref_service.h" |
| +#include "base/rand_util.h" |
| #include "base/sha1.h" |
| #include "base/stl_util.h" |
| #include "base/strings/string16.h" |
| @@ -44,7 +47,9 @@ |
| #include "content/public/browser/web_contents.h" |
| #include "extensions/browser/event_router.h" |
| #include "extensions/browser/extension_function_dispatcher.h" |
| +#include "extensions/browser/extension_registry.h" |
| #include "extensions/browser/quota_service.h" |
| +#include "extensions/common/permissions/permissions_data.h" |
| #include "grit/generated_resources.h" |
| #include "ui/base/l10n/l10n_util.h" |
| @@ -96,6 +101,58 @@ base::FilePath GetDefaultFilepathForBookmarkExport() { |
| return default_path.Append(filename); |
| } |
| +bool IsEnhancedBookmarksExtensionActive(Profile* profile) { |
| + // These are hashes of IDs associated with the release and development |
| + // versions of the enhanced bookmark extensions. |
| + static const char *enhanced_extension_hashes[] = { |
| + "D5736E4B5CF695CB93A2FB57E4FDC6E5AFAB6FE2", |
|
Yoyo Zhou
2014/06/14 00:52:24
What I mean is inline comments like
"D57..." // R
Mike Wittman
2014/06/16 21:16:18
Done.
|
| + "D57DE394F36DC1C3220E7604C575D29C51A6C495", |
| + "3F65507A3B39259B38C8173C6FFA3D12DF64CCE9" |
| + }; |
| + const ExtensionSet& extensions = |
| + ExtensionRegistry::Get(profile)->enabled_extensions(); |
| + for (ExtensionSet::const_iterator it = extensions.begin(); |
| + it != extensions.end(); ++it) { |
| + const Extension* extension = *it; |
| + if (extension->permissions_data()->HasAPIPermission( |
| + APIPermission::kBookmarkManagerPrivate)) { |
| + std::string hash = base::SHA1HashString(extension->id()); |
| + hash = base::HexEncode(hash.c_str(), hash.length()); |
| + for (size_t i = 0; i < arraysize(enhanced_extension_hashes); i++) |
| + if (hash == enhanced_extension_hashes[i]) |
| + return true; |
| + } |
| + } |
| + return false; |
| +} |
| + |
| +std::string ToBase36(int64 value) { |
| + DCHECK(value >= 0); |
| + std::string str; |
| + while (value > 0) { |
| + int digit = value % 36; |
| + value /= 36; |
| + str += (digit < 10 ? '0' + digit : 'a' + digit - 10); |
| + } |
| + std::reverse(str.begin(), str.end()); |
| + return str; |
| +} |
| + |
| +// Generate a metadata ID based on a the current time and a random number for |
| +// enhanced bookmarks, to be assigned pre-sync. |
| +std::string GenerateEnhancedBookmarksID(bool is_folder) { |
| + static const char bookmark_prefix[] = "cc_"; |
| + static const char folder_prefix[] = "cf_"; |
| + // Use [0..range_mid) for bookmarks, [range_mid..2*range_mid) for folders. |
| + int range_mid = 36*36*36*36 / 2; |
| + int rand = base::RandInt(0, range_mid - 1); |
| + int64 unix_epoch_time_in_ms = |
| + (base::Time::Now() - base::Time::UnixEpoch()).InMilliseconds(); |
| + return std::string(is_folder ? folder_prefix : bookmark_prefix) + |
| + ToBase36(is_folder ? range_mid + rand : rand) + |
| + ToBase36(unix_epoch_time_in_ms); |
| +} |
| + |
| } // namespace |
| bool BookmarksFunction::RunAsync() { |
| @@ -288,6 +345,18 @@ void BookmarkEventRouter::BookmarkNodeMoved(BookmarkModel* model, |
| bookmarks::OnMoved::Create(base::Int64ToString(node->id()), move_info)); |
| } |
| +void BookmarkEventRouter::OnWillAddBookmarkNode(BookmarkModel* model, |
| + BookmarkNode* node) { |
| + // TODO(wittman): Remove this once extension hooks are in place to allow the |
| + // enhanced bookmarks extension to manage all bookmark creation code |
| + // paths. See http://crbug.com/383557. |
| + if (IsEnhancedBookmarksExtensionActive(Profile::FromBrowserContext( |
| + browser_context_))) { |
| + static const char key[] = "stars.id"; |
| + node->SetMetaInfo(key, GenerateEnhancedBookmarksID(node->is_folder())); |
| + } |
| +} |
| + |
| void BookmarkEventRouter::BookmarkNodeAdded(BookmarkModel* model, |
| const BookmarkNode* parent, |
| int index) { |