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
3// found in the LICENSE file.
4
5#ifndef CHROME_BROWSER_UI_ANDROID_TAB_MODEL_TAB_MODEL_H_
6#define CHROME_BROWSER_UI_ANDROID_TAB_MODEL_TAB_MODEL_H_
7
8#include "base/memory/scoped_ptr.h"
9#include "chrome/browser/sync/glue/synced_window_delegate.h"
10#include "chrome/browser/ui/toolbar/toolbar_model.h"
11#include "chrome/browser/ui/toolbar/toolbar_model_delegate.h"
12#include "components/sessions/session_id.h"
13#include "content/public/browser/notification_observer.h"
14#include "content/public/browser/notification_registrar.h"
15
16namespace browser_sync {
17class SyncedWindowDelegate;
18class SyncedWindowDelegateAndroid;
19}
20
21namespace content {
22class WebContents;
23}
24
25class Profile;
26class TabAndroid;
27
28// Abstract representation of a Tab Model for Android.  Since Android does
29// not use Browser/BrowserList, this is required to allow Chrome to interact
30// with Android's Tabs and Tab Model.
31class TabModel : public content::NotificationObserver {
32 public:
33  virtual Profile* GetProfile() const;
34  virtual bool IsOffTheRecord() const;
35  virtual browser_sync::SyncedWindowDelegate* GetSyncedWindowDelegate() const;
36  virtual SessionID::id_type GetSessionId() const;
37
38  virtual int GetTabCount() const = 0;
39  virtual int GetActiveIndex() const = 0;
40  virtual content::WebContents* GetWebContentsAt(int index) const = 0;
41  // This will return NULL if the tab has not yet been initialized.
42  virtual TabAndroid* GetTabAt(int index) const = 0;
43
44  virtual void SetActiveIndex(int index) = 0;
45  virtual void CloseTabAt(int index) = 0;
46
47  // Used for restoring tabs from synced foreign sessions.
48  virtual void CreateTab(content::WebContents* web_contents,
49                         int parent_tab_id) = 0;
50
51  // Used by Developer Tools to create a new tab with a given URL.
52  // Replaces CreateTabForTesting.
53  virtual content::WebContents* CreateNewTabForDevTools(const GURL& url) = 0;
54
55  // Return true if we are currently restoring sessions asynchronously.
56  virtual bool IsSessionRestoreInProgress() const = 0;
57
58 protected:
59  explicit TabModel(Profile* profile);
60  virtual ~TabModel();
61
62  // Instructs the TabModel to broadcast a notification that all tabs are now
63  // loaded from storage.
64  void BroadcastSessionRestoreComplete();
65
66  ToolbarModel* GetToolbarModel();
67
68 private:
69  // Determines how TabModel will interact with the profile.
70  virtual void Observe(int type,
71                       const content::NotificationSource& source,
72                       const content::NotificationDetails& details) OVERRIDE;
73
74  // The profile associated with this TabModel.
75  Profile* profile_;
76
77  // Describes if this TabModel contains an off-the-record profile.
78  bool is_off_the_record_;
79
80  // The SyncedWindowDelegate associated with this TabModel.
81  scoped_ptr<browser_sync::SyncedWindowDelegateAndroid> synced_window_delegate_;
82
83  // Unique identifier of this TabModel for session restore. This id is only
84  // unique within the current session, and is not guaranteed to be unique
85  // across sessions.
86  SessionID session_id_;
87
88  // The Registrar used to register TabModel for notifications.
89  content::NotificationRegistrar registrar_;
90
91  DISALLOW_COPY_AND_ASSIGN(TabModel);
92};
93
94#endif  // CHROME_BROWSER_UI_ANDROID_TAB_MODEL_TAB_MODEL_H_
95