// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROME_BROWSER_UI_COCOA_HANDOFF_ACTIVE_URL_OBSERVER_H_
#define CHROME_BROWSER_UI_COCOA_HANDOFF_ACTIVE_URL_OBSERVER_H_

#include "base/macros.h"
#include "chrome/browser/ui/browser_list_observer.h"
#include "chrome/browser/ui/tabs/tab_strip_model_observer.h"
#include "content/public/browser/web_contents_observer.h"

namespace content {
class WebContents;
}

class Browser;
class HandoffActiveURLObserverDelegate;

// This class observes changes to the "active URL". This is defined as the
// visible URL of the WebContents of the selected tab of the most recently
// focused browser window.
class HandoffActiveURLObserver : public BrowserListObserver,
                                 public TabStripModelObserver,
                                 public content::WebContentsObserver {
 public:
  explicit HandoffActiveURLObserver(HandoffActiveURLObserverDelegate* delegate);
  ~HandoffActiveURLObserver() override;

 private:
  // BrowserListObserver
  void OnBrowserSetLastActive(Browser* browser) override;
  void OnBrowserRemoved(Browser* browser) override;

  // TabStripModelObserver
  void ActiveTabChanged(content::WebContents* old_contents,
                        content::WebContents* new_contents,
                        int index,
                        int reason) override;

  // content::WebContentsObserver
  void DidFinishNavigation(
      content::NavigationHandle* navigation_handle) override;

  // Updates the active browser.
  void SetActiveBrowser(Browser* active_browser);

  // Makes this object start observing the WebContents, if it is not already
  // doing so. This method is idempotent.
  void StartObservingWebContents(content::WebContents* web_contents);

  // Makes this object stop observing the WebContents.
  void StopObservingWebContents();

  // Returns the active WebContents. May return nullptr.
  content::WebContents* GetActiveWebContents();

  // Instances of this class should be owned by their |delegate_|.
  HandoffActiveURLObserverDelegate* delegate_;

  // This pointer is always up to date, and points to the most recently
  // activated browser, or nullptr if no browsers exist.
  Browser* active_browser_;

  DISALLOW_COPY_AND_ASSIGN(HandoffActiveURLObserver);
};

#endif  // CHROME_BROWSER_UI_COCOA_HANDOFF_ACTIVE_URL_OBSERVER_H_
