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

Side by Side Diff: chrome/browser/tabs/tab_strip_model.h

Issue 4694008: Make pink's TabContentsWrapper change compile on Windows.... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 10 years, 1 month 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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 #ifndef CHROME_BROWSER_TABS_TAB_STRIP_MODEL_H_ 5 #ifndef CHROME_BROWSER_TABS_TAB_STRIP_MODEL_H_
6 #define CHROME_BROWSER_TABS_TAB_STRIP_MODEL_H_ 6 #define CHROME_BROWSER_TABS_TAB_STRIP_MODEL_H_
7 #pragma once 7 #pragma once
8 8
9 #include <vector> 9 #include <vector>
10 10
11 #include "base/observer_list.h" 11 #include "base/observer_list.h"
12 #include "chrome/browser/tabs/tab_strip_model_observer.h" 12 #include "chrome/browser/tabs/tab_strip_model_observer.h"
13 #include "chrome/common/notification_observer.h" 13 #include "chrome/common/notification_observer.h"
14 #include "chrome/common/notification_registrar.h" 14 #include "chrome/common/notification_registrar.h"
15 #include "chrome/common/page_transition_types.h" 15 #include "chrome/common/page_transition_types.h"
16 16
17 class NavigationController; 17 class NavigationController;
18 class Profile; 18 class Profile;
19 class TabContents; 19 class TabContents;
20 class TabContentsWrapper;
20 class TabStripModelDelegate; 21 class TabStripModelDelegate;
21 class TabStripModelOrderController; 22 class TabStripModelOrderController;
22 23
23 //////////////////////////////////////////////////////////////////////////////// 24 ////////////////////////////////////////////////////////////////////////////////
24 // 25 //
25 // TabStripModel 26 // TabStripModel
26 // 27 //
27 // A model & low level controller of a Browser Window tabstrip. Holds a vector 28 // A model & low level controller of a Browser Window tabstrip. Holds a vector
28 // of TabContents, and provides an API for adding, removing and shuffling 29 // of TabContents, and provides an API for adding, removing and shuffling
29 // them, as well as a higher level API for doing specific Browser-related 30 // them, as well as a higher level API for doing specific Browser-related
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
152 // for debugging. 153 // for debugging.
153 bool HasObserver(TabStripModelObserver* observer); 154 bool HasObserver(TabStripModelObserver* observer);
154 155
155 // Basic API ///////////////////////////////////////////////////////////////// 156 // Basic API /////////////////////////////////////////////////////////////////
156 157
157 // Determines if the specified index is contained within the TabStripModel. 158 // Determines if the specified index is contained within the TabStripModel.
158 bool ContainsIndex(int index) const; 159 bool ContainsIndex(int index) const;
159 160
160 // Adds the specified TabContents in the default location. Tabs opened in the 161 // Adds the specified TabContents in the default location. Tabs opened in the
161 // foreground inherit the group of the previously selected tab. 162 // foreground inherit the group of the previously selected tab.
162 void AppendTabContents(TabContents* contents, bool foreground); 163 void AppendTabContents(TabContentsWrapper* contents, bool foreground);
163 164
164 // Adds the specified TabContents at the specified location. |add_types| is a 165 // Adds the specified TabContents at the specified location. |add_types| is a
165 // bitmask of AddTypes; see it for details. 166 // bitmask of AddTypes; see it for details.
166 // 167 //
167 // All append/insert methods end up in this method. 168 // All append/insert methods end up in this method.
168 // 169 //
169 // NOTE: adding a tab using this method does NOT query the order controller, 170 // NOTE: adding a tab using this method does NOT query the order controller,
170 // as such the ADD_FORCE_INDEX AddType is meaningless here. The only time the 171 // as such the ADD_FORCE_INDEX AddType is meaningless here. The only time the
171 // |index| is changed is if using the index would result in breaking the 172 // |index| is changed is if using the index would result in breaking the
172 // constraint that all mini-tabs occur before non-mini-tabs. 173 // constraint that all mini-tabs occur before non-mini-tabs.
173 // See also AddTabContents. 174 // See also AddTabContents.
174 void InsertTabContentsAt(int index, 175 void InsertTabContentsAt(int index,
175 TabContents* contents, 176 TabContentsWrapper* contents,
176 int add_types); 177 int add_types);
177 178
178 // Closes the TabContents at the specified index. This causes the TabContents 179 // Closes the TabContents at the specified index. This causes the TabContents
179 // to be destroyed, but it may not happen immediately (e.g. if it's a 180 // to be destroyed, but it may not happen immediately (e.g. if it's a
180 // TabContents). |close_types| is a bitmask of CloseTypes. 181 // TabContents). |close_types| is a bitmask of CloseTypes.
181 // Returns true if the TabContents was closed immediately, false if it was not 182 // Returns true if the TabContents was closed immediately, false if it was not
182 // closed (we may be waiting for a response from an onunload handler, or 183 // closed (we may be waiting for a response from an onunload handler, or
183 // waiting for the user to confirm closure). 184 // waiting for the user to confirm closure).
184 bool CloseTabContentsAt(int index, uint32 close_types); 185 bool CloseTabContentsAt(int index, uint32 close_types);
185 186
186 // Replaces the entire state of a the tab at index by switching in a 187 // Replaces the entire state of a the tab at index by switching in a
187 // different NavigationController. This is used through the recently 188 // different NavigationController. This is used through the recently
188 // closed tabs list, which needs to replace a tab's current state 189 // closed tabs list, which needs to replace a tab's current state
189 // and history with another set of contents and history. 190 // and history with another set of contents and history.
190 // 191 //
191 // The old NavigationController is deallocated and this object takes 192 // The old NavigationController is deallocated and this object takes
192 // ownership of the passed in controller. 193 // ownership of the passed in controller.
194 // XXXPINK This API is weird and wrong. Remove it or change it or rename it?
193 void ReplaceNavigationControllerAt(int index, 195 void ReplaceNavigationControllerAt(int index,
194 NavigationController* controller); 196 TabContentsWrapper* contents);
195 197
196 // Replaces the tab contents at |index| with |new_contents|. This deletes the 198 // Replaces the tab contents at |index| with |new_contents|. This deletes the
197 // TabContents currently at |index|. 199 // TabContents currently at |index|.
198 void ReplaceTabContentsAt(int index, TabContents* new_contents); 200 void ReplaceTabContentsAt(int index, TabContentsWrapper* new_contents);
199 201
200 // Detaches the TabContents at the specified index from this strip. The 202 // Detaches the TabContents at the specified index from this strip. The
201 // TabContents is not destroyed, just removed from display. The caller is 203 // TabContents is not destroyed, just removed from display. The caller is
202 // responsible for doing something with it (e.g. stuffing it into another 204 // responsible for doing something with it (e.g. stuffing it into another
203 // strip). 205 // strip).
204 TabContents* DetachTabContentsAt(int index); 206 TabContentsWrapper* DetachTabContentsAt(int index);
205 207
206 // Select the TabContents at the specified index. |user_gesture| is true if 208 // Select the TabContents at the specified index. |user_gesture| is true if
207 // the user actually clicked on the tab or navigated to it using a keyboard 209 // the user actually clicked on the tab or navigated to it using a keyboard
208 // command, false if the tab was selected as a by-product of some other 210 // command, false if the tab was selected as a by-product of some other
209 // action. 211 // action.
210 void SelectTabContentsAt(int index, bool user_gesture); 212 void SelectTabContentsAt(int index, bool user_gesture);
211 213
212 // Move the TabContents at the specified index to another index. This method 214 // Move the TabContents at the specified index to another index. This method
213 // does NOT send Detached/Attached notifications, rather it moves the 215 // does NOT send Detached/Attached notifications, rather it moves the
214 // TabContents inline and sends a Moved notification instead. 216 // TabContents inline and sends a Moved notification instead.
215 // If |select_after_move| is false, whatever tab was selected before the move 217 // If |select_after_move| is false, whatever tab was selected before the move
216 // will still be selected, but it's index may have incremented or decremented 218 // will still be selected, but it's index may have incremented or decremented
217 // one slot. 219 // one slot.
218 // NOTE: this does nothing if the move would result in app tabs and non-app 220 // NOTE: this does nothing if the move would result in app tabs and non-app
219 // tabs mixing. 221 // tabs mixing.
220 void MoveTabContentsAt(int index, int to_position, bool select_after_move); 222 void MoveTabContentsAt(int index, int to_position, bool select_after_move);
221 223
222 // Returns the currently selected TabContents, or NULL if there is none. 224 // Returns the currently selected TabContents, or NULL if there is none.
223 TabContents* GetSelectedTabContents() const; 225 TabContentsWrapper* GetSelectedTabContents() const;
224 226
225 // Returns the TabContents at the specified index, or NULL if there is none. 227 // Returns the TabContentsWrapper at the specified index, or NULL if there is
226 TabContents* GetTabContentsAt(int index) const; 228 // none.
229 TabContentsWrapper* GetTabContentsAt(int index) const;
227 230
228 // Returns the index of the specified TabContents, or TabContents::kNoTab if 231 // Returns the index of the specified TabContents wrapper, or
229 // the TabContents is not in this TabStripModel. 232 // TabStripModel::kNoTab if the TabContents is not in this TabStripModel.
230 int GetIndexOfTabContents(const TabContents* contents) const; 233 int GetIndexOfTabContents(const TabContentsWrapper* contents) const;
231 234
232 // Returns the index of the specified NavigationController, or -1 if it is 235 // Returns the index of the specified TabContents wrapper given its raw
236 // TabContents, or TabStripModel::kNoTab if the TabContents is not in this
237 // TabStripModel. Note: This is only needed in rare cases where the wrapper
238 // is not already present (such as implementing TabContentsDelegate methods,
239 // which don't know about the wrapper. Returns NULL if |contents| is not
240 // associated with any wrapper in the model.
241 int GetWrapperIndex(const TabContents* contents) const;
242
243 // Returns the index of the specified NavigationController, or kNoTab if it is
233 // not in this TabStripModel. 244 // not in this TabStripModel.
234 int GetIndexOfController(const NavigationController* controller) const; 245 int GetIndexOfController(const NavigationController* controller) const;
235 246
236 // Notify any observers that the TabContents at the specified index has 247 // Notify any observers that the TabContents at the specified index has
237 // changed in some way. See TabChangeType for details of |change_type|. 248 // changed in some way. See TabChangeType for details of |change_type|.
238 void UpdateTabContentsStateAt( 249 void UpdateTabContentsStateAt(
239 int index, 250 int index,
240 TabStripModelObserver::TabChangeType change_type); 251 TabStripModelObserver::TabChangeType change_type);
241 252
242 // Make sure there is an auto-generated New Tab tab in the TabStripModel. 253 // Make sure there is an auto-generated New Tab tab in the TabStripModel.
(...skipping 28 matching lines...) Expand all
271 282
272 // Returns the index of the last TabContents in the model opened by the 283 // Returns the index of the last TabContents in the model opened by the
273 // specified opener, starting at |start_index|. 284 // specified opener, starting at |start_index|.
274 int GetIndexOfLastTabContentsOpenedBy(const NavigationController* opener, 285 int GetIndexOfLastTabContentsOpenedBy(const NavigationController* opener,
275 int start_index) const; 286 int start_index) const;
276 287
277 // Called by the Browser when a navigation is about to occur in the specified 288 // Called by the Browser when a navigation is about to occur in the specified
278 // TabContents. Depending on the tab, and the transition type of the 289 // TabContents. Depending on the tab, and the transition type of the
279 // navigation, the TabStripModel may adjust its selection and grouping 290 // navigation, the TabStripModel may adjust its selection and grouping
280 // behavior. 291 // behavior.
281 void TabNavigating(TabContents* contents, PageTransition::Type transition); 292 void TabNavigating(TabContentsWrapper* contents,
293 PageTransition::Type transition);
282 294
283 // Forget all Opener relationships that are stored (but _not_ group 295 // Forget all Opener relationships that are stored (but _not_ group
284 // relationships!) This is to reduce unpredictable tab switching behavior 296 // relationships!) This is to reduce unpredictable tab switching behavior
285 // in complex session states. The exact circumstances under which this method 297 // in complex session states. The exact circumstances under which this method
286 // is called are left up to the implementation of the selected 298 // is called are left up to the implementation of the selected
287 // TabStripModelOrderController. 299 // TabStripModelOrderController.
288 void ForgetAllOpeners(); 300 void ForgetAllOpeners();
289 301
290 // Forgets the group affiliation of the specified TabContents. This should be 302 // Forgets the group affiliation of the specified TabContents. This should be
291 // called when a TabContents that is part of a logical group of tabs is 303 // called when a TabContents that is part of a logical group of tabs is
292 // moved to a new logical context by the user (e.g. by typing a new URL or 304 // moved to a new logical context by the user (e.g. by typing a new URL or
293 // selecting a bookmark). This also forgets the opener, which is considered 305 // selecting a bookmark). This also forgets the opener, which is considered
294 // a weaker relationship than group. 306 // a weaker relationship than group.
295 void ForgetGroup(TabContents* contents); 307 void ForgetGroup(TabContentsWrapper* contents);
296 308
297 // Returns true if the group/opener relationships present for |contents| 309 // Returns true if the group/opener relationships present for |contents|
298 // should be reset when _any_ selection change occurs in the model. 310 // should be reset when _any_ selection change occurs in the model.
299 bool ShouldResetGroupOnSelect(TabContents* contents) const; 311 bool ShouldResetGroupOnSelect(TabContentsWrapper* contents) const;
300 312
301 // Changes the blocked state of the tab at |index|. 313 // Changes the blocked state of the tab at |index|.
302 void SetTabBlocked(int index, bool blocked); 314 void SetTabBlocked(int index, bool blocked);
303 315
304 // Changes the pinned state of the tab at |index|. See description above 316 // Changes the pinned state of the tab at |index|. See description above
305 // class for details on this. 317 // class for details on this.
306 void SetTabPinned(int index, bool pinned); 318 void SetTabPinned(int index, bool pinned);
307 319
308 // Returns true if the tab at |index| is pinned. 320 // Returns true if the tab at |index| is pinned.
309 // See description above class for details on pinned tabs. 321 // See description above class for details on pinned tabs.
(...skipping 21 matching lines...) Expand all
331 // 0 and IndexOfFirstNonMiniTab. If |mini_tab| is false, the returned index 343 // 0 and IndexOfFirstNonMiniTab. If |mini_tab| is false, the returned index
332 // is between IndexOfFirstNonMiniTab and count(). 344 // is between IndexOfFirstNonMiniTab and count().
333 int ConstrainInsertionIndex(int index, bool mini_tab); 345 int ConstrainInsertionIndex(int index, bool mini_tab);
334 346
335 // Command level API ///////////////////////////////////////////////////////// 347 // Command level API /////////////////////////////////////////////////////////
336 348
337 // Adds a TabContents at the best position in the TabStripModel given the 349 // Adds a TabContents at the best position in the TabStripModel given the
338 // specified insertion index, transition, etc. |add_types| is a bitmask of 350 // specified insertion index, transition, etc. |add_types| is a bitmask of
339 // AddTypes; see it for details. This method ends up calling into 351 // AddTypes; see it for details. This method ends up calling into
340 // InsertTabContentsAt to do the actual inertion. 352 // InsertTabContentsAt to do the actual inertion.
341 void AddTabContents(TabContents* contents, 353 void AddTabContents(TabContentsWrapper* contents,
342 int index, 354 int index,
343 PageTransition::Type transition, 355 PageTransition::Type transition,
344 int add_types); 356 int add_types);
345 357
346 // Closes the selected TabContents. 358 // Closes the selected TabContents.
347 void CloseSelectedTab(); 359 void CloseSelectedTab();
348 360
349 // Select adjacent tabs 361 // Select adjacent tabs
350 void SelectNextTab(); 362 void SelectNextTab();
351 void SelectPreviousTab(); 363 void SelectPreviousTab();
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
401 413
402 private: 414 private:
403 // We cannot be constructed without a delegate. 415 // We cannot be constructed without a delegate.
404 TabStripModel(); 416 TabStripModel();
405 417
406 // Returns true if the specified TabContents is a New Tab at the end of the 418 // Returns true if the specified TabContents is a New Tab at the end of the
407 // TabStrip. We check for this because opener relationships are _not_ 419 // TabStrip. We check for this because opener relationships are _not_
408 // forgotten for the New Tab page opened as a result of a New Tab gesture 420 // forgotten for the New Tab page opened as a result of a New Tab gesture
409 // (e.g. Ctrl+T, etc) since the user may open a tab transiently to look up 421 // (e.g. Ctrl+T, etc) since the user may open a tab transiently to look up
410 // something related to their current activity. 422 // something related to their current activity.
411 bool IsNewTabAtEndOfTabStrip(TabContents* contents) const; 423 bool IsNewTabAtEndOfTabStrip(TabContentsWrapper* contents) const;
412 424
413 // Closes the TabContents at the specified indices. This causes the 425 // Closes the TabContents at the specified indices. This causes the
414 // TabContents to be destroyed, but it may not happen immediately. If the 426 // TabContents to be destroyed, but it may not happen immediately. If the
415 // page in question has an unload event the TabContents will not be destroyed 427 // page in question has an unload event the TabContents will not be destroyed
416 // until after the event has completed, which will then call back into this 428 // until after the event has completed, which will then call back into this
417 // method. 429 // method.
418 // 430 //
419 // Returns true if the TabContents were closed immediately, false if we are 431 // Returns true if the TabContents were closed immediately, false if we are
420 // waiting for the result of an onunload handler. 432 // waiting for the result of an onunload handler.
421 bool InternalCloseTabs(const std::vector<int>& indices, uint32 close_types); 433 bool InternalCloseTabs(const std::vector<int>& indices, uint32 close_types);
422 434
423 // Invoked from InternalCloseTabs and when an extension is removed for an app 435 // Invoked from InternalCloseTabs and when an extension is removed for an app
424 // tab. Notifies observers of TabClosingAt and deletes |contents|. If 436 // tab. Notifies observers of TabClosingAt and deletes |contents|. If
425 // |create_historical_tabs| is true, CreateHistoricalTab is invoked on the 437 // |create_historical_tabs| is true, CreateHistoricalTab is invoked on the
426 // delegate. 438 // delegate.
427 // 439 //
428 // The boolean parameter create_historical_tab controls whether to 440 // The boolean parameter create_historical_tab controls whether to
429 // record these tabs and their history for reopening recently closed 441 // record these tabs and their history for reopening recently closed
430 // tabs. 442 // tabs.
431 void InternalCloseTab(TabContents* contents, 443 void InternalCloseTab(TabContentsWrapper* contents,
432 int index, 444 int index,
433 bool create_historical_tabs); 445 bool create_historical_tabs);
434 446
435 TabContents* GetContentsAt(int index) const; 447 TabContentsWrapper* GetContentsAt(int index) const;
436 448
437 // The actual implementation of SelectTabContentsAt. Takes the previously 449 // The actual implementation of SelectTabContentsAt. Takes the previously
438 // selected contents in |old_contents|, which may actually not be in 450 // selected contents in |old_contents|, which may actually not be in
439 // |contents_| anymore because it may have been removed by a call to say 451 // |contents_| anymore because it may have been removed by a call to say
440 // DetachTabContentsAt... 452 // DetachTabContentsAt...
441 void ChangeSelectedContentsFrom( 453 void ChangeSelectedContentsFrom(
442 TabContents* old_contents, int to_index, bool user_gesture); 454 TabContentsWrapper* old_contents, int to_index, bool user_gesture);
443 455
444 // Returns the number of New Tab tabs in the TabStripModel. 456 // Returns the number of New Tab tabs in the TabStripModel.
445 int GetNewTabCount() const; 457 int GetNewTabCount() const;
446 458
447 // Selects either the next tab (|foward| is true), or the previous tab 459 // Selects either the next tab (|foward| is true), or the previous tab
448 // (|forward| is false). 460 // (|forward| is false).
449 void SelectRelativeTab(bool forward); 461 void SelectRelativeTab(bool forward);
450 462
451 // Does the work of MoveTabContentsAt. This has no checks to make sure the 463 // Does the work of MoveTabContentsAt. This has no checks to make sure the
452 // position is valid, those are done in MoveTabContentsAt. 464 // position is valid, those are done in MoveTabContentsAt.
(...skipping 10 matching lines...) Expand all
463 bool use_group); 475 bool use_group);
464 476
465 // Our delegate. 477 // Our delegate.
466 TabStripModelDelegate* delegate_; 478 TabStripModelDelegate* delegate_;
467 479
468 // A hunk of data representing a TabContents and (optionally) the 480 // A hunk of data representing a TabContents and (optionally) the
469 // NavigationController that spawned it. This memory only sticks around while 481 // NavigationController that spawned it. This memory only sticks around while
470 // the TabContents is in the current TabStripModel, unless otherwise 482 // the TabContents is in the current TabStripModel, unless otherwise
471 // specified in code. 483 // specified in code.
472 struct TabContentsData { 484 struct TabContentsData {
473 explicit TabContentsData(TabContents* a_contents) 485 explicit TabContentsData(TabContentsWrapper* a_contents)
474 : contents(a_contents), 486 : contents(a_contents),
475 reset_group_on_select(false), 487 reset_group_on_select(false),
476 pinned(false), 488 pinned(false),
477 blocked(false) { 489 blocked(false) {
478 SetGroup(NULL); 490 SetGroup(NULL);
479 } 491 }
480 492
481 // Create a relationship between this TabContents and other TabContentses. 493 // Create a relationship between this TabContents and other TabContentses.
482 // Used to identify which TabContents to select next after one is closed. 494 // Used to identify which TabContents to select next after one is closed.
483 void SetGroup(NavigationController* a_group) { 495 void SetGroup(NavigationController* a_group) {
484 group = a_group; 496 group = a_group;
485 opener = a_group; 497 opener = a_group;
486 } 498 }
487 499
488 // Forget the opener relationship so that when this TabContents is closed 500 // Forget the opener relationship so that when this TabContents is closed
489 // unpredictable re-selection does not occur. 501 // unpredictable re-selection does not occur.
490 void ForgetOpener() { 502 void ForgetOpener() {
491 opener = NULL; 503 opener = NULL;
492 } 504 }
493 505
494 TabContents* contents; 506 TabContentsWrapper* contents;
495 // We use NavigationControllers here since they more closely model the 507 // We use NavigationControllers here since they more closely model the
496 // "identity" of a Tab, TabContents can change depending on the URL loaded 508 // "identity" of a Tab, TabContents can change depending on the URL loaded
497 // in the Tab. 509 // in the Tab.
498 // The group is used to model a set of tabs spawned from a single parent 510 // The group is used to model a set of tabs spawned from a single parent
499 // tab. This value is preserved for a given tab as long as the tab remains 511 // tab. This value is preserved for a given tab as long as the tab remains
500 // navigated to the link it was initially opened at or some navigation from 512 // navigated to the link it was initially opened at or some navigation from
501 // that page (i.e. if the user types or visits a bookmark or some other 513 // that page (i.e. if the user types or visits a bookmark or some other
502 // navigation within that tab, the group relationship is lost). This 514 // navigation within that tab, the group relationship is lost). This
503 // property can safely be used to implement features that depend on a 515 // property can safely be used to implement features that depend on a
504 // logical group of related tabs. 516 // logical group of related tabs.
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
544 typedef ObserverList<TabStripModelObserver> TabStripModelObservers; 556 typedef ObserverList<TabStripModelObserver> TabStripModelObservers;
545 TabStripModelObservers observers_; 557 TabStripModelObservers observers_;
546 558
547 // A scoped container for notification registries. 559 // A scoped container for notification registries.
548 NotificationRegistrar registrar_; 560 NotificationRegistrar registrar_;
549 561
550 DISALLOW_COPY_AND_ASSIGN(TabStripModel); 562 DISALLOW_COPY_AND_ASSIGN(TabStripModel);
551 }; 563 };
552 564
553 #endif // CHROME_BROWSER_TABS_TAB_STRIP_MODEL_H_ 565 #endif // CHROME_BROWSER_TABS_TAB_STRIP_MODEL_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698