| // Copyright 2021 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #import "ios/chrome/browser/optimization_guide/tab_url_provider_impl.h" |
| |
| #import "base/containers/adapters.h" |
| #import "base/time/clock.h" |
| #import "base/time/time.h" |
| #import "ios/chrome/browser/main/browser.h" |
| #import "ios/chrome/browser/main/browser_list.h" |
| #import "ios/chrome/browser/main/browser_list_factory.h" |
| #import "ios/chrome/browser/web_state_list/web_state_list.h" |
| #import "ios/web/public/navigation/navigation_item.h" |
| #import "ios/web/public/navigation/navigation_manager.h" |
| #import "ios/web/public/web_state.h" |
| |
| #if !defined(__has_feature) || !__has_feature(objc_arc) |
| #error "This file requires ARC support." |
| #endif |
| |
| TabUrlProviderImpl::TabUrlProviderImpl(BrowserList* browser_list, |
| base::Clock* clock) |
| : browser_list_(browser_list), clock_(clock) {} |
| |
| TabUrlProviderImpl::~TabUrlProviderImpl() = default; |
| |
| const std::vector<GURL> TabUrlProviderImpl::GetUrlsOfActiveTabs( |
| const base::TimeDelta& duration_since_last_shown) { |
| if (!browser_list_) |
| return std::vector<GURL>(); |
| |
| // Get all URLs from regular tabs. |
| std::map<base::Time, GURL> urls; |
| for (Browser* browser : browser_list_->AllRegularBrowsers()) { |
| WebStateList* web_state_list = browser->GetWebStateList(); |
| DCHECK(web_state_list); |
| for (int i = 0; i < web_state_list->count(); ++i) { |
| web::WebState* web_state = web_state_list->GetWebStateAt(i); |
| DCHECK(web_state); |
| |
| const base::Time last_active_time = web_state->GetLastActiveTime(); |
| if (last_active_time.is_null() || |
| clock_->Now() - last_active_time > duration_since_last_shown) { |
| continue; |
| } |
| |
| urls.emplace(last_active_time, web_state->GetLastCommittedURL()); |
| } |
| } |
| |
| // Output the URLs from sorted map in desending order. |
| std::vector<GURL> res; |
| for (const auto& [navigation_time, url] : base::Reversed(urls)) |
| res.push_back(url); |
| |
| return res; |
| } |