summaryrefslogtreecommitdiff
path: root/chromium/weblayer/browser/browser_impl.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/weblayer/browser/browser_impl.cc')
-rw-r--r--chromium/weblayer/browser/browser_impl.cc198
1 files changed, 133 insertions, 65 deletions
diff --git a/chromium/weblayer/browser/browser_impl.cc b/chromium/weblayer/browser/browser_impl.cc
index d9344a7b4e6..b7f5dc490b3 100644
--- a/chromium/weblayer/browser/browser_impl.cc
+++ b/chromium/weblayer/browser/browser_impl.cc
@@ -10,11 +10,14 @@
#include "base/containers/unique_ptr_adapters.h"
#include "base/memory/ptr_util.h"
#include "base/path_service.h"
+#include "base/stl_util.h"
#include "components/base32/base32.h"
-#include "content/public/browser/browser_context.h"
#include "content/public/common/web_preferences.h"
+#include "weblayer/browser/browser_context_impl.h"
+#include "weblayer/browser/browser_list.h"
#include "weblayer/browser/feature_list_creator.h"
#include "weblayer/browser/persistence/browser_persister.h"
+#include "weblayer/browser/persistence/browser_persister_file_utils.h"
#include "weblayer/browser/persistence/minimal_browser_persister.h"
#include "weblayer/browser/profile_impl.h"
#include "weblayer/browser/tab_impl.h"
@@ -26,6 +29,9 @@
#include "base/android/jni_array.h"
#include "base/android/jni_string.h"
#include "base/json/json_writer.h"
+#include "components/metrics/metrics_service.h"
+#include "components/ukm/ukm_service.h"
+#include "weblayer/browser/android/metrics/weblayer_metrics_service_client.h"
#include "weblayer/browser/browser_process.h"
#include "weblayer/browser/java/jni/BrowserImpl_jni.h"
#endif
@@ -38,8 +44,43 @@ using base::android::ScopedJavaLocalRef;
namespace weblayer {
-// TODO(timvolodine): consider using an observer for this, crbug.com/1068713.
-int BrowserImpl::browser_count_ = 0;
+namespace {
+
+#if defined(OS_ANDROID)
+void UpdateMetricsService() {
+ static bool s_foreground = false;
+ // TODO(sky): convert this to observer.
+ bool foreground = BrowserList::GetInstance()->HasAtLeastOneResumedBrowser();
+
+ if (foreground == s_foreground)
+ return;
+
+ s_foreground = foreground;
+
+ auto* metrics_service =
+ WebLayerMetricsServiceClient::GetInstance()->GetMetricsService();
+ if (metrics_service) {
+ if (foreground)
+ metrics_service->OnAppEnterForeground();
+ else
+ metrics_service->OnAppEnterBackground();
+ }
+
+ auto* ukm_service =
+ WebLayerMetricsServiceClient::GetInstance()->GetUkmService();
+ if (ukm_service) {
+ if (foreground)
+ ukm_service->OnAppEnterForeground();
+ else
+ ukm_service->OnAppEnterBackground();
+ }
+}
+#endif // defined(OS_ANDROID)
+
+} // namespace
+
+// static
+constexpr char BrowserImpl::kPersistenceFilePrefix[];
std::unique_ptr<Browser> Browser::Create(
Profile* profile,
@@ -60,16 +101,13 @@ BrowserImpl::~BrowserImpl() {
DCHECK(tabs_.empty());
#else
while (!tabs_.empty())
- RemoveTab(tabs_.back().get());
+ DestroyTab(tabs_.back().get());
#endif
- profile_->DecrementBrowserImplCount();
- browser_count_--;
- DCHECK(browser_count_ >= 0);
+ BrowserList::GetInstance()->RemoveBrowser(this);
#if defined(OS_ANDROID)
- if (browser_count_ == 0) {
+ if (BrowserList::GetInstance()->browsers().empty())
BrowserProcess::GetInstance()->StopSafeBrowsingService();
- }
#endif
}
@@ -79,12 +117,15 @@ TabImpl* BrowserImpl::CreateTabForSessionRestore(
std::unique_ptr<TabImpl> tab =
std::make_unique<TabImpl>(profile_, std::move(web_contents), guid);
#if defined(OS_ANDROID)
- Java_BrowserImpl_createTabForSessionRestore(
+ Java_BrowserImpl_createJavaTabForNativeTab(
AttachCurrentThread(), java_impl_, reinterpret_cast<jlong>(tab.get()));
#endif
- TabImpl* tab_ptr = tab.get();
- AddTab(std::move(tab));
- return tab_ptr;
+ return AddTab(std::move(tab));
+}
+
+TabImpl* BrowserImpl::CreateTab(
+ std::unique_ptr<content::WebContents> web_contents) {
+ return CreateTabForSessionRestore(std::move(web_contents), std::string());
}
#if defined(OS_ANDROID)
@@ -95,13 +136,7 @@ bool BrowserImpl::CompositorHasSurface() {
void BrowserImpl::AddTab(JNIEnv* env,
long native_tab) {
- TabImpl* tab = reinterpret_cast<TabImpl*>(native_tab);
- std::unique_ptr<Tab> owned_tab;
- if (tab->browser())
- owned_tab = tab->browser()->RemoveTab(tab);
- else
- owned_tab.reset(tab);
- AddTab(std::move(owned_tab));
+ AddTab(reinterpret_cast<TabImpl*>(native_tab));
}
void BrowserImpl::RemoveTab(JNIEnv* env,
@@ -158,8 +193,7 @@ ScopedJavaLocalRef<jbyteArray> BrowserImpl::GetBrowserPersisterCryptoKey(
ScopedJavaLocalRef<jbyteArray> BrowserImpl::GetMinimalPersistenceState(
JNIEnv* env) {
- auto state = GetMinimalPersistenceState();
- return base::android::ToJavaByteArray(env, &(state.front()), state.size());
+ return base::android::ToJavaByteArray(env, GetMinimalPersistenceState());
}
void BrowserImpl::RestoreStateIfNecessary(
@@ -203,6 +237,14 @@ void BrowserImpl::OnFragmentStart(JNIEnv* env) {
FeatureListCreator::GetInstance()->OnBrowserFragmentStarted();
}
+void BrowserImpl::OnFragmentResume(JNIEnv* env) {
+ UpdateFragmentResumedState(true);
+}
+
+void BrowserImpl::OnFragmentPause(JNIEnv* env) {
+ UpdateFragmentResumedState(false);
+}
+
#endif
std::vector<uint8_t> BrowserImpl::GetMinimalPersistenceState(
@@ -223,41 +265,19 @@ void BrowserImpl::SetWebPreferences(content::WebPreferences* prefs) {
#endif
}
-Tab* BrowserImpl::AddTab(std::unique_ptr<Tab> tab) {
+void BrowserImpl::AddTab(Tab* tab) {
DCHECK(tab);
- TabImpl* tab_impl = static_cast<TabImpl*>(tab.get());
- DCHECK(!tab_impl->browser());
- tabs_.push_back(std::move(tab));
- tab_impl->set_browser(this);
-#if defined(OS_ANDROID)
- Java_BrowserImpl_onTabAdded(AttachCurrentThread(), java_impl_,
- tab_impl->GetJavaTab());
-#endif
- for (BrowserObserver& obs : browser_observers_)
- obs.OnTabAdded(tab_impl);
- return tab_impl;
-}
-
-std::unique_ptr<Tab> BrowserImpl::RemoveTab(Tab* tab) {
TabImpl* tab_impl = static_cast<TabImpl*>(tab);
- DCHECK_EQ(this, tab_impl->browser());
- static_cast<TabImpl*>(tab)->set_browser(nullptr);
- auto iter =
- std::find_if(tabs_.begin(), tabs_.end(), base::MatchesUniquePtr(tab));
- DCHECK(iter != tabs_.end());
- std::unique_ptr<Tab> owned_tab = std::move(*iter);
- tabs_.erase(iter);
- const bool active_tab_changed = active_tab_ == tab;
- if (active_tab_changed)
- SetActiveTab(nullptr);
+ std::unique_ptr<Tab> owned_tab;
+ if (tab_impl->browser())
+ owned_tab = tab_impl->browser()->RemoveTab(tab_impl);
+ else
+ owned_tab.reset(tab_impl);
+ AddTab(std::move(owned_tab));
+}
-#if defined(OS_ANDROID)
- Java_BrowserImpl_onTabRemoved(AttachCurrentThread(), java_impl_,
- tab ? tab_impl->GetJavaTab() : nullptr);
-#endif
- for (BrowserObserver& obs : browser_observers_)
- obs.OnTabRemoved(tab, active_tab_changed);
- return owned_tab;
+void BrowserImpl::DestroyTab(Tab* tab) {
+ RemoveTab(tab);
}
void BrowserImpl::SetActiveTab(Tab* tab) {
@@ -291,6 +311,10 @@ std::vector<Tab*> BrowserImpl::GetTabs() {
return tabs;
}
+Tab* BrowserImpl::CreateTab() {
+ return CreateTab(nullptr);
+}
+
void BrowserImpl::PrepareForShutdown() {
browser_persister_.reset();
}
@@ -312,9 +336,18 @@ void BrowserImpl::RemoveObserver(BrowserObserver* observer) {
browser_observers_.RemoveObserver(observer);
}
+void BrowserImpl::VisibleSecurityStateOfActiveTabChanged() {
+ if (visible_security_state_changed_callback_for_tests_)
+ std::move(visible_security_state_changed_callback_for_tests_).Run();
+
+#if defined(OS_ANDROID)
+ JNIEnv* env = base::android::AttachCurrentThread();
+ Java_BrowserImpl_onVisibleSecurityStateOfActiveTabChanged(env, java_impl_);
+#endif
+}
+
BrowserImpl::BrowserImpl(ProfileImpl* profile) : profile_(profile) {
- profile_->IncrementBrowserImplCount();
- browser_count_++;
+ BrowserList::GetInstance()->AddBrowser(this);
}
void BrowserImpl::RestoreStateIfNecessary(
@@ -328,24 +361,59 @@ void BrowserImpl::RestoreStateIfNecessary(
}
}
-void BrowserImpl::VisibleSecurityStateOfActiveTabChanged() {
- if (visible_security_state_changed_callback_for_tests_)
- std::move(visible_security_state_changed_callback_for_tests_).Run();
+TabImpl* BrowserImpl::AddTab(std::unique_ptr<Tab> tab) {
+ TabImpl* tab_impl = static_cast<TabImpl*>(tab.get());
+ DCHECK(!tab_impl->browser());
+ tabs_.push_back(std::move(tab));
+ tab_impl->set_browser(this);
+#if defined(OS_ANDROID)
+ Java_BrowserImpl_onTabAdded(AttachCurrentThread(), java_impl_,
+ tab_impl->GetJavaTab());
+#endif
+ for (BrowserObserver& obs : browser_observers_)
+ obs.OnTabAdded(tab_impl);
+ return tab_impl;
+}
+
+std::unique_ptr<Tab> BrowserImpl::RemoveTab(Tab* tab) {
+ TabImpl* tab_impl = static_cast<TabImpl*>(tab);
+ DCHECK_EQ(this, tab_impl->browser());
+ static_cast<TabImpl*>(tab)->set_browser(nullptr);
+ auto iter =
+ std::find_if(tabs_.begin(), tabs_.end(), base::MatchesUniquePtr(tab));
+ DCHECK(iter != tabs_.end());
+ std::unique_ptr<Tab> owned_tab = std::move(*iter);
+ tabs_.erase(iter);
+ const bool active_tab_changed = active_tab_ == tab;
+ if (active_tab_changed)
+ SetActiveTab(nullptr);
#if defined(OS_ANDROID)
- JNIEnv* env = base::android::AttachCurrentThread();
- Java_BrowserImpl_onVisibleSecurityStateOfActiveTabChanged(env, java_impl_);
+ Java_BrowserImpl_onTabRemoved(AttachCurrentThread(), java_impl_,
+ tab ? tab_impl->GetJavaTab() : nullptr);
#endif
+ for (BrowserObserver& obs : browser_observers_)
+ obs.OnTabRemoved(tab, active_tab_changed);
+ return owned_tab;
}
base::FilePath BrowserImpl::GetBrowserPersisterDataPath() {
- base::FilePath base_path = profile_->GetBrowserPersisterDataBaseDir();
- DCHECK(!GetPersistenceId().empty());
- const std::string encoded_name = base32::Base32Encode(GetPersistenceId());
- return base_path.AppendASCII("State" + encoded_name);
+ return BuildPathForBrowserPersister(
+ profile_->GetBrowserPersisterDataBaseDir(), GetPersistenceId());
}
#if defined(OS_ANDROID)
+void BrowserImpl::UpdateFragmentResumedState(bool state) {
+ const bool old_has_at_least_one_active_browser =
+ BrowserList::GetInstance()->HasAtLeastOneResumedBrowser();
+ fragment_resumed_ = state;
+ UpdateMetricsService();
+ if (old_has_at_least_one_active_browser !=
+ BrowserList::GetInstance()->HasAtLeastOneResumedBrowser()) {
+ BrowserList::GetInstance()->NotifyHasAtLeastOneResumedBrowserChanged();
+ }
+}
+
// This function is friended. JNI_BrowserImpl_CreateBrowser can not be
// friended, as it requires browser_impl.h to include BrowserImpl_jni.h, which
// is problematic (meaning not really supported and generates compile errors).