blob: aaed558176090574bda5964deb828268bb35cefc [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 "components/ukm/content/source_url_recorder.h"
#include "components/ukm/test_ukm_recorder.h"
#include "content/public/browser/web_contents.h"
#include "content/public/test/navigation_simulator.h"
#include "content/public/test/test_renderer_host.h"
#include "services/metrics/public/cpp/ukm_recorder.h"
#include "services/metrics/public/cpp/ukm_source.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "url/gurl.h"
using content::NavigationSimulator;
class SourceUrlRecorderWebContentsObserverTest
: public content::RenderViewHostTestHarness {
public:
void SetUp() override {
content::RenderViewHostTestHarness::SetUp();
ukm::InitializeSourceUrlRecorderForWebContents(web_contents());
}
GURL GetAssociatedURLForWebContentsDocument() {
const ukm::UkmSource* src = test_ukm_recorder_.GetSourceForSourceId(
ukm::GetSourceIdForWebContentsDocument(web_contents()));
return src ? src->url() : GURL();
}
protected:
ukm::TestAutoSetUkmRecorder test_ukm_recorder_;
};
TEST_F(SourceUrlRecorderWebContentsObserverTest, Basic) {
GURL url("https://www.example.com/");
NavigationSimulator::NavigateAndCommitFromBrowser(web_contents(), url);
const auto& sources = test_ukm_recorder_.GetSources();
EXPECT_EQ(1ul, sources.size());
for (const auto& kv : sources) {
EXPECT_EQ(url, kv.second->url());
EXPECT_EQ(1u, kv.second->urls().size());
}
}
TEST_F(SourceUrlRecorderWebContentsObserverTest, InitialUrl) {
GURL initial_url("https://www.a.com/");
GURL final_url("https://www.b.com/");
auto simulator =
NavigationSimulator::CreateRendererInitiated(initial_url, main_rfh());
simulator->Start();
simulator->Redirect(final_url);
simulator->Commit();
const auto& sources = test_ukm_recorder_.GetSources();
EXPECT_EQ(1ul, sources.size());
for (const auto& kv : sources) {
EXPECT_EQ(final_url, kv.second->url());
EXPECT_EQ(initial_url, kv.second->urls().front());
}
EXPECT_EQ(final_url, GetAssociatedURLForWebContentsDocument());
}
TEST_F(SourceUrlRecorderWebContentsObserverTest, IgnoreUrlInSubframe) {
GURL main_frame_url("https://www.example.com/");
GURL sub_frame_url("https://www.example.com/iframe.html");
NavigationSimulator::NavigateAndCommitFromBrowser(web_contents(),
main_frame_url);
NavigationSimulator::NavigateAndCommitFromDocument(
sub_frame_url,
content::RenderFrameHostTester::For(main_rfh())->AppendChild("subframe"));
const auto& sources = test_ukm_recorder_.GetSources();
EXPECT_EQ(1ul, sources.size());
for (const auto& kv : sources) {
EXPECT_EQ(main_frame_url, kv.second->url());
EXPECT_EQ(1u, kv.second->urls().size());
}
EXPECT_EQ(main_frame_url, GetAssociatedURLForWebContentsDocument());
}
TEST_F(SourceUrlRecorderWebContentsObserverTest, IgnoreSameDocumentNavigation) {
GURL url("https://www.example.com/");
GURL same_document_url("https://www.example.com/#samedocument");
NavigationSimulator::NavigateAndCommitFromBrowser(web_contents(), url);
NavigationSimulator::CreateRendererInitiated(same_document_url, main_rfh())
->CommitSameDocument();
EXPECT_EQ(same_document_url, web_contents()->GetLastCommittedURL());
const auto& sources = test_ukm_recorder_.GetSources();
EXPECT_EQ(1ul, sources.size());
for (const auto& kv : sources) {
EXPECT_EQ(url, kv.second->url());
EXPECT_EQ(1u, kv.second->urls().size());
}
EXPECT_EQ(url, GetAssociatedURLForWebContentsDocument());
}