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
|
// Copyright 2024 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_LENS_LENS_OVERLAY_GEN204_CONTROLLER_H_
#define CHROME_BROWSER_UI_LENS_LENS_OVERLAY_GEN204_CONTROLLER_H_
#include "base/memory/raw_ptr.h"
#include "chrome/browser/lens/core/mojom/lens.mojom.h"
#include "components/lens/lens_overlay_invocation_source.h"
#include "services/network/public/cpp/simple_url_loader.h"
#include "third_party/lens_server_proto/lens_overlay_request_id.pb.h"
class Profile;
namespace lens {
// Sends gen204 pings for the Lens Overlay.
class LensOverlayGen204Controller {
public:
LensOverlayGen204Controller();
virtual ~LensOverlayGen204Controller();
// The different latency types that can be logged.
enum class LatencyType {
// From when the overlay was invoked to when the initial cluster info
// request was sent.
kInvocationToInitialClusterInfoRequestSent = 0,
// From when the overlay was invoked to when the initial full page
// objects request was sent.
kInvocationToInitialFullPageObjectsRequestSent = 1,
// From when the overlay was invoked to when the initial full page
// objects response was received.
kInvocationToInitialFullPageObjectsResponseReceived = 10,
// From when the overlay was invoked to when the initial interaction
// request was sent.
kInvocationToInitialInteractionRequestSent = 2,
// From when the overlay was invoked to when the initial page content
// request was sent.
kInvocationToInitialPageContentRequestSent = 3,
// From when the overlay was invoked to when the initial partial page
// content request was sent.
kInvocationToInitialPartialPageContentRequestSent = 9,
// From when the full image request began processing to when the response
// was received.
kFullPageObjectsRequestFetchLatency = 4,
// From when the full image translate request began processing to when the
// response was received.
kFullPageTranslateRequestFetchLatency = 5,
// From when the interaction request began processing to when the response
// was received.
kInteractionRequestFetchLatency = 6,
// From when the page content upload request began processing to when the
// response was received.
kPageContentUploadLatency = 7,
// From the partial page content upload request began processing to when the
// response was received.
kPartialPageContentUploadLatency = 8,
};
// Sets the state of the controller. Should be called once
// per query flow, at the start, when the Lens Overlay opens.
void OnQueryFlowStart(lens::LensOverlayInvocationSource invocation_source,
Profile* profile,
uint64_t gen204_id);
// Sends a Lens latency gen204 request. The request id is optional because not
// all latency events have an associated request id, such as the cluster info
// fetch.
// TODO(crbug.com/394645019): Remove the encoded analytics id parameter when
// the analytics id param is no longer used on the server.
void SendLatencyGen204IfEnabled(
LatencyType latency_type,
base::TimeDelta latency_duration,
std::string vit_query_param_value,
std::optional<base::TimeDelta> cluster_info_latency,
std::optional<std::string> encoded_analytics_id,
std::optional<lens::LensOverlayRequestId> request_id);
// Sends a task completion gen204 request. The analytics id is the
// latest Lens request analytics id from the query controller.
// The user action is the action that triggered the task completion
// event.
// TODO(crbug.com/394645019): Remove the encoded analytics id parameter when
// the analytics id param is no longer used on the server.
void SendTaskCompletionGen204IfEnabled(std::string encoded_analytics_id,
lens::mojom::UserAction user_action,
lens::LensOverlayRequestId request_id);
// Sends a semantic event gen204 request. Some semantic events do not
// have an associated request id (e.g. text gleam view end).
void SendSemanticEventGen204IfEnabled(
lens::mojom::SemanticEvent event,
std::optional<lens::LensOverlayRequestId> request_id);
// Sends any final gen204 requests and marks the end of the query flow.
// Called when the Lens Overlay is closed.
void OnQueryFlowEnd();
// Issues the gen204 network request and adds a loader to gen204_loaders_.
// Checks that the user is opted into metrics logging.
// Can be overridden for testing.
virtual void CheckMetricsConsentAndIssueGen204NetworkRequest(GURL url);
private:
// Handles the gen204 network response and removes the source from
// gen204_loaders_.
void OnGen204NetworkResponse(const network::SimpleURLLoader* source,
std::unique_ptr<std::string> response_body);
// The invocation source that triggered the query flow.
lens::LensOverlayInvocationSource invocation_source_;
// The profile used to make requests.
raw_ptr<Profile> profile_;
// The current gen204 id for logging, set by the overlay controller.
uint64_t gen204_id_;
// Each gen204 loader in this vector corresponds to an outstanding gen204
// request. Storing them ensures they do not get deleted immediately
// after being issued, which cancels the request.
std::vector<std::unique_ptr<network::SimpleURLLoader>> gen204_loaders_;
base::WeakPtrFactory<LensOverlayGen204Controller> weak_ptr_factory_{this};
};
} // namespace lens
#endif // CHROME_BROWSER_UI_LENS_LENS_OVERLAY_GEN204_CONTROLLER_H_
|