diff options
-rw-r--r-- | ash/ash.gyp | 5 | ||||
-rw-r--r-- | ash/test/DEPS | 1 | ||||
-rw-r--r-- | ash/test/ash_test_base.cc | 9 | ||||
-rw-r--r-- | ash/test/ash_test_base.h | 4 | ||||
-rw-r--r-- | ash/test/test_metro_viewer_process_host.cc | 74 | ||||
-rw-r--r-- | ash/test/test_metro_viewer_process_host.h | 58 | ||||
-rw-r--r-- | chrome/browser/DEPS | 1 | ||||
-rw-r--r-- | chrome/browser/browser_process_platform_part_aurawin.cc | 4 | ||||
-rw-r--r-- | chrome/browser/browser_process_platform_part_aurawin.h | 4 | ||||
-rw-r--r-- | chrome/browser/metro_viewer/chrome_metro_viewer_process_host_aurawin.h | 24 | ||||
-rw-r--r-- | chrome/browser/metro_viewer/metro_viewer_process_host_win.cc (renamed from chrome/browser/metro_viewer/chrome_metro_viewer_process_host_aurawin.cc) | 48 | ||||
-rw-r--r-- | chrome/browser/metro_viewer/metro_viewer_process_host_win.h | 47 | ||||
-rw-r--r-- | chrome/chrome_browser.gypi | 9 | ||||
-rw-r--r-- | ui/aura/aura.gyp | 4 | ||||
-rw-r--r-- | ui/metro_viewer/metro_viewer.gyp | 3 | ||||
-rw-r--r-- | win8/metro_driver/metro_driver.gyp | 2 | ||||
-rw-r--r-- | win8/viewer/metro_viewer_process_host.cc | 108 | ||||
-rw-r--r-- | win8/viewer/metro_viewer_process_host.h | 94 | ||||
-rw-r--r-- | win8/win8.gyp | 14 |
19 files changed, 224 insertions, 289 deletions
diff --git a/ash/ash.gyp b/ash/ash.gyp index 90df2f0..05d2788 100644 --- a/ash/ash.gyp +++ b/ash/ash.gyp @@ -575,10 +575,9 @@ ['OS=="win"', { 'dependencies': [ '../ipc/ipc.gyp:ipc', - '../ui/metro_viewer/metro_viewer.gyp:metro_viewer_messages', - '../win8/win8.gyp:metro_viewer', - '../win8/win8.gyp:test_support_win8', + '../ui/metro_viewer/metro_viewer.gyp:metro_viewer', '../win8/win8_tests.gyp:test_registrar', + '../win8/win8.gyp:test_support_win8', ], 'sources': [ 'test/test_metro_viewer_process_host.cc', diff --git a/ash/test/DEPS b/ash/test/DEPS index 8bc7896..ace334c 100644 --- a/ash/test/DEPS +++ b/ash/test/DEPS @@ -1,5 +1,4 @@ include_rules = [ "+content/public/test", "+content/test", - "+win8/viewer", ] diff --git a/ash/test/ash_test_base.cc b/ash/test/ash_test_base.cc index 87f2243..99105e1 100644 --- a/ash/test/ash_test_base.cc +++ b/ash/test/ash_test_base.cc @@ -119,14 +119,7 @@ void AshTestBase::SetUp() { if (base::win::GetVersion() >= base::win::VERSION_WIN8 && !CommandLine::ForCurrentProcess()->HasSwitch( ash::switches::kForceAshToDesktop)) { - ipc_thread_.reset(new base::Thread("test_metro_viewer_ipc_thread")); - base::Thread::Options options; - options.message_loop_type = base::MessageLoop::TYPE_IO; - ipc_thread_->StartWithOptions(options); - - metro_viewer_host_.reset( - new TestMetroViewerProcessHost("viewer", - ipc_thread_->message_loop_proxy())); + metro_viewer_host_.reset(new TestMetroViewerProcessHost("viewer")); CHECK(metro_viewer_host_->LaunchViewerAndWaitForConnection( win8::test::kDefaultTestAppUserModelId)); aura::RemoteRootWindowHostWin* root_window_host = diff --git a/ash/test/ash_test_base.h b/ash/test/ash_test_base.h index 2d9f717..dd65bf4 100644 --- a/ash/test/ash_test_base.h +++ b/ash/test/ash_test_base.h @@ -9,7 +9,6 @@ #include "base/compiler_specific.h" #include "base/message_loop.h" -#include "base/threading/thread.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/skia/include/core/SkColor.h" #include "ui/aura/client/window_types.h" @@ -110,9 +109,6 @@ class AshTestBase : public testing::Test { scoped_ptr<AshTestHelper> ash_test_helper_; scoped_ptr<aura::test::EventGenerator> event_generator_; #if defined(OS_WIN) - // Note that the order is important here as ipc_thread_ should be destroyed - // after metro_viewer_host_->channel_. - scoped_ptr<base::Thread> ipc_thread_; scoped_ptr<TestMetroViewerProcessHost> metro_viewer_host_; ui::ScopedOleInitializer ole_initializer_; #endif diff --git a/ash/test/test_metro_viewer_process_host.cc b/ash/test/test_metro_viewer_process_host.cc index 63725f7..277864f 100644 --- a/ash/test/test_metro_viewer_process_host.cc +++ b/ash/test/test_metro_viewer_process_host.cc @@ -23,13 +23,81 @@ namespace ash { namespace test { +TestMetroViewerProcessHost::InternalMessageFilter::InternalMessageFilter( + TestMetroViewerProcessHost* owner) + : owner_(owner) { +} + +void TestMetroViewerProcessHost::InternalMessageFilter::OnChannelConnected( + int32 peer_pid) { + owner_->NotifyChannelConnected(); +} + TestMetroViewerProcessHost::TestMetroViewerProcessHost( - const std::string& ipc_channel_name, - base::SingleThreadTaskRunner* ipc_task_runner) - : MetroViewerProcessHost(ipc_channel_name, ipc_task_runner) { + const std::string& ipc_channel_name) + : ipc_thread_("test_metro_viewer_ipc_thread"), + channel_connected_event_(false, false), + closed_unexpectedly_(false) { + + base::Thread::Options options; + options.message_loop_type = base::MessageLoop::TYPE_IO; + ipc_thread_.StartWithOptions(options); + + channel_.reset(new IPC::ChannelProxy( + ipc_channel_name.c_str(), + IPC::Channel::MODE_NAMED_SERVER, + this, + ipc_thread_.message_loop_proxy())); + + channel_->AddFilter(new InternalMessageFilter(this)); } TestMetroViewerProcessHost::~TestMetroViewerProcessHost() { + channel_.reset(); + ipc_thread_.Stop(); +} + +void TestMetroViewerProcessHost::NotifyChannelConnected() { + channel_connected_event_.Signal(); +} + +bool TestMetroViewerProcessHost::LaunchViewerAndWaitForConnection( + const base::string16& app_user_model_id) { + // Activate the viewer process. NOTE: This assumes that the viewer process is + // registered as the default browser using the provided |app_user_model_id|. + + // TODO(robertshield): Initialize COM at test suite startup. + base::win::ScopedCOMInitializer com_initializer; + + base::win::ScopedComPtr<IApplicationActivationManager> activator; + HRESULT hr = activator.CreateInstance(CLSID_ApplicationActivationManager); + if (SUCCEEDED(hr)) { + DWORD pid = 0; + hr = activator->ActivateApplication( + app_user_model_id.c_str(), L"open", AO_NONE, &pid); + } + + LOG_IF(ERROR, FAILED(hr)) << "Tried and failed to launch Metro Chrome. " + << "hr=" << std::hex << hr; + + // Having launched the viewer process, now we wait for it to connect. + return channel_connected_event_.TimedWait(base::TimeDelta::FromSeconds(60)); +} + +bool TestMetroViewerProcessHost::Send(IPC::Message* msg) { + return channel_->Send(msg); +} + +bool TestMetroViewerProcessHost::OnMessageReceived( + const IPC::Message& message) { + DCHECK(CalledOnValidThread()); + bool handled = true; + IPC_BEGIN_MESSAGE_MAP(TestMetroViewerProcessHost, message) + IPC_MESSAGE_HANDLER(MetroViewerHostMsg_SetTargetSurface, OnSetTargetSurface) + IPC_MESSAGE_UNHANDLED(handled = false) + IPC_END_MESSAGE_MAP() + return handled ? true : + aura::RemoteRootWindowHostWin::Instance()->OnMessageReceived(message); } void TestMetroViewerProcessHost::OnChannelError() { diff --git a/ash/test/test_metro_viewer_process_host.h b/ash/test/test_metro_viewer_process_host.h index 0f24169..f52230b 100644 --- a/ash/test/test_metro_viewer_process_host.h +++ b/ash/test/test_metro_viewer_process_host.h @@ -7,25 +7,69 @@ #include <string> -#include "win8/viewer/metro_viewer_process_host.h" +#include "base/memory/scoped_ptr.h" +#include "base/synchronization/waitable_event.h" +#include "base/threading/non_thread_safe.h" +#include "base/threading/thread.h" +#include "ipc/ipc_channel_proxy.h" +#include "ipc/ipc_listener.h" +#include "ipc/ipc_sender.h" +#include "ui/gfx/native_widget_types.h" class AcceleratedSurface; namespace ash { namespace test { -class TestMetroViewerProcessHost : public win8::MetroViewerProcessHost { +class TestMetroViewerProcessHost : public IPC::Listener, + public IPC::Sender, + public base::NonThreadSafe { public: - TestMetroViewerProcessHost(const std::string& ipc_channel_name, - base::SingleThreadTaskRunner* ipc_task_runner); + explicit TestMetroViewerProcessHost(const std::string& ipc_channel_name); virtual ~TestMetroViewerProcessHost(); + // Launches the viewer process associated with the given |app_user_model_id| + // and blocks until that viewer process connects or until a timeout is + // reached. Returns true if the viewer process connects before the timeout is + // reached. + bool LaunchViewerAndWaitForConnection( + const base::string16& app_user_model_id); + + // IPC::Sender implementation: + virtual bool Send(IPC::Message* msg) OVERRIDE; + + // IPC::Listener implementation: + virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; + virtual void OnChannelError() OVERRIDE; + bool closed_unexpectedly() { return closed_unexpectedly_; } private: - // win8::MetroViewerProcessHost implementation - virtual void OnChannelError() OVERRIDE; - virtual void OnSetTargetSurface(gfx::NativeViewId target_surface) OVERRIDE; + void OnSetTargetSurface(gfx::NativeViewId target_surface); + + void NotifyChannelConnected(); + + // Inner message filter used to handle connection event on the IPC channel + // proxy's background thread. This prevents consumers of + // TestMetroViewerProcessHost from having to pump messages on their own + // message loop. + class InternalMessageFilter : public IPC::ChannelProxy::MessageFilter { + public: + InternalMessageFilter(TestMetroViewerProcessHost* owner); + + // IPC::ChannelProxy::MessageFilter implementation. + virtual void OnChannelConnected(int32 peer_pid) OVERRIDE; + + private: + TestMetroViewerProcessHost* owner_; + DISALLOW_COPY_AND_ASSIGN(InternalMessageFilter); + }; + + // Members related to the IPC channel. Note that the order is important + // here as ipc_thread_ should be destroyed after channel_. + base::Thread ipc_thread_; + scoped_ptr<IPC::ChannelProxy> channel_; + base::WaitableEvent channel_connected_event_; scoped_ptr<AcceleratedSurface> backing_surface; diff --git a/chrome/browser/DEPS b/chrome/browser/DEPS index 3a00e5c..84d57983 100644 --- a/chrome/browser/DEPS +++ b/chrome/browser/DEPS @@ -44,7 +44,6 @@ include_rules = [ "+sync/protocol", # Sync protobuf files. "+third_party/cros_system_api", "+win8/util", - "+win8/viewer", "+xib_localizers", # For generated mac localization helpers # TODO(stuartmorgan): Remove these by refactoring necessary code out of diff --git a/chrome/browser/browser_process_platform_part_aurawin.cc b/chrome/browser/browser_process_platform_part_aurawin.cc index e6be06d..f1730f9 100644 --- a/chrome/browser/browser_process_platform_part_aurawin.cc +++ b/chrome/browser/browser_process_platform_part_aurawin.cc @@ -9,7 +9,7 @@ #include "base/process_util.h" #include "base/win/windows_version.h" #include "chrome/browser/browser_process.h" -#include "chrome/browser/metro_viewer/chrome_metro_viewer_process_host_aurawin.h" +#include "chrome/browser/metro_viewer/metro_viewer_process_host_win.h" #include "chrome/common/chrome_switches.h" BrowserProcessPlatformPart::BrowserProcessPlatformPart() { @@ -29,7 +29,7 @@ void BrowserProcessPlatformPart::PlatformSpecificCommandLineProcessing( !metro_viewer_process_host_.get()) { // Tell the metro viewer process host to connect to the given IPC channel. metro_viewer_process_host_.reset( - new ChromeMetroViewerProcessHost( + new MetroViewerProcessHost( command_line.GetSwitchValueASCII(switches::kViewerConnection))); } } diff --git a/chrome/browser/browser_process_platform_part_aurawin.h b/chrome/browser/browser_process_platform_part_aurawin.h index ef231c4..b1b74a0 100644 --- a/chrome/browser/browser_process_platform_part_aurawin.h +++ b/chrome/browser/browser_process_platform_part_aurawin.h @@ -9,7 +9,7 @@ #include "base/memory/scoped_ptr.h" #include "chrome/browser/browser_process_platform_part_base.h" -class ChromeMetroViewerProcessHost; +class MetroViewerProcessHost; class BrowserProcessPlatformPart : public BrowserProcessPlatformPartBase { public: @@ -27,7 +27,7 @@ class BrowserProcessPlatformPart : public BrowserProcessPlatformPartBase { private: // Hosts the channel for the Windows 8 metro viewer process which runs in // the ASH environment. - scoped_ptr<ChromeMetroViewerProcessHost> metro_viewer_process_host_; + scoped_ptr<MetroViewerProcessHost> metro_viewer_process_host_; DISALLOW_COPY_AND_ASSIGN(BrowserProcessPlatformPart); }; diff --git a/chrome/browser/metro_viewer/chrome_metro_viewer_process_host_aurawin.h b/chrome/browser/metro_viewer/chrome_metro_viewer_process_host_aurawin.h deleted file mode 100644 index f3411c7..0000000 --- a/chrome/browser/metro_viewer/chrome_metro_viewer_process_host_aurawin.h +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2012 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 CHROME_BROWSER_METRO_VIEWER_CHROME_METRO_VIEWER_PROCESS_HOST_AURAWIN_H_ -#define CHROME_BROWSER_METRO_VIEWER_CHROME_METRO_VIEWER_PROCESS_HOST_AURAWIN_H_ - -#include <string> - -#include "win8/viewer/metro_viewer_process_host.h" - -class ChromeMetroViewerProcessHost : public win8::MetroViewerProcessHost { - public: - explicit ChromeMetroViewerProcessHost(const std::string& ipc_channel_name); - - private: - // win8::MetroViewerProcessHost implementation - virtual void OnChannelError() OVERRIDE; - virtual void OnSetTargetSurface(gfx::NativeViewId target_surface) OVERRIDE; - - DISALLOW_COPY_AND_ASSIGN(ChromeMetroViewerProcessHost); -}; - -#endif // CHROME_BROWSER_METRO_VIEWER_CHROME_METRO_VIEWER_PROCESS_HOST_AURAWIN_H_ diff --git a/chrome/browser/metro_viewer/chrome_metro_viewer_process_host_aurawin.cc b/chrome/browser/metro_viewer/metro_viewer_process_host_win.cc index 03385f7..b2c2d21 100644 --- a/chrome/browser/metro_viewer/chrome_metro_viewer_process_host_aurawin.cc +++ b/chrome/browser/metro_viewer/metro_viewer_process_host_win.cc @@ -2,10 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/metro_viewer/chrome_metro_viewer_process_host_aurawin.h" +#include "chrome/browser/metro_viewer/metro_viewer_process_host_win.h" #include "base/logging.h" -#include "base/memory/ref_counted.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process_platform_part_aurawin.h" #include "chrome/browser/ui/ash/ash_init.h" @@ -18,7 +17,9 @@ #include "content/public/browser/browser_thread.h" #include "content/public/browser/notification_service.h" #include "content/public/browser/web_contents.h" +#include "ipc/ipc_channel_proxy.h" #include "ui/aura/remote_root_window_host_win.h" +#include "ui/metro_viewer/metro_viewer_messages.h" #include "ui/surface/accelerated_surface_win.h" namespace { @@ -41,16 +42,43 @@ void CloseOpenAshBrowsers() { } // namespace -ChromeMetroViewerProcessHost::ChromeMetroViewerProcessHost( - const std::string& ipc_channel_name) - : MetroViewerProcessHost( - ipc_channel_name, - content::BrowserThread::GetMessageLoopProxyForThread( - content::BrowserThread::IO)) { + +MetroViewerProcessHost::MetroViewerProcessHost( + const std::string& ipc_channel_name) { g_browser_process->AddRefModule(); + channel_.reset(new IPC::ChannelProxy( + ipc_channel_name.c_str(), + IPC::Channel::MODE_NAMED_SERVER, + this, + content::BrowserThread::GetMessageLoopProxyForThread( + content::BrowserThread::IO))); +} + +MetroViewerProcessHost::~MetroViewerProcessHost() { +} + +base::ProcessId MetroViewerProcessHost::GetViewerProcessId() { + if (channel_) + return channel_->peer_pid(); + return base::kNullProcessId; +} + +bool MetroViewerProcessHost::Send(IPC::Message* msg) { + return channel_->Send(msg); +} + +bool MetroViewerProcessHost::OnMessageReceived(const IPC::Message& message) { + DCHECK(CalledOnValidThread()); + bool handled = true; + IPC_BEGIN_MESSAGE_MAP(MetroViewerProcessHost, message) + IPC_MESSAGE_HANDLER(MetroViewerHostMsg_SetTargetSurface, OnSetTargetSurface) + IPC_MESSAGE_UNHANDLED(handled = false) + IPC_END_MESSAGE_MAP() + return handled ? true : + aura::RemoteRootWindowHostWin::Instance()->OnMessageReceived(message); } -void ChromeMetroViewerProcessHost::OnChannelError() { +void MetroViewerProcessHost::OnChannelError() { // TODO(cpu): At some point we only close the browser. Right now this // is very convenient for developing. DLOG(INFO) << "viewer channel error : Quitting browser"; @@ -69,7 +97,7 @@ void ChromeMetroViewerProcessHost::OnChannelError() { g_browser_process->platform_part()->OnMetroViewerProcessTerminated(); } -void ChromeMetroViewerProcessHost::OnSetTargetSurface( +void MetroViewerProcessHost::OnSetTargetSurface( gfx::NativeViewId target_surface) { DLOG(INFO) << __FUNCTION__ << ", target_surface = " << target_surface; HWND hwnd = reinterpret_cast<HWND>(target_surface); diff --git a/chrome/browser/metro_viewer/metro_viewer_process_host_win.h b/chrome/browser/metro_viewer/metro_viewer_process_host_win.h new file mode 100644 index 0000000..765877b --- /dev/null +++ b/chrome/browser/metro_viewer/metro_viewer_process_host_win.h @@ -0,0 +1,47 @@ +// Copyright 2012 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 CHROME_BROWSER_METRO_VIEWER_METRO_VIEWER_PROCESS_HOST_WIN_H_ +#define CHROME_BROWSER_METRO_VIEWER_METRO_VIEWER_PROCESS_HOST_WIN_H_ + +#include <string> + +#include "base/memory/scoped_ptr.h" +#include "base/process_util.h" +#include "base/threading/non_thread_safe.h" +#include "ipc/ipc_listener.h" +#include "ipc/ipc_sender.h" +#include "ui/gfx/native_widget_types.h" + +namespace IPC { +class ChannelProxy; +} + +class MetroViewerProcessHost : public IPC::Listener, + public IPC::Sender, + public base::NonThreadSafe { + public: + explicit MetroViewerProcessHost(const std::string& ipc_channel_name); + virtual ~MetroViewerProcessHost(); + + // Returns the process id of the viewer process if one is connected to this + // host, returns base::kNullProcessId otherwise. + base::ProcessId GetViewerProcessId(); + + private: + // IPC::Sender implementation: + virtual bool Send(IPC::Message* msg) OVERRIDE; + + // IPC::Listener implementation: + virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; + virtual void OnChannelError() OVERRIDE; + + void OnSetTargetSurface(gfx::NativeViewId target_surface); + + scoped_ptr<IPC::ChannelProxy> channel_; + + DISALLOW_COPY_AND_ASSIGN(MetroViewerProcessHost); +}; + +#endif // CHROME_BROWSER_METRO_VIEWER_METRO_VIEWER_PROCESS_HOST_WIN_H_ diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi index 9da8adc..2b369a4 100644 --- a/chrome/chrome_browser.gypi +++ b/chrome/chrome_browser.gypi @@ -1094,8 +1094,6 @@ 'browser/metrics/variations/variations_request_scheduler_mobile.h', 'browser/metrics/variations/variations_service.cc', 'browser/metrics/variations/variations_service.h', - 'browser/metro_viewer/chrome_metro_viewer_process_host_aurawin.cc', - 'browser/metro_viewer/chrome_metro_viewer_process_host_aurawin.h', 'browser/native_window_notification_source.h', 'browser/net/about_protocol_handler.cc', 'browser/net/about_protocol_handler.h', @@ -2636,6 +2634,10 @@ ['exclude', '^browser/lifetime/application_lifetime_stub.cc'], ['exclude', '^browser/renderer_host/render_widget_host_view_views*'], ], + 'sources': [ + 'browser/metro_viewer/metro_viewer_process_host_win.cc', + 'browser/metro_viewer/metro_viewer_process_host_win.h', + ], 'dependencies': [ '../ui/aura/aura.gyp:aura', '../ui/compositor/compositor.gyp:compositor', @@ -2650,8 +2652,7 @@ ], 'dependencies': [ 'launcher_support', - '../ui/metro_viewer/metro_viewer.gyp:metro_viewer_messages', - '../win8/win8.gyp:metro_viewer', + '../ui/metro_viewer/metro_viewer.gyp:metro_viewer', ], }], ], diff --git a/ui/aura/aura.gyp b/ui/aura/aura.gyp index 547b719..feab883 100644 --- a/ui/aura/aura.gyp +++ b/ui/aura/aura.gyp @@ -122,8 +122,8 @@ }], ['OS=="win"', { 'dependencies': [ - '../metro_viewer/metro_viewer.gyp:metro_viewer_messages', - '../../ipc/ipc.gyp:ipc', + '../metro_viewer/metro_viewer.gyp:metro_viewer', + '../../ipc/ipc.gyp:ipc', ], }], ], diff --git a/ui/metro_viewer/metro_viewer.gyp b/ui/metro_viewer/metro_viewer.gyp index 00c3212..a9436d6 100644 --- a/ui/metro_viewer/metro_viewer.gyp +++ b/ui/metro_viewer/metro_viewer.gyp @@ -8,7 +8,7 @@ }, 'targets': [ { - 'target_name': 'metro_viewer_messages', + 'target_name': 'metro_viewer', 'type': 'static_library', 'dependencies': [ '../../base/base.gyp:base', @@ -25,3 +25,4 @@ }, ], } + diff --git a/win8/metro_driver/metro_driver.gyp b/win8/metro_driver/metro_driver.gyp index 623b000..f1f9892 100644 --- a/win8/metro_driver/metro_driver.gyp +++ b/win8/metro_driver/metro_driver.gyp @@ -58,7 +58,7 @@ '../../google_update/google_update.gyp:google_update', '../../ipc/ipc.gyp:ipc', '../../sandbox/sandbox.gyp:sandbox', - '../../ui/metro_viewer/metro_viewer.gyp:metro_viewer_messages', + '../../ui/metro_viewer/metro_viewer.gyp:metro_viewer', '../win8.gyp:check_sdk_patch', 'metro_driver_version_resources', ], diff --git a/win8/viewer/metro_viewer_process_host.cc b/win8/viewer/metro_viewer_process_host.cc deleted file mode 100644 index f945039..0000000 --- a/win8/viewer/metro_viewer_process_host.cc +++ /dev/null @@ -1,108 +0,0 @@ -// Copyright (c) 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 "win8/viewer/metro_viewer_process_host.h" - -#include <shlobj.h> - -#include "base/command_line.h" -#include "base/file_util.h" -#include "base/files/file_path.h" -#include "base/memory/ref_counted.h" -#include "base/process.h" -#include "base/string16.h" -#include "base/synchronization/waitable_event.h" -#include "base/time.h" -#include "base/win/scoped_comptr.h" -#include "ipc/ipc_message.h" -#include "ipc/ipc_message_macros.h" -#include "ui/aura/remote_root_window_host_win.h" -#include "ui/metro_viewer/metro_viewer_messages.h" - -namespace win8 { - -MetroViewerProcessHost::InternalMessageFilter::InternalMessageFilter( - MetroViewerProcessHost* owner) : owner_(owner) { -} - -void MetroViewerProcessHost::InternalMessageFilter::OnChannelConnected( - int32 /* peer_pid */) { - owner_->NotifyChannelConnected(); -} - -MetroViewerProcessHost::MetroViewerProcessHost( - const std::string& ipc_channel_name, - base::SingleThreadTaskRunner* ipc_task_runner) { - - channel_.reset(new IPC::ChannelProxy( - ipc_channel_name.c_str(), - IPC::Channel::MODE_NAMED_SERVER, - this, - ipc_task_runner)); -} - -MetroViewerProcessHost::~MetroViewerProcessHost() { -} - -base::ProcessId MetroViewerProcessHost::GetViewerProcessId() { - if (channel_) - return channel_->peer_pid(); - return base::kNullProcessId; -} - -bool MetroViewerProcessHost::LaunchViewerAndWaitForConnection( - const base::string16& app_user_model_id) { - DCHECK_EQ(base::kNullProcessId, channel_->peer_pid()); - - channel_connected_event_.reset(new base::WaitableEvent(false, false)); - - scoped_refptr<InternalMessageFilter> message_filter( - new InternalMessageFilter(this)); - channel_->AddFilter(message_filter); - - base::win::ScopedComPtr<IApplicationActivationManager> activator; - HRESULT hr = activator.CreateInstance(CLSID_ApplicationActivationManager); - if (SUCCEEDED(hr)) { - DWORD pid = 0; - hr = activator->ActivateApplication( - app_user_model_id.c_str(), L"open", AO_NONE, &pid); - } - - LOG_IF(ERROR, FAILED(hr)) << "Tried and failed to launch Metro Chrome. " - << "hr=" << std::hex << hr; - - // Having launched the viewer process, now we wait for it to connect. - bool success = - channel_connected_event_->TimedWait(base::TimeDelta::FromSeconds(60)); - channel_connected_event_.reset(); - - // |message_filter| is only used to signal |channel_connected_event_| above - // and can thus be removed after |channel_connected_event_| is no longer - // waiting. - channel_->RemoveFilter(message_filter); - return success; -} - -bool MetroViewerProcessHost::Send(IPC::Message* msg) { - return channel_->Send(msg); -} - -bool MetroViewerProcessHost::OnMessageReceived( - const IPC::Message& message) { - DCHECK(CalledOnValidThread()); - bool handled = true; - IPC_BEGIN_MESSAGE_MAP(MetroViewerProcessHost, message) - IPC_MESSAGE_HANDLER(MetroViewerHostMsg_SetTargetSurface, OnSetTargetSurface) - IPC_MESSAGE_UNHANDLED(handled = false) - IPC_END_MESSAGE_MAP() - return handled ? true : - aura::RemoteRootWindowHostWin::Instance()->OnMessageReceived(message); -} - -void MetroViewerProcessHost::NotifyChannelConnected() { - if (channel_connected_event_) - channel_connected_event_->Signal(); -} - -} // namespace win8 diff --git a/win8/viewer/metro_viewer_process_host.h b/win8/viewer/metro_viewer_process_host.h deleted file mode 100644 index 5be3a90..0000000 --- a/win8/viewer/metro_viewer_process_host.h +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright (c) 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. - -#ifndef WIN8_VIEWER_METRO_VIEWER_PROCESS_HOST_H_ -#define WIN8_VIEWER_METRO_VIEWER_PROCESS_HOST_H_ - -#include <string> - -#include "base/basictypes.h" -#include "base/memory/scoped_ptr.h" -#include "base/string16.h" -#include "base/threading/non_thread_safe.h" -#include "ipc/ipc_channel_proxy.h" -#include "ipc/ipc_listener.h" -#include "ipc/ipc_sender.h" -#include "ui/gfx/native_widget_types.h" - -namespace base { -class SingleThreadTaskRunner; -class WaitableEvent; -} - -namespace IPC { -class Message; -} - -namespace win8 { - -// Abstract base class for various Metro viewer process host implementations. -class MetroViewerProcessHost : public IPC::Listener, - public IPC::Sender, - public base::NonThreadSafe { - public: - // Initializes a viewer process host over |ipc_channel_name|. The given task - // runner correspond to a thread on which IPC::Channel is created and used - // (e.g. IO thread). Instantly connects to the viewer process if one is - // already connected to |ipc_channel_name|; a viewer can otherwise be - // launched synchronously via LaunchViewerAndWaitForConnection(). - MetroViewerProcessHost(const std::string& ipc_channel_name, - base::SingleThreadTaskRunner* ipc_task_runner); - virtual ~MetroViewerProcessHost(); - - // Returns the process id of the viewer process if one is connected to this - // host, returns base::kNullProcessId otherwise. - base::ProcessId GetViewerProcessId(); - - // Launches the viewer process associated with the given |app_user_model_id| - // and blocks until that viewer process connects or until a timeout is - // reached. Returns true if the viewer process connects before the timeout is - // reached. NOTE: this assumes that the app referred to by |app_user_model_id| - // is registered as the default browser. - bool LaunchViewerAndWaitForConnection( - const base::string16& app_user_model_id); - - private: - // IPC::Sender implementation: - virtual bool Send(IPC::Message* msg) OVERRIDE; - - // IPC::Listener implementation: - virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; - virtual void OnChannelError() OVERRIDE = 0; - - // Called over IPC by the viewer process to tell this host that it should be - // be drawing to |target_surface|. - virtual void OnSetTargetSurface(gfx::NativeViewId target_surface) = 0; - - void NotifyChannelConnected(); - - // Inner message filter used to handle connection event on the IPC channel - // proxy's background thread. This prevents consumers of - // MetroViewerProcessHost from having to pump messages on their own message - // loop. - class InternalMessageFilter : public IPC::ChannelProxy::MessageFilter { - public: - InternalMessageFilter(MetroViewerProcessHost* owner); - - // IPC::ChannelProxy::MessageFilter implementation. - virtual void OnChannelConnected(int32 peer_pid) OVERRIDE; - - private: - MetroViewerProcessHost* owner_; - DISALLOW_COPY_AND_ASSIGN(InternalMessageFilter); - }; - - scoped_ptr<IPC::ChannelProxy> channel_; - scoped_ptr<base::WaitableEvent> channel_connected_event_; - - DISALLOW_COPY_AND_ASSIGN(MetroViewerProcessHost); -}; - -} // namespace win8 - -#endif // WIN8_VIEWER_METRO_VIEWER_PROCESS_HOST_H_ diff --git a/win8/win8.gyp b/win8/win8.gyp index 6e3d5a8..7b198a1 100644 --- a/win8/win8.gyp +++ b/win8/win8.gyp @@ -51,20 +51,6 @@ ], }, { - 'target_name': 'metro_viewer', - 'type': 'static_library', - 'dependencies': [ - '../base/base.gyp:base', - '../ipc/ipc.gyp:ipc', - '../ui/aura/aura.gyp:aura', - '../ui/metro_viewer/metro_viewer.gyp:metro_viewer_messages', - ], - 'sources': [ - 'viewer/metro_viewer_process_host.cc', - 'viewer/metro_viewer_process_host.h', - ], - }, - { 'target_name': 'test_support_win8', 'type': 'static_library', 'dependencies': [ |