// Copyright 2017 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_TAB_UI_HELPER_H_
#define CHROME_BROWSER_UI_TAB_UI_HELPER_H_

#include <string>

#include "base/memory/weak_ptr.h"
#include "base/strings/utf_string_conversions.h"
#include "base/task/cancelable_task_tracker.h"
#include "components/favicon_base/favicon_callback.h"
#include "components/favicon_base/favicon_types.h"
#include "content/public/browser/web_contents_observer.h"
#include "content/public/browser/web_contents_user_data.h"
#include "ui/gfx/image/image.h"
#include "ui/gfx/image/image_skia.h"
#include "url/gurl.h"

// TabUIHelper is used by UI code to obtain the title and favicon for a
// WebContents. The values returned by TabUIHelper differ from the WebContents
// when the WebContents hasn't loaded.
class TabUIHelper : public content::WebContentsObserver,
                    public content::WebContentsUserData<TabUIHelper> {
 public:
  TabUIHelper(const TabUIHelper&) = delete;
  TabUIHelper& operator=(const TabUIHelper&) = delete;

  ~TabUIHelper() override;

  // Get the title of the tab. When the associated WebContents' title is empty,
  // a customized title is used.
  std::u16string GetTitle() const;

  // Get the favicon of the tab. It will return a favicon from history service
  // if it needs to, otherwise, it will return the favicon of the WebContents.
  gfx::Image GetFavicon() const;

  // Return true if the throbber should be hidden during a page load.
  bool ShouldHideThrobber() const;

  // Notifies TabUIHelper that the WebContents' initial navigation is delayed.
  // This is called by TabManager when it decides to delay a new tab's
  // navigation. TabUIHelper will obtain appropriate title and favicon after
  // receiving this signal.
  void NotifyInitialNavigationDelayed(bool is_navigation_delayed);

  // content::WebContentsObserver implementation
  void DidStopLoading() override;

  void set_was_active_at_least_once() { was_active_at_least_once_ = true; }
  void set_created_by_session_restore(bool created_by_session_restore) {
    created_by_session_restore_ = created_by_session_restore;
  }
  bool is_created_by_session_restore_for_testing() {
    return created_by_session_restore_;
  }

 private:
  friend class content::WebContentsUserData<TabUIHelper>;

  struct TabUIData {
    explicit TabUIData(const GURL& url);
    std::u16string title;
    gfx::Image favicon;
  };

  explicit TabUIHelper(content::WebContents* contents);

  // Returns true if a favicon from history should be used. It is used when a
  // new tab is opened in the background and its initial navigation is delayed.
  bool ShouldUseFaviconFromHistory() const;

  void FetchFaviconFromHistory(const GURL& url,
                               favicon_base::FaviconImageCallback callback);
  void OnURLFaviconFetched(const favicon_base::FaviconImageResult& favicon);
  void OnHostFaviconFetched(const favicon_base::FaviconImageResult& favicon);
  void UpdateFavicon(const favicon_base::FaviconImageResult& favicon);

  bool was_active_at_least_once_ = false;
  bool is_navigation_delayed_ = false;
  bool created_by_session_restore_ = false;

  // The data that stores favicon and title. It is non-null only during initial
  // navigation when the tab is opened in background.
  std::unique_ptr<TabUIData> tab_ui_data_;
  base::CancelableTaskTracker favicon_tracker_;
  base::WeakPtrFactory<TabUIHelper> weak_ptr_factory_{this};

  WEB_CONTENTS_USER_DATA_KEY_DECL();
};

#endif  // CHROME_BROWSER_UI_TAB_UI_HELPER_H_
