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

Unified Diff: chrome/test/ui_test_utils.cc

Issue 101013: Migrating the SSL UI tests to be browser tests (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 8 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 | « chrome/test/ui_test_utils.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/test/ui_test_utils.cc
===================================================================
--- chrome/test/ui_test_utils.cc (revision 14732)
+++ chrome/test/ui_test_utils.cc (working copy)
@@ -4,11 +4,12 @@
#include "chrome/test/ui_test_utils.h"
+#include "base/json_reader.h"
#include "base/message_loop.h"
#include "chrome/browser/browser.h"
#include "chrome/browser/dom_operation_notification_details.h"
#include "chrome/browser/tab_contents/navigation_controller.h"
-#include "chrome/browser/tab_contents/web_contents.h"
+#include "chrome/browser/tab_contents/tab_contents.h"
#include "chrome/common/notification_registrar.h"
#include "chrome/common/notification_service.h"
#include "chrome/views/widget/accelerator_handler.h"
@@ -65,6 +66,32 @@
DISALLOW_COPY_AND_ASSIGN(NavigationNotificationObserver);
};
+class DOMOperationObserver : public NotificationObserver {
+ public:
+ explicit DOMOperationObserver(TabContents* tab_contents) {
+ registrar_.Add(this, NotificationType::DOM_OPERATION_RESPONSE,
+ Source<TabContents>(tab_contents));
+ RunMessageLoop();
+ }
+
+ virtual void Observe(NotificationType type,
+ const NotificationSource& source,
+ const NotificationDetails& details) {
+ DCHECK(type == NotificationType::DOM_OPERATION_RESPONSE);
+ Details<DomOperationNotificationDetails> dom_op_details(details);
+ response_ = dom_op_details->json();
+ MessageLoopForUI::current()->Quit();
+ }
+
+ std::string response() const { return response_; }
+
+ private:
+ NotificationRegistrar registrar_;
+ std::string response_;
+
+ DISALLOW_COPY_AND_ASSIGN(DOMOperationObserver);
+};
+
} // namespace
void RunMessageLoop() {
@@ -98,42 +125,68 @@
WaitForNavigations(controller, number_of_navigations);
}
-JavaScriptRunner::JavaScriptRunner(WebContents* web_contents,
- const std::wstring& frame_xpath,
- const std::wstring& jscript)
- : web_contents_(web_contents),
- frame_xpath_(frame_xpath),
- jscript_(jscript) {
- NotificationService::current()->
- AddObserver(this, NotificationType::DOM_OPERATION_RESPONSE,
- Source<WebContents>(web_contents));
+Value* ExecuteJavaScript(TabContents* tab_contents,
+ const std::wstring& frame_xpath,
+ const std::wstring& original_script) {
+ // TODO(jcampan): we should make the domAutomationController not require an
+ // automation id.
+ std::wstring script = L"window.domAutomationController.setAutomationId(0);" +
+ original_script;
+ tab_contents->render_view_host()->ExecuteJavascriptInWebFrame(frame_xpath,
+ script);
+ DOMOperationObserver dom_op_observer(tab_contents);
+ std::string json = dom_op_observer.response();
+ // Wrap |json| in an array before deserializing because valid JSON has an
+ // array or an object as the root.
+ json.insert(0, "[");
+ json.append("]");
+
+ scoped_ptr<Value> root_val(JSONReader::Read(json, true));
+ if (!root_val->IsType(Value::TYPE_LIST))
+ return NULL;
+
+ ListValue* list = static_cast<ListValue*>(root_val.get());
+ Value* result;
+ if (!list || !list->GetSize() ||
+ !list->Remove(0, &result)) // Remove gives us ownership of the value.
+ return NULL;
+
+ return result;
}
-void JavaScriptRunner::Observe(NotificationType type,
- const NotificationSource& source,
- const NotificationDetails& details) {
- Details<DomOperationNotificationDetails> dom_op_details(details);
- result_ = dom_op_details->json();
- // The Jasonified response has quotes, remove them.
- if (result_.length() > 1 && result_[0] == '"')
- result_ = result_.substr(1, result_.length() - 2);
+bool ExecuteJavaScriptAndExtractInt(TabContents* tab_contents,
+ const std::wstring& frame_xpath,
+ const std::wstring& script,
+ int* result) {
+ DCHECK(result);
+ scoped_ptr<Value> value(ExecuteJavaScript(tab_contents, frame_xpath, script));
+ if (!value.get())
+ return false;
- NotificationService::current()->
- RemoveObserver(this, NotificationType::DOM_OPERATION_RESPONSE,
- Source<WebContents>(web_contents_));
- MessageLoop::current()->PostTask(FROM_HERE, new MessageLoop::QuitTask());
+ return value->GetAsInteger(result);
}
-std::string JavaScriptRunner::Run() {
- // The DOMAutomationController requires an automation ID, even though we are
- // not using it in this case.
- web_contents_->render_view_host()->ExecuteJavascriptInWebFrame(
- frame_xpath_, L"window.domAutomationController.setAutomationId(0);");
+bool ExecuteJavaScriptAndExtractBool(TabContents* tab_contents,
+ const std::wstring& frame_xpath,
+ const std::wstring& script,
+ bool* result) {
+ DCHECK(result);
+ scoped_ptr<Value> value(ExecuteJavaScript(tab_contents, frame_xpath, script));
+ if (!value.get())
+ return false;
- web_contents_->render_view_host()->ExecuteJavascriptInWebFrame(frame_xpath_,
- jscript_);
- ui_test_utils::RunMessageLoop();
- return result_;
+ return value->GetAsBoolean(result);
}
+bool ExecuteJavaScriptAndExtractString(TabContents* tab_contents,
+ const std::wstring& frame_xpath,
+ const std::wstring& script,
+ std::string* result) {
+ DCHECK(result);
+ scoped_ptr<Value> value(ExecuteJavaScript(tab_contents, frame_xpath, script));
+ if (!value.get())
+ return false;
+
+ return value->GetAsString(result);
+}
} // namespace ui_test_utils
« no previous file with comments | « chrome/test/ui_test_utils.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698