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

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

Issue 2766413004: [ios] Change API to inform WebStateList of opener-opened relationship. (Closed)
Patch Set: Address comments. Created 3 years, 9 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 d4941fdfb04836d378e686ab0c7a39a9917d4a72..c3614afa144465d94615e780bf5a5986a88e18c8 100644
--- a/ios/shared/chrome/browser/tabs/web_state_list.mm
+++ b/ios/shared/chrome/browser/tabs/web_state_list.mm
@@ -12,6 +12,7 @@
#import "ios/shared/chrome/browser/tabs/web_state_list_delegate.h"
#import "ios/shared/chrome/browser/tabs/web_state_list_observer.h"
#import "ios/shared/chrome/browser/tabs/web_state_list_order_controller.h"
+#import "ios/shared/chrome/browser/tabs/web_state_opener.h"
#import "ios/web/public/navigation_manager.h"
#import "ios/web/public/web_state/web_state.h"
@@ -26,15 +27,15 @@ class WebStateList::WebStateWrapper {
~WebStateWrapper();
web::WebState* web_state() const { return web_state_; }
- web::WebState* opener() const { return opener_; }
// Replaces the wrapped WebState (and clear associated state) and returns the
// old WebState after forfeiting ownership.
web::WebState* ReplaceWebState(web::WebState* web_state);
- // Sets the opener for the wrapped WebState and record the opener navigation
- // index to allow detecting navigation changes during the same session.
- void SetOpener(web::WebState* opener);
+ // Gets and sets information about this WebState opener. The navigation index
+ // is used to detect navigation changes during the same session.
+ WebStateOpener opener() const { return opener_; }
+ void set_opener(WebStateOpener opener) { opener_ = opener; }
// Returns whether |opener| spawned the wrapped WebState. If |use_group| is
// true, also use the opener navigation index to detect navigation changes
@@ -45,14 +46,13 @@ class WebStateList::WebStateWrapper {
private:
web::WebState* web_state_;
- web::WebState* opener_ = nullptr;
- int opener_last_committed_index_;
+ WebStateOpener opener_;
DISALLOW_COPY_AND_ASSIGN(WebStateWrapper);
};
WebStateList::WebStateWrapper::WebStateWrapper(web::WebState* web_state)
- : web_state_(web_state) {
+ : web_state_(web_state), opener_(nullptr) {
DCHECK(web_state_);
}
@@ -63,29 +63,21 @@ web::WebState* WebStateList::WebStateWrapper::ReplaceWebState(
DCHECK(web_state);
DCHECK_NE(web_state, web_state_);
std::swap(web_state, web_state_);
- opener_ = nullptr;
+ opener_ = WebStateOpener(nullptr);
return web_state;
}
-void WebStateList::WebStateWrapper::SetOpener(web::WebState* opener) {
- opener_ = opener;
- if (opener_) {
- opener_last_committed_index_ =
- opener_->GetNavigationManager()->GetLastCommittedItemIndex();
- }
-}
-
bool WebStateList::WebStateWrapper::WasOpenedBy(const web::WebState* opener,
int opener_navigation_index,
bool use_group) const {
DCHECK(opener);
- if (opener_ != opener)
+ if (opener_.opener != opener)
return false;
if (!use_group)
return true;
- return opener_last_committed_index_ == opener_navigation_index;
+ return opener_.navigation_index == opener_navigation_index;
}
WebStateList::WebStateList(WebStateListDelegate* delegate,
@@ -131,15 +123,15 @@ int WebStateList::GetIndexOfWebState(const web::WebState* web_state) const {
return kInvalidIndex;
}
-web::WebState* WebStateList::GetOpenerOfWebStateAt(int index) const {
+WebStateOpener WebStateList::GetOpenerOfWebStateAt(int index) const {
DCHECK(ContainsIndex(index));
return web_state_wrappers_[index]->opener();
}
-void WebStateList::SetOpenerOfWebStateAt(int index, web::WebState* opener) {
+void WebStateList::SetOpenerOfWebStateAt(int index, WebStateOpener opener) {
DCHECK(ContainsIndex(index));
- DCHECK(ContainsIndex(GetIndexOfWebState(opener)));
- web_state_wrappers_[index]->SetOpener(opener);
+ DCHECK(ContainsIndex(GetIndexOfWebState(opener.opener)));
+ web_state_wrappers_[index]->set_opener(opener);
}
int WebStateList::GetIndexOfNextWebStateOpenedBy(const web::WebState* opener,
@@ -154,9 +146,7 @@ int WebStateList::GetIndexOfLastWebStateOpenedBy(const web::WebState* opener,
return GetIndexOfNthWebStateOpenedBy(opener, start_index, use_group, INT_MAX);
}
-void WebStateList::InsertWebState(int index,
- web::WebState* web_state,
- web::WebState* opener) {
+void WebStateList::InsertWebState(int index, web::WebState* web_state) {
DCHECK(ContainsIndex(index) || index == count());
delegate_->WillAddWebState(web_state);
@@ -166,21 +156,22 @@ void WebStateList::InsertWebState(int index,
if (active_index_ >= index)
++active_index_;
- if (opener)
- SetOpenerOfWebStateAt(index, opener);
-
for (auto& observer : observers_)
observer.WebStateInsertedAt(this, web_state, index);
}
void WebStateList::AppendWebState(ui::PageTransition transition,
web::WebState* web_state,
- web::WebState* opener) {
- int index = order_controller_->DetermineInsertionIndex(transition, opener);
+ WebStateOpener opener) {
+ int index =
+ order_controller_->DetermineInsertionIndex(transition, opener.opener);
if (index < 0 || count() < index)
index = count();
- InsertWebState(index, web_state, opener);
+ InsertWebState(index, web_state);
+
+ if (opener.opener)
+ SetOpenerOfWebStateAt(index, opener);
}
void WebStateList::MoveWebStateAt(int from_index, int to_index) {
@@ -211,8 +202,7 @@ void WebStateList::MoveWebStateAt(int from_index, int to_index) {
}
web::WebState* WebStateList::ReplaceWebStateAt(int index,
- web::WebState* web_state,
- web::WebState* opener) {
+ web::WebState* web_state) {
DCHECK(ContainsIndex(index));
delegate_->WillAddWebState(web_state);
@@ -221,9 +211,6 @@ web::WebState* WebStateList::ReplaceWebStateAt(int index,
auto& web_state_wrapper = web_state_wrappers_[index];
web::WebState* old_web_state = web_state_wrapper->ReplaceWebState(web_state);
- if (opener && opener != old_web_state)
- SetOpenerOfWebStateAt(index, opener);
-
for (auto& observer : observers_)
observer.WebStateReplacedAt(this, old_web_state, web_state, index);
@@ -232,11 +219,11 @@ web::WebState* WebStateList::ReplaceWebStateAt(int index,
web::WebState* WebStateList::DetachWebStateAt(int index) {
DCHECK(ContainsIndex(index));
- ClearOpenersReferencing(index);
-
int new_active_index = order_controller_->DetermineNewActiveIndex(index);
web::WebState* old_web_state = web_state_wrappers_[index]->web_state();
+
+ ClearOpenersReferencing(index);
web_state_wrappers_.erase(web_state_wrappers_.begin() + index);
// Update the active index to prevent observer from seeing an invalid WebState
@@ -275,8 +262,8 @@ void WebStateList::RemoveObserver(WebStateListObserver* observer) {
void WebStateList::ClearOpenersReferencing(int index) {
web::WebState* old_web_state = web_state_wrappers_[index]->web_state();
for (auto& web_state_wrapper : web_state_wrappers_) {
- if (web_state_wrapper->opener() == old_web_state)
- web_state_wrapper->SetOpener(nullptr);
+ if (web_state_wrapper->opener().opener == old_web_state)
+ web_state_wrapper->set_opener(WebStateOpener(nullptr));
}
}

Powered by Google App Engine
This is Rietveld 408576698