Index: mojo/shell/context.cc |
diff --git a/mojo/shell/context.cc b/mojo/shell/context.cc |
index 76cc7d6f548bf2cc4219ec0782239d8be05c304d..a6dea440434f5dcb109a1a1622eafb439b8f45e6 100644 |
--- a/mojo/shell/context.cc |
+++ b/mojo/shell/context.cc |
@@ -4,10 +4,13 @@ |
#include "mojo/shell/context.h" |
+#include <vector> |
+ |
#include "build/build_config.h" |
#include "base/command_line.h" |
#include "base/lazy_instance.h" |
#include "base/memory/scoped_vector.h" |
+#include "base/strings/string_split.h" |
#include "mojo/embedder/embedder.h" |
#include "mojo/gles2/gles2_support_impl.h" |
#include "mojo/public/cpp/application/application_impl.h" |
@@ -61,6 +64,32 @@ class Setup { |
static base::LazyInstance<Setup>::Leaky setup = LAZY_INSTANCE_INITIALIZER; |
+void InitContentHandlers(DynamicServiceLoader* loader, |
+ base::CommandLine* command_line) { |
+ std::string handlers_spec = command_line->GetSwitchValueASCII( |
+ switches::kContentHandlers); |
+ if (handlers_spec.empty()) |
+ return; |
+ |
+ std::vector<std::string> parts; |
+ base::SplitString(handlers_spec, ',', &parts); |
+ if (parts.size() % 2 != 0) { |
+ LOG(ERROR) << "Invalid value for switch " << switches::kContentHandlers |
+ << ": must be a comma-separated list of mimetype/url pairs."; |
+ return; |
+ } |
+ |
+ for (size_t i = 0; i < parts.size(); i += 2) { |
+ GURL url(parts[i + 1]); |
+ if (!url.is_valid()) { |
+ LOG(ERROR) << "Invalid value for switch " << switches::kContentHandlers |
+ << ": '" << parts[i + 1] << "' is not a valid URL."; |
+ return; |
+ } |
+ loader->RegisterContentHandler(parts[i], url); |
+ } |
+} |
+ |
} // namespace |
class Context::NativeViewportServiceLoader : public ServiceLoader { |
@@ -69,10 +98,12 @@ class Context::NativeViewportServiceLoader : public ServiceLoader { |
virtual ~NativeViewportServiceLoader() {} |
private: |
- virtual void LoadService(ServiceManager* manager, |
- const GURL& url, |
- ScopedMessagePipeHandle shell_handle) OVERRIDE { |
- app_.reset(services::CreateNativeViewportService(shell_handle.Pass())); |
+ virtual void Load(ServiceManager* manager, |
+ const GURL& url, |
+ scoped_refptr<LoadCallbacks> callbacks) OVERRIDE { |
+ ScopedMessagePipeHandle shell_handle = callbacks->RegisterApplication(); |
+ if (shell_handle.is_valid()) |
+ app_.reset(services::CreateNativeViewportService(shell_handle.Pass())); |
} |
virtual void OnServiceError(ServiceManager* manager, |
@@ -95,16 +126,19 @@ void Context::Init() { |
for (size_t i = 0; i < arraysize(kLocalMojoURLs); ++i) |
mojo_url_resolver_.AddLocalFileMapping(GURL(kLocalMojoURLs[i])); |
- base::CommandLine* cmdline = base::CommandLine::ForCurrentProcess(); |
+ base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); |
scoped_ptr<DynamicServiceRunnerFactory> runner_factory; |
- if (cmdline->HasSwitch(switches::kEnableMultiprocess)) |
+ if (command_line->HasSwitch(switches::kEnableMultiprocess)) |
runner_factory.reset(new OutOfProcessDynamicServiceRunnerFactory()); |
else |
runner_factory.reset(new InProcessDynamicServiceRunnerFactory()); |
+ DynamicServiceLoader* dynamic_service_loader = |
+ new DynamicServiceLoader(this, runner_factory.Pass()); |
+ InitContentHandlers(dynamic_service_loader, command_line); |
service_manager_.set_default_loader( |
- scoped_ptr<ServiceLoader>( |
- new DynamicServiceLoader(this, runner_factory.Pass()))); |
+ scoped_ptr<ServiceLoader>(dynamic_service_loader)); |
+ |
// The native viewport service synchronously waits for certain messages. If we |
// don't run it on its own thread we can easily deadlock. Long term native |
// viewport should run its own process so that this isn't an issue. |
@@ -140,9 +174,9 @@ void Context::Init() { |
"dbus"); |
#endif // defined(OS_LINUX) |
- if (cmdline->HasSwitch(switches::kSpy)) { |
- spy_.reset(new mojo::Spy(&service_manager_, |
- cmdline->GetSwitchValueASCII(switches::kSpy))); |
+ if (command_line->HasSwitch(switches::kSpy)) { |
+ spy_.reset(new mojo::Spy( |
+ &service_manager_, command_line->GetSwitchValueASCII(switches::kSpy))); |
} |
#if defined(OS_ANDROID) |