mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
Rather than hardcoding the size and presence of the notification area in Dart, we now expose padding values on the view. These values are set to non-zero values when there are UI elements that overlap the view. We currently respect only the top padding, but this CL paves the way to respect padding in other directions. We still hardcode the size of the notification area in Java. A future CL will retrieve this value from the Android framework. Fixes #257 R=ianh@google.com Review URL: https://codereview.chromium.org/1220353002.
132 lines
3.5 KiB
C++
132 lines
3.5 KiB
C++
// Copyright 2014 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 "sky/shell/testing/test_runner.h"
|
|
|
|
#include <iostream>
|
|
|
|
#include "base/bind.h"
|
|
#include "base/message_loop/message_loop.h"
|
|
#include "base/strings/string_util.h"
|
|
#include "sky/shell/platform_view.h"
|
|
#include "sky/shell/shell.h"
|
|
#include "sky/shell/shell_view.h"
|
|
|
|
namespace sky {
|
|
namespace shell {
|
|
namespace {
|
|
|
|
struct UrlData {
|
|
std::string url;
|
|
std::string expected_pixel_hash;
|
|
bool enable_pixel_dumping = false;
|
|
};
|
|
|
|
void WaitForURL(UrlData& data) {
|
|
// A test name is formated like file:///path/to/test'--pixel-test'pixelhash
|
|
std::cin >> data.url;
|
|
|
|
std::string pixel_switch;
|
|
std::string::size_type separator_position = data.url.find('\'');
|
|
if (separator_position != std::string::npos) {
|
|
pixel_switch = data.url.substr(separator_position + 1);
|
|
data.url.erase(separator_position);
|
|
}
|
|
|
|
std::string pixel_hash;
|
|
separator_position = pixel_switch.find('\'');
|
|
if (separator_position != std::string::npos) {
|
|
pixel_hash = pixel_switch.substr(separator_position + 1);
|
|
pixel_switch.erase(separator_position);
|
|
}
|
|
|
|
data.enable_pixel_dumping = pixel_switch == "--pixel-test";
|
|
data.expected_pixel_hash = pixel_hash;
|
|
}
|
|
|
|
void PrintAndFlush(const std::string& value) {
|
|
std::cout << value;
|
|
std::cout.flush();
|
|
}
|
|
|
|
const char kFileUrlPrefix[] = "file://";
|
|
static TestRunner* g_test_runner = nullptr;
|
|
|
|
} // namespace
|
|
|
|
TestRunner::TestRunner()
|
|
: shell_view_(new ShellView(Shell::Shared())),
|
|
weak_ptr_factory_(this) {
|
|
CHECK(!g_test_runner) << "Only create one TestRunner.";
|
|
|
|
shell_view_->view()->ConnectToEngine(GetProxy(&sky_engine_));
|
|
ViewportMetricsPtr metrics = ViewportMetrics::New();
|
|
metrics->physical_width = 320;
|
|
metrics->physical_height = 640;
|
|
sky_engine_->OnViewportMetricsChanged(metrics.Pass());
|
|
}
|
|
|
|
TestRunner::~TestRunner() {
|
|
}
|
|
|
|
TestRunner& TestRunner::Shared() {
|
|
if (!g_test_runner)
|
|
g_test_runner = new TestRunner();
|
|
return *g_test_runner;
|
|
}
|
|
|
|
void TestRunner::Start(const std::string& single_test_url) {
|
|
single_test_url_ = single_test_url;
|
|
PrintAndFlush("#READY\n");
|
|
ScheduleRun();
|
|
}
|
|
|
|
void TestRunner::OnTestComplete(const mojo::String& test_result,
|
|
const mojo::Array<uint8_t> pixels) {
|
|
std::cout << "Content-Type: text/plain\n";
|
|
std::cout << test_result << "\n";
|
|
PrintAndFlush("#EOF\n"); // Text result complete
|
|
PrintAndFlush("#EOF\n"); // Pixel result complete
|
|
std::cerr << "#EOF\n";
|
|
std::cerr.flush();
|
|
bindings_.CloseAllBindings();
|
|
|
|
if (single_test_url_.length())
|
|
exit(0);
|
|
ScheduleRun();
|
|
}
|
|
|
|
void TestRunner::DispatchInputEvent(mojo::EventPtr event) {
|
|
// TODO(abarth): Not implemented.
|
|
}
|
|
|
|
void TestRunner::Create(mojo::ApplicationConnection* app,
|
|
mojo::InterfaceRequest<TestHarness> request) {
|
|
bindings_.AddBinding(this, request.Pass());
|
|
}
|
|
|
|
void TestRunner::ScheduleRun() {
|
|
base::MessageLoop::current()->PostTask(FROM_HERE,
|
|
base::Bind(&TestRunner::Run, weak_ptr_factory_.GetWeakPtr()));
|
|
}
|
|
|
|
void TestRunner::Run() {
|
|
UrlData data;
|
|
if (single_test_url_.length()) {
|
|
data.url = single_test_url_;
|
|
} else {
|
|
WaitForURL(data);
|
|
}
|
|
|
|
std::cout << "#BEGIN\n";
|
|
std::cout.flush();
|
|
|
|
if (StartsWithASCII(data.url, kFileUrlPrefix, true))
|
|
ReplaceFirstSubstringAfterOffset(&data.url, 0, kFileUrlPrefix, "");
|
|
sky_engine_->RunFromFile(data.url, package_root_);
|
|
}
|
|
|
|
} // namespace shell
|
|
} // namespace sky
|