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

Unified Diff: chrome/browser/devtools/devtools_network_controller.cc

Issue 342473004: DevTools: make network conditions emulation scoped (browser) (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixed nits Created 6 years, 6 months 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
Index: chrome/browser/devtools/devtools_network_controller.cc
diff --git a/chrome/browser/devtools/devtools_network_controller.cc b/chrome/browser/devtools/devtools_network_controller.cc
index 176ac6655dba216d1251f908d5f0fcba088fceca..3437a1924de3d90a93fe377d773a2049382a8b26 100644
--- a/chrome/browser/devtools/devtools_network_controller.cc
+++ b/chrome/browser/devtools/devtools_network_controller.cc
@@ -4,23 +4,15 @@
#include "chrome/browser/devtools/devtools_network_controller.h"
-#include "base/time/time.h"
#include "chrome/browser/devtools/devtools_network_conditions.h"
+#include "chrome/browser/devtools/devtools_network_realm.h"
#include "chrome/browser/devtools/devtools_network_transaction.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/profiles/profile_io_data.h"
#include "content/public/browser/browser_thread.h"
-#include "content/public/browser/resource_context.h"
+#include "net/base/load_flags.h"
+#include "net/http/http_request_info.h"
using content::BrowserThread;
-namespace {
-
-const char kDevToolsRequestInitiator[] = "X-DevTools-Request-Initiator";
-int64_t kPacketSize = 1500;
-
-} // namespace
-
DevToolsNetworkController::DevToolsNetworkController()
: weak_ptr_factory_(this) {
}
@@ -40,16 +32,20 @@ void DevToolsNetworkController::RemoveTransaction(
DCHECK(transactions_.find(transaction) != transactions_.end());
transactions_.erase(transaction);
- if (conditions_ && conditions_->IsThrottling()) {
- UpdateThrottles();
- throttled_transactions_.erase(std::remove(throttled_transactions_.begin(),
- throttled_transactions_.end(), transaction),
- throttled_transactions_.end());
- ArmTimer();
+ if (has_throttling_realms_) {
+ if (DevToolsNetworkRealm* realm = FindRealm(transaction))
+ realm->RemoveTransaction(transaction);
}
}
+DevToolsNetworkRealm* DevToolsNetworkController::FindRealm(
+ const DevToolsNetworkTransaction* transaction) {
+ const std::string& client_id = transaction->client_id();
+ return client_id.empty() ? NULL : realms_.get(client_id);
+}
+
void DevToolsNetworkController::SetNetworkState(
+ const std::string& client_id,
const scoped_refptr<DevToolsNetworkConditions> conditions) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
BrowserThread::PostTask(
@@ -58,28 +54,40 @@ void DevToolsNetworkController::SetNetworkState(
base::Bind(
&DevToolsNetworkController::SetNetworkStateOnIO,
weak_ptr_factory_.GetWeakPtr(),
+ client_id,
conditions));
}
void DevToolsNetworkController::SetNetworkStateOnIO(
+ const std::string& client_id,
const scoped_refptr<DevToolsNetworkConditions> conditions) {
DCHECK(thread_checker_.CalledOnValidThread());
- if (conditions_ && conditions_->IsThrottling())
- UpdateThrottles();
-
- conditions_ = conditions;
- if (!conditions || !(conditions->IsThrottling() || conditions->IsOffline())) {
- timer_.Stop();
- int64_t length = throttled_transactions_.size();
- for (int64_t i = 0; i < length; ++i)
- throttled_transactions_[i]->FireThrottledCallback();
- throttled_transactions_.clear();
+
+ DevToolsNetworkRealm* realm = realms_.get(client_id);
+ if (!realm) {
+ if (!conditions)
+ return;
+ Realm new_realm = Realm(new DevToolsNetworkRealm());
+ new_realm->UpdateConditions(conditions);
+ realms_.set(client_id, new_realm.Pass());
+ } else {
+ realm->UpdateConditions(conditions);
+ if (!conditions)
+ realms_.erase(client_id);
}
- if (!conditions)
- return;
+ bool has_offline_realms = false;
+ bool has_throttling_realms = false;
+ for (Realms::iterator it = realms_.begin(); it != realms_.end(); ++it) {
+ has_offline_realms =
+ has_offline_realms || it->second->conditions()->IsOffline();
+ has_throttling_realms =
+ has_throttling_realms || it->second->conditions()->IsThrottling();
+ }
+ has_offline_realms_ = has_offline_realms;
+ has_throttling_realms_ = has_throttling_realms;
- if (conditions_->IsOffline()) {
+ if (conditions && conditions->IsOffline()) {
// Iterate over a copy of set, because failing of transaction could
// result in creating a new one, or (theoretically) destroying one.
Transactions old_transactions(transactions_);
vsevik 2014/06/18 09:18:04 Why is this handled in controller, not realm? We a
eustas 2014/06/18 11:45:10 Done.
@@ -89,115 +97,52 @@ void DevToolsNetworkController::SetNetworkStateOnIO(
continue;
if (!(*it)->request() || (*it)->failed())
continue;
- if (ShouldFail((*it)->request()))
+ if (ShouldFail(*it))
(*it)->Fail();
}
}
-
- if (conditions_->IsThrottling()) {
- DCHECK(conditions_->maximal_throughput() != 0);
- offset_ = base::TimeTicks::Now();
- last_tick_ = 0;
- int64_t us_tick_length =
- (1000000L * kPacketSize) / conditions_->maximal_throughput();
- DCHECK(us_tick_length != 0);
- if (us_tick_length == 0)
- us_tick_length = 1;
- tick_length_ = base::TimeDelta::FromMicroseconds(us_tick_length);
- ArmTimer();
- }
}
bool DevToolsNetworkController::ShouldFail(
- const net::HttpRequestInfo* request) {
+ const DevToolsNetworkTransaction* transaction) {
DCHECK(thread_checker_.CalledOnValidThread());
- DCHECK(request);
- if (!conditions_ || !conditions_->IsOffline())
+ if (!has_offline_realms_)
+ return false;
+
+ if (!transaction->request())
return false;
- if (!conditions_->HasMatchingDomain(request->url))
+ if (!transaction->request_initiator().empty())
return false;
- return !request->extra_headers.HasHeader(kDevToolsRequestInitiator);
+ if (DevToolsNetworkRealm* realm = FindRealm(transaction))
+ return realm->conditions()->IsOffline();
+
+ // Temporary workaround for AppCache.
+ int load_flags = transaction->request()->load_flags;
+ return (load_flags & net::LOAD_DISABLE_INTERCEPT) != 0;
}
bool DevToolsNetworkController::ShouldThrottle(
- const net::HttpRequestInfo* request) {
+ const DevToolsNetworkTransaction* transaction) {
DCHECK(thread_checker_.CalledOnValidThread());
- DCHECK(request);
- if (!conditions_ || !conditions_->IsThrottling())
+ if (!has_throttling_realms_)
return false;
- if (!conditions_->HasMatchingDomain(request->url))
+ if (!transaction->request())
return false;
- return !request->extra_headers.HasHeader(kDevToolsRequestInitiator);
-}
-
-void DevToolsNetworkController::UpdateThrottles() {
- int64_t last_tick = (base::TimeTicks::Now() - offset_) / tick_length_;
- int64_t ticks = last_tick - last_tick_;
- last_tick_ = last_tick;
-
- int64_t length = throttled_transactions_.size();
- if (!length)
- return;
-
- int64_t shift = ticks % length;
- for (int64_t i = 0; i < length; ++i) {
- throttled_transactions_[i]->DecreaseThrottledByteCount(
- (ticks / length) * kPacketSize + (i < shift ? kPacketSize : 0));
- }
- std::rotate(throttled_transactions_.begin(),
- throttled_transactions_.begin() + shift, throttled_transactions_.end());
-}
-
-void DevToolsNetworkController::OnTimer() {
- UpdateThrottles();
-
- std::vector<DevToolsNetworkTransaction*> active_transactions;
- std::vector<DevToolsNetworkTransaction*> finished_transactions;
- size_t length = throttled_transactions_.size();
- for (size_t i = 0; i < length; ++i) {
- if (throttled_transactions_[i]->throttled_byte_count() < 0)
- finished_transactions.push_back(throttled_transactions_[i]);
- else
- active_transactions.push_back(throttled_transactions_[i]);
- }
- throttled_transactions_.swap(active_transactions);
-
- length = finished_transactions.size();
- for (size_t i = 0; i < length; ++i)
- finished_transactions[i]->FireThrottledCallback();
+ if (!transaction->request_initiator().empty())
+ return false;
- ArmTimer();
-}
+ if (DevToolsNetworkRealm* realm = FindRealm(transaction))
+ return realm->conditions()->IsThrottling();
-void DevToolsNetworkController::ArmTimer() {
- size_t length = throttled_transactions_.size();
- if (!length)
- return;
- int64_t min_ticks_left = 0x10000L;
- for (size_t i = 0; i < length; ++i) {
- int64_t packets_left = (throttled_transactions_[i]->throttled_byte_count() +
- kPacketSize - 1) / kPacketSize;
- int64_t ticks_left = (i + 1) + length * (packets_left - 1);
- if (i == 0 || ticks_left < min_ticks_left)
- min_ticks_left = ticks_left;
- }
- base::TimeTicks desired_time =
- offset_ + tick_length_ * (last_tick_ + min_ticks_left);
- timer_.Start(
- FROM_HERE,
- desired_time - base::TimeTicks::Now(),
- base::Bind(
- &DevToolsNetworkController::OnTimer,
- weak_ptr_factory_.GetWeakPtr()));
+ return false;
}
void DevToolsNetworkController::ThrottleTransaction(
DevToolsNetworkTransaction* transaction) {
- UpdateThrottles();
- throttled_transactions_.push_back(transaction);
- ArmTimer();
+ if (DevToolsNetworkRealm* realm = FindRealm(transaction))
+ realm->ThrottleTransaction(transaction);
}
« no previous file with comments | « chrome/browser/devtools/devtools_network_controller.h ('k') | chrome/browser/devtools/devtools_network_controller_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698