
Replace WebContentsImpl::GetUkmSourceIdForLastCommittedSource with a RenderFrameHost-based method. - RenderFrameHost-based method works correctly for non-current frames, unlike WebContentsImpl-based method. - GetPageUkmSourceId (page load == main-frame committed cross-document navigation) should be more intuitive than GetUkmSourceIdForLastCommittedSource. BUG=1061899 R=alexmos@chromium.org,rkaplow@chromium.org TBR=alexmos@chromium.org CC=bmcquade@chromium.org,csharrison@chromium.org Change-Id: I66d1520fbcb8ea4b59d7d0c3cbcbdbfa16516789 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2132393 Reviewed-by: Alexander Timin <altimin@chromium.org> Reviewed-by: Alex Moshchuk <alexmos@chromium.org> Reviewed-by: Bryan McQuade <bmcquade@chromium.org> Reviewed-by: Steven Holte <holte@chromium.org> Commit-Queue: Alexander Timin <altimin@chromium.org> Cr-Commit-Position: refs/heads/master@{#760530}
115 lines
4.1 KiB
C++
115 lines
4.1 KiB
C++
// 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 "content/browser/plugin_service_impl.h"
|
|
|
|
#include <memory>
|
|
|
|
#include "build/build_config.h"
|
|
#include "components/ukm/test_ukm_recorder.h"
|
|
#include "content/browser/ppapi_plugin_process_host.h"
|
|
#include "content/browser/web_contents/web_contents_impl.h"
|
|
#include "content/public/browser/browser_thread.h"
|
|
#include "content/public/browser/render_frame_host.h"
|
|
#include "content/public/browser/render_process_host.h"
|
|
#include "content/public/browser/web_contents.h"
|
|
#include "content/public/test/navigation_simulator.h"
|
|
#include "content/public/test/test_renderer_host.h"
|
|
#include "content/public/test/test_utils.h"
|
|
#include "services/metrics/public/cpp/ukm_source.h"
|
|
#include "testing/gtest/include/gtest/gtest.h"
|
|
|
|
namespace content {
|
|
|
|
namespace {
|
|
|
|
constexpr char kURL1[] = "http://google.com/";
|
|
constexpr char kURL2[] = "http://youtube.com/";
|
|
constexpr char kPepperBrokerEvent[] = "Pepper.Broker";
|
|
|
|
class TestBrokerClient : public PpapiPluginProcessHost::BrokerClient {
|
|
public:
|
|
void GetPpapiChannelInfo(base::ProcessHandle* renderer_handle,
|
|
int* renderer_id) override {}
|
|
void OnPpapiChannelOpened(const IPC::ChannelHandle& channel_handle,
|
|
base::ProcessId plugin_pid,
|
|
int plugin_child_id) override {}
|
|
bool Incognito() override { return false; }
|
|
};
|
|
|
|
} // anonymous namespace
|
|
|
|
class PluginServiceImplTest : public RenderViewHostTestHarness {
|
|
public:
|
|
PluginServiceImplTest() = default;
|
|
~PluginServiceImplTest() override = default;
|
|
|
|
void SetUp() override {
|
|
RenderViewHostTestHarness::SetUp();
|
|
|
|
test_ukm_recorder_ = std::make_unique<ukm::TestAutoSetUkmRecorder>();
|
|
}
|
|
|
|
// Check if count events were recorded and if they were all recorded with
|
|
// the specified source_id.
|
|
bool RecordedBrokerEvents(ukm::SourceId source_id, size_t count) {
|
|
RunAllPendingInMessageLoop(BrowserThread::UI);
|
|
auto entries = test_ukm_recorder_->GetEntriesByName(kPepperBrokerEvent);
|
|
if (entries.size() != count)
|
|
return false;
|
|
for (const auto* const entry : entries) {
|
|
if (entry->source_id != source_id)
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
void ResetUKM() {
|
|
test_ukm_recorder_ = std::make_unique<ukm::TestAutoSetUkmRecorder>();
|
|
}
|
|
|
|
private:
|
|
std::unique_ptr<ukm::TestUkmRecorder> test_ukm_recorder_;
|
|
|
|
DISALLOW_COPY_AND_ASSIGN(PluginServiceImplTest);
|
|
};
|
|
|
|
TEST_F(PluginServiceImplTest, RecordBrokerUsage) {
|
|
TestBrokerClient client;
|
|
|
|
NavigateAndCommit(GURL(kURL1));
|
|
ukm::SourceId source_id = static_cast<WebContentsImpl*>(web_contents())
|
|
->GetMainFrame()
|
|
->GetPageUkmSourceId();
|
|
PluginServiceImpl* service = PluginServiceImpl::GetInstance();
|
|
|
|
// Internal usage of the broker should not record metrics. Internal usage will
|
|
// not pass a RFH.
|
|
service->OpenChannelToPpapiBroker(0, 0, base::FilePath(), &client);
|
|
EXPECT_TRUE(RecordedBrokerEvents(source_id, 0));
|
|
|
|
// Top level frame usage should be recorded.
|
|
int render_process_id = main_rfh()->GetProcess()->GetID();
|
|
int render_frame_id = main_rfh()->GetRoutingID();
|
|
service->OpenChannelToPpapiBroker(render_process_id, render_frame_id,
|
|
base::FilePath(), &client);
|
|
EXPECT_TRUE(RecordedBrokerEvents(source_id, 1));
|
|
|
|
ResetUKM();
|
|
|
|
// Iframe usage should be recorded under the top level frame origin.
|
|
RenderFrameHost* child_frame =
|
|
RenderFrameHostTester::For(main_rfh())->AppendChild("child");
|
|
child_frame = NavigationSimulator::NavigateAndCommitFromDocument(GURL(kURL2),
|
|
child_frame);
|
|
EXPECT_EQ(GURL(kURL2), child_frame->GetLastCommittedURL());
|
|
render_process_id = child_frame->GetProcess()->GetID();
|
|
render_frame_id = child_frame->GetRoutingID();
|
|
service->OpenChannelToPpapiBroker(render_process_id, render_frame_id,
|
|
base::FilePath(), &client);
|
|
EXPECT_TRUE(RecordedBrokerEvents(source_id, 1));
|
|
}
|
|
|
|
} // namespace content
|