Index: chrome/browser/extensions/extension_function.h |
diff --git a/chrome/browser/extensions/extension_function.h b/chrome/browser/extensions/extension_function.h |
index f000bf1b51d05eb1d30132f6014c0c278209b565..c57f0b12b1f40018f0dc0c5e951c07ddb8fec49b 100644 |
--- a/chrome/browser/extensions/extension_function.h |
+++ b/chrome/browser/extensions/extension_function.h |
@@ -11,16 +11,22 @@ |
#include "base/memory/ref_counted.h" |
#include "base/memory/scoped_ptr.h" |
+#include "base/memory/weak_ptr.h" |
+#include "base/process.h" |
+#include "chrome/browser/extensions/extension_info_map.h" |
#include "chrome/browser/profiles/profile.h" |
#include "chrome/common/extensions/extension.h" |
#include "content/browser/browser_thread.h" |
#include "content/common/notification_observer.h" |
#include "content/common/notification_registrar.h" |
+#include "ipc/ipc_message.h" |
class Browser; |
+class ChromeRenderMessageFilter; |
class ExtensionFunction; |
class ExtensionFunctionDispatcher; |
class UIThreadExtensionFunction; |
+class IOThreadExtensionFunction; |
class ListValue; |
class QuotaLimitHeuristic; |
class RenderViewHost; |
@@ -59,6 +65,7 @@ class ExtensionFunction |
ExtensionFunction(); |
virtual UIThreadExtensionFunction* AsUIThreadExtensionFunction(); |
+ virtual IOThreadExtensionFunction* AsIOThreadExtensionFunction(); |
// Execute the API. Clients should initialize the ExtensionFunction using |
// SetArgs(), set_request_id(), and the other setters before calling this |
@@ -124,11 +131,17 @@ class ExtensionFunction |
// Sends the result back to the extension. |
virtual void SendResponse(bool success) = 0; |
+ // Common implementation for SenderResponse. |
+ void SendResponseImpl(base::ProcessHandle process, |
+ IPC::Message::Sender* ipc_sender, |
+ int routing_id, |
+ bool success); |
+ |
// Called when we receive an extension api request that is invalid in a way |
// that JSON validation in the renderer should have caught. This should never |
// happen and could be an attacker trying to exploit the browser, so we crash |
// the renderer instead. |
- virtual void HandleBadMessage() = 0; |
+ void HandleBadMessage(base::ProcessHandle process); |
// Return true if the argument to this function at |index| was provided and |
// is non-null. |
@@ -257,12 +270,52 @@ class UIThreadExtensionFunction : public ExtensionFunction { |
NotificationRegistrar registrar_; |
}; |
- virtual void HandleBadMessage(); |
- |
virtual void Destruct() const; |
scoped_ptr<RenderViewHostTracker> tracker_; |
+}; |
+ |
+// Extension functions that run on the IO thread. |
+class IOThreadExtensionFunction : public ExtensionFunction { |
+ public: |
+ IOThreadExtensionFunction(); |
+ |
+ virtual IOThreadExtensionFunction* AsIOThreadExtensionFunction() OVERRIDE; |
+ |
+ void set_ipc_sender(base::WeakPtr<ChromeRenderMessageFilter> ipc_sender, |
+ int routing_id) { |
+ ipc_sender_ = ipc_sender; |
+ routing_id_ = routing_id; |
+ } |
+ ChromeRenderMessageFilter* ipc_sender() const { return ipc_sender_.get(); } |
+ int routing_id() const { return routing_id_; } |
+ |
+ base::WeakPtr<ChromeRenderMessageFilter> ipc_sender_weak() const { |
+ return ipc_sender_; |
+ } |
+ |
+ void set_extension_info_map(const ExtensionInfoMap* extension_info_map) { |
+ extension_info_map_ = extension_info_map; |
+ } |
+ const ExtensionInfoMap* extension_info_map() const { |
+ return extension_info_map_.get(); |
+ } |
+ |
+ protected: |
+ friend struct BrowserThread::DeleteOnThread<BrowserThread::IO>; |
+ friend class DeleteTask<IOThreadExtensionFunction>; |
+ virtual ~IOThreadExtensionFunction(); |
+ |
+ virtual void Destruct() const; |
+ |
+ virtual void SendResponse(bool success); |
+ |
+ private: |
+ base::WeakPtr<ChromeRenderMessageFilter> ipc_sender_; |
+ int routing_id_; |
+ |
+ scoped_refptr<const ExtensionInfoMap> extension_info_map_; |
}; |
// Base class for an extension function that runs asynchronously *relative to |
@@ -290,9 +343,16 @@ class SyncExtensionFunction : public UIThreadExtensionFunction { |
protected: |
virtual ~SyncExtensionFunction(); |
+}; |
- private: |
- DISALLOW_COPY_AND_ASSIGN(SyncExtensionFunction); |
+class SyncIOThreadExtensionFunction : public IOThreadExtensionFunction { |
+ public: |
+ SyncIOThreadExtensionFunction(); |
+ |
+ virtual void Run() OVERRIDE; |
+ |
+ protected: |
+ virtual ~SyncIOThreadExtensionFunction(); |
}; |
#endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_FUNCTION_H_ |