blob: 67fa6e494d661bfd14807d7c0d8a8decd5768b21 [file] [log] [blame]
[email protected]f55c90ee62014-04-12 00:50:031// Copyright 2014 The Chromium Authors. All rights reserved.
[email protected]f7885d42012-04-03 08:30:042// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
[email protected]f55c90ee62014-04-12 00:50:035#ifndef EXTENSIONS_RENDERER_REQUEST_SENDER_H_
6#define EXTENSIONS_RENDERER_REQUEST_SENDER_H_
[email protected]f7885d42012-04-03 08:30:047
[email protected]f7885d42012-04-03 08:30:048#include <map>
[email protected]f55c90ee62014-04-12 00:50:039#include <string>
[email protected]f7885d42012-04-03 08:30:0410
avi2d124c02015-12-23 06:36:4211#include "base/macros.h"
[email protected]f7885d42012-04-03 08:30:0412#include "v8/include/v8.h"
13
[email protected]f7885d42012-04-03 08:30:0414namespace base {
15class ListValue;
16}
17
[email protected]8fe74bf2012-08-07 21:08:4218namespace extensions {
Devlin Cronin4607e322017-07-17 16:17:1819class IPCMessageSender;
[email protected]f55c90ee62014-04-12 00:50:0320class ScriptContext;
[email protected]8fe74bf2012-08-07 21:08:4221
[email protected]f7885d42012-04-03 08:30:0422struct PendingRequest;
23
24// Responsible for sending requests for named extension API functions to the
25// extension host and routing the responses back to the caller.
[email protected]8fe74bf2012-08-07 21:08:4226class RequestSender {
[email protected]f7885d42012-04-03 08:30:0427 public:
[email protected]ec47b082013-03-29 14:46:1728 // Source represents a user of RequestSender. Every request is associated with
29 // a Source object, which will be notified when the corresponding response
30 // arrives. When a Source object is going away and there are pending requests,
31 // it should call InvalidateSource() to make sure no notifications are sent to
32 // it later.
33 class Source {
34 public:
35 virtual ~Source() {}
36
[email protected]f55c90ee62014-04-12 00:50:0337 virtual ScriptContext* GetContext() = 0;
[email protected]ec47b082013-03-29 14:46:1738 virtual void OnResponseReceived(const std::string& name,
39 int request_id,
40 bool success,
41 const base::ListValue& response,
42 const std::string& error) = 0;
43 };
44
Devlin Cronin4607e322017-07-17 16:17:1845 explicit RequestSender(IPCMessageSender* ipc_message_sender);
46 ~RequestSender();
[email protected]f7885d42012-04-03 08:30:0447
[email protected]ec47b082013-03-29 14:46:1748 // In order to avoid collision, all |request_id|s passed into StartRequest()
49 // should be generated by this method.
50 int GetNextRequestId() const;
51
[email protected]f7885d42012-04-03 08:30:0452 // Makes a call to the API function |name| that is to be handled by the
[email protected]74e21e72012-07-09 21:20:5353 // extension host. The response to this request will be received in
54 // HandleResponse().
55 // TODO(koz): Remove |request_id| and generate that internally.
[email protected]4f1633f2013-03-09 14:26:2456 // There are multiple of these per render view though, so we'll
57 // need to vend the IDs centrally.
rdevlin.croninb2b31392016-06-22 23:39:1358 // Returns true if the request is successfully sent.
59 bool StartRequest(Source* source,
[email protected]4f1633f2013-03-09 14:26:2460 const std::string& name,
[email protected]74e21e72012-07-09 21:20:5361 int request_id,
62 bool has_callback,
63 bool for_io_thread,
64 base::ListValue* value_args);
65
[email protected]74e21e72012-07-09 21:20:5366 // Handles responses from the extension host to calls made by StartRequest().
67 void HandleResponse(int request_id,
68 bool success,
69 const base::ListValue& response,
70 const std::string& error);
71
[email protected]ec47b082013-03-29 14:46:1772 // Notifies this that a request source is no longer valid.
[email protected]4f1633f2013-03-09 14:26:2473 // TODO(kalman): Do this in a generic/safe way.
[email protected]ec47b082013-03-29 14:46:1774 void InvalidateSource(Source* source);
[email protected]f7885d42012-04-03 08:30:0475
76 private:
[email protected]eb7ef5f2014-02-06 09:59:1977 friend class ScopedTabID;
lazyboy4cbdfe0a2016-09-02 05:32:3278 using PendingRequestMap = std::map<int, std::unique_ptr<PendingRequest>>;
[email protected]f7885d42012-04-03 08:30:0479
lazyboy4cbdfe0a2016-09-02 05:32:3280 void InsertRequest(int request_id,
81 std::unique_ptr<PendingRequest> pending_request);
82 std::unique_ptr<PendingRequest> RemoveRequest(int request_id);
[email protected]f7885d42012-04-03 08:30:0483
[email protected]21776be2012-07-09 03:53:3284 PendingRequestMap pending_requests_;
85
Devlin Cronin4607e322017-07-17 16:17:1886 // Guaranteed to outlive this object.
87 IPCMessageSender* const ipc_message_sender_;
88
[email protected]8fe74bf2012-08-07 21:08:4289 DISALLOW_COPY_AND_ASSIGN(RequestSender);
[email protected]f7885d42012-04-03 08:30:0490};
91
[email protected]8fe74bf2012-08-07 21:08:4292} // namespace extensions
93
[email protected]f55c90ee62014-04-12 00:50:0394#endif // EXTENSIONS_RENDERER_REQUEST_SENDER_H_