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#include "chrome/browser/ui/sync/browser_synced_window_delegate.h"
6
7#include <set>
8
9#include "chrome/browser/ui/browser.h"
10#include "chrome/browser/ui/browser_finder.h"
11#include "chrome/browser/ui/browser_iterator.h"
12#include "chrome/browser/ui/sync/tab_contents_synced_tab_delegate.h"
13#include "chrome/browser/ui/tabs/tab_strip_model.h"
14#include "components/sessions/session_id.h"
15
16// static SyncedWindowDelegate implementations
17
18// static
19const std::set<browser_sync::SyncedWindowDelegate*>
20    browser_sync::SyncedWindowDelegate::GetSyncedWindowDelegates() {
21  std::set<browser_sync::SyncedWindowDelegate*> synced_window_delegates;
22  for (chrome::BrowserIterator it; !it.done(); it.Next())
23    synced_window_delegates.insert(it->synced_window_delegate());
24  return synced_window_delegates;
25}
26
27// static
28const browser_sync::SyncedWindowDelegate*
29    browser_sync::SyncedWindowDelegate::FindSyncedWindowDelegateWithId(
30        SessionID::id_type id) {
31  Browser* browser = chrome::FindBrowserWithID(id);
32  // In case we don't find the browser (e.g. for Developer Tools).
33  return browser ? browser->synced_window_delegate() : NULL;
34}
35
36// BrowserSyncedWindowDelegate implementations
37
38BrowserSyncedWindowDelegate::BrowserSyncedWindowDelegate(Browser* browser)
39    : browser_(browser) {}
40
41BrowserSyncedWindowDelegate::~BrowserSyncedWindowDelegate() {}
42
43bool BrowserSyncedWindowDelegate::IsTabPinned(
44    const browser_sync::SyncedTabDelegate* tab) const {
45  for (int i = 0; i < browser_->tab_strip_model()->count(); i++) {
46    browser_sync::SyncedTabDelegate* current = GetTabAt(i);
47    if (tab == current)
48      return browser_->tab_strip_model()->IsTabPinned(i);
49  }
50  // The window and tab are not always updated atomically, so it's possible
51  // one of the values was stale. We'll retry later, just ignore for now.
52  return false;
53}
54
55browser_sync::SyncedTabDelegate* BrowserSyncedWindowDelegate::GetTabAt(
56    int index) const {
57  return TabContentsSyncedTabDelegate::FromWebContents(
58      browser_->tab_strip_model()->GetWebContentsAt(index));
59}
60
61SessionID::id_type BrowserSyncedWindowDelegate::GetTabIdAt(int index) const {
62  return GetTabAt(index)->GetSessionId();
63}
64
65bool BrowserSyncedWindowDelegate::HasWindow() const {
66  return browser_->window() != NULL;
67}
68
69SessionID::id_type BrowserSyncedWindowDelegate::GetSessionId() const {
70  return browser_->session_id().id();
71}
72
73int BrowserSyncedWindowDelegate::GetTabCount() const {
74  return browser_->tab_strip_model()->count();
75}
76
77int BrowserSyncedWindowDelegate::GetActiveIndex() const {
78  return browser_->tab_strip_model()->active_index();
79}
80
81bool BrowserSyncedWindowDelegate::IsApp() const {
82  return browser_->is_app();
83}
84
85bool BrowserSyncedWindowDelegate::IsTypeTabbed() const {
86  return browser_->is_type_tabbed();
87}
88
89bool BrowserSyncedWindowDelegate::IsTypePopup() const {
90  return browser_->is_type_popup();
91}
92
93bool BrowserSyncedWindowDelegate::IsSessionRestoreInProgress() const {
94  return false;
95}
96