Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2017 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 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 #import "ios/shared/chrome/browser/tabs/web_state_list.h" | 5 #import "ios/shared/chrome/browser/tabs/web_state_list.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/memory/ptr_util.h" | 10 #include "base/memory/ptr_util.h" |
| 11 #import "ios/shared/chrome/browser/tabs/web_state_list_observer.h" | 11 #import "ios/shared/chrome/browser/tabs/web_state_list_observer.h" |
| 12 #import "ios/web/public/navigation_manager.h" | 12 #import "ios/web/public/navigation_manager.h" |
| 13 #import "ios/web/public/web_state/web_state.h" | 13 #import "ios/web/public/web_state/web_state.h" |
| 14 | 14 |
| 15 #if !defined(__has_feature) || !__has_feature(objc_arc) | 15 #if !defined(__has_feature) || !__has_feature(objc_arc) |
| 16 #error "This file requires ARC support." | 16 #error "This file requires ARC support." |
| 17 #endif | 17 #endif |
| 18 | 18 |
| 19 // Wrapper around a WebState stored in a WebStateList. May own the WebState | 19 // Wrapper around a WebState stored in a WebStateList. |
| 20 // dependending on the WebStateList ownership setting (should always be true | |
| 21 // once ownership of Tab is sane, see http://crbug.com/546222 for progress). | |
| 22 class WebStateList::WebStateWrapper { | 20 class WebStateList::WebStateWrapper { |
| 23 public: | 21 public: |
| 24 WebStateWrapper(web::WebState* web_state, bool assume_ownership); | 22 WebStateWrapper(web::WebState* web_state); |
|
pkl (ping after 24h if needed)
2017/02/27 19:32:09
I think the style guide mandates "explicit" for si
sdefresne
2017/02/28 05:52:52
Done. Thank you.
| |
| 25 ~WebStateWrapper(); | 23 ~WebStateWrapper(); |
| 26 | 24 |
| 27 web::WebState* web_state() const { return web_state_; } | 25 web::WebState* web_state() const { return web_state_; } |
| 28 web::WebState* opener() const { return opener_; } | 26 web::WebState* opener() const { return opener_; } |
| 29 | 27 |
| 30 // Replaces the wrapped WebState (and clear associated state) and returns the | 28 // Replaces the wrapped WebState (and clear associated state) and returns the |
| 31 // old WebState after forfeiting ownership. | 29 // old WebState after forfeiting ownership. |
| 32 web::WebState* ReplaceWebState(web::WebState* web_state); | 30 web::WebState* ReplaceWebState(web::WebState* web_state); |
| 33 | 31 |
| 34 // Sets the opener for the wrapped WebState and record the opener navigation | 32 // Sets the opener for the wrapped WebState and record the opener navigation |
| 35 // index to allow detecting navigation changes during the same session. | 33 // index to allow detecting navigation changes during the same session. |
| 36 void SetOpener(web::WebState* opener); | 34 void SetOpener(web::WebState* opener); |
| 37 | 35 |
| 38 // Returns whether |opener| spawned the wrapped WebState. If |use_group| is | 36 // Returns whether |opener| spawned the wrapped WebState. If |use_group| is |
| 39 // true, also use the opener navigation index to detect navigation changes | 37 // true, also use the opener navigation index to detect navigation changes |
| 40 // during the same session. | 38 // during the same session. |
| 41 bool WasOpenedBy(const web::WebState* opener, | 39 bool WasOpenedBy(const web::WebState* opener, |
| 42 int opener_navigation_index, | 40 int opener_navigation_index, |
| 43 bool use_group) const; | 41 bool use_group) const; |
| 44 | 42 |
| 45 private: | 43 private: |
| 46 web::WebState* web_state_; | 44 web::WebState* web_state_; |
| 47 web::WebState* opener_ = nullptr; | 45 web::WebState* opener_ = nullptr; |
| 48 int opener_last_committed_index_; | 46 int opener_last_committed_index_; |
| 49 const bool has_web_state_ownership_; | |
| 50 | 47 |
| 51 DISALLOW_COPY_AND_ASSIGN(WebStateWrapper); | 48 DISALLOW_COPY_AND_ASSIGN(WebStateWrapper); |
| 52 }; | 49 }; |
| 53 | 50 |
| 54 WebStateList::WebStateWrapper::WebStateWrapper(web::WebState* web_state, | 51 WebStateList::WebStateWrapper::WebStateWrapper(web::WebState* web_state) |
| 55 bool assume_ownership) | 52 : web_state_(web_state) { |
| 56 : web_state_(web_state), has_web_state_ownership_(assume_ownership) { | |
| 57 DCHECK(web_state_); | 53 DCHECK(web_state_); |
| 58 } | 54 } |
| 59 | 55 |
| 60 WebStateList::WebStateWrapper::~WebStateWrapper() { | 56 WebStateList::WebStateWrapper::~WebStateWrapper() = default; |
| 61 if (has_web_state_ownership_) | |
| 62 delete web_state_; | |
| 63 } | |
| 64 | 57 |
| 65 web::WebState* WebStateList::WebStateWrapper::ReplaceWebState( | 58 web::WebState* WebStateList::WebStateWrapper::ReplaceWebState( |
| 66 web::WebState* web_state) { | 59 web::WebState* web_state) { |
| 67 DCHECK(web_state); | 60 DCHECK(web_state); |
| 68 DCHECK_NE(web_state, web_state_); | 61 DCHECK_NE(web_state, web_state_); |
| 69 std::swap(web_state, web_state_); | 62 std::swap(web_state, web_state_); |
| 70 opener_ = nullptr; | 63 opener_ = nullptr; |
| 71 return web_state; | 64 return web_state; |
| 72 } | 65 } |
| 73 | 66 |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 88 | 81 |
| 89 if (!use_group) | 82 if (!use_group) |
| 90 return true; | 83 return true; |
| 91 | 84 |
| 92 return opener_last_committed_index_ == opener_navigation_index; | 85 return opener_last_committed_index_ == opener_navigation_index; |
| 93 } | 86 } |
| 94 | 87 |
| 95 WebStateList::WebStateList(WebStateOwnership ownership) | 88 WebStateList::WebStateList(WebStateOwnership ownership) |
| 96 : web_state_ownership_(ownership) {} | 89 : web_state_ownership_(ownership) {} |
| 97 | 90 |
| 98 WebStateList::~WebStateList() = default; | 91 WebStateList::~WebStateList() { |
| 92 // Once WebStateList owns the WebState and has a CloseWebStateAt() method, | |
| 93 // then change this to close all the WebState. See http://crbug.com/546222 | |
| 94 // for progress. | |
| 95 if (web_state_ownership_ == WebStateOwned) { | |
| 96 for (auto& web_state_wrapper : web_state_wrappers_) { | |
| 97 web::WebState* web_state = web_state_wrapper->web_state(); | |
| 98 delete web_state; | |
| 99 } | |
| 100 } | |
| 101 } | |
| 99 | 102 |
| 100 bool WebStateList::ContainsIndex(int index) const { | 103 bool WebStateList::ContainsIndex(int index) const { |
| 101 return 0 <= index && index < count(); | 104 return 0 <= index && index < count(); |
| 102 } | 105 } |
| 103 | 106 |
| 104 web::WebState* WebStateList::GetWebStateAt(int index) const { | 107 web::WebState* WebStateList::GetWebStateAt(int index) const { |
| 105 DCHECK(ContainsIndex(index)); | 108 DCHECK(ContainsIndex(index)); |
| 106 return web_state_wrappers_[index]->web_state(); | 109 return web_state_wrappers_[index]->web_state(); |
| 107 } | 110 } |
| 108 | 111 |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 134 int WebStateList::GetIndexOfLastWebStateOpenedBy(const web::WebState* opener, | 137 int WebStateList::GetIndexOfLastWebStateOpenedBy(const web::WebState* opener, |
| 135 int start_index, | 138 int start_index, |
| 136 bool use_group) const { | 139 bool use_group) const { |
| 137 return GetIndexOfNthWebStateOpenedBy(opener, start_index, use_group, INT_MAX); | 140 return GetIndexOfNthWebStateOpenedBy(opener, start_index, use_group, INT_MAX); |
| 138 } | 141 } |
| 139 | 142 |
| 140 void WebStateList::InsertWebState(int index, | 143 void WebStateList::InsertWebState(int index, |
| 141 web::WebState* web_state, | 144 web::WebState* web_state, |
| 142 web::WebState* opener) { | 145 web::WebState* opener) { |
| 143 DCHECK(ContainsIndex(index) || index == count()); | 146 DCHECK(ContainsIndex(index) || index == count()); |
| 144 web_state_wrappers_.insert( | 147 web_state_wrappers_.insert(web_state_wrappers_.begin() + index, |
| 145 web_state_wrappers_.begin() + index, | 148 base::MakeUnique<WebStateWrapper>(web_state)); |
| 146 base::MakeUnique<WebStateWrapper>(web_state, | |
| 147 web_state_ownership_ == WebStateOwned)); | |
| 148 | 149 |
| 149 if (opener) | 150 if (opener) |
| 150 SetOpenerOfWebStateAt(index, opener); | 151 SetOpenerOfWebStateAt(index, opener); |
| 151 | 152 |
| 152 for (auto& observer : observers_) | 153 for (auto& observer : observers_) |
| 153 observer.WebStateInsertedAt(this, web_state, index); | 154 observer.WebStateInsertedAt(this, web_state, index); |
| 154 } | 155 } |
| 155 | 156 |
| 156 void WebStateList::MoveWebStateAt(int from_index, int to_index) { | 157 void WebStateList::MoveWebStateAt(int from_index, int to_index) { |
| 157 DCHECK(ContainsIndex(from_index)); | 158 DCHECK(ContainsIndex(from_index)); |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 181 | 182 |
| 182 if (opener && opener != old_web_state) | 183 if (opener && opener != old_web_state) |
| 183 SetOpenerOfWebStateAt(index, opener); | 184 SetOpenerOfWebStateAt(index, opener); |
| 184 | 185 |
| 185 for (auto& observer : observers_) | 186 for (auto& observer : observers_) |
| 186 observer.WebStateReplacedAt(this, old_web_state, web_state, index); | 187 observer.WebStateReplacedAt(this, old_web_state, web_state, index); |
| 187 | 188 |
| 188 return old_web_state; | 189 return old_web_state; |
| 189 } | 190 } |
| 190 | 191 |
| 191 void WebStateList::DetachWebStateAt(int index) { | 192 web::WebState* WebStateList::DetachWebStateAt(int index) { |
| 192 DCHECK(ContainsIndex(index)); | 193 DCHECK(ContainsIndex(index)); |
| 193 ClearOpenersReferencing(index); | 194 ClearOpenersReferencing(index); |
| 194 | 195 |
| 195 web::WebState* web_state = web_state_wrappers_[index]->web_state(); | 196 web::WebState* old_web_state = web_state_wrappers_[index]->web_state(); |
| 196 web_state_wrappers_.erase(web_state_wrappers_.begin() + index); | 197 web_state_wrappers_.erase(web_state_wrappers_.begin() + index); |
| 197 | 198 |
| 198 for (auto& observer : observers_) | 199 for (auto& observer : observers_) |
| 199 observer.WebStateDetachedAt(this, web_state, index); | 200 observer.WebStateDetachedAt(this, old_web_state, index); |
| 201 | |
| 202 return old_web_state; | |
| 200 } | 203 } |
| 201 | 204 |
| 202 void WebStateList::AddObserver(WebStateListObserver* observer) { | 205 void WebStateList::AddObserver(WebStateListObserver* observer) { |
| 203 observers_.AddObserver(observer); | 206 observers_.AddObserver(observer); |
| 204 } | 207 } |
| 205 | 208 |
| 206 void WebStateList::RemoveObserver(WebStateListObserver* observer) { | 209 void WebStateList::RemoveObserver(WebStateListObserver* observer) { |
| 207 observers_.RemoveObserver(observer); | 210 observers_.RemoveObserver(observer); |
| 208 } | 211 } |
| 209 | 212 |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 235 } else if (found_index != kInvalidIndex) { | 238 } else if (found_index != kInvalidIndex) { |
| 236 return found_index; | 239 return found_index; |
| 237 } | 240 } |
| 238 } | 241 } |
| 239 | 242 |
| 240 return found_index; | 243 return found_index; |
| 241 } | 244 } |
| 242 | 245 |
| 243 // static | 246 // static |
| 244 const int WebStateList::kInvalidIndex; | 247 const int WebStateList::kInvalidIndex; |
| OLD | NEW |