Skip to content
This repository has been archived by the owner on Jan 4, 2019. It is now read-only.

Commit

Permalink
add tab manager
Browse files Browse the repository at this point in the history
  • Loading branch information
bridiver committed Mar 29, 2017
1 parent 5911b9c commit def7f26
Show file tree
Hide file tree
Showing 24 changed files with 1,115 additions and 137 deletions.
99 changes: 49 additions & 50 deletions atom/browser/api/atom_api_app.cc
Original file line number Diff line number Diff line change
Expand Up @@ -71,16 +71,15 @@
#include "content/public/browser/notification_types.h"
#endif

using atom::Browser;
using content::CertificateRequestResultType;

namespace mate {

#if defined(OS_WIN)
template<>
struct Converter<Browser::UserTask> {
struct Converter<atom::Browser::UserTask> {
static bool FromV8(v8::Isolate* isolate, v8::Local<v8::Value> val,
Browser::UserTask* out) {
atom::Browser::UserTask* out) {
mate::Dictionary dict;
if (!ConvertFromV8(isolate, val, &dict))
return false;
Expand Down Expand Up @@ -312,9 +311,9 @@ struct Converter<JumpListResult> {
#endif

template<>
struct Converter<Browser::LoginItemSettings> {
struct Converter<atom::Browser::LoginItemSettings> {
static bool FromV8(v8::Isolate* isolate, v8::Local<v8::Value> val,
Browser::LoginItemSettings* out) {
atom::Browser::LoginItemSettings* out) {
mate::Dictionary dict;
if (!ConvertFromV8(isolate, val, &dict))
return false;
Expand All @@ -325,7 +324,7 @@ struct Converter<Browser::LoginItemSettings> {
}

static v8::Local<v8::Value> ToV8(v8::Isolate* isolate,
Browser::LoginItemSettings val) {
atom::Browser::LoginItemSettings val) {
mate::Dictionary dict = mate::Dictionary::CreateEmpty(isolate);
dict.Set("openAtLogin", val.open_at_login);
dict.Set("openAsHidden", val.open_as_hidden);
Expand Down Expand Up @@ -432,7 +431,7 @@ bool NotificationCallbackWrapper(
const base::CommandLine::StringVector& cmd,
const base::FilePath& cwd) {
// Make sure the callback is called after app gets ready.
if (Browser::Get()->is_ready()) {
if (atom::Browser::Get()->is_ready()) {
callback.Run(cmd, cwd);
} else {
scoped_refptr<base::SingleThreadTaskRunner> task_runner(
Expand All @@ -441,7 +440,7 @@ bool NotificationCallbackWrapper(
FROM_HERE, base::Bind(base::IgnoreResult(callback), cmd, cwd));
}
// ProcessSingleton needs to know whether current process is quiting.
return !Browser::Get()->is_shutting_down();
return !atom::Browser::Get()->is_shutting_down();
}

void OnClientCertificateSelected(
Expand Down Expand Up @@ -510,7 +509,7 @@ int ImportIntoCertStore(
App::App(v8::Isolate* isolate) {
static_cast<brave::BraveContentBrowserClient*>(
brave::BraveContentBrowserClient::Get())->set_delegate(this);
Browser::Get()->AddObserver(this);
atom::Browser::Get()->AddObserver(this);
content::GpuDataManager::GetInstance()->AddObserver(this);
Init(isolate);
static_cast<BrowserProcessImpl*>(g_browser_process)->set_app(this);
Expand Down Expand Up @@ -558,7 +557,7 @@ void App::Observe(
App::~App() {
static_cast<brave::BraveContentBrowserClient*>(
brave::BraveContentBrowserClient::Get())->set_delegate(nullptr);
Browser::Get()->RemoveObserver(this);
atom::Browser::Get()->RemoveObserver(this);
net::NetworkChangeNotifier::RemoveMaxBandwidthObserver(this);
content::GpuDataManager::GetInstance()->RemoveObserver(this);
}
Expand Down Expand Up @@ -813,7 +812,7 @@ bool App::Relaunch(mate::Arguments* js_args) {
}

void App::DisableHardwareAcceleration(mate::Arguments* args) {
if (Browser::Get()->is_ready()) {
if (atom::Browser::Get()->is_ready()) {
args->ThrowError("app.disableHardwareAcceleration() can only be called "
"before app is ready");
return;
Expand Down Expand Up @@ -895,7 +894,7 @@ void App::OnCertificateManagerModelCreated(

#if defined(OS_WIN)
v8::Local<v8::Value> App::GetJumpListSettings() {
JumpList jump_list(Browser::Get()->GetAppUserModelID());
JumpList jump_list(atom::Browser::Get()->GetAppUserModelID());

int min_items = 10;
std::vector<JumpListItem> removed_items;
Expand All @@ -922,7 +921,7 @@ JumpListResult App::SetJumpList(v8::Local<v8::Value> val,
return JumpListResult::ARGUMENT_ERROR;
}

JumpList jump_list(Browser::Get()->GetAppUserModelID());
JumpList jump_list(atom::Browser::Get()->GetAppUserModelID());

if (delete_jump_list) {
return jump_list.Delete()
Expand Down Expand Up @@ -959,50 +958,50 @@ mate::Handle<App> App::Create(v8::Isolate* isolate) {
void App::BuildPrototype(
v8::Isolate* isolate, v8::Local<v8::FunctionTemplate> prototype) {
prototype->SetClassName(mate::StringToV8(isolate, "App"));
auto browser = base::Unretained(Browser::Get());
auto browser = base::Unretained(atom::Browser::Get());
mate::ObjectTemplateBuilder(isolate, prototype->PrototypeTemplate())
.SetMethod("quit", base::Bind(&Browser::Quit, browser))
.SetMethod("exit", base::Bind(&Browser::Exit, browser))
.SetMethod("focus", base::Bind(&Browser::Focus, browser))
.SetMethod("getVersion", base::Bind(&Browser::GetVersion, browser))
.SetMethod("setVersion", base::Bind(&Browser::SetVersion, browser))
.SetMethod("getName", base::Bind(&Browser::GetName, browser))
.SetMethod("setName", base::Bind(&Browser::SetName, browser))
.SetMethod("isReady", base::Bind(&Browser::is_ready, browser))
.SetMethod("quit", base::Bind(&atom::Browser::Quit, browser))
.SetMethod("exit", base::Bind(&atom::Browser::Exit, browser))
.SetMethod("focus", base::Bind(&atom::Browser::Focus, browser))
.SetMethod("getVersion", base::Bind(&atom::Browser::GetVersion, browser))
.SetMethod("setVersion", base::Bind(&atom::Browser::SetVersion, browser))
.SetMethod("getName", base::Bind(&atom::Browser::GetName, browser))
.SetMethod("setName", base::Bind(&atom::Browser::SetName, browser))
.SetMethod("isReady", base::Bind(&atom::Browser::is_ready, browser))
.SetMethod("addRecentDocument",
base::Bind(&Browser::AddRecentDocument, browser))
base::Bind(&atom::Browser::AddRecentDocument, browser))
.SetMethod("clearRecentDocuments",
base::Bind(&Browser::ClearRecentDocuments, browser))
base::Bind(&atom::Browser::ClearRecentDocuments, browser))
.SetMethod("setAppUserModelId",
base::Bind(&Browser::SetAppUserModelID, browser))
base::Bind(&atom::Browser::SetAppUserModelID, browser))
.SetMethod("isDefaultProtocolClient",
base::Bind(&Browser::IsDefaultProtocolClient, browser))
base::Bind(&atom::Browser::IsDefaultProtocolClient, browser))
.SetMethod("setAsDefaultProtocolClient",
base::Bind(&Browser::SetAsDefaultProtocolClient, browser))
base::Bind(&atom::Browser::SetAsDefaultProtocolClient, browser))
.SetMethod("removeAsDefaultProtocolClient",
base::Bind(&Browser::RemoveAsDefaultProtocolClient, browser))
.SetMethod("setBadgeCount", base::Bind(&Browser::SetBadgeCount, browser))
.SetMethod("getBadgeCount", base::Bind(&Browser::GetBadgeCount, browser))
base::Bind(&atom::Browser::RemoveAsDefaultProtocolClient, browser))
.SetMethod("setBadgeCount", base::Bind(&atom::Browser::SetBadgeCount, browser))
.SetMethod("getBadgeCount", base::Bind(&atom::Browser::GetBadgeCount, browser))
.SetMethod("getLoginItemSettings",
base::Bind(&Browser::GetLoginItemSettings, browser))
base::Bind(&atom::Browser::GetLoginItemSettings, browser))
.SetMethod("setLoginItemSettings",
base::Bind(&Browser::SetLoginItemSettings, browser))
base::Bind(&atom::Browser::SetLoginItemSettings, browser))
#if defined(OS_MACOSX)
.SetMethod("hide", base::Bind(&Browser::Hide, browser))
.SetMethod("show", base::Bind(&Browser::Show, browser))
.SetMethod("hide", base::Bind(&atom::Browser::Hide, browser))
.SetMethod("show", base::Bind(&atom::Browser::Show, browser))
.SetMethod("setUserActivity",
base::Bind(&Browser::SetUserActivity, browser))
base::Bind(&atom::Browser::SetUserActivity, browser))
.SetMethod("getCurrentActivityType",
base::Bind(&Browser::GetCurrentActivityType, browser))
base::Bind(&atom::Browser::GetCurrentActivityType, browser))
#endif
#if defined(OS_WIN)
.SetMethod("setUserTasks", base::Bind(&Browser::SetUserTasks, browser))
.SetMethod("setUserTasks", base::Bind(&atom::Browser::SetUserTasks, browser))
.SetMethod("getJumpListSettings", &App::GetJumpListSettings)
.SetMethod("setJumpList", &App::SetJumpList)
#endif
#if defined(OS_LINUX)
.SetMethod("isUnityRunning",
base::Bind(&Browser::IsUnityRunning, browser))
base::Bind(&atom::Browser::IsUnityRunning, browser))
#endif
.SetMethod("setPath", &App::SetPath)
.SetMethod("getPath", &App::GetPath)
Expand Down Expand Up @@ -1069,14 +1068,14 @@ void AppendSwitch(const std::string& switch_string, mate::Arguments* args) {
int DockBounce(const std::string& type) {
int request_id = -1;
if (type == "critical")
request_id = Browser::Get()->DockBounce(Browser::BOUNCE_CRITICAL);
request_id = atom::Browser::Get()->DockBounce(atom::Browser::BOUNCE_CRITICAL);
else if (type == "informational")
request_id = Browser::Get()->DockBounce(Browser::BOUNCE_INFORMATIONAL);
request_id = atom::Browser::Get()->DockBounce(atom::Browser::BOUNCE_INFORMATIONAL);
return request_id;
}

void DockSetMenu(atom::api::Menu* menu) {
Browser::Get()->DockSetMenu(menu->model());
atom::Browser::Get()->DockSetMenu(menu->model());
}
#endif

Expand All @@ -1093,21 +1092,21 @@ void Initialize(v8::Local<v8::Object> exports, v8::Local<v8::Value> unused,
base::Bind(&base::CommandLine::AppendArg,
base::Unretained(command_line)));
#if defined(OS_MACOSX)
auto browser = base::Unretained(Browser::Get());
auto browser = base::Unretained(atom::Browser::Get());
dict.SetMethod("dockBounce", &DockBounce);
dict.SetMethod("dockCancelBounce",
base::Bind(&Browser::DockCancelBounce, browser));
base::Bind(&atom::Browser::DockCancelBounce, browser));
dict.SetMethod("dockDownloadFinished",
base::Bind(&Browser::DockDownloadFinished, browser));
base::Bind(&atom::Browser::DockDownloadFinished, browser));
dict.SetMethod("dockSetBadgeText",
base::Bind(&Browser::DockSetBadgeText, browser));
base::Bind(&atom::Browser::DockSetBadgeText, browser));
dict.SetMethod("dockGetBadgeText",
base::Bind(&Browser::DockGetBadgeText, browser));
dict.SetMethod("dockHide", base::Bind(&Browser::DockHide, browser));
dict.SetMethod("dockShow", base::Bind(&Browser::DockShow, browser));
dict.SetMethod("dockIsVisible", base::Bind(&Browser::DockIsVisible, browser));
base::Bind(&atom::Browser::DockGetBadgeText, browser));
dict.SetMethod("dockHide", base::Bind(&atom::Browser::DockHide, browser));
dict.SetMethod("dockShow", base::Bind(&atom::Browser::DockShow, browser));
dict.SetMethod("dockIsVisible", base::Bind(&atom::Browser::DockIsVisible, browser));
dict.SetMethod("dockSetMenu", &DockSetMenu);
dict.SetMethod("dockSetIcon", base::Bind(&Browser::DockSetIcon, browser));
dict.SetMethod("dockSetIcon", base::Bind(&atom::Browser::DockSetIcon, browser));
#endif
}

Expand Down
46 changes: 41 additions & 5 deletions atom/browser/api/atom_api_web_contents.cc
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,8 @@
#include "chrome/browser/printing/print_view_manager_basic.h"
#include "chrome/browser/printing/print_view_manager_common.h"
#include "chrome/browser/ssl/security_state_tab_helper.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/common/custom_handlers/protocol_handler.h"
#include "components/autofill/content/browser/content_autofill_driver_factory.h"
#include "components/autofill/core/browser/autofill_manager.h"
Expand Down Expand Up @@ -1782,17 +1784,27 @@ void WebContents::Clone(mate::Arguments* args) {
options, callback)));
}

::Browser* WebContents::browser() const {
#if BUILDFLAG(ENABLE_EXTENSIONS)
auto tab_helper = extensions::TabHelper::FromWebContents(web_contents());
if (tab_helper)
return tab_helper->browser();
#endif
return nullptr;
}

void WebContents::SetActive(bool active) {
if (active)
web_contents()->WasShown();
else
web_contents()->WasHidden();

#if BUILDFLAG(ENABLE_EXTENSIONS)
auto tab_helper = extensions::TabHelper::FromWebContents(web_contents());
if (tab_helper)
tab_helper->SetActive(active);
#endif
if (active && browser()) {
int index =
browser()->tab_strip_model()->GetIndexOfWebContents(web_contents());
if (index != TabStripModel::kNoTab)
browser()->tab_strip_model()->ActivateTabAt(index, true);
}

Emit("set-active", active);
}
Expand All @@ -1807,6 +1819,30 @@ void WebContents::SetTabIndex(int index) {
Emit("set-tab-index", index);
}

void WebContents::SetPinned(bool pinned) {
auto tab_helper = extensions::TabHelper::FromWebContents(web_contents());
if (tab_helper)
tab_helper->SetPinned(pinned);

Emit("set-pinned", pinned);
}

void WebContents::SetAutoDiscardable(bool auto_discardable) {
auto tab_helper = extensions::TabHelper::FromWebContents(web_contents());
if (tab_helper)
tab_helper->SetAutoDiscardable(auto_discardable);

Emit("set-auto-discardable", auto_discardable);
}

void WebContents::Discard() {
auto tab_helper = extensions::TabHelper::FromWebContents(web_contents());
if (tab_helper) {
if (!Emit("will-discard") && tab_helper->Discard())
Emit("discarded");
}
}

#if BUILDFLAG(ENABLE_EXTENSIONS)
bool WebContents::ExecuteScriptInTab(mate::Arguments* args) {
auto tab_helper = extensions::TabHelper::FromWebContents(web_contents());
Expand Down
7 changes: 7 additions & 0 deletions atom/browser/api/atom_api_web_contents.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
#include "native_mate/handle.h"
#include "ui/gfx/image/image.h"

class Browser;
class ProtocolHandler;

namespace autofill {
Expand Down Expand Up @@ -216,8 +217,14 @@ class WebContents : public mate::TrackableObject<WebContents>,
// Focus.
void Focus();
bool IsFocused() const;

// Tab state
::Browser* browser() const;
void SetActive(bool active);
void SetTabIndex(int index);
void SetPinned(bool pinned);
void SetAutoDiscardable(bool auto_discardable);
void Discard();

// Zoom
void SetZoomLevel(double zoom);
Expand Down
2 changes: 1 addition & 1 deletion atom/browser/api/atom_api_window.cc
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
// found in the LICENSE file.

#include "atom/browser/api/atom_api_window.h"
#include "atom/common/native_mate_converters/value_converter.h"

#include "atom/browser/api/atom_api_menu.h"
#include "atom/browser/api/atom_api_web_contents.h"
Expand All @@ -14,6 +13,7 @@
#include "atom/common/native_mate_converters/gurl_converter.h"
#include "atom/common/native_mate_converters/image_converter.h"
#include "atom/common/native_mate_converters/string16_converter.h"
#include "atom/common/native_mate_converters/value_converter.h"
#include "atom/common/options_switches.h"
#include "base/command_line.h"
#include "content/public/browser/render_frame_host.h"
Expand Down
8 changes: 8 additions & 0 deletions atom/browser/common_web_contents_delegate.cc
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,9 @@
#include "chrome/browser/printing/print_preview_message_handler.h"
#include "chrome/browser/printing/print_view_manager_basic.h"
#include "chrome/browser/ssl/security_state_tab_helper.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_dialogs.h"
#include "chrome/browser/ui/browser_list.h"
#include "chrome/common/pref_names.h"
#include "chrome/grit/generated_resources.h"
#include "components/pref_registry/pref_registry_syncable.h"
Expand Down Expand Up @@ -213,6 +215,12 @@ void CommonWebContentsDelegate::SetOwnerWindow(
sessionID.set_id(id);
tab_helper->SetWindowId(id);

for (auto* browser : *BrowserList::GetInstance()) {
if (browser->window() == owner_window) {
tab_helper->SetBrowser(browser);
}
}

content::NotificationService::current()->Notify(
chrome::NOTIFICATION_TAB_PARENTED,
content::Source<content::WebContents>(web_contents),
Expand Down
Loading

0 comments on commit def7f26

Please sign in to comment.