OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/ui/tabs/tab_strip_model.h" | 5 #include "chrome/browser/ui/tabs/tab_strip_model.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <map> | 8 #include <map> |
9 #include <set> | 9 #include <set> |
10 #include <string> | 10 #include <string> |
11 | 11 |
12 #include "base/metrics/histogram.h" | 12 #include "base/metrics/histogram.h" |
13 #include "base/stl_util.h" | 13 #include "base/stl_util.h" |
14 #include "chrome/app/chrome_command_ids.h" | 14 #include "chrome/app/chrome_command_ids.h" |
15 #include "chrome/browser/browser_shutdown.h" | 15 #include "chrome/browser/browser_shutdown.h" |
16 #include "chrome/browser/defaults.h" | 16 #include "chrome/browser/defaults.h" |
17 #include "chrome/browser/extensions/tab_helper.h" | 17 #include "chrome/browser/extensions/tab_helper.h" |
18 #include "chrome/browser/memory/tab_manager_web_contents_data.h" | |
19 #include "chrome/browser/profiles/profile.h" | 18 #include "chrome/browser/profiles/profile.h" |
20 #include "chrome/browser/ui/tab_contents/core_tab_helper.h" | 19 #include "chrome/browser/ui/tab_contents/core_tab_helper.h" |
21 #include "chrome/browser/ui/tab_contents/core_tab_helper_delegate.h" | 20 #include "chrome/browser/ui/tab_contents/core_tab_helper_delegate.h" |
22 #include "chrome/browser/ui/tabs/tab_strip_model_delegate.h" | 21 #include "chrome/browser/ui/tabs/tab_strip_model_delegate.h" |
23 #include "chrome/browser/ui/tabs/tab_strip_model_order_controller.h" | 22 #include "chrome/browser/ui/tabs/tab_strip_model_order_controller.h" |
24 #include "chrome/browser/ui/tabs/tab_utils.h" | 23 #include "chrome/browser/ui/tabs/tab_utils.h" |
25 #include "chrome/browser/ui/web_contents_sizer.h" | 24 #include "chrome/browser/ui/web_contents_sizer.h" |
26 #include "chrome/common/url_constants.h" | 25 #include "chrome/common/url_constants.h" |
27 #include "components/web_modal/web_contents_modal_dialog_manager.h" | 26 #include "components/web_modal/web_contents_modal_dialog_manager.h" |
28 #include "content/public/browser/render_process_host.h" | 27 #include "content/public/browser/render_process_host.h" |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
154 bool pinned() const { return pinned_; } | 153 bool pinned() const { return pinned_; } |
155 void set_pinned(bool value) { pinned_ = value; } | 154 void set_pinned(bool value) { pinned_ = value; } |
156 bool blocked() const { return blocked_; } | 155 bool blocked() const { return blocked_; } |
157 void set_blocked(bool value) { blocked_ = value; } | 156 void set_blocked(bool value) { blocked_ = value; } |
158 | 157 |
159 private: | 158 private: |
160 // Make sure that if someone deletes this WebContents out from under us, it | 159 // Make sure that if someone deletes this WebContents out from under us, it |
161 // is properly removed from the tab strip. | 160 // is properly removed from the tab strip. |
162 void WebContentsDestroyed() override; | 161 void WebContentsDestroyed() override; |
163 | 162 |
164 // Marks the tab as no longer discarded if it has been reloaded from another | |
165 // source (ie: context menu). | |
166 void DidStartLoading() override; | |
167 | |
168 // The WebContents being tracked by this WebContentsData. The | 163 // The WebContents being tracked by this WebContentsData. The |
169 // WebContentsObserver does keep a reference, but when the WebContents is | 164 // WebContentsObserver does keep a reference, but when the WebContents is |
170 // deleted, the WebContentsObserver reference is NULLed and thus inaccessible. | 165 // deleted, the WebContentsObserver reference is NULLed and thus inaccessible. |
171 WebContents* contents_; | 166 WebContents* contents_; |
172 | 167 |
173 // The TabStripModel containing this WebContents. | 168 // The TabStripModel containing this WebContents. |
174 TabStripModel* tab_strip_model_; | 169 TabStripModel* tab_strip_model_; |
175 | 170 |
176 // The group is used to model a set of tabs spawned from a single parent | 171 // The group is used to model a set of tabs spawned from a single parent |
177 // tab. This value is preserved for a given tab as long as the tab remains | 172 // tab. This value is preserved for a given tab as long as the tab remains |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
224 void TabStripModel::WebContentsData::WebContentsDestroyed() { | 219 void TabStripModel::WebContentsData::WebContentsDestroyed() { |
225 DCHECK_EQ(contents_, web_contents()); | 220 DCHECK_EQ(contents_, web_contents()); |
226 | 221 |
227 // Note that we only detach the contents here, not close it - it's | 222 // Note that we only detach the contents here, not close it - it's |
228 // already been closed. We just want to undo our bookkeeping. | 223 // already been closed. We just want to undo our bookkeeping. |
229 int index = tab_strip_model_->GetIndexOfWebContents(web_contents()); | 224 int index = tab_strip_model_->GetIndexOfWebContents(web_contents()); |
230 DCHECK_NE(TabStripModel::kNoTab, index); | 225 DCHECK_NE(TabStripModel::kNoTab, index); |
231 tab_strip_model_->DetachWebContentsAt(index); | 226 tab_strip_model_->DetachWebContentsAt(index); |
232 } | 227 } |
233 | 228 |
234 void TabStripModel::WebContentsData::DidStartLoading() { | |
235 // TODO(georgesak): move this into tab_manager.cc. | |
236 memory::TabManager::WebContentsData::SetDiscardState(contents_, false); | |
237 } | |
238 | |
239 /////////////////////////////////////////////////////////////////////////////// | 229 /////////////////////////////////////////////////////////////////////////////// |
240 // TabStripModel, public: | 230 // TabStripModel, public: |
241 | 231 |
242 TabStripModel::TabStripModel(TabStripModelDelegate* delegate, Profile* profile) | 232 TabStripModel::TabStripModel(TabStripModelDelegate* delegate, Profile* profile) |
243 : delegate_(delegate), | 233 : delegate_(delegate), |
244 profile_(profile), | 234 profile_(profile), |
245 closing_all_(false), | 235 closing_all_(false), |
246 in_notify_(false), | 236 in_notify_(false), |
247 weak_factory_(this) { | 237 weak_factory_(this) { |
248 DCHECK(delegate_); | 238 DCHECK(delegate_); |
(...skipping 1011 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1260 ? TabStripModelObserver::CHANGE_REASON_USER_GESTURE | 1250 ? TabStripModelObserver::CHANGE_REASON_USER_GESTURE |
1261 : TabStripModelObserver::CHANGE_REASON_NONE; | 1251 : TabStripModelObserver::CHANGE_REASON_NONE; |
1262 CHECK(!in_notify_); | 1252 CHECK(!in_notify_); |
1263 in_notify_ = true; | 1253 in_notify_ = true; |
1264 FOR_EACH_OBSERVER(TabStripModelObserver, observers_, | 1254 FOR_EACH_OBSERVER(TabStripModelObserver, observers_, |
1265 ActiveTabChanged(old_contents, | 1255 ActiveTabChanged(old_contents, |
1266 new_contents, | 1256 new_contents, |
1267 active_index(), | 1257 active_index(), |
1268 reason)); | 1258 reason)); |
1269 in_notify_ = false; | 1259 in_notify_ = false; |
1270 // TODO(georgesak): move this into tab_manager.cc. | |
1271 memory::TabManager::WebContentsData::SetDiscardState(new_contents, false); | |
1272 } | 1260 } |
1273 } | 1261 } |
1274 | 1262 |
1275 void TabStripModel::NotifyIfActiveOrSelectionChanged( | 1263 void TabStripModel::NotifyIfActiveOrSelectionChanged( |
1276 WebContents* old_contents, | 1264 WebContents* old_contents, |
1277 NotifyTypes notify_types, | 1265 NotifyTypes notify_types, |
1278 const ui::ListSelectionModel& old_model) { | 1266 const ui::ListSelectionModel& old_model) { |
1279 NotifyIfActiveTabChanged(old_contents, notify_types); | 1267 NotifyIfActiveTabChanged(old_contents, notify_types); |
1280 | 1268 |
1281 if (!selection_model().Equals(old_model)) { | 1269 if (!selection_model().Equals(old_model)) { |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1372 | 1360 |
1373 void TabStripModel::FixOpenersAndGroupsReferencing(int index) { | 1361 void TabStripModel::FixOpenersAndGroupsReferencing(int index) { |
1374 WebContents* old_contents = GetWebContentsAtImpl(index); | 1362 WebContents* old_contents = GetWebContentsAtImpl(index); |
1375 for (WebContentsData* data : contents_data_) { | 1363 for (WebContentsData* data : contents_data_) { |
1376 if (data->group() == old_contents) | 1364 if (data->group() == old_contents) |
1377 data->set_group(contents_data_[index]->group()); | 1365 data->set_group(contents_data_[index]->group()); |
1378 if (data->opener() == old_contents) | 1366 if (data->opener() == old_contents) |
1379 data->set_opener(contents_data_[index]->opener()); | 1367 data->set_opener(contents_data_[index]->opener()); |
1380 } | 1368 } |
1381 } | 1369 } |
OLD | NEW |