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/sessions/session_id.h"
10#include "chrome/browser/sync/glue/synced_tab_delegate.h"
11#include "chrome/browser/ui/toolbar/toolbar_model.h"
12#include "chrome/browser/ui/toolbar/toolbar_model_delegate.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;
19class SyncedTabDelegate;
20}
21
22namespace content {
23class WebContents;
24}
25
26class Profile;
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 ToolbarModelDelegate {
33 public:
34  explicit TabModel(Profile* profile);
35  // Deprecated: This constructor is deprecated and should be removed once
36  // downstream Android uses new constructor. See crbug.com/159704.
37  TabModel();
38  virtual ~TabModel();
39
40  // Implementation of ToolbarDelegate
41  virtual content::WebContents* GetActiveWebContents() const OVERRIDE;
42
43  virtual Profile* GetProfile() const;
44  virtual bool IsOffTheRecord() const;
45  virtual browser_sync::SyncedWindowDelegate* GetSyncedWindowDelegate() const;
46  virtual SessionID::id_type GetSessionId() const;
47
48  virtual int GetTabCount() const = 0;
49  virtual int GetActiveIndex() const = 0;
50  virtual content::WebContents* GetWebContentsAt(int index) const = 0;
51  virtual browser_sync::SyncedTabDelegate* GetTabAt(int index) const = 0;
52
53  // Used for restoring tabs from synced foreign sessions.
54  virtual void CreateTab(content::WebContents* web_contents) = 0;
55
56  // Used for creating a new tab with a given URL.
57  virtual content::WebContents* CreateTabForTesting(const GURL& url) = 0;
58
59  // Return true if we are currently restoring sessions asynchronously.
60  virtual bool IsSessionRestoreInProgress() const = 0;
61
62  virtual void OpenClearBrowsingData() const = 0;
63
64  ToolbarModel::SecurityLevel GetSecurityLevelForCurrentTab();
65
66  // Returns search terms extracted from the current url if possible.
67  string16 GetSearchTermsForCurrentTab();
68
69  // Returns the parameter that is used to trigger query extraction.
70  std::string GetQueryExtractionParam();
71
72  // Calls through to the ToolbarModel's GetCorpusNameForMobile -- see
73  // comments in toolbar_model.h.
74  string16 GetCorpusNameForCurrentTab();
75
76 protected:
77  // Instructs the TabModel to broadcast a notification that all tabs are now
78  // loaded from storage.
79  void BroadcastSessionRestoreComplete();
80
81  ToolbarModel* GetToolbarModel();
82
83 private:
84  // Determines how TabModel will interact with the profile.
85  virtual void Observe(int type,
86                       const content::NotificationSource& source,
87                       const content::NotificationDetails& details) OVERRIDE;
88
89  // The profile associated with this TabModel.
90  Profile* profile_;
91
92  // Describes if this TabModel contains an off-the-record profile.
93  bool is_off_the_record_;
94
95  // The SyncedWindowDelegate associated with this TabModel.
96  scoped_ptr<browser_sync::SyncedWindowDelegateAndroid> synced_window_delegate_;
97
98  scoped_ptr<ToolbarModel> toolbar_model_;
99
100  // Unique identifier of this TabModel for session restore. This id is only
101  // unique within the current session, and is not guaranteed to be unique
102  // across sessions.
103  SessionID session_id_;
104
105  // The Registrar used to register TabModel for notifications.
106  content::NotificationRegistrar registrar_;
107
108  DISALLOW_COPY_AND_ASSIGN(TabModel);
109};
110
111#endif  // CHROME_BROWSER_UI_ANDROID_TAB_MODEL_TAB_MODEL_H_
112