Ignore messages sent from resources after a PluginDispatcher has been destroyed
The PluginDispatcher can be freed but resources are leaked and can still attempt
to send messages. We ignore these messages now.
Bug: 725033
Change-Id: Ifb580070cf7e6eb25b5d5ec9d4dd6691c22f5489
Reviewed-on: https://chromium-review.googlesource.com/583416
Reviewed-by: Antoine Labour <[email protected]>
Commit-Queue: Raymes Khoury <[email protected]>
Cr-Commit-Position: refs/heads/master@{#489580}
diff --git a/ppapi/proxy/connection.h b/ppapi/proxy/connection.h
index cc8255c..cec3e08 100644
--- a/ppapi/proxy/connection.h
+++ b/ppapi/proxy/connection.h
@@ -6,6 +6,7 @@
#define PPAPI_PROXY_CONNECTION_H_
#include "ipc/ipc_message.h"
+#include "ppapi/proxy/plugin_dispatcher.h"
namespace IPC {
class Sender;
@@ -16,32 +17,48 @@
// This struct holds the channels that a resource uses to send message to the
// browser and renderer.
-struct Connection {
- Connection() : browser_sender(0),
- renderer_sender(0),
- in_process(false),
- browser_sender_routing_id(MSG_ROUTING_NONE) {
- }
- Connection(IPC::Sender* browser, IPC::Sender* renderer)
- : browser_sender(browser),
- renderer_sender(renderer),
- in_process(false),
- browser_sender_routing_id(MSG_ROUTING_NONE) {
- }
- Connection(IPC::Sender* browser, IPC::Sender* renderer, int routing_id)
- : browser_sender(browser),
- renderer_sender(renderer),
- in_process(true),
- browser_sender_routing_id(routing_id) {
- }
+class Connection {
+ public:
+ Connection()
+ : browser_sender_(nullptr),
+ in_process_renderer_sender_(nullptr),
+ in_process_(false),
+ browser_sender_routing_id_(MSG_ROUTING_NONE) {}
+ Connection(
+ IPC::Sender* browser,
+ scoped_refptr<PluginDispatcher::Sender> out_of_process_renderer_sender)
+ : browser_sender_(browser),
+ in_process_renderer_sender_(nullptr),
+ out_of_process_renderer_sender_(out_of_process_renderer_sender),
+ in_process_(false),
+ browser_sender_routing_id_(MSG_ROUTING_NONE) {}
+ Connection(IPC::Sender* browser,
+ IPC::Sender* in_process_renderer_sender,
+ int routing_id)
+ : browser_sender_(browser),
+ in_process_renderer_sender_(in_process_renderer_sender),
+ in_process_(true),
+ browser_sender_routing_id_(routing_id) {}
- IPC::Sender* browser_sender;
- IPC::Sender* renderer_sender;
- bool in_process;
+ IPC::Sender* GetRendererSender() {
+ return in_process_ ? in_process_renderer_sender_
+ : out_of_process_renderer_sender_.get();
+ }
+ IPC::Sender* browser_sender() { return browser_sender_; }
+ bool in_process() { return in_process_; }
+ int browser_sender_routing_id() { return browser_sender_routing_id_; }
+
+ private:
+ IPC::Sender* browser_sender_;
+
+ IPC::Sender* in_process_renderer_sender_;
+ scoped_refptr<PluginDispatcher::Sender> out_of_process_renderer_sender_;
+
+ bool in_process_;
// We need to use a routing ID when a plugin is in-process, and messages are
// sent back from the browser to the renderer. This is so that messages are
// routed to the proper RenderFrameImpl.
- int browser_sender_routing_id;
+ int browser_sender_routing_id_;
};
} // namespace proxy