From 1028db14ebc45c0634f425a261069ac6228922fb Mon Sep 17 00:00:00 2001 From: haibinlu Date: Mon, 28 Dec 2015 18:16:27 -0800 Subject: [Blimp Client] Land CL 1528243002 (Add a basic linux client for Blimp) Exactly the same as issue 1528243002 at patchset 20001 (http://crrev.com/1528243002#ps20001) BUG=534894 Review URL: https://codereview.chromium.org/1551683002 Cr-Commit-Position: refs/heads/master@{#367040} --- blimp/BUILD.gn | 4 ++ blimp/client/BUILD.gn | 26 +++++++ blimp/client/DEPS | 2 + blimp/client/android/blimp_library_loader.cc | 31 +------- .../src/org/chromium/blimp/BlimpLibraryLoader.java | 4 +- blimp/client/blimp_startup.cc | 53 ++++++++++++++ blimp/client/blimp_startup.h | 18 +++++ blimp/client/compositor/blimp_compositor.h | 10 +-- blimp/client/linux/blimp_display_manager.cc | 82 ++++++++++++++++++++++ blimp/client/linux/blimp_display_manager.h | 66 +++++++++++++++++ blimp/client/linux/blimp_main.cc | 40 +++++++++++ blimp/client/session/blimp_client_session_linux.cc | 28 ++++++++ blimp/client/session/blimp_client_session_linux.h | 36 ++++++++++ 13 files changed, 364 insertions(+), 36 deletions(-) create mode 100644 blimp/client/blimp_startup.cc create mode 100644 blimp/client/blimp_startup.h create mode 100644 blimp/client/linux/blimp_display_manager.cc create mode 100644 blimp/client/linux/blimp_display_manager.h create mode 100644 blimp/client/linux/blimp_main.cc create mode 100644 blimp/client/session/blimp_client_session_linux.cc create mode 100644 blimp/client/session/blimp_client_session_linux.h (limited to 'blimp') diff --git a/blimp/BUILD.gn b/blimp/BUILD.gn index d29270c..6712095 100644 --- a/blimp/BUILD.gn +++ b/blimp/BUILD.gn @@ -27,6 +27,10 @@ group("blimp") { "//blimp/engine:blimp_engine_bundle", ] } + + if (is_linux && !is_chromeos) { + deps += [ "//blimp/client:blimp_shell" ] + } } # Builds all Blimp test code (unit tests, APKs). diff --git a/blimp/client/BUILD.gn b/blimp/client/BUILD.gn index 3858bd3..b7388ac 100644 --- a/blimp/client/BUILD.gn +++ b/blimp/client/BUILD.gn @@ -10,6 +10,8 @@ if (is_android) { component("blimp_client") { sources = [ "blimp_client_export.h", + "blimp_startup.cc", + "blimp_startup.h", "compositor/blimp_compositor.cc", "compositor/blimp_compositor.h", "compositor/blimp_context_provider.cc", @@ -83,6 +85,30 @@ source_set("unit_tests") { ] } +if (is_linux && !is_chromeos) { + executable("blimp_shell") { + sources = [ + "linux/blimp_display_manager.cc", + "linux/blimp_display_manager.h", + "linux/blimp_main.cc", + "session/blimp_client_session_linux.cc", + "session/blimp_client_session_linux.h", + ] + + deps = [ + ":blimp_client", + "//base", + "//ui/events/platform/x11", + "//ui/platform_window/x11", + ] + + public_configs = [ "//build/config/linux:x11" ] + public_deps = [ + "//ui/events/platform/x11", + ] + } +} + if (is_android) { manifest_package = "org.chromium.blimp" blimp_apk_manifest = "$target_gen_dir/blimp_apk_manifest/AndroidManifest.xml" diff --git a/blimp/client/DEPS b/blimp/client/DEPS index 19da9c3..e334a8c 100644 --- a/blimp/client/DEPS +++ b/blimp/client/DEPS @@ -10,12 +10,14 @@ include_rules = [ "+skia", "+third_party/skia", "+third_party/WebKit/public/web/WebInputEvent.h", + "+ui/events", "+ui/events/android", "+ui/events/blink", "+ui/events/gesture_detection", "+ui/events/gestures/blink", "+ui/gfx", "+ui/gl", + "+ui/platform_window", "+url", # TODO(dtrainor): Remove this once Toast uses are removed from Java. diff --git a/blimp/client/android/blimp_library_loader.cc b/blimp/client/android/blimp_library_loader.cc index 9668850..5a4fdff 100644 --- a/blimp/client/android/blimp_library_loader.cc +++ b/blimp/client/android/blimp_library_loader.cc @@ -11,32 +11,16 @@ #include "base/android/jni_android.h" #include "base/android/library_loader/library_loader_hooks.h" #include "base/bind.h" -#include "base/lazy_instance.h" -#include "base/logging.h" #include "base/message_loop/message_loop.h" #include "blimp/client/android/blimp_jni_registrar.h" +#include "blimp/client/blimp_startup.h" #include "jni/BlimpLibraryLoader_jni.h" #include "ui/gl/gl_surface.h" namespace { -base::LazyInstance> g_main_message_loop = - LAZY_INSTANCE_INITIALIZER; - bool OnLibrariesLoaded(JNIEnv* env, jclass clazz) { - logging::LoggingSettings settings; - settings.logging_dest = logging::LOG_TO_SYSTEM_DEBUG_LOG; - logging::InitLogging(settings); - - // Disable process info prefixes on log lines. These can be obtained via "adb - // logcat -v threadtime". - logging::SetLogItems(false, // Process ID - false, // Thread ID - false, // Timestamp - false); // Tick count - VLOG(0) << "Chromium logging enabled: level = " << logging::GetMinLogLevel() - << ", default verbosity = " << logging::GetVlogVerbosity(); - + blimp::InitializeLogging(); return true; } @@ -59,19 +43,10 @@ bool RegisterJni(JNIEnv* env) { namespace blimp { -static jboolean InitializeBlimp(JNIEnv* env, - const JavaParamRef& clazz) { - // TODO(dtrainor): Start the runner? - return true; -} - static jboolean StartBlimp(JNIEnv* env, const JavaParamRef& clazz) { - // TODO(dtrainor): Initialize ICU? - - if (!gfx::GLSurface::InitializeOneOff()) + if (!blimp::InitializeMainMessageLoop()) return false; - g_main_message_loop.Get().reset(new base::MessageLoopForUI); base::MessageLoopForUI::current()->Start(); return true; diff --git a/blimp/client/android/java/src/org/chromium/blimp/BlimpLibraryLoader.java b/blimp/client/android/java/src/org/chromium/blimp/BlimpLibraryLoader.java index 7d6f22a..8592c00 100644 --- a/blimp/client/android/java/src/org/chromium/blimp/BlimpLibraryLoader.java +++ b/blimp/client/android/java/src/org/chromium/blimp/BlimpLibraryLoader.java @@ -92,12 +92,11 @@ public final class BlimpLibraryLoader { @Override public void run() { ContextUtils.initApplicationContext(context.getApplicationContext()); - final boolean initResult = nativeInitializeBlimp(); new Handler().post(new Runnable() { @Override public void run() { // Only run nativeStartBlimp if we properly initialized native. - boolean startResult = initResult && nativeStartBlimp(); + boolean startResult = nativeStartBlimp(); sLibraryLoadResult = new Boolean(startResult); // Notify any oustanding callers to #startAsync(). @@ -128,6 +127,5 @@ public final class BlimpLibraryLoader { } // Native methods. - private static native boolean nativeInitializeBlimp(); private static native boolean nativeStartBlimp(); } diff --git a/blimp/client/blimp_startup.cc b/blimp/client/blimp_startup.cc new file mode 100644 index 0000000..8e51b28 --- /dev/null +++ b/blimp/client/blimp_startup.cc @@ -0,0 +1,53 @@ +// Copyright 2015 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 "blimp/client/blimp_startup.h" + +#include "base/files/file_path.h" +#include "base/lazy_instance.h" +#include "base/logging.h" +#include "base/message_loop/message_loop.h" +#include "base/path_service.h" +#include "third_party/skia/include/core/SkGraphics.h" +#include "ui/gl/gl_surface.h" + +namespace { +base::LazyInstance> g_main_message_loop = + LAZY_INSTANCE_INITIALIZER; +} + +namespace blimp { + +void InitializeLogging() { + logging::LoggingSettings settings; +#if defined(OS_ANDROID) + settings.logging_dest = logging::LOG_TO_SYSTEM_DEBUG_LOG; +#else + base::FilePath log_filename; + PathService::Get(base::DIR_EXE, &log_filename); + log_filename = log_filename.AppendASCII("blimp_client.log"); + settings.logging_dest = logging::LOG_TO_ALL; + settings.log_file = log_filename.value().c_str(); + settings.delete_old = logging::DELETE_OLD_LOG_FILE; +#endif // OS_ANDROID + logging::InitLogging(settings); + logging::SetLogItems(false, // Process ID + false, // Thread ID + false, // Timestamp + false); // Tick count + VLOG(0) << "Chromium logging enabled: level = " << logging::GetMinLogLevel() + << ", default verbosity = " << logging::GetVlogVerbosity(); +} + +bool InitializeMainMessageLoop() { + // TODO(dtrainor): Initialize ICU? + + if (!gfx::GLSurface::InitializeOneOff()) + return false; + SkGraphics::Init(); + g_main_message_loop.Get().reset(new base::MessageLoopForUI); + return true; +} + +} // namespace blimp diff --git a/blimp/client/blimp_startup.h b/blimp/client/blimp_startup.h new file mode 100644 index 0000000..aa0dde7 --- /dev/null +++ b/blimp/client/blimp_startup.h @@ -0,0 +1,18 @@ +// Copyright 2015 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. + +#ifndef BLIMP_CLIENT_BLIMP_STARTUP_H_ +#define BLIMP_CLIENT_BLIMP_STARTUP_H_ + +#include "blimp/client/blimp_client_export.h" + +namespace blimp { + +BLIMP_CLIENT_EXPORT void InitializeLogging(); + +BLIMP_CLIENT_EXPORT bool InitializeMainMessageLoop(); + +} // namespace blimp + +#endif // BLIMP_CLIENT_BLIMP_STARTUP_H_ diff --git a/blimp/client/compositor/blimp_compositor.h b/blimp/client/compositor/blimp_compositor.h index 05401c1..7245e8a 100644 --- a/blimp/client/compositor/blimp_compositor.h +++ b/blimp/client/compositor/blimp_compositor.h @@ -46,6 +46,11 @@ class BLIMP_CLIENT_EXPORT BlimpCompositor public RenderWidgetFeature::RenderWidgetFeatureDelegate, public BlimpInputManagerClient { public: + // |dp_to_px| is the scale factor required to move from dp (device pixels) to + // px. See https://developer.android.com/guide/practices/screens_support.html + // for more details. + BlimpCompositor(float dp_to_px, RenderWidgetFeature* render_widget_feature); + ~BlimpCompositor() override; // Default layer settings for all Blimp layer instances. @@ -78,11 +83,6 @@ class BLIMP_CLIENT_EXPORT BlimpCompositor bool OnTouchEvent(const ui::MotionEvent& motion_event); protected: - // |dp_to_px| is the scale factor required to move from dp (device pixels) to - // px. See https://developer.android.com/guide/practices/screens_support.html - // for more details. - BlimpCompositor(float dp_to_px, RenderWidgetFeature* render_widget_feature); - // Populates the cc::LayerTreeSettings used by the cc::LayerTreeHost. Can be // overridden to provide custom settings parameters. virtual void GenerateLayerTreeSettings(cc::LayerTreeSettings* settings); diff --git a/blimp/client/linux/blimp_display_manager.cc b/blimp/client/linux/blimp_display_manager.cc new file mode 100644 index 0000000..d2707b5 --- /dev/null +++ b/blimp/client/linux/blimp_display_manager.cc @@ -0,0 +1,82 @@ +// Copyright 2015 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 "blimp/client/linux/blimp_display_manager.h" + +#include "blimp/client/compositor/blimp_compositor.h" +#include "blimp/client/session/render_widget_feature.h" +#include "blimp/client/session/tab_control_feature.h" +#include "ui/events/event.h" +#include "ui/gfx/geometry/size.h" +#include "ui/platform_window/platform_window.h" +#include "ui/platform_window/x11/x11_window.h" + +namespace blimp { + +BlimpDisplayManager::BlimpDisplayManager( + const gfx::Size& window_size, + BlimpDisplayManagerDelegate* delegate, + RenderWidgetFeature* render_widget_feature, + TabControlFeature* tab_control_feature) + : device_pixel_ratio_(1.f), + delegate_(delegate), + tab_control_feature_(tab_control_feature), + blimp_compositor_(new BlimpCompositor(1.f, render_widget_feature)), + platform_window_(new ui::X11Window(this)) { + platform_window_->SetBounds(gfx::Rect(window_size)); + platform_window_->Show(); + blimp_compositor_->SetSize(window_size); + tab_control_feature_->SetSizeAndScale(platform_window_->GetBounds().size(), + device_pixel_ratio_); + + blimp_compositor_->SetVisible(true); +} + +BlimpDisplayManager::~BlimpDisplayManager() {} + +void BlimpDisplayManager::OnBoundsChanged(const gfx::Rect& new_bounds) { + blimp_compositor_->SetSize(new_bounds.size()); + tab_control_feature_->SetSizeAndScale(new_bounds.size(), device_pixel_ratio_); +} + +void BlimpDisplayManager::OnDamageRect(const gfx::Rect& damaged_region) {} + +void BlimpDisplayManager::DispatchEvent(ui::Event* event) { + // TODO(dtrainor): Look into using web_input_event_aura to translate these to + // blink events. +} + +void BlimpDisplayManager::OnCloseRequest() { + blimp_compositor_->SetVisible(false); + platform_window_->Close(); +} + +void BlimpDisplayManager::OnClosed() { + if (delegate_) + delegate_->OnClosed(); +} + +void BlimpDisplayManager::OnWindowStateChanged( + ui::PlatformWindowState new_state) {} + +void BlimpDisplayManager::OnLostCapture() {} + +void BlimpDisplayManager::OnAcceleratedWidgetAvailable( + gfx::AcceleratedWidget widget, + float device_pixel_ratio) { + device_pixel_ratio_ = device_pixel_ratio; + tab_control_feature_->SetSizeAndScale(platform_window_->GetBounds().size(), + device_pixel_ratio_); + + if (widget != gfx::kNullAcceleratedWidget) + blimp_compositor_->SetAcceleratedWidget(widget); +} + +void BlimpDisplayManager::OnAcceleratedWidgetDestroyed() { + blimp_compositor_->ReleaseAcceleratedWidget(); +} + +void BlimpDisplayManager::OnActivationChanged(bool active) {} + +} // namespace blimp diff --git a/blimp/client/linux/blimp_display_manager.h b/blimp/client/linux/blimp_display_manager.h new file mode 100644 index 0000000..8927dc1 --- /dev/null +++ b/blimp/client/linux/blimp_display_manager.h @@ -0,0 +1,66 @@ +// Copyright 2015 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. + +#ifndef BLIMP_CLIENT_LINUX_BLIMP_DISPLAY_MANAGER_H_ +#define BLIMP_CLIENT_LINUX_BLIMP_DISPLAY_MANAGER_H_ + +#include "base/macros.h" +#include "base/memory/scoped_ptr.h" +#include "ui/platform_window/platform_window_delegate.h" + +namespace gfx { +class Size; +} + +namespace ui { +class PlatformWindow; +} + +namespace blimp { + +class BlimpCompositor; +class RenderWidgetFeature; +class TabControlFeature; + +class BlimpDisplayManagerDelegate { + public: + virtual void OnClosed() = 0; +}; + +class BlimpDisplayManager : public ui::PlatformWindowDelegate { + public: + BlimpDisplayManager(const gfx::Size& window_size, + BlimpDisplayManagerDelegate* delegate, + RenderWidgetFeature* render_widget_feature, + TabControlFeature* tab_control_feature); + ~BlimpDisplayManager() override; + + // ui::PlatformWindowDelegate: + void OnBoundsChanged(const gfx::Rect& new_bounds) override; + void OnDamageRect(const gfx::Rect& damaged_region) override; + void DispatchEvent(ui::Event* event) override; + void OnCloseRequest() override; + void OnClosed() override; + void OnWindowStateChanged(ui::PlatformWindowState new_state) override; + void OnLostCapture() override; + void OnAcceleratedWidgetAvailable(gfx::AcceleratedWidget widget, + float device_pixel_ratio) override; + void OnAcceleratedWidgetDestroyed() override; + void OnActivationChanged(bool active) override; + + private: + float device_pixel_ratio_; + + BlimpDisplayManagerDelegate* delegate_; + TabControlFeature* tab_control_feature_; + + scoped_ptr blimp_compositor_; + scoped_ptr platform_window_; + + DISALLOW_COPY_AND_ASSIGN(BlimpDisplayManager); +}; + +} // namespace blimp + +#endif // BLIMP_CLIENT_LINUX_BLIMP_DISPLAY_MANAGER_H_ diff --git a/blimp/client/linux/blimp_main.cc b/blimp/client/linux/blimp_main.cc new file mode 100644 index 0000000..2d95521 --- /dev/null +++ b/blimp/client/linux/blimp_main.cc @@ -0,0 +1,40 @@ +// Copyright 2015 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 +#include + +#include "base/at_exit.h" +#include "base/command_line.h" +#include "base/run_loop.h" +#include "blimp/client/blimp_startup.h" +#include "blimp/client/session/blimp_client_session_linux.h" +#include "blimp/client/session/navigation_feature.h" + +namespace { +const char kDefaultUrl[] = "https://www.google.com"; +const int kDummyTabId = 0; +} + +int main(int argc, const char**argv) { + base::AtExitManager at_exit; + + base::CommandLine::Init(argc, argv); + + XInitThreads(); + + blimp::InitializeLogging(); + blimp::InitializeMainMessageLoop(); + + blimp::BlimpClientSessionLinux session; + + // If there is a non-switch argument to the command line, load that url. + base::CommandLine::StringVector args = + base::CommandLine::ForCurrentProcess()->GetArgs(); + std::string url = args.size() > 0 ? args[0] : kDefaultUrl; + + session.GetNavigationFeature()->NavigateToUrlText(kDummyTabId, url); + + base::RunLoop().Run(); +} diff --git a/blimp/client/session/blimp_client_session_linux.cc b/blimp/client/session/blimp_client_session_linux.cc new file mode 100644 index 0000000..99a162b --- /dev/null +++ b/blimp/client/session/blimp_client_session_linux.cc @@ -0,0 +1,28 @@ +// Copyright 2015 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 "blimp/client/session/blimp_client_session_linux.h" + +#include "base/message_loop/message_loop.h" +#include "blimp/client/linux/blimp_display_manager.h" +#include "ui/events/platform/platform_event_source.h" +#include "ui/gfx/geometry/size.h" + +namespace blimp { + +BlimpClientSessionLinux::BlimpClientSessionLinux() + : event_source_(ui::PlatformEventSource::CreateDefault()) { + blimp_display_manager_.reset(new BlimpDisplayManager(gfx::Size(800, 600), + this, + GetRenderWidgetFeature(), + GetTabControlFeature())); +} + +BlimpClientSessionLinux::~BlimpClientSessionLinux() {} + +void BlimpClientSessionLinux::OnClosed() { + base::MessageLoop::current()->QuitNow(); +} + +} // namespace blimp diff --git a/blimp/client/session/blimp_client_session_linux.h b/blimp/client/session/blimp_client_session_linux.h new file mode 100644 index 0000000..2cd8624 --- /dev/null +++ b/blimp/client/session/blimp_client_session_linux.h @@ -0,0 +1,36 @@ +// Copyright 2015 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. + +#ifndef BLIMP_CLIENT_SESSION_BLIMP_CLIENT_SESSION_LINUX_H_ +#define BLIMP_CLIENT_SESSION_BLIMP_CLIENT_SESSION_LINUX_H_ + +#include "base/macros.h" +#include "blimp/client/linux/blimp_display_manager.h" +#include "blimp/client/session/blimp_client_session.h" + +namespace ui { +class PlatformEventSource; +} + +namespace blimp { + +class BlimpClientSessionLinux : public BlimpClientSession, + public BlimpDisplayManagerDelegate { + public: + BlimpClientSessionLinux(); + ~BlimpClientSessionLinux() override; + + // BlimpDisplayManagerDelegate implementation. + void OnClosed() override; + + private: + scoped_ptr event_source_; + scoped_ptr blimp_display_manager_; + + DISALLOW_COPY_AND_ASSIGN(BlimpClientSessionLinux); +}; + +} // namespace blimp + +#endif // BLIMP_CLIENT_SESSION_BLIMP_CLIENT_SESSION_LINUX_H_ -- cgit v1.1