Chromium Code Reviews| Index: content/public/browser/web_ui_message_handler.h |
| diff --git a/content/public/browser/web_ui_message_handler.h b/content/public/browser/web_ui_message_handler.h |
| index 3a33ab1db4993ed9b80f9c6fd7c09b5cfedaa32e..a8a35cf9af814260b49f611d69a3d784e85043bd 100644 |
| --- a/content/public/browser/web_ui_message_handler.h |
| +++ b/content/public/browser/web_ui_message_handler.h |
| @@ -5,9 +5,13 @@ |
| #ifndef CONTENT_PUBLIC_BROWSER_WEB_UI_MESSAGE_HANDLER_H_ |
| #define CONTENT_PUBLIC_BROWSER_WEB_UI_MESSAGE_HANDLER_H_ |
| +#include <vector> |
| + |
| #include "base/gtest_prod_util.h" |
| +#include "base/logging.h" |
| #include "base/strings/string16.h" |
| #include "content/common/content_export.h" |
| +#include "content/public/browser/web_ui.h" |
| class GURL; |
| class WebUIBrowserTest; |
| @@ -15,6 +19,7 @@ class WebUIBrowserTest; |
| namespace base { |
| class DictionaryValue; |
| class ListValue; |
| +class Value; |
| } |
| namespace content { |
| @@ -27,7 +32,7 @@ class WebUIImpl; |
| // host is destroyed. |
| class CONTENT_EXPORT WebUIMessageHandler { |
| public: |
| - WebUIMessageHandler() : web_ui_(nullptr) {} |
| + WebUIMessageHandler() : javascript_allowed_(false), web_ui_(nullptr) {} |
| virtual ~WebUIMessageHandler() {} |
| protected: |
| @@ -35,6 +40,12 @@ class CONTENT_EXPORT WebUIMessageHandler { |
| FRIEND_TEST_ALL_PREFIXES(WebUIMessageHandlerTest, ExtractDoubleValue); |
| FRIEND_TEST_ALL_PREFIXES(WebUIMessageHandlerTest, ExtractStringValue); |
| + // Subclasses must call this once the page is ready for JavaScript calls |
| + // from this handler. |
| + void AllowJavascript(); |
| + |
| + bool IsJavascriptAllowed() const { return javascript_allowed_; } |
|
Dan Beam
2016/04/18 23:13:20
this should probably also check some other things,
Dan Beam
2016/04/18 23:13:20
if this isn't virtual, javascript_allowed() instea
tommycli
2016/04/19 17:45:38
Done.
tommycli
2016/04/19 17:45:38
I opted not to use lowercase because the new versi
|
| + |
| // Helper methods: |
| // Extract an integer value from a list Value. |
| @@ -47,14 +58,36 @@ class CONTENT_EXPORT WebUIMessageHandler { |
| // Extract a string value from a list Value. |
| static base::string16 ExtractStringValue(const base::ListValue* value); |
| - // Called when a RenderView is reused to display a page (i.e. reload). |
| - virtual void RenderViewReused() {} |
| - |
| // This is where subclasses specify which messages they'd like to handle and |
| // perform any additional initialization.. At this point web_ui() will return |
| // the associated WebUI object. |
| virtual void RegisterMessages() = 0; |
| + // Will be called whenever JavaScript from this handler becomes allowed from |
| + // the disallowed state. Subclasses should override this method to register |
| + // observers that push JavaScript calls to the page. |
| + virtual void OnJavascriptAllowed() {} |
| + |
| + // Will be called whenever JavaScript from this handler becomes disallowed |
| + // from the allowed state. This will never be called before |
| + // OnJavascriptAllowed has been called. Subclasses should override this method |
| + // to deregister or disabled observers that push JavaScript calls to the page. |
| + virtual void OnJavascriptDisallowed() {} |
| + |
| + // Call a Javascript function by sending its name and arguments down to |
| + // the renderer. This is asynchronous; there's no way to get the result |
| + // of the call, and should be thought of more like sending a message to |
| + // the page. |
| + // All function names in WebUI must consist of only ASCII characters. |
| + // These functions will crash if JavaScript is not currently allowed. |
| + template <typename... Values> |
|
Dan Beam
2016/04/18 23:13:21
til: "Variadic Templates" are a thing
tommycli
2016/04/19 17:45:38
lol, I wrote this with the C++11 reference manual
|
| + void CallJavascriptFunction(const std::string& function_name, |
| + const Values&... values) { |
| + CHECK(javascript_allowed_) << |
| + "Cannot CallJavascriptFunction before explicitly allowing JavaScript."; |
| + web_ui()->CallJavascriptFunction(function_name, values...); |
| + } |
| + |
| // Returns the attached WebUI for this handler. |
| WebUI* web_ui() const { return web_ui_; } |
| @@ -62,10 +95,17 @@ class CONTENT_EXPORT WebUIMessageHandler { |
| void set_web_ui(WebUI* web_ui) { web_ui_ = web_ui; } |
| private: |
| - // Provide external classes access to web_ui() and set_web_ui(). |
| + // Provide external classes access to web_ui(), set_web_ui(), and |
| + // RenderViewReused. |
| friend class WebUIImpl; |
| friend class ::WebUIBrowserTest; |
| + // Called when a RenderView is reused to display a page (i.e. reload). |
| + void RenderViewReused(); |
| + |
| + // True if the page is for JavaScript calls from this handler. |
| + bool javascript_allowed_; |
| + |
| WebUI* web_ui_; |
| }; |