Skip to content

Commit

Permalink
prerender: Expose activation result to DevTools
Browse files Browse the repository at this point in the history
This CL introduces activated status in PrerenderHost to DevTools, and
adds a related inspector protocol test.

Bug: 1249776
Change-Id: Iaa9eebc1d107271e53194d1fc49033a5b858bfe3
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3479000
Reviewed-by: Hiroki Nakagawa <nhiroki@chromium.org>
Reviewed-by: Andrey Kosyakov <caseq@chromium.org>
Commit-Queue: Huanpo Lin <robertlin@chromium.org>
Cr-Commit-Position: refs/heads/main@{#987333}
  • Loading branch information
Robert Lin authored and Chromium LUCI CQ committed Mar 31, 2022
1 parent 4d11843 commit 034eff3
Show file tree
Hide file tree
Showing 11 changed files with 78 additions and 1 deletion.
6 changes: 6 additions & 0 deletions content/browser/devtools/devtools_instrumentation.cc
Original file line number Diff line number Diff line change
Expand Up @@ -301,6 +301,12 @@ void BackForwardCacheNotUsed(
nav_request, result, tree_result);
}

void DidActivatePrerender(const NavigationRequest& nav_request) {
FrameTreeNode* ftn = nav_request.frame_tree_node();
DispatchToAgents(ftn, &protocol::PageHandler::DidActivatePrerender,
nav_request);
}

namespace {

protocol::String BuildBlockedByResponseReason(
Expand Down
2 changes: 2 additions & 0 deletions content/browser/devtools/devtools_instrumentation.h
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,8 @@ void BackForwardCacheNotUsed(
const BackForwardCacheCanStoreDocumentResult* result,
const BackForwardCacheCanStoreTreeResult* tree_result);

void DidActivatePrerender(const NavigationRequest& nav_request);

void OnSignedExchangeReceived(
FrameTreeNode* frame_tree_node,
absl::optional<const base::UnguessableToken> devtools_navigation_token,
Expand Down
11 changes: 11 additions & 0 deletions content/browser/devtools/protocol/page_handler.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1867,6 +1867,17 @@ void PageHandler::BackForwardCacheNotUsed(
std::move(explanation_tree));
}

void PageHandler::DidActivatePrerender(const NavigationRequest& nav_request) {
if (!enabled_)
return;
FrameTreeNode* ftn = nav_request.frame_tree_node();
std::string initiating_frame_id = ftn->devtools_frame_token().ToString();
const GURL& prerendering_url = nav_request.common_params().url;
frontend_->PrerenderAttemptCompleted(
initiating_frame_id, prerendering_url.spec(),
Page::PrerenderFinalStatusEnum::Activated);
}

bool PageHandler::ShouldBypassCSP() {
return enabled_ && bypass_csp_;
}
Expand Down
2 changes: 2 additions & 0 deletions content/browser/devtools/protocol/page_handler.h
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,8 @@ class PageHandler : public DevToolsDomainHandler,
const BackForwardCacheCanStoreDocumentResult* result,
const BackForwardCacheCanStoreTreeResult* tree_result);

void DidActivatePrerender(const NavigationRequest& nav_request);

Response Enable() override;
Response Disable() override;

Expand Down
2 changes: 1 addition & 1 deletion content/browser/devtools/protocol_config.json
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@
"include": ["enable", "disable", "reload", "navigate", "stopLoading", "getNavigationHistory", "navigateToHistoryEntry", "resetNavigationHistory", "captureScreenshot",
"startScreencast", "stopScreencast", "screencastFrameAck", "handleJavaScriptDialog", "setColorPickerEnabled",
"bringToFront", "setDownloadBehavior", "getAppManifest", "crash", "close", "setWebLifecycleState", "captureSnapshot", "getInstallabilityErrors", "getManifestIcons", "setBypassCSP", "getAppId", "addCompilationCache"],
"include_events": ["colorPicked", "interstitialShown", "interstitialHidden", "javascriptDialogOpening", "javascriptDialogClosed", "downloadWillBegin", "downloadProgress", "screencastVisibilityChanged", "screencastFrame", "backForwardCacheNotUsed"],
"include_events": ["colorPicked", "interstitialShown", "interstitialHidden", "javascriptDialogOpening", "javascriptDialogClosed", "downloadWillBegin", "downloadProgress", "screencastVisibilityChanged", "screencastFrame", "backForwardCacheNotUsed", "prerenderAttemptCompleted"],
"async": ["captureScreenshot", "navigate", "getAppManifest", "reload", "captureSnapshot", "getInstallabilityErrors", "getManifestIcons", "getAppId"]
},
{
Expand Down
2 changes: 2 additions & 0 deletions content/browser/prerender/prerender_host.cc
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
#include "base/trace_event/common/trace_event_common.h"
#include "base/trace_event/trace_conversion_helper.h"
#include "base/trace_event/typed_macros.h"
#include "content/browser/devtools/devtools_instrumentation.h"
#include "content/browser/prerender/prerender_host_registry.h"
#include "content/browser/prerender/prerender_metrics.h"
#include "content/browser/renderer_host/frame_tree.h"
Expand Down Expand Up @@ -476,6 +477,7 @@ std::unique_ptr<StoredPage> PrerenderHost::Activate(
// source ID.
RecordFinalStatus(FinalStatus::kActivated, attributes_.initiator_ukm_id,
navigation_request.GetNextPageUkmSourceId());
devtools_instrumentation::DidActivatePrerender(navigation_request);
return page;
}

Expand Down
13 changes: 13 additions & 0 deletions third_party/blink/public/devtools_protocol/browser_protocol.pdl
Original file line number Diff line number Diff line change
Expand Up @@ -8262,6 +8262,19 @@ domain Page
# Tree structure of reasons why the page could not be cached for each frame.
optional BackForwardCacheNotRestoredExplanationTree notRestoredExplanationsTree

# List of FinalStatus reasons for Prerender2.
type PrerenderFinalStatus extends string
enum
Activated

# Fired when a prerender attempt is completed.
event prerenderAttemptCompleted
parameters
# The frame id of the frame initiating prerendering.
FrameId initiatingFrameId
string prerenderingUrl
PrerenderFinalStatus finalStatus

event loadEventFired
parameters
Network.MonotonicTime timestamp
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
Test that prerender navigations report the final status
{
method : Page.prerenderAttemptCompleted
params : {
finalStatus : Activated
initiatingFrameId : <string>
prerenderingUrl : http://127.0.0.1:8000/inspector-protocol/prerender/resources/empty.html
}
sessionId : <string>
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
(async function(testRunner) {
const {page, session, dp} = await testRunner.startBlank(
`Test that prerender navigations report the final status`);
await dp.Page.enable();

// Navigate to speculation rules Prerender Page.
await page.navigate('resources/simple-prerender.html');
session.evaluate(`document.getElementById('link').click()`);
const statusReport = await dp.Page.oncePrerenderAttemptCompleted();
testRunner.log(statusReport, '', ['initiatingFrameId', 'sessionId']);

testRunner.completeTest();
});
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<!DOCTYPE html>
<html>
<head>
<script type="speculationrules">
{
"prerender":[
{"source": "list",
"urls": ["empty.html"]}
]
}
</script>
<title>Prerender Test</title>
<!-- Make sure there is no zoom so that simulated clicks hit the right spot -->
<meta name="viewport" content="width=device-width,minimum-scale=1">
</head>
<body><a href="empty.html" id="link">link</a></body>
</html>

0 comments on commit 034eff3

Please sign in to comment.