C++程序  |  73行  |  2.2 KB

// 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.

#ifndef MOJO_APPS_JS_CONTENT_HANDLER_H_
#define MOJO_APPS_JS_CONTENT_HANDLER_H_

#include "base/memory/ref_counted.h"
#include "base/memory/scoped_vector.h"
#include "mojo/public/cpp/application/application_delegate.h"
#include "mojo/public/cpp/application/interface_factory_impl.h"
#include "mojo/services/public/interfaces/content_handler/content_handler.mojom.h"

namespace mojo {

class ApplcationImpl;

namespace apps {

class ApplicationDelegateImpl;
class JSApp;

// Starts a new JSApp for each OnConnect call().

class ContentHandlerImpl : public InterfaceImpl<ContentHandler> {
 public:
  ContentHandlerImpl(ApplicationDelegateImpl* content_handler);
  virtual ~ContentHandlerImpl();

 private:
  virtual void OnConnect(const mojo::String& url,
                         URLResponsePtr content,
                         InterfaceRequest<ServiceProvider> service_provider)
      MOJO_OVERRIDE;

  ApplicationDelegateImpl* content_handler_;
};

// Manages the JSApps started by this content handler. This class owns the one
// reference to the Mojo shell. JSApps post a task to the content handler's
// thread to connect to a service or to quit.l

class ApplicationDelegateImpl : public ApplicationDelegate {
 public:
  ApplicationDelegateImpl();
  virtual ~ApplicationDelegateImpl();

  void StartJSApp(const std::string& url, URLResponsePtr content);
  void QuitJSApp(JSApp* app);

  void ConnectToService(ScopedMessagePipeHandle pipe_handle,
                        const std::string& application_url,
                        const std::string& interface_name);

 private:
  typedef ScopedVector<JSApp> AppVector;

  // ApplicationDelegate methods
  virtual void Initialize(ApplicationImpl* app) MOJO_OVERRIDE;
  virtual bool ConfigureIncomingConnection(ApplicationConnection* connection)
      MOJO_OVERRIDE;

  ApplicationImpl* application_impl_;
  InterfaceFactoryImplWithContext<ContentHandlerImpl, ApplicationDelegateImpl>
      content_handler_factory_;
  AppVector app_vector_;
};

}  // namespace apps
}  // namespace mojo

#endif  // MOJO_APPS_JS_CONTENT_HANDLER_H_