summaryrefslogtreecommitdiffstats
path: root/blimp
diff options
context:
space:
mode:
authorhaibinlu <haibinlu@chromium.org>2015-12-28 18:16:27 -0800
committerCommit bot <commit-bot@chromium.org>2015-12-29 02:18:25 +0000
commit1028db14ebc45c0634f425a261069ac6228922fb (patch)
treef36a2ef17b920033e3ad126ec8a562351957cc26 /blimp
parent77ffbd8f10c13590ff68170600284a10a634c410 (diff)
downloadchromium_src-1028db14ebc45c0634f425a261069ac6228922fb.zip
chromium_src-1028db14ebc45c0634f425a261069ac6228922fb.tar.gz
chromium_src-1028db14ebc45c0634f425a261069ac6228922fb.tar.bz2
[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}
Diffstat (limited to 'blimp')
-rw-r--r--blimp/BUILD.gn4
-rw-r--r--blimp/client/BUILD.gn26
-rw-r--r--blimp/client/DEPS2
-rw-r--r--blimp/client/android/blimp_library_loader.cc31
-rw-r--r--blimp/client/android/java/src/org/chromium/blimp/BlimpLibraryLoader.java4
-rw-r--r--blimp/client/blimp_startup.cc53
-rw-r--r--blimp/client/blimp_startup.h18
-rw-r--r--blimp/client/compositor/blimp_compositor.h10
-rw-r--r--blimp/client/linux/blimp_display_manager.cc82
-rw-r--r--blimp/client/linux/blimp_display_manager.h66
-rw-r--r--blimp/client/linux/blimp_main.cc40
-rw-r--r--blimp/client/session/blimp_client_session_linux.cc28
-rw-r--r--blimp/client/session/blimp_client_session_linux.h36
13 files changed, 364 insertions, 36 deletions
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<scoped_ptr<base::MessageLoopForUI>> 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<jclass>& clazz) {
- // TODO(dtrainor): Start the runner?
- return true;
-}
-
static jboolean StartBlimp(JNIEnv* env, const JavaParamRef<jclass>& 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<scoped_ptr<base::MessageLoopForUI>> 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<BlimpCompositor> blimp_compositor_;
+ scoped_ptr<ui::PlatformWindow> 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 <X11/Xlib.h>
+#include <string>
+
+#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<ui::PlatformEventSource> event_source_;
+ scoped_ptr<BlimpDisplayManager> blimp_display_manager_;
+
+ DISALLOW_COPY_AND_ASSIGN(BlimpClientSessionLinux);
+};
+
+} // namespace blimp
+
+#endif // BLIMP_CLIENT_SESSION_BLIMP_CLIENT_SESSION_LINUX_H_