146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// found in the LICENSE file. 446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/devtools/devtools_network_controller.h" 646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/devtools/devtools_network_conditions.h" 8f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/devtools/devtools_network_interceptor.h" 946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/devtools/devtools_network_transaction.h" 1046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "content/public/browser/browser_thread.h" 11f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "net/base/load_flags.h" 12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "net/http/http_request_info.h" 1346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 1446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)using content::BrowserThread; 1546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 1646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)DevToolsNetworkController::DevToolsNetworkController() 17f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) : default_interceptor_(new DevToolsNetworkInterceptor()), 18f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) appcache_interceptor_(new DevToolsNetworkInterceptor()), 19f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) weak_ptr_factory_(this) { 2046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 2146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 2246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)DevToolsNetworkController::~DevToolsNetworkController() { 2346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 2446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 25f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)base::WeakPtr<DevToolsNetworkInterceptor> 26f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)DevToolsNetworkController::GetInterceptor( 2746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DevToolsNetworkTransaction* transaction) { 2846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 29f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DCHECK(transaction->request()); 3046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 31f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!interceptors_.size()) 32f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return default_interceptor_->GetWeakPtr(); 33f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (transaction->request()->load_flags & net::LOAD_DISABLE_INTERCEPT) 35f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return appcache_interceptor_->GetWeakPtr(); 36f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) transaction->ProcessRequest(); 38f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& client_id = transaction->client_id(); 40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (client_id.empty()) 41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return default_interceptor_->GetWeakPtr(); 42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DevToolsNetworkInterceptor* interceptor = interceptors_.get(client_id); 44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DCHECK(interceptor); 45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!interceptor) 46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return default_interceptor_->GetWeakPtr(); 47f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return interceptor->GetWeakPtr(); 4946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 5046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 5146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void DevToolsNetworkController::SetNetworkState( 5246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const std::string& client_id, 53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<DevToolsNetworkConditions> conditions) { 5446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DCHECK_CURRENTLY_ON(BrowserThread::UI); 5546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) BrowserThread::PostTask( 5646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) content::BrowserThread::IO, 5746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) FROM_HERE, 5846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Bind( 5946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) &DevToolsNetworkController::SetNetworkStateOnIO, 6046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) weak_ptr_factory_.GetWeakPtr(), 6146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) client_id, 62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Passed(&conditions))); 6346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 6446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 6546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void DevToolsNetworkController::SetNetworkStateOnIO( 6646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const std::string& client_id, 67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<DevToolsNetworkConditions> conditions) { 6846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 69f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 70f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DevToolsNetworkInterceptor* interceptor = interceptors_.get(client_id); 71f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!interceptor) { 72f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DCHECK(conditions); 73f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!conditions) 74f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return; 75f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Interceptor new_interceptor = Interceptor(new DevToolsNetworkInterceptor()); 76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch new_interceptor->UpdateConditions(conditions.Pass()); 77f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) interceptors_.set(client_id, new_interceptor.Pass()); 78f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } else { 79f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!conditions) { 80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<DevToolsNetworkConditions> online_conditions( 81f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) new DevToolsNetworkConditions()); 82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch interceptor->UpdateConditions(online_conditions.Pass()); 83f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) interceptors_.erase(client_id); 84f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } else { 85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch interceptor->UpdateConditions(conditions.Pass()); 8646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 8746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 8846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 89f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool has_offline_interceptors = false; 90f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Interceptors::iterator it = interceptors_.begin(); 91f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) for (; it != interceptors_.end(); ++it) { 92f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (it->second->conditions()->offline()) { 93f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) has_offline_interceptors = true; 94f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) break; 95f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 96f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 9746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 98f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool is_appcache_offline = appcache_interceptor_->conditions()->offline(); 99f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (is_appcache_offline != has_offline_interceptors) { 100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<DevToolsNetworkConditions> appcache_conditions( 101f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) new DevToolsNetworkConditions(has_offline_interceptors)); 102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch appcache_interceptor_->UpdateConditions(appcache_conditions.Pass()); 103f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 10446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 105