// Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "base/base64.h" #include "base/command_line.h" #include "base/json/json_reader.h" #include "content/browser/devtools/devtools_protocol.h" #include "content/public/browser/devtools_agent_host.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/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, public DevToolsAgentHostClient { protected: void SendCommand(const std::string& method, base::DictionaryValue* params) { agent_host_->DispatchProtocolMessage( DevToolsProtocol::CreateCommand(1, method, params)->Serialize()); base::MessageLoop::current()->Run(); } bool HasValue(const std::string& path) { base::Value* value = 0; return result_->Get(path, &value); } bool HasListItem(const std::string& path_to_list, const std::string& name, const std::string& value) { base::ListValue* list; if (!result_->GetList(path_to_list, &list)) return false; for (size_t i = 0; i != list->GetSize(); i++) { base::DictionaryValue* item; if (!list->GetDictionary(i, &item)) return false; std::string id; if (!item->GetString(name, &id)) return false; if (id == value) return true; } return false; } scoped_ptr result_; scoped_refptr agent_host_; private: void SetUpOnMainThread() override { agent_host_ = DevToolsAgentHost::GetOrCreateFor(shell()->web_contents()); agent_host_->AttachClient(this); } void TearDownOnMainThread() override { agent_host_->DetachClient(); agent_host_ = NULL; } void DispatchProtocolMessage(DevToolsAgentHost* agent_host, const std::string& message) override { scoped_ptr root( static_cast(base::JSONReader::Read(message))); base::DictionaryValue* result; EXPECT_TRUE(root->GetDictionary("result", &result)); result_.reset(result->DeepCopy()); base::MessageLoop::current()->QuitNow(); } void AgentHostClosed(DevToolsAgentHost* agent_host, bool replaced) override { EXPECT_TRUE(false); } }; IN_PROC_BROWSER_TEST_F(RendererOverridesHandlerTest, QueryUsageAndQuota) { base::DictionaryValue* params = new base::DictionaryValue(); params->SetString("securityOrigin", "http://example.com"); SendCommand("Page.queryUsageAndQuota", params); EXPECT_TRUE(HasValue("quota.persistent")); EXPECT_TRUE(HasValue("quota.temporary")); EXPECT_TRUE(HasListItem("usage.temporary", "id", "appcache")); EXPECT_TRUE(HasListItem("usage.temporary", "id", "database")); EXPECT_TRUE(HasListItem("usage.temporary", "id", "indexeddatabase")); EXPECT_TRUE(HasListItem("usage.temporary", "id", "filesystem")); EXPECT_TRUE(HasListItem("usage.persistent", "id", "filesystem")); } class CaptureScreenshotTest : public RendererOverridesHandlerTest { private: #if !defined(OS_ANDROID) 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 #elif defined(MEMORY_SANITIZER) // Also fails under MSAN. http://crbug.com/423583 #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(png.data()), png.size(), &bitmap); SkColor color(bitmap.getColor(0, 0)); EXPECT_TRUE(std::abs(0x12-(int)SkColorGetR(color)) <= 1); EXPECT_TRUE(std::abs(0x34-(int)SkColorGetG(color)) <= 1); EXPECT_TRUE(std::abs(0x56-(int)SkColorGetB(color)) <= 1); } } // namespace content