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