Commit fa87929f authored by Josh Karlin's avatar Josh Karlin Committed by Commit Bot

Verify the ruleset earlier on if AdsTagging is running

Bug: 817365
Change-Id: I106d6b49c78f66b47a37d7f429b62b506ea5a225
Reviewed-on: https://chromium-review.googlesource.com/951823
Commit-Queue: Josh Karlin <jkarlin@chromium.org>
Reviewed-by: default avatarCharlie Harrison <csharrison@chromium.org>
Cr-Commit-Position: refs/heads/master@{#542132}
parent 3dfddc05
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
#include "base/strings/stringprintf.h" #include "base/strings/stringprintf.h"
#include "base/strings/utf_string_conversions.h" #include "base/strings/utf_string_conversions.h"
#include "base/test/histogram_tester.h" #include "base/test/histogram_tester.h"
#include "base/test/scoped_feature_list.h"
#include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process.h"
#include "chrome/browser/metrics/subprocess_metrics_provider.h" #include "chrome/browser/metrics/subprocess_metrics_provider.h"
#include "chrome/browser/page_load_metrics/observers/subresource_filter_metrics_observer.h" #include "chrome/browser/page_load_metrics/observers/subresource_filter_metrics_observer.h"
...@@ -69,6 +70,10 @@ ...@@ -69,6 +70,10 @@
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
#include "url/gurl.h" #include "url/gurl.h"
namespace subresource_filter {
using subresource_filter::testing::TestRulesetPair;
namespace { namespace {
namespace proto = url_pattern_index::proto; namespace proto = url_pattern_index::proto;
...@@ -132,12 +137,46 @@ GURL GetURLWithFragment(const GURL& url, base::StringPiece fragment) { ...@@ -132,12 +137,46 @@ GURL GetURLWithFragment(const GURL& url, base::StringPiece fragment) {
return url.ReplaceComponents(replacements); return url.ReplaceComponents(replacements);
} }
} // namespace void OpenAndPublishRuleset(ContentRulesetService* content_ruleset_service,
const base::FilePath& path) {
base::File index_file;
base::RunLoop open_loop;
auto open_callback = base::BindRepeating(
[](base::OnceClosure quit_closure, base::File* out, base::File result) {
*out = std::move(result);
std::move(quit_closure).Run();
},
open_loop.QuitClosure(), &index_file);
content_ruleset_service->TryOpenAndSetRulesetFile(path,
std::move(open_callback));
open_loop.Run();
ASSERT_TRUE(index_file.IsValid());
content_ruleset_service->PublishNewRulesetVersion(std::move(index_file));
}
namespace subresource_filter { RulesetVerificationStatus GetRulesetVerification() {
ContentRulesetService* service =
g_browser_process->subresource_filter_ruleset_service();
VerifiedRulesetDealer::Handle* dealer_handle = service->ruleset_dealer();
auto callback_method = [](base::OnceClosure quit_closure,
RulesetVerificationStatus* status,
VerifiedRulesetDealer* verified_dealer) {
*status = verified_dealer->status();
std::move(quit_closure).Run();
};
RulesetVerificationStatus status;
base::RunLoop run_loop;
auto callback =
base::BindRepeating(callback_method, run_loop.QuitClosure(), &status);
dealer_handle->GetDealerAsync(callback);
run_loop.Run();
return status;
}
using subresource_filter::testing::TestRulesetCreator; } // namespace
using subresource_filter::testing::TestRulesetPair;
// Tests ----------------------------------------------------------------------- // Tests -----------------------------------------------------------------------
...@@ -654,8 +693,7 @@ IN_PROC_BROWSER_TEST_F(SubresourceFilterBrowserTest, ...@@ -654,8 +693,7 @@ IN_PROC_BROWSER_TEST_F(SubresourceFilterBrowserTest,
ContentRulesetService* service = ContentRulesetService* service =
g_browser_process->subresource_filter_ruleset_service(); g_browser_process->subresource_filter_ruleset_service();
ASSERT_TRUE(service->ruleset_dealer()); ASSERT_TRUE(service->ruleset_dealer());
service->PublishNewRulesetVersion( OpenAndPublishRuleset(service, test_ruleset_pair.indexed.path);
testing::TestRuleset::Open(test_ruleset_pair.indexed));
auto ruleset_handle = auto ruleset_handle =
std::make_unique<VerifiedRuleset::Handle>(service->ruleset_dealer()); std::make_unique<VerifiedRuleset::Handle>(service->ruleset_dealer());
...@@ -667,6 +705,27 @@ IN_PROC_BROWSER_TEST_F(SubresourceFilterBrowserTest, ...@@ -667,6 +705,27 @@ IN_PROC_BROWSER_TEST_F(SubresourceFilterBrowserTest,
receiver.GetCallback()); receiver.GetCallback());
receiver.WaitForActivationDecision(); receiver.WaitForActivationDecision();
receiver.ExpectReceivedOnce(ActivationState(ActivationLevel::DISABLED)); receiver.ExpectReceivedOnce(ActivationState(ActivationLevel::DISABLED));
RulesetVerificationStatus dealer_status = GetRulesetVerification();
EXPECT_EQ(RulesetVerificationStatus::CORRUPT, dealer_status);
}
IN_PROC_BROWSER_TEST_F(SubresourceFilterBrowserTest, LazyRulesetValidation) {
// The ruleset shouldn't be validated until it's used.
SetRulesetToDisallowURLsWithPathSuffix("included_script.js");
RulesetVerificationStatus dealer_status = GetRulesetVerification();
EXPECT_EQ(RulesetVerificationStatus::NOT_VERIFIED, dealer_status);
}
IN_PROC_BROWSER_TEST_F(SubresourceFilterBrowserTest,
AdsTaggingImmediateRulesetValidation) {
// When Ads Tagging is enabled, the ruleset should be validated as soon as
// it's published.
base::test::ScopedFeatureList feature_list;
feature_list.InitAndEnableFeature(subresource_filter::kAdTagging);
SetRulesetToDisallowURLsWithPathSuffix("included_script.js");
RulesetVerificationStatus dealer_status = GetRulesetVerification();
EXPECT_EQ(RulesetVerificationStatus::INTACT, dealer_status);
} }
IN_PROC_BROWSER_TEST_F(SubresourceFilterBrowserTest, PageLoadMetrics) { IN_PROC_BROWSER_TEST_F(SubresourceFilterBrowserTest, PageLoadMetrics) {
......
...@@ -6,12 +6,14 @@ ...@@ -6,12 +6,14 @@
#include <utility> #include <utility>
#include "base/feature_list.h"
#include "base/logging.h" #include "base/logging.h"
#include "base/macros.h" #include "base/macros.h"
#include "base/sequenced_task_runner.h" #include "base/sequenced_task_runner.h"
#include "base/task_scheduler/post_task.h" #include "base/task_scheduler/post_task.h"
#include "components/subresource_filter/content/common/subresource_filter_messages.h" #include "components/subresource_filter/content/common/subresource_filter_messages.h"
#include "components/subresource_filter/core/browser/ruleset_service.h" #include "components/subresource_filter/core/browser/ruleset_service.h"
#include "components/subresource_filter/core/browser/subresource_filter_features.h"
#include "content/public/browser/browser_thread.h" #include "content/public/browser/browser_thread.h"
#include "content/public/browser/notification_service.h" #include "content/public/browser/notification_service.h"
#include "content/public/browser/notification_source.h" #include "content/public/browser/notification_source.h"
...@@ -85,6 +87,14 @@ void ContentRulesetService::PublishNewRulesetVersion(base::File ruleset_data) { ...@@ -85,6 +87,14 @@ void ContentRulesetService::PublishNewRulesetVersion(base::File ruleset_data) {
DCHECK(ruleset_data.IsValid()); DCHECK(ruleset_data.IsValid());
CloseFileOnFileThread(&ruleset_data_); CloseFileOnFileThread(&ruleset_data_);
// If Ad Tagging is running, then every request does a lookup and it's
// important that we verify the ruleset early on.
if (base::FeatureList::IsEnabled(kAdTagging)) {
// Even though the handle will immediately be destroyed, it will still
// validate the ruleset on its task runner.
VerifiedRuleset::Handle ruleset_handle(ruleset_dealer_.get());
}
ruleset_data_ = std::move(ruleset_data); ruleset_data_ = std::move(ruleset_data);
for (auto it = content::RenderProcessHost::AllHostsIterator(); !it.IsAtEnd(); for (auto it = content::RenderProcessHost::AllHostsIterator(); !it.IsAtEnd();
it.Advance()) { it.Advance()) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment