Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1743)

Unified Diff: content/test/browser_test_utils.cc

Issue 10795090: Move ExecuteJavaScript functions from ui_test_utils.h to browser_test_utils.h so they can be reused… (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 8 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/public/test/browser_test_utils.h ('k') | content/test/layout_browsertest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/test/browser_test_utils.cc
===================================================================
--- content/test/browser_test_utils.cc (revision 148111)
+++ content/test/browser_test_utils.cc (working copy)
@@ -4,42 +4,100 @@
#include "content/public/test/browser_test_utils.h"
+#include "base/json/json_reader.h"
+#include "base/utf_string_conversions.h"
+#include "content/public/browser/dom_operation_notification_details.h"
#include "content/public/browser/notification_types.h"
#include "content/public/browser/render_view_host.h"
#include "content/public/browser/web_contents.h"
+#include "content/public/browser/web_contents_observer.h"
#include "content/public/browser/web_contents_view.h"
#include "content/public/test/test_utils.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace content {
-void SimulateMouseClick(WebContents* web_contents) {
- int x = web_contents->GetView()->GetContainerSize().width() / 2;
- int y = web_contents->GetView()->GetContainerSize().height() / 2;
- WebKit::WebMouseEvent mouse_event;
- mouse_event.type = WebKit::WebInputEvent::MouseDown;
- mouse_event.button = WebKit::WebMouseEvent::ButtonLeft;
- mouse_event.x = x;
- mouse_event.y = y;
- // Mac needs globalX/globalY for events to plugins.
- gfx::Rect offset;
- web_contents->GetView()->GetContainerBounds(&offset);
- mouse_event.globalX = x + offset.x();
- mouse_event.globalY = y + offset.y();
- mouse_event.clickCount = 1;
- web_contents->GetRenderViewHost()->ForwardMouseEvent(mouse_event);
- mouse_event.type = WebKit::WebInputEvent::MouseUp;
- web_contents->GetRenderViewHost()->ForwardMouseEvent(mouse_event);
-}
+namespace {
-void SimulateMouseEvent(WebContents* web_contents,
- WebKit::WebInputEvent::Type type,
- const gfx::Point& point) {
- WebKit::WebMouseEvent mouse_event;
- mouse_event.type = type;
- mouse_event.x = point.x();
- mouse_event.y = point.y();
- web_contents->GetRenderViewHost()->ForwardMouseEvent(mouse_event);
+class DOMOperationObserver : public NotificationObserver,
+ public WebContentsObserver {
+ public:
+ explicit DOMOperationObserver(RenderViewHost* render_view_host)
+ : WebContentsObserver(WebContents::FromRenderViewHost(render_view_host)),
+ did_respond_(false) {
+ registrar_.Add(this, NOTIFICATION_DOM_OPERATION_RESPONSE,
+ Source<RenderViewHost>(render_view_host));
+ message_loop_runner_ = new MessageLoopRunner;
+ }
+
+ virtual void Observe(int type,
+ const NotificationSource& source,
+ const NotificationDetails& details) OVERRIDE {
+ DCHECK(type == NOTIFICATION_DOM_OPERATION_RESPONSE);
+ Details<DomOperationNotificationDetails> dom_op_details(details);
+ response_ = dom_op_details->json;
+ did_respond_ = true;
+ message_loop_runner_->Quit();
+ }
+
+ // Overridden from WebContentsObserver:
+ virtual void RenderViewGone(base::TerminationStatus status) OVERRIDE {
+ message_loop_runner_->Quit();
+ }
+
+ bool WaitAndGetResponse(std::string* response) WARN_UNUSED_RESULT {
+ message_loop_runner_->Run();
+ *response = response_;
+ return did_respond_;
+ }
+
+ private:
+ NotificationRegistrar registrar_;
+ std::string response_;
+ bool did_respond_;
+ scoped_refptr<MessageLoopRunner> message_loop_runner_;
+
+ DISALLOW_COPY_AND_ASSIGN(DOMOperationObserver);
+};
+
+// Specifying a prototype so that we can add the WARN_UNUSED_RESULT attribute.
+bool ExecuteJavaScriptHelper(RenderViewHost* render_view_host,
+ const std::wstring& frame_xpath,
+ const std::wstring& original_script,
+ scoped_ptr<Value>* result) WARN_UNUSED_RESULT;
+
+// Executes the passed |original_script| in the frame pointed to by
+// |frame_xpath|. If |result| is not NULL, stores the value that the evaluation
+// of the script in |result|. Returns true on success.
+bool ExecuteJavaScriptHelper(RenderViewHost* render_view_host,
+ const std::wstring& frame_xpath,
+ const std::wstring& original_script,
+ scoped_ptr<Value>* result) {
+ // TODO(jcampan): we should make the domAutomationController not require an
+ // automation id.
+ std::wstring script = L"window.domAutomationController.setAutomationId(0);" +
+ original_script;
+ DOMOperationObserver dom_op_observer(render_view_host);
+ render_view_host->ExecuteJavascriptInWebFrame(WideToUTF16Hack(frame_xpath),
+ WideToUTF16Hack(script));
+ std::string json;
+ if (!dom_op_observer.WaitAndGetResponse(&json)) {
+ DLOG(ERROR) << "Cannot communicate with DOMOperationObserver.";
+ return false;
+ }
+
+ // Nothing more to do for callers that ignore the returned JS value.
+ if (!result)
+ return true;
+
+ base::JSONReader reader(base::JSON_ALLOW_TRAILING_COMMAS);
+ result->reset(reader.ReadToValue(json));
+ if (!result->get()) {
+ DLOG(ERROR) << reader.GetErrorMessage();
+ return false;
+ }
+
+ return true;
}
void BuildSimpleWebKeyEvent(WebKit::WebInputEvent::Type type,
@@ -77,6 +135,37 @@
event->modifiers |= WebKit::WebInputEvent::MetaKey;
}
+} // namespace
+
+void SimulateMouseClick(WebContents* web_contents) {
+ int x = web_contents->GetView()->GetContainerSize().width() / 2;
+ int y = web_contents->GetView()->GetContainerSize().height() / 2;
+ WebKit::WebMouseEvent mouse_event;
+ mouse_event.type = WebKit::WebInputEvent::MouseDown;
+ mouse_event.button = WebKit::WebMouseEvent::ButtonLeft;
+ mouse_event.x = x;
+ mouse_event.y = y;
+ // Mac needs globalX/globalY for events to plugins.
+ gfx::Rect offset;
+ web_contents->GetView()->GetContainerBounds(&offset);
+ mouse_event.globalX = x + offset.x();
+ mouse_event.globalY = y + offset.y();
+ mouse_event.clickCount = 1;
+ web_contents->GetRenderViewHost()->ForwardMouseEvent(mouse_event);
+ mouse_event.type = WebKit::WebInputEvent::MouseUp;
+ web_contents->GetRenderViewHost()->ForwardMouseEvent(mouse_event);
+}
+
+void SimulateMouseEvent(WebContents* web_contents,
+ WebKit::WebInputEvent::Type type,
+ const gfx::Point& point) {
+ WebKit::WebMouseEvent mouse_event;
+ mouse_event.type = type;
+ mouse_event.x = point.x();
+ mouse_event.y = point.y();
+ web_contents->GetRenderViewHost()->ForwardMouseEvent(mouse_event);
+}
+
void SimulateKeyPress(WebContents* web_contents,
ui::KeyboardCode key,
bool control,
@@ -102,6 +191,53 @@
web_contents->GetRenderViewHost()->ForwardKeyboardEvent(event_up);
}
+bool ExecuteJavaScript(RenderViewHost* render_view_host,
+ const std::wstring& frame_xpath,
+ const std::wstring& original_script) {
+ std::wstring script =
+ original_script + L";window.domAutomationController.send(0);";
+ return ExecuteJavaScriptHelper(render_view_host, frame_xpath, script, NULL);
+}
+
+bool ExecuteJavaScriptAndExtractInt(RenderViewHost* render_view_host,
+ const std::wstring& frame_xpath,
+ const std::wstring& script,
+ int* result) {
+ DCHECK(result);
+ scoped_ptr<Value> value;
+ if (!ExecuteJavaScriptHelper(render_view_host, frame_xpath, script, &value) ||
+ !value.get())
+ return false;
+
+ return value->GetAsInteger(result);
+}
+
+bool ExecuteJavaScriptAndExtractBool(RenderViewHost* render_view_host,
+ const std::wstring& frame_xpath,
+ const std::wstring& script,
+ bool* result) {
+ DCHECK(result);
+ scoped_ptr<Value> value;
+ if (!ExecuteJavaScriptHelper(render_view_host, frame_xpath, script, &value) ||
+ !value.get())
+ return false;
+
+ return value->GetAsBoolean(result);
+}
+
+bool ExecuteJavaScriptAndExtractString(RenderViewHost* render_view_host,
+ const std::wstring& frame_xpath,
+ const std::wstring& script,
+ std::string* result) {
+ DCHECK(result);
+ scoped_ptr<Value> value;
+ if (!ExecuteJavaScriptHelper(render_view_host, frame_xpath, script, &value) ||
+ !value.get())
+ return false;
+
+ return value->GetAsString(result);
+}
+
TitleWatcher::TitleWatcher(WebContents* web_contents,
const string16& expected_title)
: web_contents_(web_contents),
« no previous file with comments | « content/public/test/browser_test_utils.h ('k') | content/test/layout_browsertest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698