blob: 23e90c900b6a9ad2dbb8c3153a0c50237bc751bc [file] [log] [blame]
// Copyright 2020 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 "chrome/browser/ui/webui/tab_search/tab_search_page_handler.h"
#include <memory>
#include <string>
#include <utility>
#include <vector>
#include "base/base64.h"
#include "chrome/browser/extensions/extension_tab_util.h"
#include "chrome/browser/favicon/favicon_utils.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_finder.h"
#include "chrome/browser/ui/browser_list.h"
#include "chrome/browser/ui/browser_window.h"
#include "chrome/browser/ui/tabs/tab_renderer_data.h"
#include "chrome/browser/ui/webui/util/image_util.h"
TabSearchPageHandler::TabSearchPageHandler(
mojo::PendingReceiver<tab_search::mojom::PageHandler> receiver,
mojo::PendingRemote<tab_search::mojom::Page> page,
content::WebUI* web_ui)
: receiver_(this, std::move(receiver)),
page_(std::move(page)),
browser_(chrome::FindLastActive()),
web_ui_(web_ui) {
DCHECK(browser_);
}
TabSearchPageHandler::~TabSearchPageHandler() = default;
void TabSearchPageHandler::GetProfileTabs(GetProfileTabsCallback callback) {
auto profile_tabs = tab_search::mojom::ProfileTabs::New();
Profile* profile = browser_->profile();
for (auto* browser : *BrowserList::GetInstance()) {
if (browser->profile() != profile) {
continue;
}
TabStripModel* tab_strip_model = browser->tab_strip_model();
auto window_tabs = tab_search::mojom::WindowTabs::New();
window_tabs->active = (browser == browser_);
for (int i = 0; i < tab_strip_model->count(); ++i) {
window_tabs->tabs.push_back(
GetTabData(browser, tab_strip_model->GetWebContentsAt(i), i));
}
profile_tabs->windows.push_back(std::move(window_tabs));
}
std::move(callback).Run(std::move(profile_tabs));
}
void TabSearchPageHandler::GetTabGroups(GetTabGroupsCallback callback) {
// TODO(crbug.com/1096120): Implement this when we can get theme color from
// browser
NOTIMPLEMENTED();
}
void TabSearchPageHandler::SwitchToTab(
tab_search::mojom::SwitchToTabInfoPtr switch_to_tab_info) {
Profile* profile = browser_->profile();
for (auto* browser : *BrowserList::GetInstance()) {
if (browser->profile() != profile) {
continue;
}
TabStripModel* tab_strip_model = browser->tab_strip_model();
for (int index = 0; index < tab_strip_model->count(); ++index) {
content::WebContents* contents = tab_strip_model->GetWebContentsAt(index);
if (extensions::ExtensionTabUtil::GetTabId(contents) ==
switch_to_tab_info->tab_id) {
tab_strip_model->ActivateTabAt(index);
browser->window()->Activate();
return;
}
}
}
}
tab_search::mojom::TabPtr TabSearchPageHandler::GetTabData(
Browser* browser,
content::WebContents* contents,
int index) {
auto tab_data = tab_search::mojom::Tab::New();
tab_data->active = browser->tab_strip_model()->active_index() == index;
tab_data->tab_id = extensions::ExtensionTabUtil::GetTabId(contents);
tab_data->index = index;
const base::Optional<tab_groups::TabGroupId> group_id =
browser->tab_strip_model()->GetTabGroupForTab(index);
if (group_id.has_value()) {
tab_data->group_id = group_id.value().ToString();
}
TabRendererData tab_renderer_data =
TabRendererData::FromTabInModel(browser->tab_strip_model(), index);
tab_data->pinned = tab_renderer_data.pinned;
tab_data->title = base::UTF16ToUTF8(tab_renderer_data.title);
tab_data->url = tab_renderer_data.visible_url.GetContent();
if (tab_renderer_data.favicon.isNull()) {
tab_data->is_default_favicon = true;
} else {
tab_data->fav_icon_url = webui::EncodePNGAndMakeDataURI(
tab_renderer_data.favicon, web_ui_->GetDeviceScaleFactor());
tab_data->is_default_favicon =
tab_renderer_data.favicon.BackedBySameObjectAs(
favicon::GetDefaultFavicon().AsImageSkia());
}
tab_data->show_icon = tab_renderer_data.show_icon;
return tab_data;
}