// 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. #ifndef WEBLAYER_BROWSER_BROWSER_IMPL_H_ #define WEBLAYER_BROWSER_BROWSER_IMPL_H_ #include #include #include "base/callback.h" #include "base/observer_list.h" #include "build/build_config.h" #include "weblayer/public/browser.h" #if defined(OS_ANDROID) #include "base/android/scoped_java_ref.h" #endif namespace base { class FilePath; } namespace content { class WebContents; struct WebPreferences; } namespace weblayer { class BrowserPersister; class ProfileImpl; class TabImpl; class BrowserImpl : public Browser { public: // Prefix used for storing persistence state. static constexpr char kPersistenceFilePrefix[] = "State"; BrowserImpl(const BrowserImpl&) = delete; BrowserImpl& operator=(const BrowserImpl&) = delete; ~BrowserImpl() override; BrowserPersister* browser_persister() { return browser_persister_.get(); } ProfileImpl* profile() { return profile_; } // Creates and adds a Tab from session restore. The returned tab is owned by // this Browser. TabImpl* CreateTabForSessionRestore( std::unique_ptr web_contents, const std::string& guid); TabImpl* CreateTab(std::unique_ptr web_contents); #if defined(OS_ANDROID) bool CompositorHasSurface(); void AddTab(JNIEnv* env, long native_tab); void RemoveTab(JNIEnv* env, long native_tab); base::android::ScopedJavaLocalRef GetTabs(JNIEnv* env); void SetActiveTab(JNIEnv* env, long native_tab); base::android::ScopedJavaLocalRef GetActiveTab(JNIEnv* env); void PrepareForShutdown(JNIEnv* env); base::android::ScopedJavaLocalRef GetPersistenceId(JNIEnv* env); void SaveBrowserPersisterIfNecessary(JNIEnv* env); base::android::ScopedJavaLocalRef GetBrowserPersisterCryptoKey( JNIEnv* env); base::android::ScopedJavaLocalRef GetMinimalPersistenceState( JNIEnv* env); void RestoreStateIfNecessary( JNIEnv* env, const base::android::JavaParamRef& j_persistence_id, const base::android::JavaParamRef& j_persistence_crypto_key, const base::android::JavaParamRef& j_minimal_persistence_state); void WebPreferencesChanged(JNIEnv* env); void OnFragmentStart(JNIEnv* env); void OnFragmentResume(JNIEnv* env); void OnFragmentPause(JNIEnv* env); bool fragment_resumed() { return fragment_resumed_; } #endif // Used in tests to specify a non-default max (0 means use the default). std::vector GetMinimalPersistenceState(int max_size_in_bytes); // Used by tests to specify a callback to listen to changes to visible // security state. void set_visible_security_state_callback_for_tests( base::OnceClosure closure) { visible_security_state_changed_callback_for_tests_ = std::move(closure); } bool GetPasswordEchoEnabled(); void SetWebPreferences(content::WebPreferences* prefs); // Browser: void AddTab(Tab* tab) override; void DestroyTab(Tab* tab) override; void SetActiveTab(Tab* tab) override; Tab* GetActiveTab() override; std::vector GetTabs() override; Tab* CreateTab() override; void PrepareForShutdown() override; std::string GetPersistenceId() override; std::vector GetMinimalPersistenceState() override; void AddObserver(BrowserObserver* observer) override; void RemoveObserver(BrowserObserver* observer) override; void VisibleSecurityStateOfActiveTabChanged() override; private: // For creation. friend class Browser; #if defined(OS_ANDROID) friend BrowserImpl* CreateBrowserForAndroid( ProfileImpl*, const base::android::JavaParamRef&); #endif explicit BrowserImpl(ProfileImpl* profile); void RestoreStateIfNecessary(const PersistenceInfo& persistence_info); TabImpl* AddTab(std::unique_ptr tab); std::unique_ptr RemoveTab(Tab* tab); // Returns the path used by |browser_persister_|. base::FilePath GetBrowserPersisterDataPath(); #if defined(OS_ANDROID) void UpdateFragmentResumedState(bool state); bool fragment_resumed_ = false; base::android::ScopedJavaGlobalRef java_impl_; #endif base::ObserverList browser_observers_; ProfileImpl* const profile_; std::vector> tabs_; TabImpl* active_tab_ = nullptr; std::string persistence_id_; std::unique_ptr browser_persister_; base::OnceClosure visible_security_state_changed_callback_for_tests_; }; } // namespace weblayer #endif // WEBLAYER_BROWSER_BROWSER_IMPL_H_