Chromium Code Reviews| Index: content/browser/gpu/gpu_data_manager_impl.h |
| diff --git a/content/browser/gpu/gpu_data_manager_impl.h b/content/browser/gpu/gpu_data_manager_impl.h |
| index 62707350b25e48c5b08b4e68ce877a0d7f9c778b..f9b2c8d24aa6c9da27d98e46f80b3ad7a00a245f 100644 |
| --- a/content/browser/gpu/gpu_data_manager_impl.h |
| +++ b/content/browser/gpu/gpu_data_manager_impl.h |
| @@ -5,7 +5,8 @@ |
| #ifndef CONTENT_BROWSER_GPU_GPU_DATA_MANAGER_IMPL_H_ |
| #define CONTENT_BROWSER_GPU_GPU_DATA_MANAGER_IMPL_H_ |
| -#include <set> |
| +#include <list> |
| +#include <map> |
| #include <string> |
| #include "base/compiler_specific.h" |
| @@ -15,6 +16,7 @@ |
| #include "base/memory/singleton.h" |
| #include "base/observer_list_threadsafe.h" |
| #include "base/synchronization/lock.h" |
| +#include "base/time.h" |
| #include "base/values.h" |
| #include "content/browser/gpu/gpu_blacklist.h" |
| #include "content/public/browser/gpu_data_manager.h" |
| @@ -22,12 +24,31 @@ |
| #include "content/public/common/gpu_memory_stats.h" |
| class CommandLine; |
| +class GURL; |
| namespace content { |
| class CONTENT_EXPORT GpuDataManagerImpl |
| : public NON_EXPORTED_BASE(GpuDataManager) { |
| public: |
| + // Indicates the guilt level of a domain which caused a GPU reset. |
| + // If a domain is 100% known to be guilty of resetting the GPU, then |
| + // it will generally not cause other domains' use of 3D APIs to be |
| + // blocked, unless system stability would be compromised. |
| + enum DomainGuilt { |
| + DOMAIN_GUILT_KNOWN, |
| + DOMAIN_GUILT_UNKNOWN |
| + }; |
| + |
| + // Indicates the reason that access to a given client API (like |
| + // WebGL or Pepper 3D) was blocked or not. This state is distinct |
| + // from blacklisting of an entire feature. |
| + enum DomainBlockStatus { |
| + DOMAIN_BLOCK_STATUS_BLOCKED, |
| + DOMAIN_BLOCK_STATUS_ALL_DOMAINS_BLOCKED, |
| + DOMAIN_BLOCK_STATUS_NOT_BLOCKED |
| + }; |
| + |
| // Getter for the singleton. This will return NULL on failure. |
| static GpuDataManagerImpl* GetInstance(); |
| @@ -53,6 +74,8 @@ class CONTENT_EXPORT GpuDataManagerImpl |
| virtual void RemoveObserver(GpuDataManagerObserver* observer) OVERRIDE; |
| virtual void SetWindowCount(uint32 count) OVERRIDE; |
| virtual uint32 GetWindowCount() const OVERRIDE; |
| + virtual void UnblockDomainFrom3DAPIs(const GURL& url) OVERRIDE; |
| + virtual void DisableDomainBlockingFor3DAPIsForTesting() OVERRIDE; |
| // This collects preliminary GPU info, load GpuBlacklist, and compute the |
| // preliminary blacklisted features; it should only be called at browser |
| @@ -91,7 +114,27 @@ class CONTENT_EXPORT GpuDataManagerImpl |
| bool IsUsingAcceleratedSurface() const; |
| #endif |
| + // Maintenance of domains requiring explicit user permission before |
| + // using client-facing 3D APIs (WebGL, Pepper 3D), either because |
| + // the domain has caused the GPU to reset, or because too many GPU |
| + // resets have been observed globally recently, and system stability |
| + // might be compromised. |
| + // |
| + // The given URL may be a partial URL (including at least the host) |
| + // or a full URL to a page. |
| + // |
| + // Note that the unblocking API must be part of the content API |
| + // because it is called from Chrome side code. |
| + void BlockDomainFrom3DAPIs(const GURL& url, DomainGuilt guilt); |
| + DomainBlockStatus Are3DAPIsBlocked(const GURL& url) const; |
| + |
| private: |
| + struct DomainBlockEntry { |
| + DomainGuilt last_guilt; |
| + }; |
| + |
| + typedef std::map<std::string, DomainBlockEntry> DomainBlockMap; |
| + |
| typedef ObserverListThreadSafe<GpuDataManagerObserver> |
| GpuDataManagerObserverList; |
| @@ -108,6 +151,16 @@ class CONTENT_EXPORT GpuDataManagerImpl |
| NoGpuInfoUpdateWithSoftwareRendering); |
| FRIEND_TEST_ALL_PREFIXES(GpuDataManagerImplTest, |
| GPUVideoMemoryUsageStatsUpdate); |
| + FRIEND_TEST_ALL_PREFIXES(GpuDataManagerImplTest, |
| + BlockAllDomainsFrom3DAPIs); |
| + FRIEND_TEST_ALL_PREFIXES(GpuDataManagerImplTest, |
| + UnblockGuiltyDomainFrom3DAPIs); |
| + FRIEND_TEST_ALL_PREFIXES(GpuDataManagerImplTest, |
| + UnblockDomainOfUnknownGuiltFrom3DAPIs); |
| + FRIEND_TEST_ALL_PREFIXES(GpuDataManagerImplTest, |
| + UnblockOtherDomainFrom3DAPIs); |
| + FRIEND_TEST_ALL_PREFIXES(GpuDataManagerImplTest, |
| + UnblockThisDomainFrom3DAPIs); |
| GpuDataManagerImpl(); |
| virtual ~GpuDataManagerImpl(); |
| @@ -131,6 +184,17 @@ class CONTENT_EXPORT GpuDataManagerImpl |
| // Try to switch to software rendering, if possible and necessary. |
| void EnableSoftwareRenderingIfNecessary(); |
| + // Helper to extract the domain from a given URL. |
| + std::string GetDomainFromURL(const GURL& url) const; |
| + |
| + // Implementation functions for blocking of 3D graphics APIs, used |
| + // for unit testing. |
| + void BlockDomainFrom3DAPIsAtTime( |
| + const GURL& url, DomainGuilt guilt, base::Time at_time); |
| + DomainBlockStatus Are3DAPIsBlockedAtTime( |
| + const GURL& url, base::Time at_time) const; |
| + int64 GetBlockAllDomainsDurationInMs() const; |
| + |
| bool complete_gpu_info_already_requested_; |
| GpuFeatureType blacklisted_features_; |
| @@ -163,6 +227,10 @@ class CONTENT_EXPORT GpuDataManagerImpl |
| // Number of currently open windows, to be used in gpu memory allocation. |
| int window_count_; |
| + DomainBlockMap blocked_domains_; |
| + mutable std::list<base::Time> timestamps_of_gpu_resets_; |
|
jam
2012/11/15 16:57:25
doesn't look like this needs to be mutable?
Ken Russell (switch to Gerrit)
2012/11/15 20:53:25
It does -- the const Are3DAPIsBlocked removes expi
jam
2012/11/15 21:11:38
ah I somehow missed that one when looking, nvm
|
| + bool domain_blocking_enabled_; |
| + |
| DISALLOW_COPY_AND_ASSIGN(GpuDataManagerImpl); |
| }; |