blob: b4f891815bf6ef156e78d97f18ee86b3fbba4429 [file] [log] [blame]
// Copyright 2017 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 <memory>
#include <string>
#include <utility>
#include "base/bind.h"
#include "base/json/string_escape.h"
#include "base/memory/ref_counted_memory.h"
#include "base/optional.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/stringprintf.h"
#include "base/test/metrics/histogram_tester.h"
#include "base/test/scoped_feature_list.h"
#include "chrome/browser/search/ntp_features.h"
#include "chrome/browser/search_provider_logos/logo_service_factory.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/search/instant_test_utils.h"
#include "chrome/browser/ui/search/local_ntp_test_utils.h"
#include "chrome/common/url_constants.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/ui_test_utils.h"
#include "components/keyed_service/content/browser_context_dependency_manager.h"
#include "components/search_provider_logos/logo_service.h"
#include "content/public/browser/web_contents.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/test_navigation_observer.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "url/gurl.h"
using search_provider_logos::EncodedLogo;
using search_provider_logos::EncodedLogoCallback;
using search_provider_logos::LogoCallbacks;
using search_provider_logos::LogoCallbackReason;
using search_provider_logos::LogoObserver;
using search_provider_logos::LogoService;
using search_provider_logos::LogoType;
using testing::_;
using testing::DoAll;
using testing::Eq;
using testing::IsEmpty;
namespace {
const char kCachedB64[] = "\161\247\041\171\337\276"; // b64decode("cached++")
const char kFreshB64[] = "\176\267\254\207\357\276"; // b64decode("fresh+++")
const int kFakeboxTopPx = 56 + 200 + 29; // top margin + height + bottom margin
// A base64 encoding of a tiny but valid gif file.
const char kTinyGifData[] =
"R0lGODlhAQABAIABAP///wAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==";
scoped_refptr<base::RefCountedString> MakeRefPtr(std::string content) {
return base::RefCountedString::TakeString(&content);
}
class MockLogoService : public LogoService {
public:
MOCK_METHOD1(GetLogoPtr, void(LogoCallbacks* callbacks));
void GetLogo(LogoCallbacks callbacks) override { GetLogoPtr(&callbacks); }
void GetLogo(LogoObserver* observer) override { NOTREACHED(); }
};
ACTION_P2(ReturnCachedLogo, reason, logo) {
if (arg0->on_cached_encoded_logo_available) {
std::move(arg0->on_cached_encoded_logo_available).Run(reason, logo);
}
}
ACTION_P2(ReturnFreshLogo, reason, logo) {
if (arg0->on_fresh_encoded_logo_available) {
std::move(arg0->on_fresh_encoded_logo_available).Run(reason, logo);
}
}
} // namespace
class LocalNTPDoodleTest : public InProcessBrowserTest {
protected:
LocalNTPDoodleTest() {}
MockLogoService* logo_service() {
return static_cast<MockLogoService*>(
LogoServiceFactory::GetForProfile(browser()->profile()));
}
base::Optional<int> GetDimension(content::WebContents* tab,
const std::string& id,
const std::string& dimension) {
double value = 0.0;
if (instant_test_utils::GetDoubleFromJS(
tab,
base::StringPrintf(
"document.getElementById(%s).getBoundingClientRect()[%s]",
base::GetQuotedJSONString(id).c_str(),
base::GetQuotedJSONString(dimension).c_str()),
&value)) {
return value;
}
return base::nullopt;
}
void TeardownWindowOpenTest(content::WebContents* tab) {
ASSERT_TRUE(content::ExecuteScript(tab, "window.open = windowOpenOld"));
}
void SetupWindowOpenTest(content::WebContents* tab) {
ASSERT_TRUE(content::ExecuteScript(tab,
"var windowOpenOld = window.open; "
"window.open = (w) => { openedWindow = "
"w };"));
}
base::Optional<std::string> GetWindowOpenURL(content::WebContents* tab) {
std::string target_url;
if (instant_test_utils::GetStringFromJS(tab, "openedWindow", &target_url)) {
return target_url;
}
return base::nullopt;
}
void TeardownNavigatorTest(content::WebContents* tab) {
ASSERT_TRUE(content::ExecuteScript(tab, "window.navigator = navigatorOld"));
}
void SetupBeaconTest(content::WebContents* tab) {
ASSERT_TRUE(content::ExecuteScript(tab,
"var navigatorOld = window.navigator; "
"window.navigator = {};"
"window.navigator.sendBeacon = "
"(url) => { sentbeacon = url };"));
}
base::Optional<std::string> GetBeaconURL(content::WebContents* tab) {
std::string target_url;
if (instant_test_utils::GetStringFromJS(tab, "sentbeacon", &target_url)) {
return target_url;
}
return base::nullopt;
}
bool ElementExists(content::WebContents* tab, const std::string& id) {
return ExecuteBooleanJS(
tab, base::StringPrintf("!!document.getElementById(%s)",
base::GetQuotedJSONString(id).c_str()));
}
bool DialogIsOpen(content::WebContents* tab, const std::string& id) {
return ExecuteBooleanJS(
tab,
base::StringPrintf("!!document.getElementById(%s).hasAttribute('open')",
base::GetQuotedJSONString(id).c_str()));
}
bool ExecuteBooleanJS(content::WebContents* tab, const std::string& js) {
bool value;
if (instant_test_utils::GetBoolFromJS(tab, js, &value)) {
return value;
}
return false;
}
base::Optional<std::string> GetComputedStyle(content::WebContents* tab,
const std::string& id,
const std::string& css_name) {
std::string css_value;
if (instant_test_utils::GetStringFromJS(
tab,
base::StringPrintf(
"getComputedStyle(document.getElementById(%s))[%s]",
base::GetQuotedJSONString(id).c_str(),
base::GetQuotedJSONString(css_name).c_str()),
&css_value)) {
return css_value;
}
return base::nullopt;
}
base::Optional<double> GetComputedOpacity(content::WebContents* tab,
const std::string& id) {
auto css_value = GetComputedStyle(tab, id, "opacity");
double double_value;
if ((css_value != base::nullopt) &&
base::StringToDouble(*css_value, &double_value)) {
return double_value;
}
return base::nullopt;
}
base::Optional<std::string> GetComputedDisplay(content::WebContents* tab,
const std::string& id) {
return GetComputedStyle(tab, id, "display");
}
// Gets $(id)[property]. Coerces to string.
base::Optional<std::string> GetElementProperty(content::WebContents* tab,
const std::string& id,
const std::string& property) {
std::string value;
if (instant_test_utils::GetStringFromJS(
tab,
base::StringPrintf("document.getElementById(%s)[%s] + ''",
base::GetQuotedJSONString(id).c_str(),
base::GetQuotedJSONString(property).c_str()),
&value)) {
return value;
}
return base::nullopt;
}
void WaitForFadeIn(content::WebContents* tab, const std::string& id) {
content::ConsoleObserverDelegate console_observer(tab, "WaitForFadeIn");
tab->SetDelegate(&console_observer);
bool result = false;
if (!instant_test_utils::GetBoolFromJS(
tab,
base::StringPrintf(
R"js(
(function(id, message) {
var element = document.getElementById(id);
var fn = function() {
if (element.classList.contains('show-logo') &&
(window.getComputedStyle(element).opacity == 1.0)) {
console.log(message);
} else {
element.addEventListener('transitionend', fn);
}
};
fn();
return true;
})(%s, 'WaitForFadeIn')
)js",
base::GetQuotedJSONString(id).c_str()),
&result) &&
result) {
ADD_FAILURE() << "failed to wait for fade-in";
return;
}
console_observer.Wait();
}
// See enum LogoImpressionType in ntp_user_data_logger.cc.
static const int kLogoImpressionStatic = 0;
static const int kLogoImpressionCta = 1;
// See enum LogoClickType in ntp_user_data_logger.cc.
static const int kLogoClickCta = 1;
private:
void SetUp() override {
feature_list_.InitWithFeatures(
{features::kUseGoogleLocalNtp, features::kDoodlesOnLocalNtp}, {});
InProcessBrowserTest::SetUp();
}
void SetUpInProcessBrowserTestFixture() override {
will_create_browser_context_services_subscription_ =
BrowserContextDependencyManager::GetInstance()
->RegisterWillCreateBrowserContextServicesCallbackForTesting(
base::Bind(
&LocalNTPDoodleTest::OnWillCreateBrowserContextServices,
base::Unretained(this)));
}
static std::unique_ptr<KeyedService> CreateLogoService(
content::BrowserContext* context) {
return std::make_unique<MockLogoService>();
}
void OnWillCreateBrowserContextServices(content::BrowserContext* context) {
LogoServiceFactory::GetInstance()->SetTestingFactory(
context, base::BindRepeating(&LocalNTPDoodleTest::CreateLogoService));
}
base::test::ScopedFeatureList feature_list_;
std::unique_ptr<
base::CallbackList<void(content::BrowserContext*)>::Subscription>
will_create_browser_context_services_subscription_;
};
IN_PROC_BROWSER_TEST_F(LocalNTPDoodleTest,
ShouldBeUnchangedOnLogoFetchCancelled) {
EXPECT_CALL(*logo_service(), GetLogoPtr(_))
.WillRepeatedly(
DoAll(ReturnCachedLogo(LogoCallbackReason::CANCELED, base::nullopt),
ReturnFreshLogo(LogoCallbackReason::CANCELED, base::nullopt)));
// Open a new blank tab, then go to NTP and listen for console messages.
content::WebContents* active_tab =
local_ntp_test_utils::OpenNewTab(browser(), GURL("about:blank"));
content::ConsoleObserverDelegate console_observer(active_tab, "*");
active_tab->SetDelegate(&console_observer);
base::HistogramTester histograms;
ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUINewTabURL));
EXPECT_THAT(GetDimension(active_tab, "fakebox", "top"), Eq(kFakeboxTopPx));
EXPECT_THAT(GetComputedOpacity(active_tab, "logo-default"), Eq(1.0));
EXPECT_THAT(GetComputedOpacity(active_tab, "logo-doodle"), Eq(0.0));
EXPECT_THAT(console_observer.message(), IsEmpty());
histograms.ExpectTotalCount("NewTabPage.LogoShown", 0);
histograms.ExpectTotalCount("NewTabPage.LogoShown.FromCache", 0);
histograms.ExpectTotalCount("NewTabPage.LogoShown.Fresh", 0);
histograms.ExpectTotalCount("NewTabPage.LogoShownTime2", 0);
}
IN_PROC_BROWSER_TEST_F(LocalNTPDoodleTest,
ShouldBeUnchangedWhenNoCachedOrFreshDoodle) {
EXPECT_CALL(*logo_service(), GetLogoPtr(_))
.WillRepeatedly(DoAll(
ReturnCachedLogo(LogoCallbackReason::DETERMINED, base::nullopt),
ReturnFreshLogo(LogoCallbackReason::REVALIDATED, base::nullopt)));
// Open a new blank tab, then go to NTP and listen for console messages.
content::WebContents* active_tab =
local_ntp_test_utils::OpenNewTab(browser(), GURL("about:blank"));
content::ConsoleObserverDelegate console_observer(active_tab, "*");
active_tab->SetDelegate(&console_observer);
base::HistogramTester histograms;
ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUINewTabURL));
EXPECT_THAT(GetDimension(active_tab, "fakebox", "top"), Eq(kFakeboxTopPx));
EXPECT_THAT(GetComputedOpacity(active_tab, "logo-default"), Eq(1.0));
EXPECT_THAT(GetComputedOpacity(active_tab, "logo-doodle"), Eq(0.0));
EXPECT_THAT(console_observer.message(), IsEmpty());
histograms.ExpectTotalCount("NewTabPage.LogoShown", 0);
histograms.ExpectTotalCount("NewTabPage.LogoShown.FromCache", 0);
histograms.ExpectTotalCount("NewTabPage.LogoShown.Fresh", 0);
histograms.ExpectTotalCount("NewTabPage.LogoShownTime2", 0);
}
IN_PROC_BROWSER_TEST_F(LocalNTPDoodleTest, ShouldShowDoodleWhenCached) {
EncodedLogo cached_logo;
cached_logo.encoded_image = MakeRefPtr(kCachedB64);
cached_logo.metadata.mime_type = "image/png";
cached_logo.metadata.on_click_url = GURL("https://www.chromium.org/");
cached_logo.metadata.alt_text = "Chromium";
EXPECT_CALL(*logo_service(), GetLogoPtr(_))
.WillRepeatedly(DoAll(
ReturnCachedLogo(LogoCallbackReason::DETERMINED, cached_logo),
ReturnFreshLogo(LogoCallbackReason::REVALIDATED, base::nullopt)));
// Open a new blank tab, then go to NTP and listen for console messages.
content::WebContents* active_tab =
local_ntp_test_utils::OpenNewTab(browser(), GURL("about:blank"));
content::ConsoleObserverDelegate console_observer(active_tab, "*");
active_tab->SetDelegate(&console_observer);
base::HistogramTester histograms;
ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUINewTabURL));
EXPECT_THAT(GetDimension(active_tab, "fakebox", "top"), Eq(kFakeboxTopPx));
EXPECT_THAT(GetComputedOpacity(active_tab, "logo-default"), Eq(0.0));
EXPECT_THAT(GetComputedOpacity(active_tab, "logo-doodle"), Eq(1.0));
EXPECT_THAT(GetComputedDisplay(active_tab, "logo-doodle-container"),
Eq<std::string>("inline-block"));
EXPECT_THAT(GetComputedDisplay(active_tab, "logo-doodle-iframe"),
Eq<std::string>("none"));
EXPECT_THAT(GetElementProperty(active_tab, "logo-doodle-image", "title"),
Eq<std::string>("Chromium"));
// TODO(sfiera): check href by clicking on button.
EXPECT_THAT(console_observer.message(), IsEmpty());
histograms.ExpectTotalCount("NewTabPage.LogoShown", 1);
histograms.ExpectBucketCount("NewTabPage.LogoShown", kLogoImpressionStatic,
1);
histograms.ExpectTotalCount("NewTabPage.LogoShown.FromCache", 1);
histograms.ExpectBucketCount("NewTabPage.LogoShown.FromCache",
kLogoImpressionStatic, 1);
histograms.ExpectTotalCount("NewTabPage.LogoShown.Fresh", 0);
histograms.ExpectTotalCount("NewTabPage.LogoShownTime2", 1);
}
IN_PROC_BROWSER_TEST_F(LocalNTPDoodleTest, ShouldShowInteractiveLogo) {
EncodedLogo cached_logo;
cached_logo.encoded_image = MakeRefPtr(std::string());
cached_logo.metadata.mime_type = "image/png";
cached_logo.metadata.type = LogoType::INTERACTIVE;
cached_logo.metadata.full_page_url =
GURL("https://www.chromium.org/interactive");
cached_logo.metadata.alt_text = "alt text";
cached_logo.metadata.iframe_width_px = 500;
cached_logo.metadata.iframe_height_px = 200;
EXPECT_CALL(*logo_service(), GetLogoPtr(_))
.WillRepeatedly(DoAll(
ReturnCachedLogo(LogoCallbackReason::DETERMINED, cached_logo),
ReturnFreshLogo(LogoCallbackReason::REVALIDATED, base::nullopt)));
// Open a new blank tab, then go to NTP.
content::WebContents* active_tab =
local_ntp_test_utils::OpenNewTab(browser(), GURL("about:blank"));
base::HistogramTester histograms;
ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUINewTabURL));
EXPECT_THAT(GetDimension(active_tab, "fakebox", "top"), Eq(kFakeboxTopPx));
EXPECT_THAT(GetComputedOpacity(active_tab, "logo-default"), Eq(0.0));
EXPECT_THAT(GetComputedOpacity(active_tab, "logo-doodle"), Eq(1.0));
EXPECT_THAT(GetComputedDisplay(active_tab, "logo-doodle-container"),
Eq<std::string>("none"));
EXPECT_THAT(GetComputedDisplay(active_tab, "logo-doodle-iframe"),
Eq<std::string>("block"));
EXPECT_THAT(GetElementProperty(active_tab, "logo-doodle-iframe", "src"),
Eq<std::string>("https://www.chromium.org/interactive"));
EXPECT_THAT(GetElementProperty(active_tab, "logo-doodle-iframe", "title"),
Eq<std::string>("alt text"));
}
IN_PROC_BROWSER_TEST_F(LocalNTPDoodleTest,
ShouldShowInteractiveLogoWithoutImage) {
EncodedLogo cached_logo;
cached_logo.encoded_image = nullptr;
cached_logo.metadata.type = LogoType::INTERACTIVE;
cached_logo.metadata.full_page_url =
GURL("https://www.chromium.org/interactive");
cached_logo.metadata.alt_text = "alt text";
cached_logo.metadata.iframe_width_px = 500;
cached_logo.metadata.iframe_height_px = 200;
EXPECT_CALL(*logo_service(), GetLogoPtr(_))
.WillRepeatedly(DoAll(
ReturnCachedLogo(LogoCallbackReason::DETERMINED, cached_logo),
ReturnFreshLogo(LogoCallbackReason::REVALIDATED, base::nullopt)));
// Open a new blank tab, then go to NTP.
content::WebContents* active_tab =
local_ntp_test_utils::OpenNewTab(browser(), GURL("about:blank"));
base::HistogramTester histograms;
ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUINewTabURL));
EXPECT_THAT(GetDimension(active_tab, "fakebox", "top"), Eq(kFakeboxTopPx));
EXPECT_THAT(GetComputedOpacity(active_tab, "logo-default"), Eq(0.0));
EXPECT_THAT(GetComputedOpacity(active_tab, "logo-doodle"), Eq(1.0));
EXPECT_THAT(GetComputedDisplay(active_tab, "logo-doodle-container"),
Eq<std::string>("none"));
EXPECT_THAT(GetComputedDisplay(active_tab, "logo-doodle-iframe"),
Eq<std::string>("block"));
EXPECT_THAT(GetElementProperty(active_tab, "logo-doodle-iframe", "src"),
Eq<std::string>("https://www.chromium.org/interactive"));
EXPECT_THAT(GetElementProperty(active_tab, "logo-doodle-iframe", "title"),
Eq<std::string>("alt text"));
}
IN_PROC_BROWSER_TEST_F(LocalNTPDoodleTest,
ShouldFadeSimpleDoodleToDefaultWhenFetched) {
EncodedLogo cached_logo;
cached_logo.encoded_image = MakeRefPtr(kCachedB64);
cached_logo.metadata.mime_type = "image/png";
cached_logo.metadata.on_click_url = GURL("https://www.chromium.org/");
cached_logo.metadata.alt_text = "Chromium";
EXPECT_CALL(*logo_service(), GetLogoPtr(_))
.WillOnce(
DoAll(ReturnCachedLogo(LogoCallbackReason::DETERMINED, cached_logo),
ReturnFreshLogo(LogoCallbackReason::DETERMINED, base::nullopt)))
.WillRepeatedly(DoAll(
ReturnCachedLogo(LogoCallbackReason::DETERMINED, base::nullopt),
ReturnFreshLogo(LogoCallbackReason::REVALIDATED, base::nullopt)));
// Open a new blank tab, then go to NTP.
content::WebContents* active_tab =
local_ntp_test_utils::OpenNewTab(browser(), GURL("about:blank"));
base::HistogramTester histograms;
ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUINewTabURL));
WaitForFadeIn(active_tab, "logo-default");
EXPECT_THAT(GetDimension(active_tab, "fakebox", "top"), Eq(kFakeboxTopPx));
EXPECT_THAT(GetComputedOpacity(active_tab, "logo-default"), Eq(1.0));
EXPECT_THAT(GetComputedOpacity(active_tab, "logo-doodle"), Eq(0.0));
histograms.ExpectTotalCount("NewTabPage.LogoShown", 1);
histograms.ExpectBucketCount("NewTabPage.LogoShown", kLogoImpressionStatic,
1);
histograms.ExpectTotalCount("NewTabPage.LogoShown.FromCache", 1);
histograms.ExpectBucketCount("NewTabPage.LogoShown.FromCache",
kLogoImpressionStatic, 1);
histograms.ExpectTotalCount("NewTabPage.LogoShown.Fresh", 0);
histograms.ExpectTotalCount("NewTabPage.LogoShownTime2", 1);
}
IN_PROC_BROWSER_TEST_F(LocalNTPDoodleTest,
ShouldFadeDefaultToSimpleDoodleWhenFetched) {
EncodedLogo fresh_logo;
fresh_logo.encoded_image = MakeRefPtr(kFreshB64);
fresh_logo.metadata.mime_type = "image/png";
fresh_logo.metadata.on_click_url = GURL("https://www.chromium.org/");
fresh_logo.metadata.alt_text = "Chromium";
EXPECT_CALL(*logo_service(), GetLogoPtr(_))
.WillOnce(
DoAll(ReturnCachedLogo(LogoCallbackReason::DETERMINED, base::nullopt),
ReturnFreshLogo(LogoCallbackReason::DETERMINED, fresh_logo)))
.WillRepeatedly(DoAll(
ReturnCachedLogo(LogoCallbackReason::DETERMINED, fresh_logo),
ReturnFreshLogo(LogoCallbackReason::REVALIDATED, base::nullopt)));
// Open a new blank tab, then go to NTP.
content::WebContents* active_tab =
local_ntp_test_utils::OpenNewTab(browser(), GURL("about:blank"));
base::HistogramTester histograms;
ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUINewTabURL));
WaitForFadeIn(active_tab, "logo-doodle");
EXPECT_THAT(GetDimension(active_tab, "fakebox", "top"), Eq(kFakeboxTopPx));
EXPECT_THAT(GetComputedOpacity(active_tab, "logo-default"), Eq(0.0));
EXPECT_THAT(GetComputedOpacity(active_tab, "logo-doodle"), Eq(1.0));
EXPECT_THAT(GetComputedDisplay(active_tab, "logo-doodle-container"),
Eq<std::string>("inline-block"));
EXPECT_THAT(GetComputedDisplay(active_tab, "logo-doodle-iframe"),
Eq<std::string>("none"));
EXPECT_THAT(GetElementProperty(active_tab, "logo-doodle-image", "title"),
Eq<std::string>("Chromium"));
// TODO(sfiera): check href by clicking on button.
histograms.ExpectTotalCount("NewTabPage.LogoShown", 1);
histograms.ExpectBucketCount("NewTabPage.LogoShown", kLogoImpressionStatic,
1);
histograms.ExpectTotalCount("NewTabPage.LogoShown.FromCache", 0);
histograms.ExpectTotalCount("NewTabPage.LogoShown.Fresh", 1);
histograms.ExpectBucketCount("NewTabPage.LogoShown.Fresh",
kLogoImpressionStatic, 1);
histograms.ExpectTotalCount("NewTabPage.LogoShownTime2", 1);
}
IN_PROC_BROWSER_TEST_F(LocalNTPDoodleTest,
ShouldFadeDefaultToInteractiveDoodleWhenFetched) {
EncodedLogo fresh_logo;
fresh_logo.encoded_image = MakeRefPtr(std::string());
fresh_logo.metadata.mime_type = "image/png";
fresh_logo.metadata.type = LogoType::INTERACTIVE;
fresh_logo.metadata.full_page_url =
GURL("https://www.chromium.org/interactive");
fresh_logo.metadata.alt_text = "alt text";
fresh_logo.metadata.iframe_width_px = 500;
fresh_logo.metadata.iframe_height_px = 200;
EXPECT_CALL(*logo_service(), GetLogoPtr(_))
.WillOnce(
DoAll(ReturnCachedLogo(LogoCallbackReason::DETERMINED, base::nullopt),
ReturnFreshLogo(LogoCallbackReason::DETERMINED, fresh_logo)))
.WillRepeatedly(DoAll(
ReturnCachedLogo(LogoCallbackReason::DETERMINED, fresh_logo),
ReturnFreshLogo(LogoCallbackReason::REVALIDATED, base::nullopt)));
// Open a new blank tab, then go to NTP.
content::WebContents* active_tab =
local_ntp_test_utils::OpenNewTab(browser(), GURL("about:blank"));
ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUINewTabURL));
WaitForFadeIn(active_tab, "logo-doodle");
EXPECT_THAT(GetDimension(active_tab, "fakebox", "top"), Eq(kFakeboxTopPx));
EXPECT_THAT(GetComputedOpacity(active_tab, "logo-default"), Eq(0.0));
EXPECT_THAT(GetComputedOpacity(active_tab, "logo-doodle"), Eq(1.0));
EXPECT_THAT(GetComputedDisplay(active_tab, "logo-doodle-container"),
Eq<std::string>("none"));
EXPECT_THAT(GetComputedDisplay(active_tab, "logo-doodle-iframe"),
Eq<std::string>("block"));
EXPECT_THAT(GetElementProperty(active_tab, "logo-doodle-iframe", "src"),
Eq<std::string>("https://www.chromium.org/interactive"));
}
IN_PROC_BROWSER_TEST_F(LocalNTPDoodleTest, ShouldNotFadeFromInteractiveDoodle) {
EncodedLogo cached_logo;
cached_logo.encoded_image = MakeRefPtr(std::string());
cached_logo.metadata.mime_type = "image/png";
cached_logo.metadata.type = LogoType::INTERACTIVE;
cached_logo.metadata.full_page_url =
GURL("https://www.chromium.org/interactive");
cached_logo.metadata.alt_text = "alt text";
cached_logo.metadata.iframe_width_px = 500;
cached_logo.metadata.iframe_height_px = 200;
EXPECT_CALL(*logo_service(), GetLogoPtr(_))
.WillOnce(
DoAll(ReturnCachedLogo(LogoCallbackReason::DETERMINED, cached_logo),
ReturnFreshLogo(LogoCallbackReason::DETERMINED, base::nullopt)))
.WillRepeatedly(DoAll(
ReturnCachedLogo(LogoCallbackReason::DETERMINED, base::nullopt),
ReturnFreshLogo(LogoCallbackReason::REVALIDATED, base::nullopt)));
// Open a new blank tab, then go to NTP.
content::WebContents* active_tab =
local_ntp_test_utils::OpenNewTab(browser(), GURL("about:blank"));
ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUINewTabURL));
EXPECT_THAT(GetDimension(active_tab, "fakebox", "top"), Eq(kFakeboxTopPx));
EXPECT_THAT(GetComputedOpacity(active_tab, "logo-default"), Eq(0.0));
EXPECT_THAT(GetComputedOpacity(active_tab, "logo-doodle"), Eq(1.0));
EXPECT_THAT(GetComputedDisplay(active_tab, "logo-doodle-container"),
Eq<std::string>("none"));
EXPECT_THAT(GetComputedDisplay(active_tab, "logo-doodle-iframe"),
Eq<std::string>("block"));
EXPECT_THAT(GetElementProperty(active_tab, "logo-doodle-iframe", "src"),
Eq<std::string>("https://www.chromium.org/interactive"));
}
IN_PROC_BROWSER_TEST_F(LocalNTPDoodleTest,
ShouldFadeSimpleDoodleToSimpleDoodleWhenFetched) {
EncodedLogo cached_logo;
cached_logo.encoded_image = MakeRefPtr(kCachedB64);
cached_logo.metadata.mime_type = "image/png";
cached_logo.metadata.on_click_url = GURL("https://www.chromium.org/cached");
cached_logo.metadata.alt_text = "cached alt text";
EncodedLogo fresh_logo;
fresh_logo.encoded_image = MakeRefPtr(kFreshB64);
fresh_logo.metadata.mime_type = "image/png";
fresh_logo.metadata.on_click_url = GURL("https://www.chromium.org/fresh");
fresh_logo.metadata.alt_text = "fresh alt text";
EXPECT_CALL(*logo_service(), GetLogoPtr(_))
.WillOnce(
DoAll(ReturnCachedLogo(LogoCallbackReason::DETERMINED, cached_logo),
ReturnFreshLogo(LogoCallbackReason::DETERMINED, fresh_logo)))
.WillRepeatedly(DoAll(
ReturnCachedLogo(LogoCallbackReason::DETERMINED, fresh_logo),
ReturnFreshLogo(LogoCallbackReason::REVALIDATED, base::nullopt)));
// Open a new blank tab, then go to NTP.
content::WebContents* active_tab =
local_ntp_test_utils::OpenNewTab(browser(), GURL("about:blank"));
base::HistogramTester histograms;
ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUINewTabURL));
WaitForFadeIn(active_tab, "logo-doodle");
EXPECT_THAT(GetDimension(active_tab, "fakebox", "top"), Eq(kFakeboxTopPx));
EXPECT_THAT(GetComputedOpacity(active_tab, "logo-default"), Eq(0.0));
EXPECT_THAT(GetComputedOpacity(active_tab, "logo-doodle"), Eq(1.0));
EXPECT_THAT(GetComputedDisplay(active_tab, "logo-doodle-container"),
Eq<std::string>("inline-block"));
EXPECT_THAT(GetComputedDisplay(active_tab, "logo-doodle-iframe"),
Eq<std::string>("none"));
EXPECT_THAT(GetElementProperty(active_tab, "logo-doodle-image", "src"),
Eq<std::string>("data:image/png;base64,fresh+++"));
EXPECT_THAT(GetElementProperty(active_tab, "logo-doodle-image", "title"),
Eq<std::string>("fresh alt text"));
// TODO(sfiera): check href by clicking on button.
// LogoShown is recorded for both cached and fresh Doodle, but LogoShownTime2
// is only recorded once per NTP.
histograms.ExpectTotalCount("NewTabPage.LogoShown", 2);
histograms.ExpectBucketCount("NewTabPage.LogoShown", kLogoImpressionStatic,
2);
histograms.ExpectTotalCount("NewTabPage.LogoShown.FromCache", 1);
histograms.ExpectBucketCount("NewTabPage.LogoShown.FromCache",
kLogoImpressionStatic, 1);
histograms.ExpectTotalCount("NewTabPage.LogoShown.Fresh", 1);
histograms.ExpectBucketCount("NewTabPage.LogoShown.Fresh",
kLogoImpressionStatic, 1);
histograms.ExpectTotalCount("NewTabPage.LogoShownTime2", 1);
}
IN_PROC_BROWSER_TEST_F(LocalNTPDoodleTest, ShouldUpdateMetadataWhenChanged) {
EncodedLogo cached_logo;
cached_logo.encoded_image = MakeRefPtr(kCachedB64);
cached_logo.metadata.mime_type = "image/png";
cached_logo.metadata.on_click_url = GURL("https://www.chromium.org/cached");
cached_logo.metadata.alt_text = "cached alt text";
EncodedLogo fresh_logo;
fresh_logo.encoded_image = cached_logo.encoded_image;
fresh_logo.metadata.mime_type = cached_logo.metadata.mime_type;
fresh_logo.metadata.on_click_url = GURL("https://www.chromium.org/fresh");
fresh_logo.metadata.alt_text = "fresh alt text";
EXPECT_CALL(*logo_service(), GetLogoPtr(_))
.WillOnce(
DoAll(ReturnCachedLogo(LogoCallbackReason::DETERMINED, cached_logo),
ReturnFreshLogo(LogoCallbackReason::DETERMINED, fresh_logo)))
.WillRepeatedly(DoAll(
ReturnCachedLogo(LogoCallbackReason::DETERMINED, fresh_logo),
ReturnFreshLogo(LogoCallbackReason::REVALIDATED, base::nullopt)));
// Open a new blank tab, then go to NTP.
content::WebContents* active_tab =
local_ntp_test_utils::OpenNewTab(browser(), GURL("about:blank"));
base::HistogramTester histograms;
ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUINewTabURL));
EXPECT_THAT(GetDimension(active_tab, "fakebox", "top"), Eq(kFakeboxTopPx));
EXPECT_THAT(GetComputedOpacity(active_tab, "logo-default"), Eq(0.0));
EXPECT_THAT(GetComputedOpacity(active_tab, "logo-doodle"), Eq(1.0));
EXPECT_THAT(GetComputedDisplay(active_tab, "logo-doodle-container"),
Eq<std::string>("inline-block"));
EXPECT_THAT(GetComputedDisplay(active_tab, "logo-doodle-iframe"),
Eq<std::string>("none"));
EXPECT_THAT(GetElementProperty(active_tab, "logo-doodle-image", "title"),
Eq<std::string>("fresh alt text"));
// TODO(sfiera): check href by clicking on button.
// Metadata update does not count as a new impression.
histograms.ExpectTotalCount("NewTabPage.LogoShown", 1);
histograms.ExpectBucketCount("NewTabPage.LogoShown", kLogoImpressionStatic,
1);
histograms.ExpectTotalCount("NewTabPage.LogoShown.FromCache", 1);
histograms.ExpectBucketCount("NewTabPage.LogoShown.FromCache",
kLogoImpressionStatic, 1);
histograms.ExpectTotalCount("NewTabPage.LogoShown.Fresh", 0);
histograms.ExpectTotalCount("NewTabPage.LogoShownTime2", 1);
}
IN_PROC_BROWSER_TEST_F(LocalNTPDoodleTest, ShouldAppendShareButtonWhenCached) {
EncodedLogo cached_logo;
cached_logo.encoded_image = MakeRefPtr(kCachedB64);
cached_logo.metadata.mime_type = "image/png";
cached_logo.metadata.on_click_url = GURL("https://www.chromium.org/");
cached_logo.metadata.alt_text = "Chromium";
cached_logo.metadata.short_link = GURL("https://g.co");
cached_logo.metadata.share_button_x = 12;
cached_logo.metadata.share_button_y = 39;
cached_logo.metadata.share_button_opacity = 0.8;
cached_logo.metadata.share_button_icon = "sbimg";
cached_logo.metadata.share_button_bg = "#ffff00";
EXPECT_CALL(*logo_service(), GetLogoPtr(_))
.WillRepeatedly(DoAll(
ReturnCachedLogo(LogoCallbackReason::DETERMINED, cached_logo),
ReturnFreshLogo(LogoCallbackReason::REVALIDATED, base::nullopt)));
// Open a new blank tab, then go to NTP and listen for console messages.
content::WebContents* active_tab =
local_ntp_test_utils::OpenNewTab(browser(), GURL("about:blank"));
content::ConsoleObserverDelegate console_observer(active_tab, "*");
active_tab->SetDelegate(&console_observer);
base::HistogramTester histograms;
ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUINewTabURL));
EXPECT_TRUE(ElementExists(active_tab, "ddlsb"));
EXPECT_TRUE(ElementExists(active_tab, "ddlsb-img"));
EXPECT_THAT(GetComputedStyle(active_tab, "ddlsb", "left"),
Eq<std::string>("12px"));
EXPECT_THAT(GetComputedStyle(active_tab, "ddlsb", "top"),
Eq<std::string>("39px"));
EXPECT_THAT(GetComputedStyle(active_tab, "ddlsb", "background-color"),
Eq<std::string>("rgba(255, 255, 0, 0.8)"));
EXPECT_THAT(GetElementProperty(active_tab, "ddlsb-img", "src"),
Eq<std::string>("data:image/png;base64,sbimg"));
}
IN_PROC_BROWSER_TEST_F(LocalNTPDoodleTest,
ShouldNotAppendShareButtonWhenCacheEmpty) {
EncodedLogo cached_logo;
cached_logo.encoded_image = MakeRefPtr(kCachedB64);
cached_logo.metadata.mime_type = "image/png";
cached_logo.metadata.on_click_url = GURL("https://www.chromium.org/");
cached_logo.metadata.alt_text = "Chromium";
cached_logo.metadata.short_link = GURL("https://g.co");
cached_logo.metadata.share_button_x = -1;
cached_logo.metadata.share_button_y = -1;
cached_logo.metadata.share_button_opacity = 0;
cached_logo.metadata.share_button_icon = "";
cached_logo.metadata.share_button_bg = "";
EXPECT_CALL(*logo_service(), GetLogoPtr(_))
.WillRepeatedly(DoAll(
ReturnCachedLogo(LogoCallbackReason::DETERMINED, cached_logo),
ReturnFreshLogo(LogoCallbackReason::REVALIDATED, base::nullopt)));
// Open a new blank tab, then go to NTP and listen for console messages.
content::WebContents* active_tab =
local_ntp_test_utils::OpenNewTab(browser(), GURL("about:blank"));
content::ConsoleObserverDelegate console_observer(active_tab, "*");
active_tab->SetDelegate(&console_observer);
ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUINewTabURL));
EXPECT_FALSE(ElementExists(active_tab, "ddlsb"));
EXPECT_FALSE(ElementExists(active_tab, "ddlsb-img"));
}
IN_PROC_BROWSER_TEST_F(LocalNTPDoodleTest,
ShouldNotAppendShareButtonWhenCacheIncomplete) {
EncodedLogo cached_logo;
cached_logo.encoded_image = MakeRefPtr(kCachedB64);
cached_logo.metadata.mime_type = "image/png";
cached_logo.metadata.on_click_url = GURL("https://www.chromium.org/");
cached_logo.metadata.alt_text = "Chromium";
cached_logo.metadata.short_link = GURL("https://g.co");
cached_logo.metadata.share_button_x = 12;
cached_logo.metadata.share_button_y = 36;
cached_logo.metadata.share_button_opacity = 0.8;
cached_logo.metadata.share_button_icon = "";
cached_logo.metadata.share_button_bg = "#ffff00";
EXPECT_CALL(*logo_service(), GetLogoPtr(_))
.WillRepeatedly(DoAll(
ReturnCachedLogo(LogoCallbackReason::DETERMINED, cached_logo),
ReturnFreshLogo(LogoCallbackReason::REVALIDATED, base::nullopt)));
// Open a new blank tab, then go to NTP and listen for console messages.
content::WebContents* active_tab =
local_ntp_test_utils::OpenNewTab(browser(), GURL("about:blank"));
content::ConsoleObserverDelegate console_observer(active_tab, "*");
active_tab->SetDelegate(&console_observer);
ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUINewTabURL));
EXPECT_FALSE(ElementExists(active_tab, "ddlsb"));
EXPECT_FALSE(ElementExists(active_tab, "ddlsb-img"));
}
IN_PROC_BROWSER_TEST_F(LocalNTPDoodleTest,
ShouldShowShareDialogWhenShareButtonClicked) {
EncodedLogo cached_logo;
cached_logo.encoded_image = MakeRefPtr(kCachedB64);
cached_logo.metadata.mime_type = "image/png";
cached_logo.metadata.on_click_url = GURL("https://www.chromium.org/");
cached_logo.metadata.alt_text = "Chromium";
cached_logo.metadata.short_link = GURL("https://g.co");
cached_logo.metadata.share_button_x = 12;
cached_logo.metadata.share_button_y = 36;
cached_logo.metadata.share_button_opacity = 0.8;
cached_logo.metadata.share_button_icon = "sbimg";
cached_logo.metadata.share_button_bg = "#ffff00";
EXPECT_CALL(*logo_service(), GetLogoPtr(_))
.WillRepeatedly(DoAll(
ReturnCachedLogo(LogoCallbackReason::DETERMINED, cached_logo),
ReturnFreshLogo(LogoCallbackReason::REVALIDATED, base::nullopt)));
// Open a new blank tab, then go to NTP and listen for console messages.
content::WebContents* active_tab =
local_ntp_test_utils::OpenNewTab(browser(), GURL("about:blank"));
content::ConsoleObserverDelegate console_observer(active_tab, "*");
active_tab->SetDelegate(&console_observer);
ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUINewTabURL));
EXPECT_FALSE(DialogIsOpen(active_tab, "ddlsd"));
ASSERT_TRUE(content::ExecuteScript(
active_tab, "document.getElementById('ddlsb').click();"));
EXPECT_TRUE(DialogIsOpen(active_tab, "ddlsd"));
// Check title
std::string title;
ASSERT_TRUE(instant_test_utils::GetStringFromJS(
active_tab, "document.getElementById('ddlsd-title').innerHTML", &title));
EXPECT_THAT(title, Eq<std::string>(cached_logo.metadata.alt_text));
// Check share link inside textbox
std::string link;
ASSERT_TRUE(instant_test_utils::GetStringFromJS(
active_tab, "document.getElementById('ddlsd-text').value", &link));
EXPECT_THAT(link, Eq<std::string>("https://g.co/"));
ASSERT_TRUE(content::ExecuteScript(
active_tab, "document.getElementById('ddlsd-close').click();"));
EXPECT_FALSE(DialogIsOpen(active_tab, "ddlsd"));
}
IN_PROC_BROWSER_TEST_F(LocalNTPDoodleTest, ShouldOpenFacebookInShareDialog) {
EncodedLogo cached_logo;
cached_logo.encoded_image = MakeRefPtr(kCachedB64);
cached_logo.metadata.mime_type = "image/png";
cached_logo.metadata.on_click_url = GURL("https://www.chromium.org/");
cached_logo.metadata.alt_text = "Chromium";
cached_logo.metadata.short_link = GURL("https://g.co");
cached_logo.metadata.share_button_x = 12;
cached_logo.metadata.share_button_y = 36;
cached_logo.metadata.share_button_opacity = 0.8;
cached_logo.metadata.share_button_icon = "sbimg";
cached_logo.metadata.share_button_bg = "#ffff00";
EXPECT_CALL(*logo_service(), GetLogoPtr(_))
.WillRepeatedly(DoAll(
ReturnCachedLogo(LogoCallbackReason::DETERMINED, cached_logo),
ReturnFreshLogo(LogoCallbackReason::REVALIDATED, base::nullopt)));
// Open a new blank tab, then go to NTP and listen for console messages.
content::WebContents* active_tab =
local_ntp_test_utils::OpenNewTab(browser(), GURL("about:blank"));
ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUINewTabURL));
ASSERT_TRUE(content::ExecuteScript(
active_tab, "document.getElementById('ddlsb').click();"));
EXPECT_TRUE(DialogIsOpen(active_tab, "ddlsd"));
SetupWindowOpenTest(active_tab);
ASSERT_TRUE(content::ExecuteScript(
active_tab, "document.getElementById('ddlsd-fbb').click();"));
EXPECT_THAT(GetWindowOpenURL(active_tab),
Eq<std::string>(
"https://www.facebook.com/dialog/share?app_id=738026486351791"
"&href=https%3A%2F%2Fg.co%2F&hashtag=%23GoogleDoodle"));
}
IN_PROC_BROWSER_TEST_F(LocalNTPDoodleTest, ShouldOpenTwitterInShareDialog) {
EncodedLogo cached_logo;
cached_logo.encoded_image = MakeRefPtr(kCachedB64);
cached_logo.metadata.mime_type = "image/png";
cached_logo.metadata.on_click_url = GURL("https://www.chromium.org/");
cached_logo.metadata.alt_text = "Chromium";
cached_logo.metadata.short_link = GURL("https://g.co");
cached_logo.metadata.share_button_x = 12;
cached_logo.metadata.share_button_y = 36;
cached_logo.metadata.share_button_opacity = 0.8;
cached_logo.metadata.share_button_icon = "sbimg";
cached_logo.metadata.share_button_bg = "#ffff00";
EXPECT_CALL(*logo_service(), GetLogoPtr(_))
.WillRepeatedly(DoAll(
ReturnCachedLogo(LogoCallbackReason::DETERMINED, cached_logo),
ReturnFreshLogo(LogoCallbackReason::REVALIDATED, base::nullopt)));
// Open a new blank tab, then go to NTP and listen for console messages.
content::WebContents* active_tab =
local_ntp_test_utils::OpenNewTab(browser(), GURL("about:blank"));
ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUINewTabURL));
ASSERT_TRUE(content::ExecuteScript(
active_tab, "document.getElementById('ddlsb').click();"));
EXPECT_TRUE(DialogIsOpen(active_tab, "ddlsd"));
SetupWindowOpenTest(active_tab);
ASSERT_TRUE(content::ExecuteScript(
active_tab, "document.getElementById('ddlsd-twb').click();"));
EXPECT_THAT(GetWindowOpenURL(active_tab),
Eq<std::string>("https://twitter.com/intent/tweet"
"?text=Chromium%0Ahttps%3A%2F%2Fg.co%2F"));
}
IN_PROC_BROWSER_TEST_F(LocalNTPDoodleTest, ShouldCopyLinkInShareDialog) {
EncodedLogo cached_logo;
cached_logo.encoded_image = MakeRefPtr(kCachedB64);
cached_logo.metadata.mime_type = "image/png";
cached_logo.metadata.on_click_url = GURL("https://www.chromium.org/");
cached_logo.metadata.alt_text = "Chromium";
cached_logo.metadata.short_link = GURL("https://g.co");
cached_logo.metadata.share_button_x = 12;
cached_logo.metadata.share_button_y = 36;
cached_logo.metadata.share_button_opacity = 0.8;
cached_logo.metadata.share_button_icon = "sbimg";
cached_logo.metadata.share_button_bg = "#ffff00";
EXPECT_CALL(*logo_service(), GetLogoPtr(_))
.WillRepeatedly(DoAll(
ReturnCachedLogo(LogoCallbackReason::DETERMINED, cached_logo),
ReturnFreshLogo(LogoCallbackReason::REVALIDATED, base::nullopt)));
// Open a new blank tab, then go to NTP and listen for console messages.
content::WebContents* active_tab =
local_ntp_test_utils::OpenNewTab(browser(), GURL("about:blank"));
ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUINewTabURL));
ASSERT_TRUE(content::ExecuteScript(
active_tab, "document.getElementById('ddlsb').click();"));
EXPECT_TRUE(DialogIsOpen(active_tab, "ddlsd"));
ASSERT_TRUE(content::ExecuteScript(
active_tab, "document.getElementById('ddlsd-copy').click();"));
std::string short_link;
ASSERT_TRUE(instant_test_utils::GetStringFromJS(
active_tab, "window.getSelection().toString()", &short_link));
EXPECT_EQ("https://g.co/", short_link);
}
IN_PROC_BROWSER_TEST_F(LocalNTPDoodleTest, ShouldLogShareClicksNoEventId) {
EncodedLogo cached_logo;
cached_logo.encoded_image = MakeRefPtr(kCachedB64);
cached_logo.metadata.mime_type = "image/png";
cached_logo.metadata.on_click_url =
GURL("https://www.chrotmium.org/?ct=test");
cached_logo.metadata.alt_text = "Chromium";
cached_logo.metadata.short_link = GURL("https://g.co");
cached_logo.metadata.share_button_x = 12;
cached_logo.metadata.share_button_y = 36;
cached_logo.metadata.share_button_opacity = 0.8;
cached_logo.metadata.share_button_icon = "sbimg";
cached_logo.metadata.share_button_bg = "#ffff00";
EXPECT_CALL(*logo_service(), GetLogoPtr(_))
.WillRepeatedly(DoAll(
ReturnCachedLogo(LogoCallbackReason::DETERMINED, cached_logo),
ReturnFreshLogo(LogoCallbackReason::REVALIDATED, base::nullopt)));
// Open a new blank tab, then go to NTP and listen for console messages.
content::WebContents* active_tab =
local_ntp_test_utils::OpenNewTab(browser(), GURL("about:blank"));
ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUINewTabURL));
// Replace window.open so we stay in the same tab.
SetupWindowOpenTest(active_tab);
SetupBeaconTest(active_tab);
ASSERT_TRUE(content::ExecuteScript(
active_tab, "document.getElementById('ddlsb').click();"));
ASSERT_TRUE(content::ExecuteScript(
active_tab, "document.getElementById('ddlsd-fbb').click();"));
EXPECT_THAT(
GetBeaconURL(active_tab),
Eq<std::string>("https://www.google.com/gen_204"
"?atyp=i&ct=doodle&cad=sh%2C2%2Cct%3Atest&ntp=1"));
ASSERT_TRUE(content::ExecuteScript(
active_tab, "document.getElementById('ddlsd-twb').click();"));
EXPECT_THAT(
GetBeaconURL(active_tab),
Eq<std::string>("https://www.google.com/gen_204"
"?atyp=i&ct=doodle&cad=sh%2C3%2Cct%3Atest&ntp=1"));
ASSERT_TRUE(content::ExecuteScript(
active_tab, "document.getElementById('ddlsd-emb').click();"));
EXPECT_THAT(
GetBeaconURL(active_tab),
Eq<std::string>("https://www.google.com/gen_204"
"?atyp=i&ct=doodle&cad=sh%2C5%2Cct%3Atest&ntp=1"));
ASSERT_TRUE(content::ExecuteScript(
active_tab, "document.getElementById('ddlsd-copy').click();"));
std::string short_link;
EXPECT_THAT(
GetBeaconURL(active_tab),
Eq<std::string>("https://www.google.com/gen_204"
"?atyp=i&ct=doodle&cad=sh%2C6%2Cct%3Atest&ntp=1"));
}
IN_PROC_BROWSER_TEST_F(LocalNTPDoodleTest, ShouldLogShareClicksWithEventId) {
EncodedLogo cached_logo;
cached_logo.encoded_image = MakeRefPtr(kCachedB64);
cached_logo.metadata.mime_type = "image/png";
cached_logo.metadata.on_click_url =
GURL("https://www.chrotmium.org/?ct=test");
cached_logo.metadata.alt_text = "Chromium";
cached_logo.metadata.short_link = GURL("https://g.co");
cached_logo.metadata.share_button_x = 12;
cached_logo.metadata.share_button_y = 36;
cached_logo.metadata.share_button_opacity = 0.8;
cached_logo.metadata.share_button_icon = "sbimg";
cached_logo.metadata.share_button_bg = "#ffff00";
EXPECT_CALL(*logo_service(), GetLogoPtr(_))
.WillRepeatedly(DoAll(
ReturnCachedLogo(LogoCallbackReason::DETERMINED, cached_logo),
ReturnFreshLogo(LogoCallbackReason::REVALIDATED, base::nullopt)));
// Open a new blank tab, then go to NTP and listen for console messages.
content::WebContents* active_tab =
local_ntp_test_utils::OpenNewTab(browser(), GURL("about:blank"));
ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUINewTabURL));
// Replace window.open so we stay in the same tab.
SetupWindowOpenTest(active_tab);
SetupBeaconTest(active_tab);
ASSERT_TRUE(content::ExecuteScript(active_tab, "doodles.ei = 'test_ei';"));
ASSERT_TRUE(content::ExecuteScript(
active_tab, "document.getElementById('ddlsb').click();"));
ASSERT_TRUE(content::ExecuteScript(
active_tab, "document.getElementById('ddlsd-fbb').click();"));
EXPECT_THAT(
GetBeaconURL(active_tab),
Eq<std::string>("https://www.google.com/gen_204?atyp=i"
"&ct=doodle&cad=sh%2C2%2Cct%3Atest&ntp=1&ei=test_ei"));
ASSERT_TRUE(content::ExecuteScript(
active_tab, "document.getElementById('ddlsd-twb').click();"));
EXPECT_THAT(
GetBeaconURL(active_tab),
Eq<std::string>("https://www.google.com/gen_204?atyp=i"
"&ct=doodle&cad=sh%2C3%2Cct%3Atest&ntp=1&ei=test_ei"));
ASSERT_TRUE(content::ExecuteScript(
active_tab, "document.getElementById('ddlsd-emb').click();"));
EXPECT_THAT(
GetBeaconURL(active_tab),
Eq<std::string>("https://www.google.com/gen_204?atyp=i"
"&ct=doodle&cad=sh%2C5%2Cct%3Atest&ntp=1&ei=test_ei"));
ASSERT_TRUE(content::ExecuteScript(
active_tab, "document.getElementById('ddlsd-copy').click();"));
std::string short_link;
EXPECT_THAT(
GetBeaconURL(active_tab),
Eq<std::string>("https://www.google.com/gen_204?atyp=i"
"&ct=doodle&cad=sh%2C6%2Cct%3Atest&ntp=1&ei=test_ei"));
}
IN_PROC_BROWSER_TEST_F(LocalNTPDoodleTest, ShouldAnimateLogoWhenClicked) {
EncodedLogo cached_logo;
cached_logo.encoded_image = MakeRefPtr(kCachedB64);
cached_logo.metadata.mime_type = "image/png";
cached_logo.metadata.type = LogoType::ANIMATED;
cached_logo.metadata.animated_url = GURL("data:image/png;base64,cached++");
cached_logo.metadata.on_click_url = GURL("https://www.chromium.org/");
cached_logo.metadata.alt_text = "alt text";
EXPECT_CALL(*logo_service(), GetLogoPtr(_))
.WillRepeatedly(DoAll(
ReturnCachedLogo(LogoCallbackReason::DETERMINED, cached_logo),
ReturnFreshLogo(LogoCallbackReason::REVALIDATED, base::nullopt)));
// Open a new blank tab, then go to NTP.
content::WebContents* active_tab =
local_ntp_test_utils::OpenNewTab(browser(), GURL("about:blank"));
base::HistogramTester histograms;
ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUINewTabURL));
EXPECT_THAT(GetDimension(active_tab, "fakebox", "top"), Eq(kFakeboxTopPx));
EXPECT_THAT(GetComputedOpacity(active_tab, "logo-default"), Eq(0.0));
EXPECT_THAT(GetComputedOpacity(active_tab, "logo-doodle"), Eq(1.0));
EXPECT_THAT(GetComputedDisplay(active_tab, "logo-doodle-container"),
Eq<std::string>("inline-block"));
EXPECT_THAT(GetComputedDisplay(active_tab, "logo-doodle-iframe"),
Eq<std::string>("none"));
EXPECT_THAT(GetElementProperty(active_tab, "logo-doodle-image", "src"),
Eq<std::string>("data:image/png;base64,cached++"));
EXPECT_THAT(GetElementProperty(active_tab, "logo-doodle-image", "title"),
Eq<std::string>("alt text"));
// Click image, swapping out for animated URL.
ASSERT_TRUE(content::ExecuteScript(
active_tab, "document.getElementById('logo-doodle-button').click();"));
EXPECT_THAT(GetDimension(active_tab, "fakebox", "top"), Eq(kFakeboxTopPx));
EXPECT_THAT(GetElementProperty(active_tab, "logo-doodle-image", "src"),
Eq(cached_logo.metadata.animated_url.spec()));
// TODO(sfiera): check href by clicking on button.
histograms.ExpectTotalCount("NewTabPage.LogoShown", 1);
histograms.ExpectBucketCount("NewTabPage.LogoShown", kLogoImpressionCta, 1);
histograms.ExpectTotalCount("NewTabPage.LogoShown.FromCache", 1);
histograms.ExpectBucketCount("NewTabPage.LogoShown.FromCache",
kLogoImpressionCta, 1);
histograms.ExpectTotalCount("NewTabPage.LogoShown.Fresh", 0);
histograms.ExpectTotalCount("NewTabPage.LogoShownTime2", 1);
histograms.ExpectTotalCount("NewTabPage.LogoClick", 1);
histograms.ExpectBucketCount("NewTabPage.LogoClick", kLogoClickCta, 1);
}
IN_PROC_BROWSER_TEST_F(LocalNTPDoodleTest,
ShouldAddShareButtonInAnimatedDoodle) {
EncodedLogo cached_logo;
cached_logo.encoded_image = MakeRefPtr(kCachedB64);
cached_logo.metadata.mime_type = "image/png";
cached_logo.metadata.type = LogoType::ANIMATED;
cached_logo.metadata.animated_url = GURL("data:image/png;base64,cached++");
cached_logo.metadata.on_click_url = GURL("https://www.chromium.org/");
cached_logo.metadata.alt_text = "alt text";
cached_logo.metadata.short_link = GURL("https://g.co");
cached_logo.metadata.share_button_x = 12;
cached_logo.metadata.share_button_y = 36;
cached_logo.metadata.share_button_opacity = 0.8;
cached_logo.metadata.share_button_icon = "sbimg";
cached_logo.metadata.share_button_bg = "#ffff00";
EXPECT_CALL(*logo_service(), GetLogoPtr(_))
.WillRepeatedly(DoAll(
ReturnCachedLogo(LogoCallbackReason::DETERMINED, cached_logo),
ReturnFreshLogo(LogoCallbackReason::REVALIDATED, base::nullopt)));
// Open a new blank tab, then go to NTP.
content::WebContents* active_tab =
local_ntp_test_utils::OpenNewTab(browser(), GURL("about:blank"));
base::HistogramTester histograms;
ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUINewTabURL));
// Share button should not be present pre-CTA click
EXPECT_FALSE(ElementExists(active_tab, "ddlsb"));
ASSERT_TRUE(content::ExecuteScript(
active_tab, "document.getElementById('logo-doodle-button').click();"));
// Share button is only added post-CTA click when the animation is playing
EXPECT_TRUE(ElementExists(active_tab, "ddlsb"));
}
std::string WaitForDdllogResponse(content::WebContents* tab,
int expected_ddllog_count) {
std::string response;
EXPECT_TRUE(content::ExecuteScriptAndExtractString(
tab,
base::StringPrintf(R"js(
if (doodles.numDdllogResponsesReceived == %i) {
window.domAutomationController.send(doodles.lastDdllogResponse);
} else {
doodles.onDdllogResponse = function() {
if (doodles.numDdllogResponsesReceived == %i) {
window.domAutomationController.send(doodles.lastDdllogResponse);
doodles.onDdllogResponse = null;
}
}
} )js",
expected_ddllog_count, expected_ddllog_count),
&response));
return response;
}
IN_PROC_BROWSER_TEST_F(LocalNTPDoodleTest, ShouldLogForSimpleDoodle) {
// Start a test server to provide the ddllog response.
net::EmbeddedTestServer test_server(net::EmbeddedTestServer::TYPE_HTTPS);
test_server.ServeFilesFromSourceDirectory("chrome/test/data/local_ntp");
ASSERT_TRUE(test_server.Start());
const GURL on_click_url = test_server.GetURL("/simple.html");
const GURL log_url = test_server.GetURL("/ddllog-target_url_params");
EncodedLogo cached_logo;
cached_logo.encoded_image = MakeRefPtr(kCachedB64);
cached_logo.metadata.mime_type = "image/png";
cached_logo.metadata.on_click_url = on_click_url;
cached_logo.metadata.alt_text = "Chromium";
cached_logo.metadata.log_url = log_url;
EXPECT_CALL(*logo_service(), GetLogoPtr(_))
.WillRepeatedly(DoAll(
ReturnCachedLogo(LogoCallbackReason::DETERMINED, cached_logo),
ReturnFreshLogo(LogoCallbackReason::REVALIDATED, base::nullopt)));
// Open a new blank tab, then go to NTP and listen for console messages.
content::WebContents* active_tab =
local_ntp_test_utils::OpenNewTab(browser(), GURL("about:blank"));
content::WebContentsDelegate* original_delegate = active_tab->GetDelegate();
content::ConsoleObserverDelegate console_observer(active_tab, "*");
active_tab->SetDelegate(&console_observer);
ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUINewTabURL));
ASSERT_THAT(GetComputedOpacity(active_tab, "logo-doodle"), Eq(1.0));
// Wait for the ddllog request to get resolved.
std::string response = WaitForDdllogResponse(active_tab, 1);
EXPECT_EQ("target_url_params a=b&c=d", response);
// Before clicking on the Doodle, re-attach the original WebContentsDelegate,
// otherwise setting 'window.location' doesn't have any effect.
active_tab->SetDelegate(original_delegate);
content::TestNavigationObserver nav_observer(active_tab);
ASSERT_TRUE(content::ExecuteScript(
active_tab, "document.getElementById('logo-doodle-button').click();"));
nav_observer.Wait();
ASSERT_TRUE(nav_observer.last_navigation_succeeded());
std::string target_url;
ASSERT_TRUE(instant_test_utils::GetStringFromJS(
active_tab, "document.location.href", &target_url));
EXPECT_EQ(on_click_url.spec() + "?a=b&c=d", target_url);
EXPECT_THAT(console_observer.message(), IsEmpty());
}
IN_PROC_BROWSER_TEST_F(LocalNTPDoodleTest, ShouldLogForAnimatedDoodle) {
// Start a test server to provide the ddllog responses.
net::EmbeddedTestServer test_server(net::EmbeddedTestServer::TYPE_HTTPS);
test_server.ServeFilesFromSourceDirectory("chrome/test/data/local_ntp");
ASSERT_TRUE(test_server.Start());
const GURL on_click_url = test_server.GetURL("/simple.html");
const GURL cta_log_url = test_server.GetURL("/ddllog-interaction_log_url");
const GURL log_url = test_server.GetURL("/ddllog-target_url_params");
EncodedLogo cached_logo;
cached_logo.encoded_image = MakeRefPtr(kCachedB64);
cached_logo.metadata.mime_type = "image/png";
cached_logo.metadata.type = LogoType::ANIMATED;
cached_logo.metadata.animated_url =
GURL(std::string("data:image/gif;base64,") + kTinyGifData);
cached_logo.metadata.on_click_url = on_click_url;
cached_logo.metadata.alt_text = "alt text";
cached_logo.metadata.cta_log_url = cta_log_url;
cached_logo.metadata.log_url = log_url;
EXPECT_CALL(*logo_service(), GetLogoPtr(_))
.WillRepeatedly(DoAll(
ReturnCachedLogo(LogoCallbackReason::DETERMINED, cached_logo),
ReturnFreshLogo(LogoCallbackReason::REVALIDATED, base::nullopt)));
// Open a new blank tab, then go to NTP and listen for console messages.
content::WebContents* active_tab =
local_ntp_test_utils::OpenNewTab(browser(), GURL("about:blank"));
content::WebContentsDelegate* original_delegate = active_tab->GetDelegate();
content::ConsoleObserverDelegate console_observer(active_tab, "*");
active_tab->SetDelegate(&console_observer);
ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUINewTabURL));
ASSERT_THAT(GetComputedOpacity(active_tab, "logo-doodle"), Eq(1.0));
// Wait for the first (CTA) ddllog request to get resolved.
std::string cta_response = WaitForDdllogResponse(active_tab, 1);
EXPECT_EQ(
"interaction_log_url https://www.chromium.org/doodle_interaction_log",
cta_response);
// Click image, swapping out for animated URL.
ASSERT_TRUE(content::ExecuteScript(
active_tab, "document.getElementById('logo-doodle-button').click();"));
ASSERT_THAT(GetElementProperty(active_tab, "logo-doodle-image", "src"),
Eq(cached_logo.metadata.animated_url.spec()));
// Wait for the second (non-CTA) ddllog request to get resolved.
std::string anim_response = WaitForDdllogResponse(active_tab, 2);
EXPECT_EQ("target_url_params a=b&c=d", anim_response);
// Before clicking on the Doodle, re-attach the original WebContentsDelegate,
// otherwise setting 'window.location' doesn't seem to have any effect for
// some reason.
active_tab->SetDelegate(original_delegate);
content::TestNavigationObserver nav_observer(active_tab);
ASSERT_TRUE(content::ExecuteScript(
active_tab, "document.getElementById('logo-doodle-button').click();"));
nav_observer.Wait();
ASSERT_TRUE(nav_observer.last_navigation_succeeded());
std::string target_url;
ASSERT_TRUE(instant_test_utils::GetStringFromJS(
active_tab, "document.location.href", &target_url));
EXPECT_EQ(on_click_url.spec() + "?a=b&c=d", target_url);
EXPECT_THAT(console_observer.message(), IsEmpty());
}
IN_PROC_BROWSER_TEST_F(LocalNTPDoodleTest, ShouldNotMoveFakeboxForIframeSizes) {
for (int height : {0, 150, 229, 500}) {
EncodedLogo cached_logo;
cached_logo.encoded_image = MakeRefPtr(std::string());
cached_logo.metadata.mime_type = "image/png";
cached_logo.metadata.type = LogoType::INTERACTIVE;
cached_logo.metadata.full_page_url =
GURL("https://www.chromium.org/interactive");
cached_logo.metadata.alt_text = "alt text";
cached_logo.metadata.iframe_width_px = 500;
cached_logo.metadata.iframe_height_px = height;
EXPECT_CALL(*logo_service(), GetLogoPtr(_))
.WillRepeatedly(DoAll(
ReturnCachedLogo(LogoCallbackReason::DETERMINED, cached_logo),
ReturnFreshLogo(LogoCallbackReason::REVALIDATED, base::nullopt)));
// Open a new blank tab, then go to NTP.
content::WebContents* active_tab =
local_ntp_test_utils::OpenNewTab(browser(), GURL("about:blank"));
base::HistogramTester histograms;
ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUINewTabURL));
EXPECT_THAT(GetDimension(active_tab, "fakebox", "top"), Eq(kFakeboxTopPx))
<< "iframe_height_px = " << height;
}
}
IN_PROC_BROWSER_TEST_F(LocalNTPDoodleTest, ShouldMoveFakeboxWhenIframeResized) {
EncodedLogo cached_logo;
cached_logo.encoded_image = MakeRefPtr(std::string());
cached_logo.metadata.mime_type = "image/png";
cached_logo.metadata.type = LogoType::INTERACTIVE;
cached_logo.metadata.full_page_url =
GURL("https://www.chromium.org/interactive");
cached_logo.metadata.alt_text = "alt text";
cached_logo.metadata.iframe_width_px = 400;
cached_logo.metadata.iframe_height_px = 220; // > 200, so smaller margin
EXPECT_CALL(*logo_service(), GetLogoPtr(_))
.WillRepeatedly(DoAll(
ReturnCachedLogo(LogoCallbackReason::DETERMINED, cached_logo),
ReturnFreshLogo(LogoCallbackReason::REVALIDATED, base::nullopt)));
// Open a new blank tab, then go to NTP.
content::WebContents* active_tab =
local_ntp_test_utils::OpenNewTab(browser(), GURL("about:blank"));
base::HistogramTester histograms;
ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUINewTabURL));
// Initial dimensions are correct:
EXPECT_THAT(GetDimension(active_tab, "fakebox", "top"), Eq(kFakeboxTopPx));
EXPECT_THAT(GetDimension(active_tab, "logo-doodle-iframe", "width"), Eq(400));
EXPECT_THAT(GetDimension(active_tab, "logo-doodle-iframe", "height"),
Eq(220));
// Trigger resize. The duration parameter is left untested, since that would
// require introducing a potentially-flaky sleep in the test. Additionally,
// this would really be a cross-origin postMessage, from the Doodle iframe,
// origin google.com.
ASSERT_TRUE(content::ExecuteScript(active_tab,
R"js(
window.postMessage({
cmd: "resizeDoodle",
width: "100%",
height: "400px", // 180px more
duration: "0s",
}, "chrome-search://local-ntp");
)js"));
// Fakebox is now 180px lower, with the iframe larger, as requested.
EXPECT_THAT(GetDimension(active_tab, "fakebox", "top"),
Eq(kFakeboxTopPx + 180));
EXPECT_THAT(GetDimension(active_tab, "logo-doodle-iframe", "width"),
Eq(GetDimension(active_tab, "logo", "width")));
EXPECT_THAT(GetDimension(active_tab, "logo-doodle-iframe", "height"),
Eq(400));
ASSERT_TRUE(content::ExecuteScript(active_tab,
R"js(
window.postMessage({
cmd: "resizeDoodle",
width: "400px",
height: "220px",
duration: "0s",
}, "chrome-search://local-ntp");
)js"));
// Back to the original dimensions now.
EXPECT_THAT(GetDimension(active_tab, "fakebox", "top"), Eq(kFakeboxTopPx));
EXPECT_THAT(GetDimension(active_tab, "logo-doodle-iframe", "width"), Eq(400));
EXPECT_THAT(GetDimension(active_tab, "logo-doodle-iframe", "height"),
Eq(220));
}