1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef MOJO_APPS_JS_CONTENT_HANDLER_H_
6#define MOJO_APPS_JS_CONTENT_HANDLER_H_
7
8#include "base/memory/ref_counted.h"
9#include "base/memory/scoped_vector.h"
10#include "mojo/public/cpp/application/application_delegate.h"
11#include "mojo/public/cpp/application/interface_factory_impl.h"
12#include "mojo/services/public/interfaces/content_handler/content_handler.mojom.h"
13
14namespace mojo {
15
16class ApplcationImpl;
17
18namespace apps {
19
20class ApplicationDelegateImpl;
21class JSApp;
22
23// Starts a new JSApp for each OnConnect call().
24
25class ContentHandlerImpl : public InterfaceImpl<ContentHandler> {
26 public:
27  ContentHandlerImpl(ApplicationDelegateImpl* content_handler);
28  virtual ~ContentHandlerImpl();
29
30 private:
31  virtual void OnConnect(const mojo::String& url,
32                         URLResponsePtr content,
33                         InterfaceRequest<ServiceProvider> service_provider)
34      MOJO_OVERRIDE;
35
36  ApplicationDelegateImpl* content_handler_;
37};
38
39// Manages the JSApps started by this content handler. This class owns the one
40// reference to the Mojo shell. JSApps post a task to the content handler's
41// thread to connect to a service or to quit.l
42
43class ApplicationDelegateImpl : public ApplicationDelegate {
44 public:
45  ApplicationDelegateImpl();
46  virtual ~ApplicationDelegateImpl();
47
48  void StartJSApp(const std::string& url, URLResponsePtr content);
49  void QuitJSApp(JSApp* app);
50
51  void ConnectToService(ScopedMessagePipeHandle pipe_handle,
52                        const std::string& application_url,
53                        const std::string& interface_name);
54
55 private:
56  typedef ScopedVector<JSApp> AppVector;
57
58  // ApplicationDelegate methods
59  virtual void Initialize(ApplicationImpl* app) MOJO_OVERRIDE;
60  virtual bool ConfigureIncomingConnection(ApplicationConnection* connection)
61      MOJO_OVERRIDE;
62
63  ApplicationImpl* application_impl_;
64  InterfaceFactoryImplWithContext<ContentHandlerImpl, ApplicationDelegateImpl>
65      content_handler_factory_;
66  AppVector app_vector_;
67};
68
69}  // namespace apps
70}  // namespace mojo
71
72#endif  // MOJO_APPS_JS_CONTENT_HANDLER_H_
73