summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorvkuzkokov@chromium.org <vkuzkokov@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-06-19 20:27:01 +0000
committervkuzkokov@chromium.org <vkuzkokov@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-06-19 20:27:01 +0000
commit6ebdc2850e1f4368746f483bc3f046ee3afdec42 (patch)
tree65116a0c37d4890bc44436fa9d4d907d3ce02eb5
parenta6c3afba696488432858ba243e662b78d9f5c085 (diff)
downloadchromium_src-6ebdc2850e1f4368746f483bc3f046ee3afdec42.zip
chromium_src-6ebdc2850e1f4368746f483bc3f046ee3afdec42.tar.gz
chromium_src-6ebdc2850e1f4368746f483bc3f046ee3afdec42.tar.bz2
DevTools: Fix for Page.captureScreenshot
from https://chromiumcodereview.appspot.com/190693002/ This patch makes Page.captureScreenshot synchronize with the renderer. When fixed implementation hits Stable it will be possible to use Page.captureScreenshot in Telemetry instead of window.chrome.gpuBenchmarking.beginWindowSnapshotPNG and remove the latter. BUG=242405 Review URL: https://codereview.chromium.org/311313003 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@278472 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--content/browser/devtools/renderer_overrides_handler.cc58
-rw-r--r--content/browser/devtools/renderer_overrides_handler.h6
-rw-r--r--content/browser/devtools/renderer_overrides_handler_browsertest.cc103
-rw-r--r--content/browser/renderer_host/render_widget_host_impl.cc71
-rw-r--r--content/browser/renderer_host/render_widget_host_impl.h20
-rw-r--r--content/browser/renderer_host/render_widget_host_view_mac.mm9
-rw-r--r--content/common/view_messages.h4
-rw-r--r--content/renderer/render_view_impl.cc14
-rw-r--r--content/renderer/render_view_impl.h1
-rw-r--r--ui/events/latency_info.cc1
-rw-r--r--ui/events/latency_info.h4
11 files changed, 209 insertions, 82 deletions
diff --git a/content/browser/devtools/renderer_overrides_handler.cc b/content/browser/devtools/renderer_overrides_handler.cc
index 7370275..4b8ea1e 100644
--- a/content/browser/devtools/renderer_overrides_handler.cc
+++ b/content/browser/devtools/renderer_overrides_handler.cc
@@ -263,20 +263,6 @@ void RendererOverridesHandler::ParseCaptureParameters(
*scale = 5;
}
-base::DictionaryValue* RendererOverridesHandler::CreateScreenshotResponse(
- const std::vector<unsigned char>& png_data) {
- std::string base_64_data;
- base::Base64Encode(
- base::StringPiece(reinterpret_cast<const char*>(&png_data[0]),
- png_data.size()),
- &base_64_data);
-
- base::DictionaryValue* response = new base::DictionaryValue();
- response->SetString(
- devtools::Page::captureScreenshot::kResponseData, base_64_data);
- return response;
-}
-
// DOM agent handlers --------------------------------------------------------
scoped_refptr<DevToolsProtocol::Response>
@@ -470,43 +456,37 @@ RendererOverridesHandler::PageNavigateToHistoryEntry(
scoped_refptr<DevToolsProtocol::Response>
RendererOverridesHandler::PageCaptureScreenshot(
scoped_refptr<DevToolsProtocol::Command> command) {
- RenderViewHost* host = agent_->GetRenderViewHost();
+ RenderViewHostImpl* host = static_cast<RenderViewHostImpl*>(
+ agent_->GetRenderViewHost());
if (!host->GetView())
return command->InternalErrorResponse("Unable to access the view");
- gfx::Rect view_bounds = host->GetView()->GetViewBounds();
- gfx::Rect snapshot_bounds(view_bounds.size());
- gfx::Size snapshot_size = snapshot_bounds.size();
-
- std::vector<unsigned char> png_data;
- if (ui::GrabViewSnapshot(host->GetView()->GetNativeView(),
- &png_data,
- snapshot_bounds)) {
- if (png_data.size())
- return command->SuccessResponse(CreateScreenshotResponse(png_data));
- else
- return command->InternalErrorResponse("Unable to capture screenshot");
- }
-
- ui::GrabViewSnapshotAsync(
- host->GetView()->GetNativeView(),
- snapshot_bounds,
- base::ThreadTaskRunnerHandle::Get(),
+ host->GetSnapshotFromBrowser(
base::Bind(&RendererOverridesHandler::ScreenshotCaptured,
- weak_factory_.GetWeakPtr(), command));
+ weak_factory_.GetWeakPtr(), command));
return command->AsyncResponsePromise();
}
void RendererOverridesHandler::ScreenshotCaptured(
scoped_refptr<DevToolsProtocol::Command> command,
- scoped_refptr<base::RefCountedBytes> png_data) {
- if (png_data) {
- SendAsyncResponse(
- command->SuccessResponse(CreateScreenshotResponse(png_data->data())));
- } else {
+ const unsigned char* png_data,
+ size_t png_size) {
+ if (!png_data || !png_size) {
SendAsyncResponse(
command->InternalErrorResponse("Unable to capture screenshot"));
+ return;
}
+
+ std::string base_64_data;
+ base::Base64Encode(
+ base::StringPiece(reinterpret_cast<const char*>(png_data), png_size),
+ &base_64_data);
+
+ base::DictionaryValue* response = new base::DictionaryValue();
+ response->SetString(devtools::Page::screencastFrame::kParamData,
+ base_64_data);
+
+ SendAsyncResponse(command->SuccessResponse(response));
}
scoped_refptr<DevToolsProtocol::Response>
diff --git a/content/browser/devtools/renderer_overrides_handler.h b/content/browser/devtools/renderer_overrides_handler.h
index 0f7f8bc..0dd1ca0 100644
--- a/content/browser/devtools/renderer_overrides_handler.h
+++ b/content/browser/devtools/renderer_overrides_handler.h
@@ -44,9 +44,6 @@ class CONTENT_EXPORT RendererOverridesHandler
void ParseCaptureParameters(DevToolsProtocol::Command* command,
std::string* format, int* quality,
double* scale);
- base::DictionaryValue* CreateScreenshotResponse(
- const std::vector<unsigned char>& png_data);
-
// DOM domain.
scoped_refptr<DevToolsProtocol::Response>
GrantPermissionsForSetFileInputFiles(
@@ -84,7 +81,8 @@ class CONTENT_EXPORT RendererOverridesHandler
void ScreenshotCaptured(
scoped_refptr<DevToolsProtocol::Command> command,
- scoped_refptr<base::RefCountedBytes> png_data);
+ const unsigned char* png_data,
+ size_t png_size);
void ScreencastFrameCaptured(
const std::string& format,
diff --git a/content/browser/devtools/renderer_overrides_handler_browsertest.cc b/content/browser/devtools/renderer_overrides_handler_browsertest.cc
index d869d9d..1243a66 100644
--- a/content/browser/devtools/renderer_overrides_handler_browsertest.cc
+++ b/content/browser/devtools/renderer_overrides_handler_browsertest.cc
@@ -2,37 +2,30 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "base/basictypes.h"
+#include "base/base64.h"
+#include "base/command_line.h"
#include "base/json/json_reader.h"
-#include "base/memory/scoped_ptr.h"
-#include "content/browser/devtools/renderer_overrides_handler.h"
+#include "content/browser/devtools/devtools_protocol.h"
#include "content/public/browser/devtools_agent_host.h"
+#include "content/public/browser/devtools_client_host.h"
+#include "content/public/browser/devtools_manager.h"
#include "content/public/browser/web_contents.h"
+#include "content/public/test/browser_test_utils.h"
#include "content/public/test/content_browser_test.h"
-#include "content/public/test/content_browser_test_utils.h"
#include "content/shell/browser/shell.h"
+#include "third_party/skia/include/core/SkBitmap.h"
+#include "ui/compositor/compositor_switches.h"
+#include "ui/gfx/codec/png_codec.h"
namespace content {
-class RendererOverridesHandlerTest : public ContentBrowserTest {
+class RendererOverridesHandlerTest : public ContentBrowserTest,
+ public DevToolsClientHost {
protected:
- scoped_refptr<DevToolsProtocol::Response> SendCommand(
- const std::string& method,
- base::DictionaryValue* params) {
- scoped_ptr<RendererOverridesHandler> handler(CreateHandler());
- scoped_refptr<DevToolsProtocol::Command> command(
- DevToolsProtocol::CreateCommand(1, method, params));
- return handler->HandleCommand(command);
- }
-
- void SendAsyncCommand(const std::string& method,
- base::DictionaryValue* params) {
- scoped_ptr<RendererOverridesHandler> handler(CreateHandler());
- scoped_refptr<DevToolsProtocol::Command> command(
- DevToolsProtocol::CreateCommand(1, method, params));
- scoped_refptr<DevToolsProtocol::Response> response =
- handler->HandleCommand(command);
- EXPECT_TRUE(response->is_async_promise());
+ void SendCommand(const std::string& method,
+ base::DictionaryValue* params) {
+ EXPECT_TRUE(DevToolsManager::GetInstance()->DispatchOnInspectorBackend(this,
+ DevToolsProtocol::CreateCommand(1, method, params)->Serialize()));
base::MessageLoop::current()->Run();
}
@@ -64,30 +57,40 @@ class RendererOverridesHandlerTest : public ContentBrowserTest {
scoped_ptr<base::DictionaryValue> result_;
private:
- RendererOverridesHandler* CreateHandler() {
- RenderViewHost* rvh = shell()->web_contents()->GetRenderViewHost();
- DevToolsAgentHost* agent = DevToolsAgentHost::GetOrCreateFor(rvh).get();
- scoped_ptr<RendererOverridesHandler> handler(
- new RendererOverridesHandler(agent));
- handler->SetNotifier(base::Bind(
- &RendererOverridesHandlerTest::OnMessageSent, base::Unretained(this)));
- return handler.release();
+ virtual void SetUpOnMainThread() OVERRIDE {
+ DevToolsManager::GetInstance()->RegisterDevToolsClientHostFor(
+ DevToolsAgentHost::GetOrCreateFor(
+ shell()->web_contents()->GetRenderViewHost()).get(),
+ this);
+ }
+
+ virtual void TearDownOnMainThread() OVERRIDE {
+ DevToolsManager::GetInstance()->ClientHostClosing(this);
}
- void OnMessageSent(const std::string& message) {
+ virtual void DispatchOnInspectorFrontend(
+ const std::string& message) OVERRIDE {
scoped_ptr<base::DictionaryValue> root(
static_cast<base::DictionaryValue*>(base::JSONReader::Read(message)));
base::DictionaryValue* result;
- root->GetDictionary("result", &result);
+ EXPECT_TRUE(root->GetDictionary("result", &result));
result_.reset(result->DeepCopy());
base::MessageLoop::current()->QuitNow();
}
+
+ virtual void InspectedContentsClosing() OVERRIDE {
+ EXPECT_TRUE(false);
+ }
+
+ virtual void ReplacedWithAnotherClient() OVERRIDE {
+ EXPECT_TRUE(false);
+ }
};
IN_PROC_BROWSER_TEST_F(RendererOverridesHandlerTest, QueryUsageAndQuota) {
base::DictionaryValue* params = new base::DictionaryValue();
params->SetString("securityOrigin", "http://example.com");
- SendAsyncCommand("Page.queryUsageAndQuota", params);
+ SendCommand("Page.queryUsageAndQuota", params);
EXPECT_TRUE(HasValue("quota.persistent"));
EXPECT_TRUE(HasValue("quota.temporary"));
@@ -98,4 +101,38 @@ IN_PROC_BROWSER_TEST_F(RendererOverridesHandlerTest, QueryUsageAndQuota) {
EXPECT_TRUE(HasListItem("usage.persistent", "id", "filesystem"));
}
+class CaptureScreenshotTest : public RendererOverridesHandlerTest {
+ private:
+#if !defined(OS_ANDROID)
+ virtual void SetUpCommandLine(base::CommandLine* command_line) OVERRIDE {
+ command_line->AppendSwitch(switches::kEnablePixelOutputInTests);
+ }
+#endif
+};
+
+// Does not link on Android
+#if defined(OS_ANDROID)
+#define MAYBE_CaptureScreenshot DISABLED_CaptureScreenshot
+#else
+#define MAYBE_CaptureScreenshot CaptureScreenshot
+#endif
+IN_PROC_BROWSER_TEST_F(CaptureScreenshotTest, MAYBE_CaptureScreenshot) {
+ shell()->LoadURL(GURL("about:blank"));
+ EXPECT_TRUE(content::ExecuteScript(
+ shell()->web_contents()->GetRenderViewHost(),
+ "document.body.style.background = '#123456'"));
+ SendCommand("Page.captureScreenshot", new base::DictionaryValue());
+ std::string base64;
+ EXPECT_TRUE(result_->GetString("data", &base64));
+ std::string png;
+ EXPECT_TRUE(base::Base64Decode(base64, &png));
+ SkBitmap bitmap;
+ gfx::PNGCodec::Decode(reinterpret_cast<const unsigned char*>(png.data()),
+ png.size(), &bitmap);
+ SkColor color(bitmap.getColor(0, 0));
+ EXPECT_EQ(0x12U, SkColorGetR(color));
+ EXPECT_EQ(0x34U, SkColorGetG(color));
+ EXPECT_EQ(0x56U, SkColorGetB(color));
+}
+
} // namespace content
diff --git a/content/browser/renderer_host/render_widget_host_impl.cc b/content/browser/renderer_host/render_widget_host_impl.cc
index 52a3890..40359e9 100644
--- a/content/browser/renderer_host/render_widget_host_impl.cc
+++ b/content/browser/renderer_host/render_widget_host_impl.cc
@@ -192,7 +192,8 @@ RenderWidgetHostImpl::RenderWidgetHostImpl(RenderWidgetHostDelegate* delegate,
allow_privileged_mouse_lock_(false),
has_touch_handler_(false),
weak_factory_(this),
- last_input_number_(static_cast<int64>(GetProcess()->GetID()) << 32) {
+ last_input_number_(static_cast<int64>(GetProcess()->GetID()) << 32),
+ next_browser_snapshot_id_(0) {
CHECK(delegate_);
if (routing_id_ == MSG_ROUTING_NONE) {
routing_id_ = process_->GetNextRoutingID();
@@ -1162,6 +1163,13 @@ void RenderWidgetHostImpl::InvalidateScreenInfo() {
screen_info_.reset();
}
+void RenderWidgetHostImpl::GetSnapshotFromBrowser(
+ const base::Callback<void(const unsigned char*,size_t)> callback) {
+ int id = next_browser_snapshot_id_++;
+ pending_browser_snapshots_.insert(std::make_pair(id, callback));
+ Send(new ViewMsg_ForceRedraw(GetRoutingID(), id));
+}
+
void RenderWidgetHostImpl::OnSelectionChanged(const base::string16& text,
size_t offset,
const gfx::Range& range) {
@@ -2157,6 +2165,12 @@ void RenderWidgetHostImpl::ComputeTouchLatency(
void RenderWidgetHostImpl::FrameSwapped(const ui::LatencyInfo& latency_info) {
ui::LatencyInfo::LatencyComponent window_snapshot_component;
+ if (latency_info.FindLatency(ui::WINDOW_OLD_SNAPSHOT_FRAME_NUMBER_COMPONENT,
+ GetLatencyComponentId(),
+ &window_snapshot_component)) {
+ WindowOldSnapshotReachedScreen(
+ static_cast<int>(window_snapshot_component.sequence_number));
+ }
if (latency_info.FindLatency(ui::WINDOW_SNAPSHOT_FRAME_NUMBER_COMPONENT,
GetLatencyComponentId(),
&window_snapshot_component)) {
@@ -2216,7 +2230,7 @@ void RenderWidgetHostImpl::WindowSnapshotAsyncCallback(
routing_id, snapshot_id, snapshot_size, png_data->data()));
}
-void RenderWidgetHostImpl::WindowSnapshotReachedScreen(int snapshot_id) {
+void RenderWidgetHostImpl::WindowOldSnapshotReachedScreen(int snapshot_id) {
DCHECK(base::MessageLoopForUI::IsCurrent());
std::vector<unsigned char> png;
@@ -2252,6 +2266,53 @@ void RenderWidgetHostImpl::WindowSnapshotReachedScreen(int snapshot_id) {
snapshot_size));
}
+void RenderWidgetHostImpl::WindowSnapshotReachedScreen(int snapshot_id) {
+ DCHECK(base::MessageLoopForUI::IsCurrent());
+
+ gfx::Rect view_bounds = GetView()->GetViewBounds();
+ gfx::Rect snapshot_bounds(view_bounds.size());
+
+ std::vector<unsigned char> png;
+ if (ui::GrabViewSnapshot(
+ GetView()->GetNativeView(), &png, snapshot_bounds)) {
+ OnSnapshotDataReceived(snapshot_id, &png.front(), png.size());
+ return;
+ }
+
+ ui::GrabViewSnapshotAsync(
+ GetView()->GetNativeView(),
+ snapshot_bounds,
+ base::ThreadTaskRunnerHandle::Get(),
+ base::Bind(&RenderWidgetHostImpl::OnSnapshotDataReceivedAsync,
+ weak_factory_.GetWeakPtr(),
+ snapshot_id));
+}
+
+void RenderWidgetHostImpl::OnSnapshotDataReceived(int snapshot_id,
+ const unsigned char* data,
+ size_t size) {
+ // Any pending snapshots with a lower ID than the one received are considered
+ // to be implicitly complete, and returned the same snapshot data.
+ PendingSnapshotMap::iterator it = pending_browser_snapshots_.begin();
+ while(it != pending_browser_snapshots_.end()) {
+ if (it->first <= snapshot_id) {
+ it->second.Run(data, size);
+ pending_browser_snapshots_.erase(it++);
+ } else {
+ ++it;
+ }
+ }
+}
+
+void RenderWidgetHostImpl::OnSnapshotDataReceivedAsync(
+ int snapshot_id,
+ scoped_refptr<base::RefCountedBytes> png_data) {
+ if (png_data)
+ OnSnapshotDataReceived(snapshot_id, png_data->front(), png_data->size());
+ else
+ OnSnapshotDataReceived(snapshot_id, NULL, 0);
+}
+
// static
void RenderWidgetHostImpl::CompositorFrameDrawn(
const std::vector<ui::LatencyInfo>& latency_info) {
@@ -2262,7 +2323,8 @@ void RenderWidgetHostImpl::CompositorFrameDrawn(
b != latency_info[i].latency_components.end();
++b) {
if (b->first.first == ui::INPUT_EVENT_LATENCY_BEGIN_RWH_COMPONENT ||
- b->first.first == ui::WINDOW_SNAPSHOT_FRAME_NUMBER_COMPONENT) {
+ b->first.first == ui::WINDOW_SNAPSHOT_FRAME_NUMBER_COMPONENT ||
+ b->first.first == ui::WINDOW_OLD_SNAPSHOT_FRAME_NUMBER_COMPONENT) {
// Matches with GetLatencyComponentId
int routing_id = b->first.second & 0xffffffff;
int process_id = (b->first.second >> 32) & 0xffffffff;
@@ -2286,7 +2348,8 @@ void RenderWidgetHostImpl::AddLatencyInfoComponentIds(
latency_info->latency_components.begin();
while (lc != latency_info->latency_components.end()) {
ui::LatencyComponentType component_type = lc->first.first;
- if (component_type == ui::WINDOW_SNAPSHOT_FRAME_NUMBER_COMPONENT) {
+ if (component_type == ui::WINDOW_SNAPSHOT_FRAME_NUMBER_COMPONENT ||
+ component_type == ui::WINDOW_OLD_SNAPSHOT_FRAME_NUMBER_COMPONENT) {
// Generate a new component entry with the correct component ID
ui::LatencyInfo::LatencyMap::key_type key =
std::make_pair(component_type, GetLatencyComponentId());
diff --git a/content/browser/renderer_host/render_widget_host_impl.h b/content/browser/renderer_host/render_widget_host_impl.h
index 65fa860..47e65e0 100644
--- a/content/browser/renderer_host/render_widget_host_impl.h
+++ b/content/browser/renderer_host/render_widget_host_impl.h
@@ -192,6 +192,11 @@ class CONTENT_EXPORT RenderWidgetHostImpl
virtual void AccessibilityHitTest(const gfx::Point& point) OVERRIDE;
virtual void AccessibilityFatalError() OVERRIDE;
+ // Forces redraw in the renderer and when the update reaches the browser
+ // grabs snapshot from the compositor. Returns PNG-encoded snapshot.
+ void GetSnapshotFromBrowser(
+ const base::Callback<void(const unsigned char*,size_t)> callback);
+
const NativeWebKeyboardEvent* GetLastKeyboardEvent() const;
// Notification that the screen info has changed.
@@ -693,8 +698,18 @@ class CONTENT_EXPORT RenderWidgetHostImpl
// which may get in recursive loops).
void DelayedAutoResized();
+ void WindowOldSnapshotReachedScreen(int snapshot_id);
+
void WindowSnapshotReachedScreen(int snapshot_id);
+ void OnSnapshotDataReceived(int snapshot_id,
+ const unsigned char* png,
+ size_t size);
+
+ void OnSnapshotDataReceivedAsync(
+ int snapshot_id,
+ scoped_refptr<base::RefCountedBytes> png_data);
+
// Send a message to the renderer process to change the accessibility mode.
void SetAccessibilityMode(AccessibilityMode AccessibilityMode);
@@ -862,6 +877,11 @@ class CONTENT_EXPORT RenderWidgetHostImpl
int64 last_input_number_;
+ int next_browser_snapshot_id_;
+ typedef std::map<int,
+ base::Callback<void(const unsigned char*, size_t)> > PendingSnapshotMap;
+ PendingSnapshotMap pending_browser_snapshots_;
+
DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostImpl);
};
diff --git a/content/browser/renderer_host/render_widget_host_view_mac.mm b/content/browser/renderer_host/render_widget_host_view_mac.mm
index 38fb478..a89b935 100644
--- a/content/browser/renderer_host/render_widget_host_view_mac.mm
+++ b/content/browser/renderer_host/render_widget_host_view_mac.mm
@@ -2069,6 +2069,12 @@ void RenderWidgetHostViewMac::AddPendingLatencyInfo(
NULL)) {
should_defer = true;
}
+ if (latency_info[i].FindLatency(
+ ui::WINDOW_OLD_SNAPSHOT_FRAME_NUMBER_COMPONENT,
+ render_widget_host_->GetLatencyComponentId(),
+ NULL)) {
+ should_defer = true;
+ }
}
if (should_defer) {
// Multiple pending screenshot requests will work, but if every frame
@@ -2113,8 +2119,7 @@ void RenderWidgetHostViewMac::TickPendingLatencyInfoDelay() {
base::Bind(&RenderWidgetHostViewMac::TickPendingLatencyInfoDelay,
pending_latency_info_delay_weak_ptr_factory_.GetWeakPtr()));
[compositing_iosurface_layer_ gotNewFrame];
- }
- if (software_layer_) {
+ } else {
// In software mode there is not an explicit setNeedsDisplay/display loop,
// so just wait a pretend-vsync at 60 Hz.
base::MessageLoop::current()->PostDelayedTask(
diff --git a/content/common/view_messages.h b/content/common/view_messages.h
index 3815910..de9d3a6 100644
--- a/content/common/view_messages.h
+++ b/content/common/view_messages.h
@@ -989,6 +989,10 @@ IPC_MESSAGE_ROUTED2(ViewMsg_ReclaimCompositorResources,
IPC_MESSAGE_ROUTED0(ViewMsg_SelectWordAroundCaret)
+// Sent by the browser to ask the renderer to redraw.
+IPC_MESSAGE_ROUTED1(ViewMsg_ForceRedraw,
+ int /* request_id */)
+
// -----------------------------------------------------------------------------
// Messages sent from the renderer to the browser.
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc
index 0eed3aa..10e4427 100644
--- a/content/renderer/render_view_impl.cc
+++ b/content/renderer/render_view_impl.cc
@@ -1117,6 +1117,7 @@ bool RenderViewImpl::OnMessageReceived(const IPC::Message& message) {
OnReleaseDisambiguationPopupBitmap)
IPC_MESSAGE_HANDLER(ViewMsg_WindowSnapshotCompleted,
OnWindowSnapshotCompleted)
+ IPC_MESSAGE_HANDLER(ViewMsg_ForceRedraw, OnForceRedraw)
IPC_MESSAGE_HANDLER(ViewMsg_SelectWordAroundCaret, OnSelectWordAroundCaret)
#if defined(OS_ANDROID)
IPC_MESSAGE_HANDLER(InputMsg_ActivateNearestFindResult,
@@ -1333,6 +1334,19 @@ void RenderViewImpl::GetWindowSnapshot(const WindowSnapshotCallback& callback) {
int id = next_snapshot_id_++;
pending_snapshots_.insert(std::make_pair(id, callback));
ui::LatencyInfo latency_info;
+ latency_info.AddLatencyNumber(ui::WINDOW_OLD_SNAPSHOT_FRAME_NUMBER_COMPONENT,
+ 0,
+ id);
+ scoped_ptr<cc::SwapPromiseMonitor> latency_info_swap_promise_monitor;
+ if (RenderWidgetCompositor* rwc = compositor()) {
+ latency_info_swap_promise_monitor =
+ rwc->CreateLatencyInfoSwapPromiseMonitor(&latency_info).Pass();
+ }
+ ScheduleCompositeWithForcedRedraw();
+}
+
+void RenderViewImpl::OnForceRedraw(int id) {
+ ui::LatencyInfo latency_info;
latency_info.AddLatencyNumber(ui::WINDOW_SNAPSHOT_FRAME_NUMBER_COMPONENT,
0,
id);
diff --git a/content/renderer/render_view_impl.h b/content/renderer/render_view_impl.h
index 324c4c7..950dd0f 100644
--- a/content/renderer/render_view_impl.h
+++ b/content/renderer/render_view_impl.h
@@ -753,6 +753,7 @@ class CONTENT_EXPORT RenderViewImpl
void OnDisownOpener();
void OnWindowSnapshotCompleted(const int snapshot_id,
const gfx::Size& size, const std::vector<unsigned char>& png);
+ void OnForceRedraw(int request_id);
void OnSelectWordAroundCaret();
#if defined(OS_ANDROID)
void OnActivateNearestFindResult(int request_id, float x, float y);
diff --git a/ui/events/latency_info.cc b/ui/events/latency_info.cc
index 3fedd67e..021b3c9 100644
--- a/ui/events/latency_info.cc
+++ b/ui/events/latency_info.cc
@@ -26,6 +26,7 @@ const char* GetComponentName(ui::LatencyComponentType type) {
CASE_TYPE(INPUT_EVENT_LATENCY_RENDERING_SCHEDULED_COMPONENT);
CASE_TYPE(INPUT_EVENT_LATENCY_ACKED_TOUCH_COMPONENT);
CASE_TYPE(WINDOW_SNAPSHOT_FRAME_NUMBER_COMPONENT);
+ CASE_TYPE(WINDOW_OLD_SNAPSHOT_FRAME_NUMBER_COMPONENT);
CASE_TYPE(INPUT_EVENT_LATENCY_TERMINATED_MOUSE_COMPONENT);
CASE_TYPE(INPUT_EVENT_LATENCY_TERMINATED_TOUCH_COMPONENT);
CASE_TYPE(INPUT_EVENT_LATENCY_TERMINATED_GESTURE_COMPONENT);
diff --git a/ui/events/latency_info.h b/ui/events/latency_info.h
index 619b046..d423fc7 100644
--- a/ui/events/latency_info.h
+++ b/ui/events/latency_info.h
@@ -44,6 +44,10 @@ enum LatencyComponentType {
// Frame number when a window snapshot was requested. The snapshot
// is taken when the rendering results actually reach the screen.
WINDOW_SNAPSHOT_FRAME_NUMBER_COMPONENT,
+ // Frame number for a snapshot requested via
+ // gpuBenchmarking.beginWindowSnapshotPNG
+ // TODO(vkuzkokov): remove when patch adding this hits Stable
+ WINDOW_OLD_SNAPSHOT_FRAME_NUMBER_COMPONENT,
// ---------------------------TERMINAL COMPONENT-----------------------------
// TERMINAL COMPONENT is when we show the latency end in chrome://tracing.
// Timestamp when the mouse event is acked from renderer and it does not