1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
|
// Copyright 2025 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_CONTEXTUAL_CUEING_ZERO_STATE_SUGGESTIONS_PAGE_DATA_H_
#define CHROME_BROWSER_CONTEXTUAL_CUEING_ZERO_STATE_SUGGESTIONS_PAGE_DATA_H_
#include <string>
#include <vector>
#include "base/callback_list.h"
#include "base/time/time.h"
#include "components/optimization_guide/content/browser/page_content_proto_provider.h"
#include "components/optimization_guide/core/hints/optimization_guide_decision.h"
#include "components/optimization_guide/core/hints/optimization_metadata.h"
#include "components/optimization_guide/core/optimization_guide_model_executor.h"
#include "content/public/browser/page_user_data.h"
class OptimizationGuideKeyedService;
namespace content_extraction {
struct InnerTextResult;
} // namespace content_extraction
namespace optimization_guide {
class ModelQualityLogEntry;
} // namespace optimization_guide
namespace optimization_guide::proto {
class ZeroStateSuggestionsRequest;
} // namespace optimization_guide::proto
namespace contextual_cueing {
using GlicSuggestionsCallbackList =
base::OnceCallbackList<void(std::optional<std::vector<std::string>>)>;
using GlicSuggestionsCallback = GlicSuggestionsCallbackList::CallbackType;
// Processes zero state suggestions for GLIC, scoped to the given page.
class ZeroStateSuggestionsPageData
: public content::PageUserData<ZeroStateSuggestionsPageData> {
public:
ZeroStateSuggestionsPageData(const ZeroStateSuggestionsPageData&) = delete;
ZeroStateSuggestionsPageData& operator=(const ZeroStateSuggestionsPageData&) =
delete;
~ZeroStateSuggestionsPageData() override;
// Initiates page content extraction.
void InitiatePageContentExtraction();
// Explicitly fetch suggestions for this page.
void FetchSuggestions(bool is_fre,
std::vector<std::string> supported_tools,
GlicSuggestionsCallback callback);
private:
friend class content::PageUserData<ZeroStateSuggestionsPageData>;
friend class ContextualCueingServiceTestZeroStateSuggestions;
friend class ZeroStateSuggestionsPageDataTest;
// Note that this constructor initiates extracting page content.
explicit ZeroStateSuggestionsPageData(content::Page& page);
// Returns the URL of the primary main frame associated with this page.
const GURL GetUrl();
// Returns the pending request if there is one.
std::optional<optimization_guide::proto::ZeroStateSuggestionsRequest>
pending_request() const {
return suggestions_request_;
}
// Called when inner text is extracted.
void OnReceivedInnerText(
std::unique_ptr<content_extraction::InnerTextResult> result);
// Called when annotated page content is received.
void OnReceivedAnnotatedPageContent(
std::optional<optimization_guide::AIPageContentResult> content);
// Called when on-demand metadata is received.
void OnReceivedOptimizationMetadataOnDemand(
const GURL& url,
const base::flat_map<
optimization_guide::proto::OptimizationType,
optimization_guide::OptimizationGuideDecisionWithMetadata>&
decisions);
// Called when optimization metadata is received.
void OnReceivedOptimizationMetadata(
optimization_guide::OptimizationGuideDecision decision,
const optimization_guide::OptimizationMetadata& metadata);
// Send out suggestions request, if all necessary fetches are complete.
void RequestSuggestionsIfComplete();
// If `optimization_metadata_` contains everything necessary to determine a
// suggestions result, run `suggestions_callbacks_` to return those
// suggestions. This method itself also returns true if suggestions are sent
// via the callbacks as a result of execution.
bool ReturnSuggestionsFromOptimizationMetadataIfPossible();
// Called when a zero state suggestions server response is received.
void OnModelExecutionResponse(
base::TimeTicks mes_begin_time,
optimization_guide::OptimizationGuideModelExecutionResult result,
std::unique_ptr<optimization_guide::ModelQualityLogEntry> log_entry);
// Tracks the status of fetches needed in `RequestSuggestionsIfComplete()`:
// 1. inner text
// 2. annotated page content
// 3. optimization metadata
bool content_extraction_initiated_ = false;
base::TimeTicks page_context_begin_time_;
// Tracks if `this` has logged to page context extraction duration histogram.
bool page_context_duration_logged_ = false;
bool inner_text_done_ = false;
std::unique_ptr<content_extraction::InnerTextResult> inner_text_result_;
bool annotated_page_content_done_ = false;
std::optional<optimization_guide::AIPageContentResult>
annotated_page_content_;
bool optimization_metadata_done_ = false;
optimization_guide::OptimizationGuideDecision optimization_decision_;
optimization_guide::OptimizationMetadata optimization_metadata_;
// Tracks the state for a request.
base::TimeTicks begin_time_;
std::optional<optimization_guide::proto::ZeroStateSuggestionsRequest>
suggestions_request_;
GlicSuggestionsCallbackList suggestions_callbacks_;
std::optional<std::vector<std::string>> cached_suggestions_;
// Not owned and guaranteed to outlive `this`.
raw_ptr<OptimizationGuideKeyedService> optimization_guide_keyed_service_ =
nullptr;
base::WeakPtrFactory<ZeroStateSuggestionsPageData> weak_ptr_factory_{this};
PAGE_USER_DATA_KEY_DECL();
};
} // namespace contextual_cueing
#endif // CHROME_BROWSER_CONTEXTUAL_CUEING_ZERO_STATE_SUGGESTIONS_PAGE_DATA_H_
|