 Chromium Code Reviews
 Chromium Code Reviews Issue 591463003:
  Remote Assistance on Chrome OS Part III - NativeMessageHost  (Closed) 
  Base URL: https://chromium.googlesource.com/chromium/src.git@native_messaging
    
  
    Issue 591463003:
  Remote Assistance on Chrome OS Part III - NativeMessageHost  (Closed) 
  Base URL: https://chromium.googlesource.com/chromium/src.git@native_messaging| Index: chrome/browser/extensions/api/messaging/native_message_host_chromeos.cc | 
| diff --git a/chrome/browser/extensions/api/messaging/native_message_host_chromeos.cc b/chrome/browser/extensions/api/messaging/native_message_host_chromeos.cc | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..61fc49ee8799a546445e745a511b01efa77770da | 
| --- /dev/null | 
| +++ b/chrome/browser/extensions/api/messaging/native_message_host_chromeos.cc | 
| @@ -0,0 +1,149 @@ | 
| +// 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 "extensions/browser/api/messaging/native_message_host.h" | 
| + | 
| +#include <map> | 
| +#include <string> | 
| +#include "base/bind.h" | 
| 
Sergey Ulanov
2014/09/22 23:42:58
empty line above this one
 
kelvinp
2014/09/23 20:16:41
Done.
 | 
