Index: content/browser/loader/resource_scheduler.cc |
diff --git a/content/browser/loader/resource_scheduler.cc b/content/browser/loader/resource_scheduler.cc |
index 85adbdb30e275631b53af88286e75b658e73a16c..7ce283eb2f67720fdb9bf5fd24ef168ba2035ff8 100644 |
--- a/content/browser/loader/resource_scheduler.cc |
+++ b/content/browser/loader/resource_scheduler.cc |
@@ -12,6 +12,7 @@ |
#include "content/public/browser/resource_controller.h" |
#include "content/public/browser/resource_request_info.h" |
#include "content/public/browser/resource_throttle.h" |
+#include "content/public/browser/web_contents_observer.h" |
#include "ipc/ipc_message_macros.h" |
#include "net/base/host_port_pair.h" |
#include "net/base/load_flags.h" |
@@ -228,11 +229,11 @@ void ResourceScheduler::RequestQueue::Insert( |
} |
// Each client represents a tab. |
-class ResourceScheduler::Client { |
+class ResourceScheduler::Client : public content::WebContentsObserver { |
public: |
- explicit Client(ResourceScheduler* scheduler) |
+ explicit Client(ResourceScheduler* scheduler, WebContentsImpl* web_contents) |
: is_audible_(false), |
- is_visible_(false), |
+ is_visible_(!web_contents->IsHidden()), |
mmenke
2014/08/15 18:57:09
It's not safe to muck with the web_contents here.
|
is_loaded_(false), |
is_paused_(false), |
has_body_(false), |
@@ -240,9 +241,10 @@ class ResourceScheduler::Client { |
total_delayable_count_(0), |
throttle_state_(ResourceScheduler::THROTTLED) { |
scheduler_ = scheduler; |
+ Observe(web_contents); |
} |
- ~Client() { |
+ virtual ~Client() { |
// Update to default state and pause to ensure the scheduler has a |
// correct count of relevant types of clients. |
is_visible_ = false; |
@@ -251,6 +253,16 @@ class ResourceScheduler::Client { |
UpdateThrottleState(); |
} |
+ // WebContentsObserver implementation. |
+ virtual void WasShown() OVERRIDE { |
+ OnVisibilityChanged(true); |
+ } |
+ |
+ // WebContentsObserver implementation. |
+ virtual void WasHidden() OVERRIDE { |
+ OnVisibilityChanged(false); |
+ } |
+ |
void ScheduleRequest( |
net::URLRequest* url_request, |
ScheduledResourceRequest* request) { |
@@ -288,6 +300,8 @@ class ResourceScheduler::Client { |
bool is_loaded() const { return is_loaded_; } |
+ bool IsVisible() const { return is_visible_; } |
+ |
void OnAudibilityChanged(bool is_audible) { |
if (is_audible == is_audible_) { |
return; |
@@ -731,12 +745,14 @@ void ResourceScheduler::RemoveRequest(ScheduledResourceRequest* request) { |
client->RemoveRequest(request); |
} |
-void ResourceScheduler::OnClientCreated(int child_id, int route_id) { |
+void ResourceScheduler::OnClientCreated(int child_id, |
+ int route_id, |
+ WebContentsImpl* web_contents) { |
DCHECK(CalledOnValidThread()); |
ClientId client_id = MakeClientId(child_id, route_id); |
DCHECK(!ContainsKey(client_map_, client_id)); |
- Client* client = new Client(this); |
+ Client* client = new Client(this, web_contents); |
client_map_[client_id] = client; |
// TODO(aiolos): set Client visibility/audibility when signals are added |
@@ -817,14 +833,6 @@ void ResourceScheduler::OnAudibilityChanged(int child_id, |
client->OnAudibilityChanged(is_audible); |
} |
-void ResourceScheduler::OnVisibilityChanged(int child_id, |
- int route_id, |
- bool is_visible) { |
- Client* client = GetClient(child_id, route_id); |
- DCHECK(client); |
- client->OnVisibilityChanged(is_visible); |
-} |
- |
void ResourceScheduler::OnLoadingStateChanged(int child_id, |
int route_id, |
bool is_loaded) { |
@@ -833,6 +841,12 @@ void ResourceScheduler::OnLoadingStateChanged(int child_id, |
client->OnLoadingStateChanged(is_loaded); |
} |
+bool ResourceScheduler::IsClientVisibleForTesting(int child_id, int route_id) { |
+ Client* client = GetClient(child_id, route_id); |
+ DCHECK(client); |
+ return client->IsVisible(); |
+} |
+ |
ResourceScheduler::Client* ResourceScheduler::GetClient(int child_id, |
int route_id) { |
ClientId client_id = MakeClientId(child_id, route_id); |