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

Unified Diff: ios/shared/chrome/browser/tabs/web_state_list.mm

Issue 2703333006: Move the notion of current Tab from TabModel to WebStateList. (Closed)
Patch Set: Created 3 years, 10 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: ios/shared/chrome/browser/tabs/web_state_list.mm
diff --git a/ios/shared/chrome/browser/tabs/web_state_list.mm b/ios/shared/chrome/browser/tabs/web_state_list.mm
index 77c01a6f938064f25c233665c52409ae00e1216c..ccb01f384d5eb9e3366836ba41b73f854866b49f 100644
--- a/ios/shared/chrome/browser/tabs/web_state_list.mm
+++ b/ios/shared/chrome/browser/tabs/web_state_list.mm
@@ -4,6 +4,7 @@
#import "ios/shared/chrome/browser/tabs/web_state_list.h"
+#include <algorithm>
#include <utility>
#include "base/logging.h"
@@ -105,6 +106,12 @@ bool WebStateList::ContainsIndex(int index) const {
return 0 <= index && index < count();
}
+web::WebState* WebStateList::GetActiveWebState() const {
+ if (active_index_ != kInvalidIndex)
+ return GetWebStateAt(active_index_);
+ return nullptr;
+}
+
web::WebState* WebStateList::GetWebStateAt(int index) const {
DCHECK(ContainsIndex(index));
return web_state_wrappers_[index]->web_state();
@@ -150,6 +157,9 @@ void WebStateList::InsertWebState(int index,
base::MakeUnique<WebStateWrapper>(web_state,
web_state_ownership_ == WebStateOwned));
+ if (active_index_ >= index)
+ ++active_index_;
+
if (opener)
SetOpenerOfWebStateAt(index, opener);
@@ -180,6 +190,16 @@ void WebStateList::MoveWebStateAt(int from_index, int to_index) {
web_state_wrappers_.insert(web_state_wrappers_.begin() + to_index,
std::move(web_state_wrapper));
+ if (active_index_ == from_index) {
+ active_index_ = to_index;
+ } else {
+ int min = std::min(from_index, to_index);
+ int max = std::max(from_index, to_index);
+ int delta = from_index < to_index ? -1 : +1;
+ if (min <= active_index_ && active_index_ <= max)
+ active_index_ += delta;
+ }
+
for (auto& observer : observers_)
observer.WebStateMoved(this, web_state, from_index, to_index);
}
@@ -206,11 +226,32 @@ void WebStateList::DetachWebStateAt(int index) {
DCHECK(ContainsIndex(index));
FixOpenersReferencing(index);
+ int new_active_index = order_controller_->DetermineNewActiveIndex(index);
+
web::WebState* web_state = web_state_wrappers_[index]->web_state();
rohitrao (ping after 24h) 2017/02/22 15:13:43 What keeps ownership of this object so that it doe
sdefresne 2017/02/23 15:43:48 That's a really good remark. Fixed by https://code
web_state_wrappers_.erase(web_state_wrappers_.begin() + index);
+ // Update the active index to prevent observer from seeing an invalid WebState
+ // as the active one but only send the WebStateActivatedAt notification after
+ // the WebStateDetachedAt one.
+ bool active_web_state_was_closed = (index == active_index_);
+ if (active_index_ > index)
marq (ping after 24h) 2017/02/21 17:23:11 Use {} if there's an else clause.
sdefresne 2017/02/21 17:29:29 I checked the style guide [1] and it does not say
+ --active_index_;
+ else if (active_index_ == index)
+ active_index_ = new_active_index;
+
for (auto& observer : observers_)
observer.WebStateDetachedAt(this, web_state, index);
+
+ if (active_web_state_was_closed)
+ NotifyIfActiveWebStateChanged(web_state, false);
+}
+
+void WebStateList::ActivateWebStateAt(int index) {
+ DCHECK(ContainsIndex(index));
+ web::WebState* old_web_state = GetActiveWebState();
+ active_index_ = index;
+ NotifyIfActiveWebStateChanged(old_web_state, true);
}
void WebStateList::AddObserver(WebStateListObserver* observer) {
@@ -229,6 +270,18 @@ void WebStateList::FixOpenersReferencing(int index) {
}
}
+void WebStateList::NotifyIfActiveWebStateChanged(web::WebState* old_web_state,
+ bool user_action) {
+ web::WebState* new_web_state = GetActiveWebState();
+ if (old_web_state == new_web_state)
+ return;
+
+ for (auto& observer : observers_) {
+ observer.WebStateActivatedAt(this, old_web_state, new_web_state,
+ active_index_, user_action);
+ }
+}
+
int WebStateList::GetIndexOfNthWebStateOpenedBy(const web::WebState* opener,
int start_index,
bool use_group,

Powered by Google App Engine
This is Rietveld 408576698