| Index: chrome/browser/chromeos/login/merge_session_throttle.cc
|
| diff --git a/chrome/browser/chromeos/login/merge_session_throttle.cc b/chrome/browser/chromeos/login/merge_session_throttle.cc
|
| deleted file mode 100644
|
| index 3b36b9713947f35d9aedc240862b872c2bb73052..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/chromeos/login/merge_session_throttle.cc
|
| +++ /dev/null
|
| @@ -1,275 +0,0 @@
|
| -// Copyright (c) 2013 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "chrome/browser/chromeos/login/merge_session_throttle.h"
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/lazy_instance.h"
|
| -#include "base/logging.h"
|
| -#include "base/memory/singleton.h"
|
| -#include "base/metrics/histogram.h"
|
| -#include "base/strings/string_util.h"
|
| -#include "base/threading/non_thread_safe.h"
|
| -#include "base/time/time.h"
|
| -#include "chrome/browser/chromeos/login/merge_session_load_page.h"
|
| -#include "chrome/browser/chromeos/login/merge_session_xhr_request_waiter.h"
|
| -#include "chrome/browser/chromeos/login/oauth2_login_manager.h"
|
| -#include "chrome/browser/chromeos/login/oauth2_login_manager_factory.h"
|
| -#include "chrome/browser/chromeos/login/user_manager.h"
|
| -#include "chrome/browser/chromeos/login/user_manager.h"
|
| -#include "chrome/browser/google/google_util.h"
|
| -#include "chrome/browser/net/chrome_url_request_context.h"
|
| -#include "chrome/common/url_constants.h"
|
| -#include "content/public/browser/browser_thread.h"
|
| -#include "content/public/browser/render_view_host.h"
|
| -#include "content/public/browser/resource_controller.h"
|
| -#include "content/public/browser/resource_request_info.h"
|
| -#include "content/public/browser/web_contents.h"
|
| -#include "net/base/net_errors.h"
|
| -#include "net/base/net_util.h"
|
| -#include "net/base/network_change_notifier.h"
|
| -#include "net/url_request/url_request.h"
|
| -#include "net/url_request/url_request_context.h"
|
| -
|
| -using content::BrowserThread;
|
| -using content::RenderViewHost;
|
| -using content::WebContents;
|
| -
|
| -namespace {
|
| -
|
| -const int64 kMaxSessionRestoreTimeInSec = 60;
|
| -
|
| -// The set of blocked profiles.
|
| -class ProfileSet : public base::NonThreadSafe,
|
| - public std::set<Profile*> {
|
| - public:
|
| - ProfileSet() {
|
| - }
|
| -
|
| - virtual ~ProfileSet() {
|
| - }
|
| -
|
| - static ProfileSet* Get();
|
| -
|
| - private:
|
| - friend struct ::base::DefaultLazyInstanceTraits<ProfileSet>;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(ProfileSet);
|
| -};
|
| -
|
| -// Set of all of profiles for which restore session is in progress.
|
| -// This static member is accessible only form UI thread.
|
| -static base::LazyInstance<ProfileSet> g_blocked_profiles =
|
| - LAZY_INSTANCE_INITIALIZER;
|
| -
|
| -ProfileSet* ProfileSet::Get() {
|
| - return g_blocked_profiles.Pointer();
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -base::AtomicRefCount MergeSessionThrottle::all_profiles_restored_(0);
|
| -
|
| -MergeSessionThrottle::MergeSessionThrottle(net::URLRequest* request,
|
| - ResourceType::Type resource_type)
|
| - : request_(request),
|
| - resource_type_(resource_type) {
|
| -}
|
| -
|
| -MergeSessionThrottle::~MergeSessionThrottle() {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| -}
|
| -
|
| -void MergeSessionThrottle::WillStartRequest(bool* defer) {
|
| - if (!ShouldDelayUrl(request_->url()))
|
| - return;
|
| -
|
| - DVLOG(1) << "WillStartRequest: defer " << request_->url();
|
| - const content::ResourceRequestInfo* info =
|
| - content::ResourceRequestInfo::ForRequest(request_);
|
| - BrowserThread::PostTask(
|
| - BrowserThread::UI,
|
| - FROM_HERE,
|
| - base::Bind(
|
| - &MergeSessionThrottle::DeleayResourceLoadingOnUIThread,
|
| - resource_type_,
|
| - info->GetChildID(),
|
| - info->GetRouteID(),
|
| - request_->url(),
|
| - base::Bind(
|
| - &MergeSessionThrottle::OnBlockingPageComplete,
|
| - AsWeakPtr())));
|
| - *defer = true;
|
| -}
|
| -
|
| -const char* MergeSessionThrottle::GetNameForLogging() const {
|
| - return "MergeSessionThrottle";
|
| -}
|
| -
|
| -// static.
|
| -bool MergeSessionThrottle::AreAllSessionMergedAlready() {
|
| - return !base::AtomicRefCountIsZero(&all_profiles_restored_);
|
| -}
|
| -
|
| -void MergeSessionThrottle::OnBlockingPageComplete() {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| - controller()->Resume();
|
| -}
|
| -
|
| -bool MergeSessionThrottle::ShouldDelayUrl(const GURL& url) const {
|
| - // If we are loading google properties while merge session is in progress,
|
| - // we will show delayed loading page instead.
|
| - return !net::NetworkChangeNotifier::IsOffline() &&
|
| - !AreAllSessionMergedAlready() &&
|
| - google_util::IsGoogleHostname(url.host(),
|
| - google_util::ALLOW_SUBDOMAIN);
|
| -}
|
| -
|
| -// static
|
| -void MergeSessionThrottle::BlockProfile(Profile* profile) {
|
| - // Add a new profile to the list of those that we are currently blocking
|
| - // blocking page loading for.
|
| - if (ProfileSet::Get()->find(profile) == ProfileSet::Get()->end()) {
|
| - DVLOG(1) << "Blocking profile " << profile;
|
| - ProfileSet::Get()->insert(profile);
|
| -
|
| - // Since a new profile just got blocked, we can not assume that
|
| - // all sessions are merged anymore.
|
| - if (AreAllSessionMergedAlready()) {
|
| - base::AtomicRefCountDec(&all_profiles_restored_);
|
| - DVLOG(1) << "Marking all sessions unmerged!";
|
| - }
|
| - }
|
| -}
|
| -
|
| -// static
|
| -void MergeSessionThrottle::UnblockProfile(Profile* profile) {
|
| - // Have we blocked loading of pages for this this profile
|
| - // before?
|
| - DVLOG(1) << "Unblocking profile " << profile;
|
| - ProfileSet::Get()->erase(profile);
|
| -
|
| - // Check if there is any other profile to block on.
|
| - if (ProfileSet::Get()->size() == 0) {
|
| - base::AtomicRefCountInc(&all_profiles_restored_);
|
| - DVLOG(1) << "All profiles merged " << all_profiles_restored_;
|
| - }
|
| -}
|
| -
|
| -// static
|
| -bool MergeSessionThrottle::ShouldDelayRequest(
|
| - int render_process_id,
|
| - int render_view_id) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| -
|
| - if (!chromeos::UserManager::Get()->IsUserLoggedIn()) {
|
| - return false;
|
| - } else if (!chromeos::UserManager::Get()->IsLoggedInAsRegularUser()) {
|
| - // This is not a regular user session, let's remove the throttle
|
| - // permanently.
|
| - if (!AreAllSessionMergedAlready())
|
| - base::AtomicRefCountInc(&all_profiles_restored_);
|
| -
|
| - return false;
|
| - }
|
| -
|
| - RenderViewHost* render_view_host =
|
| - RenderViewHost::FromID(render_process_id, render_view_id);
|
| - if (!render_view_host)
|
| - return false;
|
| -
|
| - WebContents* web_contents =
|
| - WebContents::FromRenderViewHost(render_view_host);
|
| - if (!web_contents)
|
| - return false;
|
| -
|
| - content::BrowserContext* browser_context =
|
| - web_contents->GetBrowserContext();
|
| - if (!browser_context)
|
| - return false;
|
| -
|
| - Profile* profile = Profile::FromBrowserContext(browser_context);
|
| - if (!profile)
|
| - return false;
|
| -
|
| - chromeos::OAuth2LoginManager* login_manager =
|
| - chromeos::OAuth2LoginManagerFactory::GetInstance()->GetForProfile(
|
| - profile);
|
| - if (!login_manager)
|
| - return false;
|
| -
|
| - switch (login_manager->state()) {
|
| - case chromeos::OAuth2LoginManager::SESSION_RESTORE_NOT_STARTED:
|
| - // The session restore for this profile hasn't even started yet. Don't
|
| - // block for now.
|
| - // In theory this should not happen since we should
|
| - // kick off the session restore process for the newly added profile
|
| - // before we attempt loading any page.
|
| - if (chromeos::UserManager::Get()->IsLoggedInAsRegularUser() &&
|
| - !chromeos::UserManager::Get()->IsLoggedInAsStub()) {
|
| - LOG(WARNING) << "Loading content for a profile without "
|
| - << "session restore?";
|
| - }
|
| - return false;
|
| - case chromeos::OAuth2LoginManager::SESSION_RESTORE_PREPARING:
|
| - case chromeos::OAuth2LoginManager::SESSION_RESTORE_IN_PROGRESS: {
|
| - // Check if the session restore has been going on for a while already.
|
| - // If so, don't attempt to block page loading.
|
| - if ((base::Time::Now() -
|
| - login_manager->session_restore_start()).InSeconds() >
|
| - kMaxSessionRestoreTimeInSec) {
|
| - UnblockProfile(profile);
|
| - return false;
|
| - }
|
| -
|
| - // Add a new profile to the list of those that we are currently blocking
|
| - // blocking page loading for.
|
| - BlockProfile(profile);
|
| - return true;
|
| - }
|
| - case chromeos::OAuth2LoginManager::SESSION_RESTORE_DONE:
|
| - case chromeos::OAuth2LoginManager::SESSION_RESTORE_FAILED:
|
| - case chromeos::OAuth2LoginManager::SESSION_RESTORE_CONNECTION_FAILED: {
|
| - UnblockProfile(profile);
|
| - return false;
|
| - }
|
| - }
|
| -
|
| - NOTREACHED();
|
| - return false;
|
| -}
|
| -
|
| -// static.
|
| -void MergeSessionThrottle::DeleayResourceLoadingOnUIThread(
|
| - ResourceType::Type resource_type,
|
| - int render_process_id,
|
| - int render_view_id,
|
| - const GURL& url,
|
| - const CompletionCallback& callback) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| -
|
| - if (ShouldDelayRequest(render_process_id, render_view_id)) {
|
| - // There is a chance that the tab closed after we decided to show
|
| - // the offline page on the IO thread and before we actually show the
|
| - // offline page here on the UI thread.
|
| - RenderViewHost* render_view_host =
|
| - RenderViewHost::FromID(render_process_id, render_view_id);
|
| - WebContents* web_contents = render_view_host ?
|
| - WebContents::FromRenderViewHost(render_view_host) : NULL;
|
| - if (resource_type == ResourceType::MAIN_FRAME) {
|
| - DVLOG(1) << "Creating page waiter for " << url.spec();
|
| - (new chromeos::MergeSessionLoadPage(web_contents, url, callback))->Show();
|
| - } else {
|
| - DVLOG(1) << "Creating XHR waiter for " << url.spec();
|
| - DCHECK(resource_type == ResourceType::XHR);
|
| - Profile* profile = Profile::FromBrowserContext(
|
| - web_contents->GetBrowserContext());
|
| - (new chromeos::MergeSessionXHRRequestWaiter(profile,
|
| - callback))->StartWaiting();
|
| - }
|
| - } else {
|
| - BrowserThread::PostTask(
|
| - BrowserThread::IO, FROM_HERE, callback);
|
| - }
|
| -}
|
|
|