| +#include "base/callback.h" | 
| +#include "base/memory/scoped_ptr.h" | 
| +#include "base/memory/weak_ptr.h" | 
| +#include "extensions/common/constants.h" | 
| +#include "extensions/common/url_pattern_set.h" | 
| +#include "ui/gfx/native_widget_types.h" | 
| +#include "url/gurl.h" | 
| + | 
| +namespace extensions { | 
| + | 
| +namespace { | 
| + | 
| +typedef NativeMessageHost::Client Client; | 
| +typedef base::Callback<scoped_ptr<NativeMessageHost>( | 
| + base::WeakPtr<Client> weak_client_ui, | 
| + int destination_port)> NativeMessageHostFactoryMethod; | 
| + | 
| +// A simple NativeMesageHost that echoes the received message. It is currently | 
| +// used for testing. | 
| +// TODO(kelvinp): Replace this class once Remote Assistance in process host | 
| +// is implemented. | 
| +class EchoHost : public NativeMessageHost { | 
| + public: | 
| + scoped_ptr<NativeMessageHost> static CreateEchoHost( | 
| + base::WeakPtr<Client> weak_client_ui, | 
| + int destination_port) { | 
| + return scoped_ptr<NativeMessageHost>( | 
| + new EchoHost(weak_client_ui, destination_port)); | 
| + } | 
| + | 
| + EchoHost(base::WeakPtr<Client> client, int port) | 
| + : client_(client), port_(port) {} | 
| + | 
| + virtual void Send(const std::string& json) OVERRIDE { | 
| + client_->PostMessageFromNative(port_, json); | 
| + }; | 
| + | 
| + private: | 
| + base::WeakPtr<Client> client_; | 
| + int port_; | 
| + | 
| + DISALLOW_COPY_AND_ASSIGN(EchoHost); | 
| +}; | 
| + | 
| +// A data structure that encapsulates the factory method and the list of | 
| +// extensions that are allowed to connect to the NativeMessageHost. | 
| +class HostDescriptor { | 
| + public: | 
| + explicit HostDescriptor(NativeMessageHostFactoryMethod method); | 
| + void AddAllowedOrigin(const std::string& pattern); | 
| + | 
| + URLPatternSet allowed_origins; | 
| + NativeMessageHostFactoryMethod factory_method; | 
| + | 
| + private: | 
| + DISALLOW_COPY_AND_ASSIGN(HostDescriptor); | 
| +}; | 
| + | 
| +typedef std::map<std::string, HostDescriptor*> HostMap; | 
| 
Sergey Ulanov
2014/09/22 23:42:58
This all seems to be more complicated than it need
 
kelvinp
2014/09/23 20:16:41
Done.
 | 
| +typedef std::pair<std::string, HostDescriptor*> Entry; | 
| + | 
| +class NativeMessageHostFactory { | 
| + public: | 
| + NativeMessageHostFactory(); | 
| + ~NativeMessageHostFactory(); | 
| + scoped_ptr<NativeMessageHost> Create(base::WeakPtr<Client> weak_client_ui, | 
| + const std::string& source_extension_id, | 
| + const std::string& native_host_name, | 
| + int destination_port); | 
| + | 
| + private: | 
| + HostMap host_table_; | 
| + | 
| + DISALLOW_COPY_AND_ASSIGN(NativeMessageHostFactory); | 
| +}; | 
| + | 
| +NativeMessageHostFactory* g_host_factory; | 
| 
Sergey Ulanov
2014/09/22 23:42:58
As mentioned above I don't think you need this. Bu
 
kelvinp
2014/09/23 20:16:41
Done.
 | 
| + | 
| +} // namespace | 
| + | 
| +HostDescriptor::HostDescriptor(NativeMessageHostFactoryMethod method) | 
| + : factory_method(method) { | 
| +} | 
| + | 
| +void HostDescriptor::AddAllowedOrigin(const std::string& pattern) { | 
| + URLPattern allowed_origin(URLPattern::SCHEME_ALL); | 
| + DCHECK_EQ(URLPattern::PARSE_SUCCESS, allowed_origin.Parse(pattern)); | 
| + allowed_origins.AddPattern(allowed_origin); | 
| +} | 
| + | 
| +NativeMessageHostFactory::NativeMessageHostFactory() { | 
| + // Initializes the host table for remote assistance. | 
| + // TODO(kelvinp): Create the actual It2Me host. | 
| + HostDescriptor* remote_assistance = | 
| + new HostDescriptor(base::Bind(&EchoHost::CreateEchoHost)); | 
| + remote_assistance->AddAllowedOrigin( | 
| + "chrome-extension://ljacajndfccfgnfohlgkdphmbnpkjflk/"); | 
| 
Sergey Ulanov
2014/09/22 23:42:58
You need to whitelist all chromoting IDs. See remo
 
kelvinp
2014/09/23 20:16:41
Done.
 | 
| + host_table_.insert( | 
| + Entry("com.google.chrome.remote_assistance", remote_assistance)); | 
| +} | 
| + | 
| +scoped_ptr<NativeMessageHost> NativeMessageHostFactory::Create( | 
| + base::WeakPtr<Client> weak_client_ui, | 
| + const std::string& source_extension_id, | 
| + const std::string& native_host_name, | 
| + int destination_port) { | 
| + // Look up the host descriptor based on the host name. | 
| + HostMap::iterator it = host_table_.find(native_host_name); | 
| + if (it == host_table_.end()) { | 
| + return scoped_ptr<NativeMessageHost>(); | 
| + } | 
| + | 
| + // Ensure only the white-listed extensions can connect to the native | 
| + // component. | 
| + HostDescriptor* descriptor = it->second; | 
| + GURL origin(std::string(kExtensionScheme) + "://" + source_extension_id); | 
| + if (!descriptor->allowed_origins.MatchesSecurityOrigin(origin)) { | 
| + return scoped_ptr<NativeMessageHost>(); | 
| + } | 
| + | 
| + // Create the Host. | 
| + return descriptor->factory_method.Run(weak_client_ui, destination_port); | 
| +} | 
| + | 
| +scoped_ptr<NativeMessageHost> NativeMessageHost::Create( | 
| + gfx::NativeView native_view, | 
| + base::WeakPtr<Client> weak_client_ui, | 
| + const std::string& source_extension_id, | 
| + const std::string& native_host_name, | 
| + int destination_port, | 
| + bool allow_user_level) { | 
| + if (!g_host_factory) { | 
| + g_host_factory = new NativeMessageHostFactory(); | 
| + } | 
| + | 
| + return g_host_factory->Create( | 
| + weak_client_ui, source_extension_id, native_host_name, destination_port); | 
| +} | 
| + | 
| +} // namespace extensions |