| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/download/download_request_limiter.h" | 5 #include "chrome/browser/download/download_request_limiter.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/stl_util.h" | 8 #include "base/stl_util.h" |
| 9 #include "chrome/browser/download/download_request_infobar_delegate.h" | 9 #include "chrome/browser/download/download_request_infobar_delegate.h" |
| 10 #include "chrome/browser/infobars/infobar_tab_helper.h" | 10 #include "chrome/browser/infobars/infobar_tab_helper.h" |
| 11 #include "chrome/browser/tab_contents/tab_util.h" | 11 #include "chrome/browser/tab_contents/tab_util.h" |
| 12 #include "chrome/browser/ui/blocked_content/blocked_content_tab_helper.h" | 12 #include "chrome/browser/ui/blocked_content/blocked_content_tab_helper.h" |
| 13 #include "chrome/browser/ui/blocked_content/blocked_content_tab_helper_delegate.
h" | 13 #include "chrome/browser/ui/blocked_content/blocked_content_tab_helper_delegate.
h" |
| 14 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" | 14 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" |
| 15 #include "content/browser/tab_contents/navigation_controller.h" | 15 #include "content/browser/tab_contents/navigation_controller.h" |
| 16 #include "content/browser/tab_contents/tab_contents.h" | 16 #include "content/browser/tab_contents/tab_contents.h" |
| 17 #include "content/public/browser/browser_thread.h" | 17 #include "content/public/browser/browser_thread.h" |
| 18 #include "content/public/browser/navigation_entry.h" | 18 #include "content/public/browser/navigation_entry.h" |
| 19 #include "content/public/browser/notification_source.h" | 19 #include "content/public/browser/notification_source.h" |
| 20 #include "content/public/browser/notification_types.h" | 20 #include "content/public/browser/notification_types.h" |
| 21 #include "content/public/browser/web_contents_delegate.h" | 21 #include "content/public/browser/web_contents_delegate.h" |
| 22 | 22 |
| 23 using content::BrowserThread; | 23 using content::BrowserThread; |
| 24 using content::NavigationEntry; |
| 24 using content::WebContents; | 25 using content::WebContents; |
| 25 | 26 |
| 26 // TabDownloadState ------------------------------------------------------------ | 27 // TabDownloadState ------------------------------------------------------------ |
| 27 | 28 |
| 28 DownloadRequestLimiter::TabDownloadState::TabDownloadState( | 29 DownloadRequestLimiter::TabDownloadState::TabDownloadState( |
| 29 DownloadRequestLimiter* host, | 30 DownloadRequestLimiter* host, |
| 30 NavigationController* controller, | 31 NavigationController* controller, |
| 31 NavigationController* originating_controller) | 32 NavigationController* originating_controller) |
| 32 : host_(host), | 33 : host_(host), |
| 33 controller_(controller), | 34 controller_(controller), |
| 34 status_(DownloadRequestLimiter::ALLOW_ONE_DOWNLOAD), | 35 status_(DownloadRequestLimiter::ALLOW_ONE_DOWNLOAD), |
| 35 download_count_(0), | 36 download_count_(0), |
| 36 infobar_(NULL) { | 37 infobar_(NULL) { |
| 37 content::Source<NavigationController> notification_source(controller); | 38 content::Source<NavigationController> notification_source(controller); |
| 38 registrar_.Add(this, content::NOTIFICATION_NAV_ENTRY_PENDING, | 39 registrar_.Add(this, content::NOTIFICATION_NAV_ENTRY_PENDING, |
| 39 notification_source); | 40 notification_source); |
| 40 registrar_.Add(this, content::NOTIFICATION_TAB_CLOSED, notification_source); | 41 registrar_.Add(this, content::NOTIFICATION_TAB_CLOSED, notification_source); |
| 41 | 42 |
| 42 content::NavigationEntry* active_entry = originating_controller ? | 43 NavigationEntry* active_entry = originating_controller ? |
| 43 originating_controller->GetActiveEntry() : controller->GetActiveEntry(); | 44 originating_controller->GetActiveEntry() : controller->GetActiveEntry(); |
| 44 if (active_entry) | 45 if (active_entry) |
| 45 initial_page_host_ = active_entry->GetURL().host(); | 46 initial_page_host_ = active_entry->GetURL().host(); |
| 46 } | 47 } |
| 47 | 48 |
| 48 DownloadRequestLimiter::TabDownloadState::~TabDownloadState() { | 49 DownloadRequestLimiter::TabDownloadState::~TabDownloadState() { |
| 49 // We should only be destroyed after the callbacks have been notified. | 50 // We should only be destroyed after the callbacks have been notified. |
| 50 DCHECK(callbacks_.empty()); | 51 DCHECK(callbacks_.empty()); |
| 51 | 52 |
| 52 // And we should have closed the infobar. | 53 // And we should have closed the infobar. |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 107 } | 108 } |
| 108 | 109 |
| 109 switch (type) { | 110 switch (type) { |
| 110 case content::NOTIFICATION_NAV_ENTRY_PENDING: { | 111 case content::NOTIFICATION_NAV_ENTRY_PENDING: { |
| 111 // NOTE: resetting state on a pending navigate isn't ideal. In particular | 112 // NOTE: resetting state on a pending navigate isn't ideal. In particular |
| 112 // it is possible that queued up downloads for the page before the | 113 // it is possible that queued up downloads for the page before the |
| 113 // pending navigate will be delivered to us after we process this | 114 // pending navigate will be delivered to us after we process this |
| 114 // request. If this happens we may let a download through that we | 115 // request. If this happens we may let a download through that we |
| 115 // shouldn't have. But this is rather rare, and it is difficult to get | 116 // shouldn't have. But this is rather rare, and it is difficult to get |
| 116 // 100% right, so we don't deal with it. | 117 // 100% right, so we don't deal with it. |
| 117 content::NavigationEntry* entry = controller_->GetPendingEntry(); | 118 NavigationEntry* entry = controller_->GetPendingEntry(); |
| 118 if (!entry) | 119 if (!entry) |
| 119 return; | 120 return; |
| 120 | 121 |
| 121 if (content::PageTransitionIsRedirect(entry->GetTransitionType())) { | 122 if (content::PageTransitionIsRedirect(entry->GetTransitionType())) { |
| 122 // Redirects don't count. | 123 // Redirects don't count. |
| 123 return; | 124 return; |
| 124 } | 125 } |
| 125 | 126 |
| 126 if (status_ == DownloadRequestLimiter::ALLOW_ALL_DOWNLOADS || | 127 if (status_ == DownloadRequestLimiter::ALLOW_ALL_DOWNLOADS || |
| 127 status_ == DownloadRequestLimiter::DOWNLOADS_NOT_ALLOWED) { | 128 status_ == DownloadRequestLimiter::DOWNLOADS_NOT_ALLOWED) { |
| (...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 337 | 338 |
| 338 void DownloadRequestLimiter::Remove(TabDownloadState* state) { | 339 void DownloadRequestLimiter::Remove(TabDownloadState* state) { |
| 339 DCHECK(ContainsKey(state_map_, state->controller())); | 340 DCHECK(ContainsKey(state_map_, state->controller())); |
| 340 state_map_.erase(state->controller()); | 341 state_map_.erase(state->controller()); |
| 341 delete state; | 342 delete state; |
| 342 } | 343 } |
| 343 | 344 |
| 344 // static | 345 // static |
| 345 DownloadRequestLimiter::TestingDelegate* DownloadRequestLimiter::delegate_ = | 346 DownloadRequestLimiter::TestingDelegate* DownloadRequestLimiter::delegate_ = |
| 346 NULL; | 347 NULL; |
| OLD | NEW |