15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/sync/browser_synced_window_delegate.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sessions/session_id.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_finder.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser_iterator.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/sync/tab_contents_synced_tab_delegate.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static SyncedWindowDelegate implementations
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::set<browser_sync::SyncedWindowDelegate*>
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    browser_sync::SyncedWindowDelegate::GetSyncedWindowDelegates() {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<browser_sync::SyncedWindowDelegate*> synced_window_delegates;
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (chrome::BrowserIterator it; !it.done(); it.Next())
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    synced_window_delegates.insert(it->synced_window_delegate());
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return synced_window_delegates;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const browser_sync::SyncedWindowDelegate*
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    browser_sync::SyncedWindowDelegate::FindSyncedWindowDelegateWithId(
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SessionID::id_type id) {
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Browser* browser = chrome::FindBrowserWithID(id);
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // In case we don't find the browser (e.g. for Developer Tools).
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return browser ? browser->synced_window_delegate() : NULL;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// BrowserSyncedWindowDelegate implementations
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserSyncedWindowDelegate::BrowserSyncedWindowDelegate(Browser* browser)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : browser_(browser) {}
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserSyncedWindowDelegate::~BrowserSyncedWindowDelegate() {}
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrowserSyncedWindowDelegate::IsTabPinned(
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const browser_sync::SyncedTabDelegate* tab) const {
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (int i = 0; i < browser_->tab_strip_model()->count(); i++) {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    browser_sync::SyncedTabDelegate* current = GetTabAt(i);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (tab == current)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return browser_->tab_strip_model()->IsTabPinned(i);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
50a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // The window and tab are not always updated atomically, so it's possible
51a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // one of the values was stale. We'll retry later, just ignore for now.
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)browser_sync::SyncedTabDelegate* BrowserSyncedWindowDelegate::GetTabAt(
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int index) const {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return TabContentsSyncedTabDelegate::FromWebContents(
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser_->tab_strip_model()->GetWebContentsAt(index));
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SessionID::id_type BrowserSyncedWindowDelegate::GetTabIdAt(int index) const {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetTabAt(index)->GetSessionId();
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrowserSyncedWindowDelegate::HasWindow() const {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return browser_->window() != NULL;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SessionID::id_type BrowserSyncedWindowDelegate::GetSessionId() const {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return browser_->session_id().id();
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int BrowserSyncedWindowDelegate::GetTabCount() const {
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return browser_->tab_strip_model()->count();
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int BrowserSyncedWindowDelegate::GetActiveIndex() const {
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return browser_->tab_strip_model()->active_index();
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrowserSyncedWindowDelegate::IsApp() const {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return browser_->is_app();
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrowserSyncedWindowDelegate::IsTypeTabbed() const {
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return browser_->is_type_tabbed();
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrowserSyncedWindowDelegate::IsTypePopup() const {
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return browser_->is_type_popup();
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrowserSyncedWindowDelegate::IsSessionRestoreInProgress() const {
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
96