| Index: chrome/test/render_view_test.cc
|
| ===================================================================
|
| --- chrome/test/render_view_test.cc (revision 94974)
|
| +++ chrome/test/render_view_test.cc (working copy)
|
| @@ -1,321 +0,0 @@
|
| -// Copyright (c) 2011 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "chrome/test/render_view_test.h"
|
| -
|
| -#include "chrome/browser/extensions/extension_function_dispatcher.h"
|
| -#include "chrome/common/extensions/extension.h"
|
| -#include "chrome/common/print_messages.h"
|
| -#include "chrome/common/render_messages.h"
|
| -#include "chrome/renderer/autofill/password_autofill_manager.h"
|
| -#include "chrome/renderer/extensions/event_bindings.h"
|
| -#include "chrome/renderer/extensions/extension_dispatcher.h"
|
| -#include "chrome/renderer/extensions/extension_process_bindings.h"
|
| -#include "chrome/renderer/extensions/js_only_v8_extensions.h"
|
| -#include "chrome/renderer/extensions/renderer_extension_bindings.h"
|
| -#include "chrome/renderer/mock_render_process.h"
|
| -#include "content/common/dom_storage_common.h"
|
| -#include "content/common/native_web_keyboard_event.h"
|
| -#include "content/common/renderer_preferences.h"
|
| -#include "content/common/view_messages.h"
|
| -#include "content/renderer/renderer_main_platform_delegate.h"
|
| -#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h"
|
| -#include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h"
|
| -#include "third_party/WebKit/Source/WebKit/chromium/public/WebKit.h"
|
| -#include "third_party/WebKit/Source/WebKit/chromium/public/WebScriptController.h"
|
| -#include "third_party/WebKit/Source/WebKit/chromium/public/WebScriptSource.h"
|
| -#include "third_party/WebKit/Source/WebKit/chromium/public/WebURLRequest.h"
|
| -#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h"
|
| -#include "webkit/glue/webkit_glue.h"
|
| -
|
| -#if defined(OS_LINUX)
|
| -#include "ui/base/gtk/event_synthesis_gtk.h"
|
| -#endif
|
| -
|
| -using WebKit::WebFrame;
|
| -using WebKit::WebInputEvent;
|
| -using WebKit::WebMouseEvent;
|
| -using WebKit::WebScriptController;
|
| -using WebKit::WebScriptSource;
|
| -using WebKit::WebString;
|
| -using WebKit::WebURLRequest;
|
| -using autofill::AutofillAgent;
|
| -using autofill::PasswordAutofillManager;
|
| -
|
| -namespace {
|
| -const int32 kRouteId = 5;
|
| -const int32 kOpenerId = 7;
|
| -} // namespace
|
| -
|
| -RenderViewTest::RenderViewTest() : extension_dispatcher_(NULL) {
|
| -}
|
| -
|
| -RenderViewTest::~RenderViewTest() {
|
| -}
|
| -
|
| -void RenderViewTest::ProcessPendingMessages() {
|
| - msg_loop_.PostTask(FROM_HERE, new MessageLoop::QuitTask());
|
| - msg_loop_.Run();
|
| -}
|
| -
|
| -WebFrame* RenderViewTest::GetMainFrame() {
|
| - return view_->webview()->mainFrame();
|
| -}
|
| -
|
| -void RenderViewTest::ExecuteJavaScript(const char* js) {
|
| - GetMainFrame()->executeScript(WebScriptSource(WebString::fromUTF8(js)));
|
| -}
|
| -
|
| -bool RenderViewTest::ExecuteJavaScriptAndReturnIntValue(
|
| - const string16& script,
|
| - int* int_result) {
|
| - v8::Handle<v8::Value> result =
|
| - GetMainFrame()->executeScriptAndReturnValue(WebScriptSource(script));
|
| - if (result.IsEmpty() || !result->IsInt32())
|
| - return false;
|
| -
|
| - if (int_result)
|
| - *int_result = result->Int32Value();
|
| -
|
| - return true;
|
| -}
|
| -
|
| -void RenderViewTest::LoadHTML(const char* html) {
|
| - std::string url_str = "data:text/html;charset=utf-8,";
|
| - url_str.append(html);
|
| - GURL url(url_str);
|
| -
|
| - GetMainFrame()->loadRequest(WebURLRequest(url));
|
| -
|
| - // The load actually happens asynchronously, so we pump messages to process
|
| - // the pending continuation.
|
| - ProcessPendingMessages();
|
| -}
|
| -
|
| -void RenderViewTest::SetUp() {
|
| - content::GetContentClient()->set_renderer(&chrome_content_renderer_client_);
|
| - extension_dispatcher_ = new ExtensionDispatcher();
|
| - chrome_content_renderer_client_.SetExtensionDispatcher(extension_dispatcher_);
|
| - sandbox_init_wrapper_.reset(new SandboxInitWrapper());
|
| - command_line_.reset(new CommandLine(CommandLine::NO_PROGRAM));
|
| - params_.reset(new MainFunctionParams(*command_line_, *sandbox_init_wrapper_,
|
| - NULL));
|
| - platform_.reset(new RendererMainPlatformDelegate(*params_));
|
| - platform_->PlatformInitialize();
|
| -
|
| - // Setting flags and really doing anything with WebKit is fairly fragile and
|
| - // hacky, but this is the world we live in...
|
| - webkit_glue::SetJavaScriptFlags(" --expose-gc");
|
| - WebKit::initialize(&webkitclient_);
|
| - WebScriptController::registerExtension(JsonSchemaJsV8Extension::Get());
|
| - WebScriptController::registerExtension(EventBindings::Get(
|
| - extension_dispatcher_));
|
| - WebScriptController::registerExtension(ExtensionApiTestV8Extension::Get());
|
| - WebScriptController::registerExtension(ExtensionProcessBindings::Get(
|
| - extension_dispatcher_));
|
| - WebScriptController::registerExtension(RendererExtensionBindings::Get(
|
| - extension_dispatcher_));
|
| - EventBindings::SetRenderThread(&render_thread_);
|
| -
|
| - mock_process_.reset(new MockRenderProcess);
|
| -
|
| - render_thread_.set_routing_id(kRouteId);
|
| -
|
| - // This needs to pass the mock render thread to the view.
|
| - view_ = RenderView::Create(&render_thread_,
|
| - 0,
|
| - kOpenerId,
|
| - RendererPreferences(),
|
| - WebPreferences(),
|
| - new SharedRenderViewCounter(0),
|
| - kRouteId,
|
| - kInvalidSessionStorageNamespaceId,
|
| - string16());
|
| -
|
| - // Attach a pseudo keyboard device to this object.
|
| - mock_keyboard_.reset(new MockKeyboard());
|
| -
|
| - // RenderView doesn't expose it's PasswordAutofillManager or
|
| - // AutofillAgent objects, because it has no need to store them directly
|
| - // (they're stored as RenderViewObserver*). So just create another set.
|
| - password_autofill_ = new PasswordAutofillManager(view_);
|
| - autofill_agent_ = new AutofillAgent(view_, password_autofill_);
|
| -}
|
| -
|
| -void RenderViewTest::TearDown() {
|
| - // Try very hard to collect garbage before shutting down.
|
| - GetMainFrame()->collectGarbage();
|
| - GetMainFrame()->collectGarbage();
|
| -
|
| - render_thread_.SendCloseMessage();
|
| -
|
| - // Run the loop so the release task from the renderwidget executes.
|
| - ProcessPendingMessages();
|
| -
|
| - EventBindings::SetRenderThread(NULL);
|
| -
|
| - view_ = NULL;
|
| -
|
| - mock_process_.reset();
|
| -
|
| - // After resetting the view_ and mock_process_ we may get some new tasks
|
| - // which need to be processed before shutting down WebKit
|
| - // (http://crbug.com/21508).
|
| - msg_loop_.RunAllPending();
|
| -
|
| - WebKit::shutdown();
|
| -
|
| - mock_keyboard_.reset();
|
| -
|
| - platform_->PlatformUninitialize();
|
| - platform_.reset();
|
| - params_.reset();
|
| - command_line_.reset();
|
| - sandbox_init_wrapper_.reset();
|
| -
|
| - extension_dispatcher_->OnRenderProcessShutdown();
|
| - extension_dispatcher_ = NULL;
|
| -}
|
| -
|
| -int RenderViewTest::SendKeyEvent(MockKeyboard::Layout layout,
|
| - int key_code,
|
| - MockKeyboard::Modifiers modifiers,
|
| - std::wstring* output) {
|
| -#if defined(OS_WIN)
|
| - // Retrieve the Unicode character for the given tuple (keyboard-layout,
|
| - // key-code, and modifiers).
|
| - // Exit when a keyboard-layout driver cannot assign a Unicode character to
|
| - // the tuple to prevent sending an invalid key code to the RenderView object.
|
| - CHECK(mock_keyboard_.get());
|
| - CHECK(output);
|
| - int length = mock_keyboard_->GetCharacters(layout, key_code, modifiers,
|
| - output);
|
| - if (length != 1)
|
| - return -1;
|
| -
|
| - // Create IPC messages from Windows messages and send them to our
|
| - // back-end.
|
| - // A keyboard event of Windows consists of three Windows messages:
|
| - // WM_KEYDOWN, WM_CHAR, and WM_KEYUP.
|
| - // WM_KEYDOWN and WM_KEYUP sends virtual-key codes. On the other hand,
|
| - // WM_CHAR sends a composed Unicode character.
|
| - NativeWebKeyboardEvent keydown_event(NULL, WM_KEYDOWN, key_code, 0);
|
| - SendNativeKeyEvent(keydown_event);
|
| -
|
| - NativeWebKeyboardEvent char_event(NULL, WM_CHAR, (*output)[0], 0);
|
| - SendNativeKeyEvent(char_event);
|
| -
|
| - NativeWebKeyboardEvent keyup_event(NULL, WM_KEYUP, key_code, 0);
|
| - SendNativeKeyEvent(keyup_event);
|
| -
|
| - return length;
|
| -#elif defined(OS_LINUX)
|
| - // We ignore |layout|, which means we are only testing the layout of the
|
| - // current locale. TODO(estade): fix this to respect |layout|.
|
| - std::vector<GdkEvent*> events;
|
| - ui::SynthesizeKeyPressEvents(
|
| - NULL, static_cast<ui::KeyboardCode>(key_code),
|
| - modifiers & (MockKeyboard::LEFT_CONTROL | MockKeyboard::RIGHT_CONTROL),
|
| - modifiers & (MockKeyboard::LEFT_SHIFT | MockKeyboard::RIGHT_SHIFT),
|
| - modifiers & (MockKeyboard::LEFT_ALT | MockKeyboard::RIGHT_ALT),
|
| - &events);
|
| -
|
| - guint32 unicode_key = 0;
|
| - for (size_t i = 0; i < events.size(); ++i) {
|
| - // Only send the up/down events for key press itself (skip the up/down
|
| - // events for the modifier keys).
|
| - if ((i + 1) == (events.size() / 2) || i == (events.size() / 2)) {
|
| - unicode_key = gdk_keyval_to_unicode(events[i]->key.keyval);
|
| - NativeWebKeyboardEvent webkit_event(&events[i]->key);
|
| - SendNativeKeyEvent(webkit_event);
|
| -
|
| - // Need to add a char event after the key down.
|
| - if (webkit_event.type == WebKit::WebInputEvent::RawKeyDown) {
|
| - NativeWebKeyboardEvent char_event = webkit_event;
|
| - char_event.type = WebKit::WebInputEvent::Char;
|
| - char_event.skip_in_browser = true;
|
| - SendNativeKeyEvent(char_event);
|
| - }
|
| - }
|
| - gdk_event_free(events[i]);
|
| - }
|
| -
|
| - *output = std::wstring(1, unicode_key);
|
| - return 1;
|
| -#else
|
| - NOTIMPLEMENTED();
|
| - return L'\0';
|
| -#endif
|
| -}
|
| -
|
| -void RenderViewTest::SendNativeKeyEvent(
|
| - const NativeWebKeyboardEvent& key_event) {
|
| - scoped_ptr<IPC::Message> input_message(new ViewMsg_HandleInputEvent(0));
|
| - input_message->WriteData(reinterpret_cast<const char*>(&key_event),
|
| - sizeof(WebKit::WebKeyboardEvent));
|
| - view_->OnMessageReceived(*input_message);
|
| -}
|
| -
|
| -const char* const kGetCoordinatesScript =
|
| - "(function() {"
|
| - " function GetCoordinates(elem) {"
|
| - " if (!elem)"
|
| - " return [ 0, 0];"
|
| - " var coordinates = [ elem.offsetLeft, elem.offsetTop];"
|
| - " var parent_coordinates = GetCoordinates(elem.offsetParent);"
|
| - " coordinates[0] += parent_coordinates[0];"
|
| - " coordinates[1] += parent_coordinates[1];"
|
| - " return coordinates;"
|
| - " };"
|
| - " var elem = document.getElementById('$1');"
|
| - " if (!elem)"
|
| - " return null;"
|
| - " var bounds = GetCoordinates(elem);"
|
| - " bounds[2] = elem.offsetWidth;"
|
| - " bounds[3] = elem.offsetHeight;"
|
| - " return bounds;"
|
| - "})();";
|
| -gfx::Rect RenderViewTest::GetElementBounds(const std::string& element_id) {
|
| - std::vector<std::string> params;
|
| - params.push_back(element_id);
|
| - std::string script =
|
| - ReplaceStringPlaceholders(kGetCoordinatesScript, params, NULL);
|
| -
|
| - v8::HandleScope handle_scope;
|
| - v8::Handle<v8::Value> value = GetMainFrame()->executeScriptAndReturnValue(
|
| - WebScriptSource(WebString::fromUTF8(script)));
|
| - if (value.IsEmpty() || !value->IsArray())
|
| - return gfx::Rect();
|
| -
|
| - v8::Handle<v8::Array> array = value.As<v8::Array>();
|
| - if (array->Length() != 4)
|
| - return gfx::Rect();
|
| - std::vector<int> coords;
|
| - for (int i = 0; i < 4; ++i) {
|
| - v8::Handle<v8::Number> index = v8::Number::New(i);
|
| - v8::Local<v8::Value> value = array->Get(index);
|
| - if (value.IsEmpty() || !value->IsInt32())
|
| - return gfx::Rect();
|
| - coords.push_back(value->Int32Value());
|
| - }
|
| - return gfx::Rect(coords[0], coords[1], coords[2], coords[3]);
|
| -}
|
| -
|
| -bool RenderViewTest::SimulateElementClick(const std::string& element_id) {
|
| - gfx::Rect bounds = GetElementBounds(element_id);
|
| - if (bounds.IsEmpty())
|
| - return false;
|
| - WebMouseEvent mouse_event;
|
| - mouse_event.type = WebInputEvent::MouseDown;
|
| - mouse_event.button = WebMouseEvent::ButtonLeft;
|
| - mouse_event.x = bounds.CenterPoint().x();
|
| - mouse_event.y = bounds.CenterPoint().y();
|
| - mouse_event.clickCount = 1;
|
| - ViewMsg_HandleInputEvent input_event(0);
|
| - scoped_ptr<IPC::Message> input_message(new ViewMsg_HandleInputEvent(0));
|
| - input_message->WriteData(reinterpret_cast<const char*>(&mouse_event),
|
| - sizeof(WebMouseEvent));
|
| - view_->OnMessageReceived(*input_message);
|
| - return true;
|
| -}
|
|
|