// Copyright 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 CONTENT_RENDERER_PEPPER_PEPPER_BROWSER_CONNECTION_H_
#define CONTENT_RENDERER_PEPPER_PEPPER_BROWSER_CONNECTION_H_
#include <map>
#include <string>
#include <vector>
#include "base/callback.h"
#include "base/files/file_path.h"
#include "content/public/renderer/render_frame_observer.h"
#include "content/public/renderer/render_frame_observer_tracker.h"
#include "ppapi/c/pp_file_info.h"
#include "ppapi/c/pp_instance.h"
#include "ppapi/c/pp_resource.h"
class GURL;
namespace content {
// This class represents a connection from the renderer to the browser for
// sending/receiving pepper ResourceHost related messages. When the browser
// and renderer communicate about ResourceHosts, they should pass the plugin
// process ID to identify which plugin they are talking about.
class PepperBrowserConnection
: public RenderFrameObserver,
public RenderFrameObserverTracker<PepperBrowserConnection> {
public:
typedef base::Callback<void(const std::vector<int>&)>
PendingResourceIDCallback;
explicit PepperBrowserConnection(RenderFrame* render_frame);
virtual ~PepperBrowserConnection();
virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
// TODO(teravest): Instead of having separate methods per message, we should
// add generic functionality similar to PluginResource::Call().
// Sends a request to the browser to create ResourceHosts for the given
// |instance| of a plugin identified by |child_process_id|. |callback| will be
// run when a reply is received with the pending resource IDs.
void SendBrowserCreate(PP_Instance instance,
int child_process_id,
const std::vector<IPC::Message>& create_messages,
const PendingResourceIDCallback& callback);
// Called when the renderer creates an in-process instance.
void DidCreateInProcessInstance(PP_Instance instance,
int render_view_id,
const GURL& document_url,
const GURL& plugin_url);
// Called when the renderer deletes an in-process instance.
void DidDeleteInProcessInstance(PP_Instance instance);
private:
// Message handlers.
void OnMsgCreateResourceHostsFromHostReply(
int32_t sequence_number,
const std::vector<int>& pending_resource_host_ids);
// Return the next sequence number.
int32_t GetNextSequence();
// Sequence number to track pending callbacks.
int32_t next_sequence_number_;
// Maps a sequence number to the callback to be run.
std::map<int32_t, PendingResourceIDCallback> pending_create_map_;
DISALLOW_COPY_AND_ASSIGN(PepperBrowserConnection);
};
} // namespace content
#endif // CONTENT_RENDERER_PEPPER_PEPPER_BROWSER_CONNECTION_H_