#include "ui/base/ui_base_features.h"
#include "ui/base/window_open_disposition.h"
#include "ui/events/keycodes/keyboard_codes.h"
-#if defined(SAMSUNG_MENU_TREE_UI)
+
+#if defined(SAMSUNG_NEXT_BROWSER)
#include "chrome/browser/ui/samsung/samsung_browser_core.h"
+#include "chrome/common/chrome_switches.h"
#endif
#if BUILDFLAG(IS_MAC)
NewTab(browser_);
break;
}
-#if defined(SAMSUNG_MENU_TREE_UI)
+#if defined(SAMSUNG_NEXT_BROWSER)
case IDC_SAMSUNG_OPEN_FEATURED: {
NewTabWithURL(browser_, "chrome://featured");
break;
chrome::kPeopleSubPage);
break;
case IDC_SHOW_BOOKMARK_MANAGER:
-#if defined(SAMSUNG_MENU_TREE_UI)
+#if defined(SAMSUNG_NEXT_BROWSER)
NewTabWithURL(browser_, "chrome://featured/#bookmarks");
#else
ShowBookmarkManager(browser_->GetBrowserForOpeningWebUi());
command_updater_.UpdateCommandEnabled(
IDC_NEW_TAB, !browser_->app_controller() ||
!browser_->app_controller()->ShouldHideNewTabButton());
-#if defined(SAMSUNG_MENU_TREE_UI)
+#if defined(SAMSUNG_NEXT_BROWSER)
command_updater_.UpdateCommandEnabled(IDC_SAMSUNG_OPEN_FEATURED, true);
command_updater_.UpdateCommandEnabled(IDC_SAMSUNG_OPEN_PWA, true);
#endif
command_updater_.UpdateCommandEnabled(IDC_WINDOW_GROUP_TAB, is_normal);
// Page-related commands
-#if defined(SAMSUNG_MENU_TREE_UI)
- auto samsung_browser_core =
- samsung_browser_main::SamsungBrowserCore::instance();
- if (samsung_browser_core) {
- auto bookmark_button_controller =
- samsung_browser_core->BookmarkButtonController();
- if (bookmark_button_controller) {
- std::string url = current_web_contents->GetURL().spec();
- bool is_bookmarked_by_user;
- if (url.substr(0, 9).compare("chrome://") == 0 || url.empty()) {
- is_bookmarked_by_user = false;
- } else {
- LOG(INFO) << "Valid URL. Check if URL is Bookmarked: " << url;
- is_bookmarked_by_user = bookmark_button_controller->isBookmarked(url);
+#if defined(SAMSUNG_NEXT_BROWSER)
+ const base::CommandLine* command_line =
+ base::CommandLine::ForCurrentProcess();
+
+ bool is_browser_lite = command_line->HasSwitch(switches::kBrowserLite);
+
+ if (is_browser_lite) {
+ window()->SetStarredState(
+ BookmarkTabHelper::FromWebContents(current_web_contents)->is_starred());
+ } else {
+ auto samsung_browser_core =
+ samsung_browser_main::SamsungBrowserCore::instance();
+ if (samsung_browser_core) {
+ auto bookmark_button_controller =
+ samsung_browser_core->BookmarkButtonController();
+ if (bookmark_button_controller) {
+ std::string url = current_web_contents->GetURL().spec();
+ bool is_bookmarked_by_user;
+ if (url.substr(0, 9).compare("chrome://") == 0 || url.empty()) {
+ is_bookmarked_by_user = false;
+ } else {
+ LOG(INFO) << "Valid URL. Check if URL is Bookmarked: " << url;
+ is_bookmarked_by_user = bookmark_button_controller->isBookmarked(url);
+ }
+ window()->SetStarredState(is_bookmarked_by_user);
}
- window()->SetStarredState(is_bookmarked_by_user);
}
}
#else
window()->SetStarredState(
BookmarkTabHelper::FromWebContents(current_web_contents)->is_starred());
-#endif // SAMSUNG_MENU_TREE_UI
+#endif // SAMSUNG_NEXT_BROWSER
window()->ZoomChangedForActiveTab(false);
command_updater_.UpdateCommandEnabled(IDC_VIEW_SOURCE,
CanViewSource(browser_));
#if defined(SAMSUNG_NEXT_BROWSER)
#include "chrome/browser/ui/samsung/samsung_browser_core.h"
#include "components/url_formatter/url_fixer.h"
+#include "chrome/common/chrome_switches.h"
#endif
#if !BUILDFLAG(IS_ANDROID)
void BookmarkCurrentTab(Browser* browser) {
LOG(INFO) << "In BookmarkCurrentTab";
-// Add Bookmark to Cloud
#if defined(SAMSUNG_NEXT_BROWSER)
- content::WebContents* const web_contents =
- browser->tab_strip_model()->GetActiveWebContents();
+ const base::CommandLine* command_line =
+ base::CommandLine::ForCurrentProcess();
- auto samsung_browser_core =
- samsung_browser_main::SamsungBrowserCore::instance();
- if (!samsung_browser_core) {
- LOG(INFO) << "samsung_browser_core null";
- return;
- }
- auto bookmark_button_controller =
- samsung_browser_core->BookmarkButtonController();
- if (!bookmark_button_controller) {
- LOG(INFO) << "bookmark_button_controller null";
- return;
- }
+ bool is_browser_lite = command_line->HasSwitch(switches::kBrowserLite);
- auto watch_later_controller = samsung_browser_core->WatchLaterController();
- if (!watch_later_controller) {
- LOG(INFO) << "watch_later_controller null";
- return;
- }
+ if (is_browser_lite) {
+ // Add Bookmark to Local Chromium
+ base::RecordAction(base::UserMetricsAction("Star"));
+ BookmarkModel* model =
+ BookmarkModelFactory::GetForBrowserContext(browser->profile());
- const GURL& url = web_contents->GetURL();
- std::string spec = url.spec();
+ GURL url;
+ std::u16string title;
+ if (!BookmarkCurrentTabHelper(browser, model, &url, &title)) {
+ return;
+ }
- bool is_bookmarked_by_user = bookmark_button_controller->isBookmarked(spec);
- samsung_browser_fw_core::WatchlaterIconState watch_later_icon_state =
- watch_later_controller->GetWatchLaterIconState(spec);
- // Make sure the model actually added a bookmark before showing the star. A
- // bookmark isn't created if the url is invalid.
- if (browser->window()->IsActive()) {
- // Only show the bubble if the window is active, otherwise we may get into
- // weird situations where the bubble is deleted as soon as it is shown.
- browser->window()->ShowSamsungBookmarkBubble(url, is_bookmarked_by_user,
- watch_later_icon_state);
+ base::RecordAction(base::UserMetricsAction("Star"));
+ bool was_bookmarked_by_user = bookmarks::IsBookmarkedByUser(model, url);
+
+ bookmarks::AddIfNotBookmarked(model, url, title);
+ bool is_bookmarked_by_user = bookmarks::IsBookmarkedByUser(model, url);
+ // Make sure the model actually added a bookmark before showing the star. A
+ // bookmark isn't created if the url is invalid.
+
+ if (browser->window()->IsActive() && is_bookmarked_by_user) {
+ // Only show the bubble if the window is active, otherwise we may get into
+ // weird situations where the bubble is deleted as soon as it is shown.
+ browser->window()->ShowBookmarkBubble(url, was_bookmarked_by_user);
+ }
+
+ if (!was_bookmarked_by_user && is_bookmarked_by_user) {
+ RecordBookmarksAdded(browser->profile());
+ }
+ } else {
+ // Add Bookmark to Cloud
+ content::WebContents* const web_contents =
+ browser->tab_strip_model()->GetActiveWebContents();
+
+ auto samsung_browser_core =
+ samsung_browser_main::SamsungBrowserCore::instance();
+ if (!samsung_browser_core) {
+ LOG(INFO) << "samsung_browser_core null";
+ return;
+ }
+ auto bookmark_button_controller =
+ samsung_browser_core->BookmarkButtonController();
+ if (!bookmark_button_controller) {
+ LOG(INFO) << "bookmark_button_controller null";
+ return;
+ }
+
+ auto watch_later_controller = samsung_browser_core->WatchLaterController();
+ if (!watch_later_controller) {
+ LOG(INFO) << "watch_later_controller null";
+ return;
+ }
+
+ const GURL& url = web_contents->GetURL();
+ std::string spec = url.spec();
+
+ bool is_bookmarked_by_user = bookmark_button_controller->isBookmarked(spec);
+ samsung_browser_fw_core::WatchlaterIconState watch_later_icon_state =
+ watch_later_controller->GetWatchLaterIconState(spec);
+ // Make sure the model actually added a bookmark before showing the star. A
+ // bookmark isn't created if the url is invalid.
+ if (browser->window()->IsActive()) {
+ // Only show the bubble if the window is active, otherwise we may get into
+ // weird situations where the bubble is deleted as soon as it is shown.
+ browser->window()->ShowSamsungBookmarkBubble(url, is_bookmarked_by_user,
+ watch_later_icon_state);
+ }
}
-#else
+
+#else // SAMSUNG_NEXT_BROWSER
base::RecordAction(base::UserMetricsAction("Star"));
BookmarkModel* model =
BookmarkModelFactory::GetForBrowserContext(browser->profile());
prefs->SetBoolean(bookmarks::prefs::kAddedBookmarkSincePowerBookmarksLaunch,
true);
}
-#endif
+#endif // IS_ANDROID
bookmarks::AddIfNotBookmarked(model, url, title);
bool is_bookmarked_by_user = bookmarks::IsBookmarkedByUser(model, url);
// Make sure the model actually added a bookmark before showing the star. A
if (!was_bookmarked_by_user && is_bookmarked_by_user) {
RecordBookmarksAdded(browser->profile());
}
-#endif
+#endif // SAMSUNG_NEXT_BROWSER
}
void BookmarkCurrentTabInFolder(Browser* browser, int64_t folder_id) {
#include <set>
#include "base/logging.h"
+#include "base/base64.h"
+#include "base/command_line.h"
#include "base/functional/bind.h"
#include "base/functional/callback_helpers.h"
+#include "base/location.h"
#include "base/task/thread_pool.h"
+#include "chrome/browser/bookmarks/bookmark_model_factory.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/browser_list.h"
#include "chrome/browser/ui/samsung/cursor_controller.h"
+#include "chrome/browser/ui/samsung/samsung_account_manager.h"
+#include "chrome/browser/ui/samsung/samsung_browser_core.h"
+#include "chrome/common/chrome_switches.h"
+#include "components/bookmarks/browser/bookmark_model.h"
+#include "components/bookmarks/browser/bookmark_node.h"
+#include "components/samsung/opened_tabs/samsung_bpopened_tab_model.h"
+#include "components/samsung/public/samsung_utility.h"
#include "content/public/browser/browser_context.h"
#include "content/public/browser/url_data_source.h"
#include "content/public/browser/web_ui.h"
-#include "chrome/browser/ui/samsung/samsung_browser_core.h"
-#include "components/samsung/public/samsung_utility.h"
-#include "components/samsung/opened_tabs/samsung_bpopened_tab_model.h"
-#include "chrome/browser/ui/samsung/samsung_account_manager.h"
+#include "ui/gfx/codec/png_codec.h"
+#include "ui/gfx/image/image.h"
SamsungBookmarksHandler::SamsungBookmarksHandler(){
Init();
AllowJavascript();
LOG(INFO) << "HandleGetBookmarksData start";
- const std::string url = args[0].GetString();
+ if (IsBrowserLite()) {
+ // Do fetch of Local Bookmarks on a Different Thread
+ base::RepeatingCallback<void()> fetchTask = base::BindRepeating(
+ &SamsungBookmarksHandler::HandleGetLocalBookmarksDataThreadCb,
+ base::Unretained(this), this);
+ base::ThreadPool::PostTask(
+ FROM_HERE, {base::MayBlock(), base::TaskPriority::BEST_EFFORT},
+ fetchTask);
+ } else {
+ const std::string url = args[0].GetString();
- //Do fetch of Bookmarks on a Different Thread
- base::RepeatingCallback<void()> fetchTask = base::BindRepeating(&SamsungBookmarksHandler::HandleGetBookmarksDataThreadCb, base::Unretained(this), this, url);
- base::ThreadPool::PostTask(
- FROM_HERE, {base::MayBlock(), base::TaskPriority::BEST_EFFORT}, fetchTask);
+ // Do fetch of Bookmarks on a Different Thread
+ base::RepeatingCallback<void()> fetchTask = base::BindRepeating(
+ &SamsungBookmarksHandler::HandleGetBookmarksDataThreadCb,
+ base::Unretained(this), this, url);
+ base::ThreadPool::PostTask(
+ FROM_HERE, {base::MayBlock(), base::TaskPriority::BEST_EFFORT},
+ fetchTask);
+ }
}
void SamsungBookmarksHandler::HandleGetBookmarksDataThreadCb(void* user_data, const std::string url){
FireWebUIListener("show-bookmarks-data", final_results);
}
+std::string ImageToBase64(const gfx::Image& image) {
+ if (image.IsEmpty()) {
+ return "";
+ }
+
+ // Get the bitmap representation
+ const SkBitmap* bitmap = image.ToSkBitmap();
+ if (!bitmap || bitmap->isNull()) {
+ return "";
+ }
+
+ // Encode the bitmap to PNG
+ std::vector<unsigned char> png_data;
+ if (!gfx::PNGCodec::EncodeBGRASkBitmap(*bitmap, false, &png_data)) {
+ return "";
+ }
+
+ // Convert PNG data to base64
+ return base::Base64Encode(base::make_span(png_data));
+}
+
+void ProcessNode(const bookmarks::BookmarkNode* node,
+ int depth,
+ std::vector<samsung_browser_fw_core::BookmarkItem>* bookmarks,
+ std::string parent_id,
+ bookmarks::BookmarkModel* model) {
+ if (!node)
+ return;
+
+ std::string indent(depth * 2, ' ');
+
+ if (node->is_url()) {
+ LOG(INFO) << indent << "- " << base::UTF16ToUTF8(node->GetTitle()) << ": "
+ << node->url().spec() << "\n";
+ auto favicon = model->GetFavicon(node);
+
+ samsung_browser_fw_core::BookmarkItem tmp(
+ node->uuid().AsLowercaseString(), // id
+ node->url().spec(), // url
+ base::UTF16ToUTF8(node->GetTitle()), // title
+ ImageToBase64(favicon),
+ samsung_browser_fw_core::BookmarkType::UserBookmark,
+ samsung_browser_fw_core::BookmarkItemType::Bookmark, parent_id);
+
+ bookmarks->push_back(tmp);
+ } else if (node->is_folder()) {
+ for (int i = 0; i < node->children().size(); ++i) {
+ ProcessNode(node->children()[i].get(), depth + 1, bookmarks,
+ std::to_string(node->id()), model);
+ }
+ }
+}
+
+void SamsungBookmarksHandler::GetAllLocalBookmarksData(
+ std::vector<samsung_browser_fw_core::BookmarkItem>* bookmarks) {
+ LOG(INFO) << "GetAllLocalBookmarksData";
+ bookmarks->clear();
+
+ Browser* browser = BrowserList::GetInstance()->GetLastActive();
+ if (!browser) {
+ LOG(INFO) << "browser is null";
+ return;
+ }
+ Profile* profile = browser->profile();
+ bookmarks::BookmarkModel* model =
+ BookmarkModelFactory::GetForBrowserContext(profile);
+
+ if (!model->loaded()) {
+ LOG(INFO) << "Model not yet loaded";
+ return;
+ }
+
+ const bookmarks::BookmarkNode* root_node = model->root_node();
+ ProcessNode(root_node, 0, bookmarks, "", model);
+}
+
+void SamsungBookmarksHandler::HandleGetLocalBookmarksDataThreadCb(
+ void* user_data) {
+ SamsungBookmarksHandler* self =
+ static_cast<SamsungBookmarksHandler*>(user_data);
+ LOG(INFO) << "SamsungBookmarksHandler::HandleGetLocalBookmarksDataThreadCb";
+
+ std::vector<samsung_browser_fw_core::BookmarkItem> bookmarks;
+ self->GetAllLocalBookmarksData(&bookmarks);
+
+ base::Value::Dict final_results;
+ base::Value::Dict results_info;
+ for (auto& bookmark : bookmarks) {
+ results_info.Set("title", bookmark.getTitle());
+ results_info.Set("url", bookmark.getURL());
+ results_info.Set("favicon_data", bookmark.getSourceName());
+ if (bookmark.getItemType() ==
+ samsung_browser_fw_core::BookmarkItemType::Folder) {
+ results_info.Set("itemType", "Folder");
+ } else {
+ results_info.Set("itemType", "Bookmark");
+ }
+ final_results.Set(bookmark.getID().toString(), std::move(results_info));
+ results_info.clear();
+ }
+ FireWebUIListener("show-bookmarks-data", final_results);
+}
+
void SamsungBookmarksHandler::HandleRemoveBookmark(const base::Value::List& args) {
AllowJavascript();
LOG(INFO) << "HandleRemoveBookmark";
const std::string& url = args[0].GetString();
- LOG(INFO) << "HandleRemoveBookmark" << url;
- auto bookmark_controller = samsung_browser_main::SamsungBrowserCore::instance()->BookmarkButtonController();
- if(url.length() > 0) {
- bookmark_controller->RemoveBookmark(url);
+ const std::string& uuid = args[1].GetString();
+
+ if (IsBrowserLite()) {
+ Browser* browser = BrowserList::GetInstance()->GetLastActive();
+ if (!browser) {
+ LOG(INFO) << "browser is null";
+ return;
+ }
+ Profile* profile = browser->profile();
+ bookmarks::BookmarkModel* model =
+ BookmarkModelFactory::GetForBrowserContext(profile);
+
+ if (!model->loaded()) {
+ LOG(INFO) << "Model not yet loaded";
+ return;
+ }
+
+ const base::Uuid& bookmark_node_uuid =
+ base::Uuid::ParseCaseInsensitive(uuid);
+
+ if (!bookmark_node_uuid.is_valid()) {
+ LOG(INFO) << "Invalid Bookmark UUID";
+ return;
+ }
+
+ const bookmarks::BookmarkNode* bookmark_node =
+ model->GetNodeByUuid(bookmark_node_uuid, bookmarks::BookmarkModel::NodeTypeForUuidLookup::kLocalOrSyncableNodes);
+ model->Remove(bookmark_node, bookmarks::metrics::BookmarkEditSource::kUser, base::Location::Current());
+ BookmarkStateChanged();
+ } else {
+ LOG(INFO) << "HandleRemoveBookmark" << url;
+ auto bookmark_controller =
+ samsung_browser_main::SamsungBrowserCore::instance()
+ ->BookmarkButtonController();
+ if (url.length() > 0) {
+ bookmark_controller->RemoveBookmark(url);
+ }
}
}
void SamsungBookmarksHandler::HandleRemoveAllBookmarks(const base::Value::List& args) {
AllowJavascript();
LOG(INFO) << "HandleRemoveAllBookmarks";
- const std::string& id = args[0].GetString();
- LOG(INFO) << "HandleRemoveFolder" << id;
- auto bookmark_controller = samsung_browser_main::SamsungBrowserCore::instance()->BookmarkButtonController();
- bookmark_controller->RemoveAllBookmarks(id);
+
+ if (IsBrowserLite()) {
+ Browser* browser = BrowserList::GetInstance()->GetLastActive();
+ if (!browser) {
+ LOG(INFO) << "browser is null";
+ return;
+ }
+ Profile* profile = browser->profile();
+ bookmarks::BookmarkModel* model =
+ BookmarkModelFactory::GetForBrowserContext(profile);
+
+ if (!model->loaded()) {
+ LOG(INFO) << "Model not yet loaded";
+ return;
+ }
+ model->RemoveAllUserBookmarks(base::Location::Current());
+ BookmarkStateChanged();
+ } else {
+ const std::string& id = args[0].GetString();
+ LOG(INFO) << "HandleRemoveFolder" << id;
+ auto bookmark_controller =
+ samsung_browser_main::SamsungBrowserCore::instance()
+ ->BookmarkButtonController();
+ bookmark_controller->RemoveAllBookmarks(id);
+ }
}
std::string SamsungBookmarksHandler::getFavicon(const std::string& url) {
const std::string& id = args[0].GetString();
const std::string& title = args[1].GetString();
const std::string& url = args[2].GetString();
- // LOG(INFO) << "HandleEditBookmark " << id << " " << url << " " << title;
- // LOG(INFO) << "HandleEditBookmark " << args[0] << " " << args[1];
- LOG(INFO) << "HandleEditBookmark " << args[0].GetString();
- LOG(INFO) << "HandleEditBookmark " << args[1].GetString();
- LOG(INFO) << "HandleEditBookmark " << args[2].GetString();
- auto bookmark_controller = samsung_browser_main::SamsungBrowserCore::instance()->BookmarkButtonController();
- bookmark_controller->EditBookmark(samsung_browser_fw_core::BookmarkID(id), url, title);
- bool refresh = true;
- FireWebUIListener("change-in-bookmarks-data", base::Value(refresh));
+
+ if (IsBrowserLite()) {
+ Browser* browser = BrowserList::GetInstance()->GetLastActive();
+ if (!browser) {
+ LOG(INFO) << "browser is null";
+ return;
+ }
+ Profile* profile = browser->profile();
+ bookmarks::BookmarkModel* model =
+ BookmarkModelFactory::GetForBrowserContext(profile);
+
+ if (!model->loaded()) {
+ LOG(INFO) << "Model not yet loaded";
+ return;
+ }
+
+ const base::Uuid& bookmark_node_uuid = base::Uuid::ParseCaseInsensitive(id);
+
+ if (!bookmark_node_uuid.is_valid()) {
+ LOG(INFO) << "Invalid Bookmark UUID";
+ return;
+ }
+
+ const bookmarks::BookmarkNode* bookmark_node =
+ model->GetNodeByUuid(bookmark_node_uuid, bookmarks::BookmarkModel::NodeTypeForUuidLookup::kLocalOrSyncableNodes);
+ model->SetTitle(bookmark_node, base::UTF8ToUTF16(title),
+ bookmarks::metrics::BookmarkEditSource::kUser);
+ model->SetURL(bookmark_node, GURL(url),
+ bookmarks::metrics::BookmarkEditSource::kUser);
+
+ BookmarkStateChanged();
+ } else {
+ auto bookmark_controller =
+ samsung_browser_main::SamsungBrowserCore::instance()
+ ->BookmarkButtonController();
+ bookmark_controller->EditBookmark(samsung_browser_fw_core::BookmarkID(id),
+ url, title);
+ bool refresh = true;
+ FireWebUIListener("change-in-bookmarks-data", base::Value(refresh));
+ }
}
void SamsungBookmarksHandler::bookmarkAddedCallback(){
system_config_manager->RemoveImfChangedObserver(this);
}
}
+
+bool SamsungBookmarksHandler::IsBrowserLite() {
+ const base::CommandLine* command_line =
+ base::CommandLine::ForCurrentProcess();
+
+ return command_line->HasSwitch(switches::kBrowserLite);
+}
\ No newline at end of file