blob: e4fe35db1884b37cda9f52a878664af50799ac62 [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 "base/test/bind.h"
#include "build/build_config.h"
#include "components/content_settings/core/browser/host_content_settings_map.h"
#include "ui/gfx/image/image_unittest_util.h"
#include "weblayer/browser/browser_list.h"
#include "weblayer/browser/browser_list_observer.h"
#include "weblayer/browser/default_search_engine.h"
#include "weblayer/browser/favicon/favicon_fetcher_impl.h"
#include "weblayer/browser/favicon/test_favicon_fetcher_delegate.h"
#include "weblayer/browser/host_content_settings_map_factory.h"
#include "weblayer/browser/profile_impl.h"
#include "weblayer/browser/tab_impl.h"
#include "weblayer/public/browser.h"
#include "weblayer/shell/browser/shell.h"
#include "weblayer/test/weblayer_browser_test.h"
#include "weblayer/test/weblayer_browser_test_utils.h"
namespace weblayer {
using ProfileBrowserTest = WebLayerBrowserTest;
// TODO(crbug.com/654704): Android does not support PRE_ tests.
#if !defined(OS_ANDROID)
// UKM enabling via Profile persists across restarts.
IN_PROC_BROWSER_TEST_F(ProfileBrowserTest, PRE_PersistUKM) {
GetProfile()->SetBooleanSetting(SettingType::UKM_ENABLED, true);
}
IN_PROC_BROWSER_TEST_F(ProfileBrowserTest, PersistUKM) {
ASSERT_TRUE(GetProfile()->GetBooleanSetting(SettingType::UKM_ENABLED));
}
// Enabling Network Prediction via Profile persists across restarts.
IN_PROC_BROWSER_TEST_F(ProfileBrowserTest, PRE_PersistNetworkPrediction) {
GetProfile()->SetBooleanSetting(SettingType::NETWORK_PREDICTION_ENABLED,
false);
}
IN_PROC_BROWSER_TEST_F(ProfileBrowserTest, PersistNetworkPrediction) {
ASSERT_FALSE(
GetProfile()->GetBooleanSetting(SettingType::NETWORK_PREDICTION_ENABLED));
}
#endif // !defined(OS_ANDROID)
IN_PROC_BROWSER_TEST_F(ProfileBrowserTest, GetCachedFaviconForPageUrl) {
// Navigation to a page with a favicon.
ASSERT_TRUE(embedded_test_server()->Start());
TestFaviconFetcherDelegate fetcher_delegate;
auto fetcher = shell()->tab()->CreateFaviconFetcher(&fetcher_delegate);
const GURL url =
embedded_test_server()->GetURL("/simple_page_with_favicon.html");
NavigateAndWaitForCompletion(url, shell());
fetcher_delegate.WaitForFavicon();
EXPECT_FALSE(fetcher_delegate.last_image().IsEmpty());
EXPECT_EQ(1, fetcher_delegate.on_favicon_changed_call_count());
// Request the favicon.
base::RunLoop run_loop;
static_cast<TabImpl*>(shell()->tab())
->profile()
->GetCachedFaviconForPageUrl(
url, base::BindLambdaForTesting([&](gfx::Image image) {
// The last parameter is the max difference allowed for each color
// component. As the image is encoded before saving to disk some
// variance is expected.
EXPECT_TRUE(gfx::test::AreImagesClose(
image, fetcher_delegate.last_image(), 10));
run_loop.Quit();
}));
run_loop.Run();
}
IN_PROC_BROWSER_TEST_F(ProfileBrowserTest, ClearBrowsingDataDeletesFavicons) {
// Navigate to a page with a favicon.
ASSERT_TRUE(embedded_test_server()->Start());
TestFaviconFetcherDelegate fetcher_delegate;
auto fetcher = shell()->tab()->CreateFaviconFetcher(&fetcher_delegate);
const GURL url =
embedded_test_server()->GetURL("/simple_page_with_favicon.html");
NavigateAndWaitForCompletion(url, shell());
fetcher_delegate.WaitForNonemptyFavicon();
EXPECT_FALSE(fetcher_delegate.last_image().IsEmpty());
EXPECT_EQ(1, fetcher_delegate.on_favicon_changed_call_count());
// Delete the favicons.
base::RunLoop run_loop;
base::Time now = base::Time::Now();
ProfileImpl* profile = static_cast<TabImpl*>(shell()->tab())->profile();
profile->ClearBrowsingData({BrowsingDataType::COOKIES_AND_SITE_DATA},
now - base::TimeDelta::FromMinutes(5), now,
run_loop.QuitClosure());
run_loop.Run();
// Ask for the cached favicon, there shouldn't be one.
base::RunLoop run_loop2;
profile->GetCachedFaviconForPageUrl(
url, base::BindLambdaForTesting([&](gfx::Image image) {
EXPECT_TRUE(image.IsEmpty());
run_loop2.Quit();
}));
run_loop2.Run();
// Navigate to another page, and verify favicon is downloaded.
fetcher_delegate.ClearLastImage();
const GURL url2 =
embedded_test_server()->GetURL("/simple_page_with_favicon2.html");
NavigateAndWaitForCompletion(url2, shell());
fetcher_delegate.WaitForNonemptyFavicon();
EXPECT_FALSE(fetcher_delegate.last_image().IsEmpty());
EXPECT_EQ(2, fetcher_delegate.on_favicon_changed_call_count());
// And fetch the favicon one more time.
base::RunLoop run_loop3;
profile->GetCachedFaviconForPageUrl(
url2, base::BindLambdaForTesting([&](gfx::Image image) {
EXPECT_FALSE(image.IsEmpty());
// The last parameter is the max difference allowed for each color
// component. As the image is encoded before saving to disk some
// variance is expected.
EXPECT_TRUE(gfx::test::AreImagesClose(
image, fetcher_delegate.last_image(), 10));
run_loop3.Quit();
}));
run_loop3.Run();
}
// Test default value.
IN_PROC_BROWSER_TEST_F(ProfileBrowserTest, DefaultNetworkPredictionState) {
ASSERT_TRUE(
GetProfile()->GetBooleanSetting(SettingType::NETWORK_PREDICTION_ENABLED));
}
IN_PROC_BROWSER_TEST_F(ProfileBrowserTest, ClearSiteSettings) {
auto dse_origin = GetDseOrigin().GetURL();
auto foo_origin = GURL("http://www.foo.com");
auto* settings_map = HostContentSettingsMapFactory::GetForBrowserContext(
static_cast<TabImpl*>(shell()->tab())
->web_contents()
->GetBrowserContext());
EXPECT_EQ(settings_map->GetContentSetting(dse_origin, dse_origin,
ContentSettingsType::GEOLOCATION),
CONTENT_SETTING_ALLOW);
EXPECT_EQ(settings_map->GetContentSetting(foo_origin, foo_origin,
ContentSettingsType::GEOLOCATION),
CONTENT_SETTING_ASK);
settings_map->SetContentSettingDefaultScope(foo_origin, foo_origin,
ContentSettingsType::GEOLOCATION,
CONTENT_SETTING_ALLOW);
// Ensure clearing things other than site data doesn't change it
base::RunLoop run_loop;
base::Time now = base::Time::Now();
ProfileImpl* profile = static_cast<TabImpl*>(shell()->tab())->profile();
profile->ClearBrowsingData(
{BrowsingDataType::COOKIES_AND_SITE_DATA, BrowsingDataType::CACHE},
base::Time(), now, run_loop.QuitClosure());
run_loop.Run();
EXPECT_EQ(settings_map->GetContentSetting(dse_origin, dse_origin,
ContentSettingsType::GEOLOCATION),
CONTENT_SETTING_ALLOW);
EXPECT_EQ(settings_map->GetContentSetting(foo_origin, foo_origin,
ContentSettingsType::GEOLOCATION),
CONTENT_SETTING_ALLOW);
// Now clear site data.
base::RunLoop run_loop2;
profile->ClearBrowsingData({BrowsingDataType::SITE_SETTINGS}, base::Time(),
now, run_loop2.QuitClosure());
run_loop2.Run();
EXPECT_EQ(settings_map->GetContentSetting(dse_origin, dse_origin,
ContentSettingsType::GEOLOCATION),
CONTENT_SETTING_ALLOW);
EXPECT_EQ(settings_map->GetContentSetting(foo_origin, foo_origin,
ContentSettingsType::GEOLOCATION),
CONTENT_SETTING_ASK);
}
// This test creates a Browser and Tab, which doesn't work well with Java when
// driven from native code.
#if !defined(OS_ANDROID)
class BrowserListObserverImpl : public BrowserListObserver {
public:
BrowserListObserverImpl(std::unique_ptr<Profile> profile,
base::OnceClosure done_closure)
: profile_(std::move(profile)), done_closure_(std::move(done_closure)) {
BrowserList::GetInstance()->AddObserver(this);
}
~BrowserListObserverImpl() override {
BrowserList::GetInstance()->RemoveObserver(this);
}
// BrowserListObserver:
void OnBrowserDestroyed(Browser* browser) override {
Profile::DestroyAndDeleteDataFromDisk(std::move(profile_),
std::move(done_closure_));
}
private:
std::unique_ptr<Profile> profile_;
base::OnceClosure done_closure_;
};
// This is a crash test to verify no memory related problems calling
// DestroyAndDeleteDataFromDisk() from OnBrowserDestroyed().
IN_PROC_BROWSER_TEST_F(ProfileBrowserTest, DestroyFromOnBrowserRemoved) {
auto profile = Profile::Create("2", true);
auto browser = Browser::Create(profile.get(), nullptr);
// MarkAsDeleted() may be called multiple times.
static_cast<ProfileImpl*>(profile.get())->MarkAsDeleted();
static_cast<ProfileImpl*>(profile.get())->MarkAsDeleted();
base::RunLoop run_loop;
BrowserListObserverImpl observer(std::move(profile), run_loop.QuitClosure());
browser.reset();
run_loop.Run();
// No crashes should happen.
}
#endif
} // namespace weblayer