blob: da1542b04b459132e6d4b55a695d10c0841fe805 [file] [log] [blame]
// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_UI_THUMBNAILS_THUMBNAIL_READINESS_TRACKER_H_
#define CHROME_BROWSER_UI_THUMBNAILS_THUMBNAIL_READINESS_TRACKER_H_
#include "base/callback.h"
#include "base/memory/raw_ptr.h"
#include "chrome/browser/ui/thumbnails/thumbnail_image.h"
#include "content/public/browser/web_contents.h"
#include "content/public/browser/web_contents_observer.h"
// Determines how ready a page is for thumbnail capture based on
// navigation and loading state.
class ThumbnailReadinessTracker : public content::WebContentsObserver {
public:
using Readiness = ThumbnailImage::CaptureReadiness;
using ReadinessChangeCallback = base::RepeatingCallback<void(Readiness)>;
// |web_contents| should be a newly-created contents. If not, the
// output readiness states will not be correct. |callback| will be
// called with the new ready state whenever it changes.
ThumbnailReadinessTracker(content::WebContents* web_contents,
ReadinessChangeCallback callback);
~ThumbnailReadinessTracker() override;
// content::WebContentsObserver:
void DidStartNavigation(
content::NavigationHandle* navigation_handle) override;
void DidFinishNavigation(
content::NavigationHandle* navigation_handle) override;
void DocumentOnLoadCompletedInPrimaryMainFrame() override;
void WebContentsDestroyed() override;
private:
void UpdateReadiness(Readiness readiness);
ReadinessChangeCallback callback_;
Readiness last_readiness_ = Readiness::kNotReady;
// The last navigation that reset the thumbnail. When this navigation
// finishes, the page is considered ready for capture.
raw_ptr<content::NavigationHandle> pending_navigation_ = nullptr;
};
#endif // CHROME_BROWSER_UI_THUMBNAILS_THUMBNAIL_READINESS_TRACKER_H_