Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(997)

Unified Diff: content/browser/gpu/gpu_data_manager_impl_unittest.cc

Issue 11378008: Raise an infobar and deny access to WebGL if a GPU reset was detected while a web page containing W… (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Work around build failure on Mac OS with 10.6 SDK. Created 8 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/browser/gpu/gpu_data_manager_impl.cc ('k') | content/browser/renderer_host/render_message_filter.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/browser/gpu/gpu_data_manager_impl_unittest.cc
diff --git a/content/browser/gpu/gpu_data_manager_impl_unittest.cc b/content/browser/gpu/gpu_data_manager_impl_unittest.cc
index 371f60721f4b5b041005c6e6795e6c30143d79d9..159cf58116004043525ff01d40de6ed2edb91b16 100644
--- a/content/browser/gpu/gpu_data_manager_impl_unittest.cc
+++ b/content/browser/gpu/gpu_data_manager_impl_unittest.cc
@@ -4,9 +4,11 @@
#include "base/message_loop.h"
#include "base/run_loop.h"
+#include "base/time.h"
#include "content/browser/gpu/gpu_data_manager_impl.h"
#include "content/public/browser/gpu_data_manager_observer.h"
#include "content/public/common/gpu_info.h"
+#include "googleurl/src/gurl.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace content {
@@ -39,6 +41,18 @@ class TestObserver : public GpuDataManagerObserver {
bool video_memory_usage_stats_updated_;
};
+static base::Time GetTimeForTesting() {
+ return base::Time::FromDoubleT(1000);
+}
+
+static GURL GetDomain1ForTesting() {
+ return GURL("http://foo.com/");
+}
+
+static GURL GetDomain2ForTesting() {
+ return GURL("http://bar.com/");
+}
+
} // namespace anonymous
class GpuDataManagerImplTest : public testing::Test {
@@ -48,12 +62,38 @@ class GpuDataManagerImplTest : public testing::Test {
virtual ~GpuDataManagerImplTest() { }
protected:
+ // scoped_ptr doesn't work with GpuDataManagerImpl because its
+ // destructor is private. GpuDataManagerImplTest is however a friend
+ // so we can make a little helper class here.
+ class ScopedGpuDataManagerImpl {
+ public:
+ ScopedGpuDataManagerImpl() : impl_(new GpuDataManagerImpl()) {}
+ ~ScopedGpuDataManagerImpl() { delete impl_; }
+
+ GpuDataManagerImpl* get() const { return impl_; }
+ GpuDataManagerImpl* operator->() const { return impl_; }
+ // Small violation of C++ style guide to avoid polluting several
+ // tests with get() calls.
+ operator GpuDataManagerImpl*() { return impl_; }
+
+ private:
+ GpuDataManagerImpl* impl_;
+ DISALLOW_COPY_AND_ASSIGN(ScopedGpuDataManagerImpl);
+ };
+
void SetUp() {
}
void TearDown() {
}
+ base::Time JustBeforeExpiration(GpuDataManagerImpl* manager);
+ base::Time JustAfterExpiration(GpuDataManagerImpl* manager);
+ void TestBlockingDomainFrom3DAPIs(
+ GpuDataManagerImpl::DomainGuilt guilt_level);
+ void TestUnblockingDomainFrom3DAPIs(
+ GpuDataManagerImpl::DomainGuilt guilt_level);
+
MessageLoop message_loop_;
};
@@ -65,8 +105,8 @@ TEST_F(GpuDataManagerImplTest, GpuSideBlacklisting) {
// disabled when GPU process launches and collects full GPU info,
// it's too late to let renderer know, so we basically block all GPU
// access, to be on the safe side.
- GpuDataManagerImpl* manager = new GpuDataManagerImpl();
- ASSERT_TRUE(manager);
+ ScopedGpuDataManagerImpl manager;
+ ASSERT_TRUE(manager.get());
EXPECT_EQ(0, manager->GetBlacklistedFeatures());
EXPECT_TRUE(manager->GpuAccessAllowed());
@@ -108,13 +148,11 @@ TEST_F(GpuDataManagerImplTest, GpuSideBlacklisting) {
EXPECT_EQ(GPU_FEATURE_TYPE_WEBGL |
GPU_FEATURE_TYPE_ACCELERATED_2D_CANVAS,
manager->GetBlacklistedFeatures());
-
- delete manager;
}
TEST_F(GpuDataManagerImplTest, GpuSideExceptions) {
- GpuDataManagerImpl* manager = new GpuDataManagerImpl();
- ASSERT_TRUE(manager);
+ ScopedGpuDataManagerImpl manager;
+ ASSERT_TRUE(manager.get());
EXPECT_EQ(0, manager->GetBlacklistedFeatures());
EXPECT_TRUE(manager->GpuAccessAllowed());
@@ -153,27 +191,23 @@ TEST_F(GpuDataManagerImplTest, GpuSideExceptions) {
manager->UpdateGpuInfo(gpu_info);
EXPECT_TRUE(manager->GpuAccessAllowed());
EXPECT_EQ(0, manager->GetBlacklistedFeatures());
-
- delete manager;
}
TEST_F(GpuDataManagerImplTest, BlacklistCard) {
- GpuDataManagerImpl* manager = new GpuDataManagerImpl();
- ASSERT_TRUE(manager);
+ ScopedGpuDataManagerImpl manager;
+ ASSERT_TRUE(manager.get());
EXPECT_EQ(0, manager->GetBlacklistedFeatures());
EXPECT_TRUE(manager->GpuAccessAllowed());
manager->BlacklistCard();
EXPECT_FALSE(manager->GpuAccessAllowed());
EXPECT_EQ(GPU_FEATURE_TYPE_ALL, manager->GetBlacklistedFeatures());
-
- delete manager;
}
TEST_F(GpuDataManagerImplTest, SoftwareRendering) {
// Blacklist, then register SwiftShader.
- GpuDataManagerImpl* manager = new GpuDataManagerImpl();
- ASSERT_TRUE(manager);
+ ScopedGpuDataManagerImpl manager;
+ ASSERT_TRUE(manager.get());
EXPECT_EQ(0, manager->GetBlacklistedFeatures());
EXPECT_TRUE(manager->GpuAccessAllowed());
EXPECT_FALSE(manager->ShouldUseSoftwareRendering());
@@ -190,14 +224,12 @@ TEST_F(GpuDataManagerImplTest, SoftwareRendering) {
EXPECT_TRUE(manager->GpuAccessAllowed());
EXPECT_EQ(GPU_FEATURE_TYPE_ACCELERATED_2D_CANVAS,
manager->GetBlacklistedFeatures());
-
- delete manager;
}
TEST_F(GpuDataManagerImplTest, SoftwareRendering2) {
// Register SwiftShader, then blacklist.
- GpuDataManagerImpl* manager = new GpuDataManagerImpl();
- ASSERT_TRUE(manager);
+ ScopedGpuDataManagerImpl manager;
+ ASSERT_TRUE(manager.get());
EXPECT_EQ(0, manager->GetBlacklistedFeatures());
EXPECT_TRUE(manager->GpuAccessAllowed());
EXPECT_FALSE(manager->ShouldUseSoftwareRendering());
@@ -213,13 +245,11 @@ TEST_F(GpuDataManagerImplTest, SoftwareRendering2) {
EXPECT_TRUE(manager->ShouldUseSoftwareRendering());
EXPECT_EQ(GPU_FEATURE_TYPE_ACCELERATED_2D_CANVAS,
manager->GetBlacklistedFeatures());
-
- delete manager;
}
TEST_F(GpuDataManagerImplTest, GpuInfoUpdate) {
- GpuDataManagerImpl* manager = new GpuDataManagerImpl();
- ASSERT_TRUE(manager);
+ ScopedGpuDataManagerImpl manager;
+ ASSERT_TRUE(manager.get());
TestObserver observer;
manager->AddObserver(&observer);
@@ -237,13 +267,11 @@ TEST_F(GpuDataManagerImplTest, GpuInfoUpdate) {
run_loop.RunUntilIdle();
}
EXPECT_TRUE(observer.gpu_info_updated());
-
- delete manager;
}
TEST_F(GpuDataManagerImplTest, NoGpuInfoUpdateWithSoftwareRendering) {
- GpuDataManagerImpl* manager = new GpuDataManagerImpl();
- ASSERT_TRUE(manager);
+ ScopedGpuDataManagerImpl manager;
+ ASSERT_TRUE(manager.get());
manager->BlacklistCard();
const FilePath test_path(FILE_PATH_LITERAL("AnyPath"));
@@ -271,13 +299,11 @@ TEST_F(GpuDataManagerImplTest, NoGpuInfoUpdateWithSoftwareRendering) {
run_loop.RunUntilIdle();
}
EXPECT_FALSE(observer.gpu_info_updated());
-
- delete manager;
}
TEST_F(GpuDataManagerImplTest, GPUVideoMemoryUsageStatsUpdate) {
- GpuDataManagerImpl* manager = new GpuDataManagerImpl();
- ASSERT_TRUE(manager);
+ ScopedGpuDataManagerImpl manager;
+ ASSERT_TRUE(manager.get());
TestObserver observer;
manager->AddObserver(&observer);
@@ -295,8 +321,133 @@ TEST_F(GpuDataManagerImplTest, GPUVideoMemoryUsageStatsUpdate) {
run_loop.RunUntilIdle();
}
EXPECT_TRUE(observer.video_memory_usage_stats_updated());
+}
+
+base::Time GpuDataManagerImplTest::JustBeforeExpiration(
+ GpuDataManagerImpl* manager) {
+ return GetTimeForTesting() + base::TimeDelta::FromMilliseconds(
+ manager->GetBlockAllDomainsDurationInMs()) -
+ base::TimeDelta::FromMilliseconds(3);
+}
+
+base::Time GpuDataManagerImplTest::JustAfterExpiration(
+ GpuDataManagerImpl* manager) {
+ return GetTimeForTesting() + base::TimeDelta::FromMilliseconds(
+ manager->GetBlockAllDomainsDurationInMs()) +
+ base::TimeDelta::FromMilliseconds(3);
+}
+
+void GpuDataManagerImplTest::TestBlockingDomainFrom3DAPIs(
+ GpuDataManagerImpl::DomainGuilt guilt_level) {
+ ScopedGpuDataManagerImpl manager;
+ ASSERT_TRUE(manager.get());
+
+ manager->BlockDomainFrom3DAPIsAtTime(GetDomain1ForTesting(),
+ guilt_level,
+ GetTimeForTesting());
+
+ // This domain should be blocked no matter what.
+ EXPECT_EQ(GpuDataManagerImpl::DOMAIN_BLOCK_STATUS_BLOCKED,
+ manager->Are3DAPIsBlockedAtTime(GetDomain1ForTesting(),
+ GetTimeForTesting()));
+ EXPECT_EQ(GpuDataManagerImpl::DOMAIN_BLOCK_STATUS_BLOCKED,
+ manager->Are3DAPIsBlockedAtTime(GetDomain1ForTesting(),
+ JustBeforeExpiration(manager)));
+ EXPECT_EQ(GpuDataManagerImpl::DOMAIN_BLOCK_STATUS_BLOCKED,
+ manager->Are3DAPIsBlockedAtTime(GetDomain1ForTesting(),
+ JustAfterExpiration(manager)));
+}
+
+void GpuDataManagerImplTest::TestUnblockingDomainFrom3DAPIs(
+ GpuDataManagerImpl::DomainGuilt guilt_level) {
+ ScopedGpuDataManagerImpl manager;
+ ASSERT_TRUE(manager.get());
+
+ manager->BlockDomainFrom3DAPIsAtTime(GetDomain1ForTesting(),
+ guilt_level,
+ GetTimeForTesting());
+
+ // Unblocking the domain should work.
+ manager->UnblockDomainFrom3DAPIs(GetDomain1ForTesting());
+ EXPECT_EQ(GpuDataManagerImpl::DOMAIN_BLOCK_STATUS_NOT_BLOCKED,
+ manager->Are3DAPIsBlockedAtTime(GetDomain1ForTesting(),
+ GetTimeForTesting()));
+ EXPECT_EQ(GpuDataManagerImpl::DOMAIN_BLOCK_STATUS_NOT_BLOCKED,
+ manager->Are3DAPIsBlockedAtTime(GetDomain1ForTesting(),
+ JustBeforeExpiration(manager)));
+ EXPECT_EQ(GpuDataManagerImpl::DOMAIN_BLOCK_STATUS_NOT_BLOCKED,
+ manager->Are3DAPIsBlockedAtTime(GetDomain1ForTesting(),
+ JustAfterExpiration(manager)));
+}
+
+TEST_F(GpuDataManagerImplTest, BlockGuiltyDomainFrom3DAPIs) {
+ TestBlockingDomainFrom3DAPIs(GpuDataManagerImpl::DOMAIN_GUILT_KNOWN);
+}
+
+TEST_F(GpuDataManagerImplTest, BlockDomainOfUnknownGuiltFrom3DAPIs) {
+ TestBlockingDomainFrom3DAPIs(GpuDataManagerImpl::DOMAIN_GUILT_UNKNOWN);
+}
+
+TEST_F(GpuDataManagerImplTest, BlockAllDomainsFrom3DAPIs) {
+ ScopedGpuDataManagerImpl manager;
+ ASSERT_TRUE(manager.get());
+
+ manager->BlockDomainFrom3DAPIsAtTime(GetDomain1ForTesting(),
+ GpuDataManagerImpl::DOMAIN_GUILT_UNKNOWN,
+ GetTimeForTesting());
+
+ // Blocking of other domains should expire.
+ EXPECT_EQ(GpuDataManagerImpl::DOMAIN_BLOCK_STATUS_ALL_DOMAINS_BLOCKED,
+ manager->Are3DAPIsBlockedAtTime(GetDomain2ForTesting(),
+ JustBeforeExpiration(manager)));
+ EXPECT_EQ(GpuDataManagerImpl::DOMAIN_BLOCK_STATUS_NOT_BLOCKED,
+ manager->Are3DAPIsBlockedAtTime(GetDomain2ForTesting(),
+ JustAfterExpiration(manager)));
+}
+
+TEST_F(GpuDataManagerImplTest, UnblockGuiltyDomainFrom3DAPIs) {
+ TestUnblockingDomainFrom3DAPIs(GpuDataManagerImpl::DOMAIN_GUILT_KNOWN);
+}
+
+TEST_F(GpuDataManagerImplTest, UnblockDomainOfUnknownGuiltFrom3DAPIs) {
+ TestUnblockingDomainFrom3DAPIs(GpuDataManagerImpl::DOMAIN_GUILT_UNKNOWN);
+}
+
+TEST_F(GpuDataManagerImplTest, UnblockOtherDomainFrom3DAPIs) {
+ ScopedGpuDataManagerImpl manager;
+ ASSERT_TRUE(manager.get());
+
+ manager->BlockDomainFrom3DAPIsAtTime(GetDomain1ForTesting(),
+ GpuDataManagerImpl::DOMAIN_GUILT_UNKNOWN,
+ GetTimeForTesting());
+
+ manager->UnblockDomainFrom3DAPIs(GetDomain2ForTesting());
+
+ EXPECT_EQ(GpuDataManagerImpl::DOMAIN_BLOCK_STATUS_NOT_BLOCKED,
+ manager->Are3DAPIsBlockedAtTime(GetDomain2ForTesting(),
+ JustBeforeExpiration(manager)));
+
+ // The original domain should still be blocked.
+ EXPECT_EQ(GpuDataManagerImpl::DOMAIN_BLOCK_STATUS_BLOCKED,
+ manager->Are3DAPIsBlockedAtTime(GetDomain1ForTesting(),
+ JustBeforeExpiration(manager)));
+}
+
+TEST_F(GpuDataManagerImplTest, UnblockThisDomainFrom3DAPIs) {
+ ScopedGpuDataManagerImpl manager;
+ ASSERT_TRUE(manager.get());
+
+ manager->BlockDomainFrom3DAPIsAtTime(GetDomain1ForTesting(),
+ GpuDataManagerImpl::DOMAIN_GUILT_UNKNOWN,
+ GetTimeForTesting());
+
+ manager->UnblockDomainFrom3DAPIs(GetDomain1ForTesting());
- delete manager;
+ // This behavior is debatable. Perhaps the GPU reset caused by
+ // domain 1 should still cause other domains to be blocked.
+ EXPECT_EQ(GpuDataManagerImpl::DOMAIN_BLOCK_STATUS_NOT_BLOCKED,
+ manager->Are3DAPIsBlockedAtTime(GetDomain2ForTesting(),
+ JustBeforeExpiration(manager)));
}
} // namespace content
« no previous file with comments | « content/browser/gpu/gpu_data_manager_impl.cc ('k') | content/browser/renderer_host/render_message_filter.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698