blob: 9fb435a621e1dda92bf48d3ce61ead706523b87a [file] [log] [blame]
// Copyright 2015 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/page_load_metrics/browser/metrics_web_contents_observer.h"
#include <memory>
#include <vector>
#include "base/macros.h"
#include "base/process/kill.h"
#include "chrome/common/url_constants.h"
#include "chrome/test/base/chrome_render_view_host_test_harness.h"
#include "components/page_load_metrics/browser/test_metrics_web_contents_observer_embedder.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/test/navigation_simulator.h"
#include "content/public/test/web_contents_tester.h"
#include "extensions/buildflags/buildflags.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-blink.h"
#include "url/gurl.h"
#if BUILDFLAG(ENABLE_EXTENSIONS)
#include "extensions/browser/extension_registry.h"
#include "extensions/common/constants.h"
#include "extensions/common/extension.h"
#include "extensions/common/manifest_constants.h"
#include "extensions/common/value_builder.h"
#endif
using content::NavigationSimulator;
namespace page_load_metrics {
class MetricsWebContentsObserverTest : public ChromeRenderViewHostTestHarness {
public:
MetricsWebContentsObserverTest() = default;
void SetUp() override {
ChromeRenderViewHostTestHarness::SetUp();
AttachObserver();
}
const std::vector<mojom::PageLoadFeatures>& observed_features() const {
return embedder_interface_->observed_features();
}
protected:
MetricsWebContentsObserver* observer() {
return MetricsWebContentsObserver::FromWebContents(web_contents());
}
private:
void AttachObserver() {
auto embedder_interface =
std::make_unique<TestMetricsWebContentsObserverEmbedder>();
embedder_interface_ = embedder_interface.get();
MetricsWebContentsObserver* observer =
MetricsWebContentsObserver::CreateForWebContents(
web_contents(), std::move(embedder_interface));
observer->OnVisibilityChanged(content::Visibility::VISIBLE);
}
TestMetricsWebContentsObserverEmbedder* embedder_interface_;
DISALLOW_COPY_AND_ASSIGN(MetricsWebContentsObserverTest);
};
#if BUILDFLAG(ENABLE_EXTENSIONS)
TEST_F(MetricsWebContentsObserverTest,
RecordFeatureUsageIgnoresChromeExtensionUpdates) {
// Register our fake extension. The URL we access must be part of the
// 'web_accessible_resources' for the network commit to work.
base::DictionaryValue manifest;
manifest.SetString(extensions::manifest_keys::kVersion, "1.0.0.0");
manifest.SetString(extensions::manifest_keys::kName, "TestExtension");
manifest.SetInteger(extensions::manifest_keys::kManifestVersion, 2);
manifest.Set("web_accessible_resources",
extensions::ListBuilder().Append("main.html").Build());
std::string error;
scoped_refptr<extensions::Extension> extension =
extensions::Extension::Create(
base::FilePath(FILE_PATH_LITERAL("//no-such-file")),
extensions::mojom::ManifestLocation::kInvalidLocation, manifest,
extensions::Extension::NO_FLAGS, "mbflcebpggnecokmikipoihdbecnjfoj",
&error);
ASSERT_TRUE(error.empty());
extensions::ExtensionRegistry::Get(web_contents()->GetBrowserContext())
->AddEnabled(extension);
content::WebContentsTester* web_contents_tester =
content::WebContentsTester::For(web_contents());
const GURL chrome_extension_url(
"chrome-extension://mbflcebpggnecokmikipoihdbecnjfoj/main.html");
web_contents_tester->NavigateAndCommit(GURL(chrome_extension_url));
ASSERT_EQ(main_rfh()->GetLastCommittedURL().spec(),
GURL(chrome_extension_url));
std::vector<blink::mojom::WebFeature> web_features;
web_features.push_back(blink::mojom::WebFeature::kHTMLMarqueeElement);
web_features.push_back(blink::mojom::WebFeature::kFormAttribute);
mojom::PageLoadFeatures features(web_features, {}, {});
MetricsWebContentsObserver::RecordFeatureUsage(main_rfh(), features);
// The features come from an extension source, so shouldn't be counted.
EXPECT_EQ(observed_features().size(), 0ul);
}
#endif
} // namespace page_load_metrics