blob: e4b3e2ff84966f6a2e77badea6e7af3b1b3b69fc [file] [log] [blame]
// Copyright (c) 2010 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.
// TestWebViewDelegate class:
// This class implements the WebViewDelegate methods for the test shell. One
// instance is owned by each TestShell.
#ifndef WEBKIT_TOOLS_TEST_SHELL_TEST_WEBVIEW_DELEGATE_H_
#define WEBKIT_TOOLS_TEST_SHELL_TEST_WEBVIEW_DELEGATE_H_
#include "build/build_config.h"
#if defined(OS_WIN)
#include <windows.h>
#endif
#include <map>
#include <set>
#include <string>
#if defined(TOOLKIT_USES_GTK)
#include <gdk/gdkcursor.h>
#endif
#include "base/basictypes.h"
#include "base/scoped_ptr.h"
#include "base/weak_ptr.h"
#include "third_party/WebKit/WebKit/chromium/public/WebContextMenuData.h"
#include "third_party/WebKit/WebKit/chromium/public/WebFileSystem.h"
#include "third_party/WebKit/WebKit/chromium/public/WebFrameClient.h"
#include "third_party/WebKit/WebKit/chromium/public/WebRect.h"
#if defined(OS_MACOSX)
#include "third_party/WebKit/WebKit/chromium/public/WebPopupMenuInfo.h"
#endif
#include "third_party/WebKit/WebKit/chromium/public/WebPopupType.h"
#include "third_party/WebKit/WebKit/chromium/public/WebViewClient.h"
#include "webkit/glue/webcursor.h"
#include "webkit/glue/plugins/webplugin_page_delegate.h"
#if defined(OS_WIN)
#include "webkit/tools/test_shell/drag_delegate.h"
#include "webkit/tools/test_shell/drop_delegate.h"
#endif
#include "webkit/tools/test_shell/mock_spellcheck.h"
#include "webkit/tools/test_shell/test_navigation_controller.h"
struct WebPreferences;
class GURL;
class TestGeolocationService;
class TestShell;
class WebWidgetHost;
namespace WebKit {
class WebDeviceOrientationClient;
class WebStorageNamespace;
struct WebWindowFeatures;
}
class TestWebViewDelegate : public WebKit::WebViewClient,
public WebKit::WebFrameClient,
public webkit_glue::WebPluginPageDelegate,
public base::SupportsWeakPtr<TestWebViewDelegate> {
public:
struct CapturedContextMenuEvent {
CapturedContextMenuEvent(int in_node_type,
int in_x,
int in_y)
: node_type(in_node_type),
x(in_x),
y(in_y) {
}
int node_type;
int x;
int y;
};
typedef std::vector<CapturedContextMenuEvent> CapturedContextMenuEvents;
// WebKit::WebViewClient
virtual WebKit::WebView* createView(
WebKit::WebFrame* creator,
const WebKit::WebWindowFeatures& features,
const WebKit::WebString& frame_name);
virtual WebKit::WebWidget* createPopupMenu(WebKit::WebPopupType popup_type);
virtual WebKit::WebWidget* createPopupMenu(
const WebKit::WebPopupMenuInfo& info);
virtual WebKit::WebStorageNamespace* createSessionStorageNamespace(
unsigned quota);
virtual void didAddMessageToConsole(
const WebKit::WebConsoleMessage& message,
const WebKit::WebString& source_name, unsigned source_line);
virtual void didStartLoading();
virtual void didStopLoading();
virtual bool shouldBeginEditing(const WebKit::WebRange& range);
virtual bool shouldEndEditing(const WebKit::WebRange& range);
virtual bool shouldInsertNode(
const WebKit::WebNode& node, const WebKit::WebRange& range,
WebKit::WebEditingAction action);
virtual bool shouldInsertText(
const WebKit::WebString& text, const WebKit::WebRange& range,
WebKit::WebEditingAction action);
virtual bool shouldChangeSelectedRange(
const WebKit::WebRange& from, const WebKit::WebRange& to,
WebKit::WebTextAffinity affinity, bool still_selecting);
virtual bool shouldDeleteRange(const WebKit::WebRange& range);
virtual bool shouldApplyStyle(
const WebKit::WebString& style, const WebKit::WebRange& range);
virtual bool isSmartInsertDeleteEnabled();
virtual bool isSelectTrailingWhitespaceEnabled();
virtual void didBeginEditing();
virtual void didChangeSelection(bool is_selection_empty);
virtual void didChangeContents();
virtual void didEndEditing();
virtual bool handleCurrentKeyboardEvent();
virtual void spellCheck(
const WebKit::WebString& text, int& misspelledOffset,
int& misspelledLength);
virtual WebKit::WebString autoCorrectWord(
const WebKit::WebString& misspelled_word);
virtual void runModalAlertDialog(
WebKit::WebFrame* frame, const WebKit::WebString& message);
virtual bool runModalConfirmDialog(
WebKit::WebFrame* frame, const WebKit::WebString& message);
virtual bool runModalPromptDialog(
WebKit::WebFrame* frame, const WebKit::WebString& message,
const WebKit::WebString& default_value, WebKit::WebString* actual_value);
virtual bool runModalBeforeUnloadDialog(
WebKit::WebFrame* frame, const WebKit::WebString& message);
virtual void showContextMenu(
WebKit::WebFrame* frame, const WebKit::WebContextMenuData& data);
virtual void setStatusText(const WebKit::WebString& text);
virtual void startDragging(
const WebKit::WebDragData& data, WebKit::WebDragOperationsMask mask,
const WebKit::WebImage& image, const WebKit::WebPoint& offset);
virtual void navigateBackForwardSoon(int offset);
virtual int historyBackListCount();
virtual int historyForwardListCount();
virtual void focusAccessibilityObject(
const WebKit::WebAccessibilityObject& object);
virtual WebKit::WebNotificationPresenter* notificationPresenter();
virtual WebKit::WebGeolocationService* geolocationService();
virtual WebKit::WebDeviceOrientationClient* deviceOrientationClient();
// WebKit::WebWidgetClient
virtual void didInvalidateRect(const WebKit::WebRect& rect);
virtual void didScrollRect(int dx, int dy,
const WebKit::WebRect& clip_rect);
virtual void didFocus();
virtual void didBlur();
virtual void didChangeCursor(const WebKit::WebCursorInfo& cursor);
virtual void closeWidgetSoon();
virtual void show(WebKit::WebNavigationPolicy policy);
virtual void runModal();
virtual WebKit::WebRect windowRect();
virtual void setWindowRect(const WebKit::WebRect& rect);
virtual WebKit::WebRect rootWindowRect();
virtual WebKit::WebRect windowResizerRect();
virtual WebKit::WebScreenInfo screenInfo();
// WebKit::WebFrameClient
virtual WebKit::WebPlugin* createPlugin(
WebKit::WebFrame*, const WebKit::WebPluginParams&);
virtual WebKit::WebWorker* createWorker(
WebKit::WebFrame*, WebKit::WebWorkerClient*);
virtual WebKit::WebMediaPlayer* createMediaPlayer(
WebKit::WebFrame*, WebKit::WebMediaPlayerClient*);
virtual WebKit::WebApplicationCacheHost* createApplicationCacheHost(
WebKit::WebFrame*, WebKit::WebApplicationCacheHostClient*);
virtual bool allowPlugins(WebKit::WebFrame* frame, bool enabled_per_settings);
virtual bool allowImages(WebKit::WebFrame* frame, bool enabled_per_settings);
virtual void loadURLExternally(
WebKit::WebFrame*, const WebKit::WebURLRequest&,
WebKit::WebNavigationPolicy);
virtual WebKit::WebNavigationPolicy decidePolicyForNavigation(
WebKit::WebFrame*, const WebKit::WebURLRequest&,
WebKit::WebNavigationType, const WebKit::WebNode&,
WebKit::WebNavigationPolicy default_policy, bool isRedirect);
virtual bool canHandleRequest(
WebKit::WebFrame*, const WebKit::WebURLRequest&);
virtual WebKit::WebURLError cannotHandleRequestError(
WebKit::WebFrame*, const WebKit::WebURLRequest& request);
virtual WebKit::WebURLError cancelledError(
WebKit::WebFrame*, const WebKit::WebURLRequest& request);
virtual void unableToImplementPolicyWithError(
WebKit::WebFrame*, const WebKit::WebURLError&);
virtual void willPerformClientRedirect(
WebKit::WebFrame*, const WebKit::WebURL& from, const WebKit::WebURL& to,
double interval, double fire_time);
virtual void didCancelClientRedirect(WebKit::WebFrame*);
virtual void didCreateDataSource(
WebKit::WebFrame*, WebKit::WebDataSource*);
virtual void didStartProvisionalLoad(WebKit::WebFrame*);
virtual void didReceiveServerRedirectForProvisionalLoad(WebKit::WebFrame*);
virtual void didFailProvisionalLoad(
WebKit::WebFrame*, const WebKit::WebURLError&);
virtual void didCommitProvisionalLoad(
WebKit::WebFrame*, bool is_new_navigation);
virtual void didClearWindowObject(WebKit::WebFrame*);
virtual void didReceiveTitle(
WebKit::WebFrame*, const WebKit::WebString& title);
virtual void didFinishDocumentLoad(WebKit::WebFrame*);
virtual void didHandleOnloadEvents(WebKit::WebFrame*);
virtual void didFailLoad(
WebKit::WebFrame*, const WebKit::WebURLError&);
virtual void didFinishLoad(WebKit::WebFrame*);
virtual void didNavigateWithinPage(
WebKit::WebFrame*, bool is_new_navigation);
virtual void didChangeLocationWithinPage(
WebKit::WebFrame*);
virtual void assignIdentifierToRequest(
WebKit::WebFrame*, unsigned identifier, const WebKit::WebURLRequest&);
virtual void willSendRequest(
WebKit::WebFrame*, unsigned identifier, WebKit::WebURLRequest&,
const WebKit::WebURLResponse& redirectResponse);
virtual void didReceiveResponse(
WebKit::WebFrame*, unsigned identifier, const WebKit::WebURLResponse&);
virtual void didFinishResourceLoad(
WebKit::WebFrame*, unsigned identifier);
virtual void didFailResourceLoad(
WebKit::WebFrame*, unsigned identifier, const WebKit::WebURLError&);
virtual void didDisplayInsecureContent(WebKit::WebFrame* frame);
virtual void didRunInsecureContent(
WebKit::WebFrame* frame, const WebKit::WebSecurityOrigin& origin);
virtual bool allowScript(WebKit::WebFrame* frame, bool enabled_per_settings);
virtual void openFileSystem(
WebKit::WebFrame* frame,
WebKit::WebFileSystem::Type type,
long long size,
WebKit::WebFileSystemCallbacks* callbacks);
// webkit_glue::WebPluginPageDelegate
virtual webkit_glue::WebPluginDelegate* CreatePluginDelegate(
const FilePath& url,
const std::string& mime_type);
virtual void CreatedPluginWindow(
gfx::PluginWindowHandle handle);
virtual void WillDestroyPluginWindow(
gfx::PluginWindowHandle handle);
virtual void DidMovePlugin(
const webkit_glue::WebPluginGeometry& move);
virtual void DidStartLoadingForPlugin() {}
virtual void DidStopLoadingForPlugin() {}
virtual void ShowModalHTMLDialogForPlugin(
const GURL& url,
const gfx::Size& size,
const std::string& json_arguments,
std::string* json_retval) {}
virtual WebKit::WebCookieJar* GetCookieJar();
TestWebViewDelegate(TestShell* shell);
~TestWebViewDelegate();
void Reset();
void SetSmartInsertDeleteEnabled(bool enabled);
void SetSelectTrailingWhitespaceEnabled(bool enabled);
// Additional accessors
WebKit::WebFrame* top_loading_frame() { return top_loading_frame_; }
#if defined(OS_WIN)
IDropTarget* drop_delegate() { return drop_delegate_.get(); }
IDropSource* drag_delegate() { return drag_delegate_.get(); }
#endif
const CapturedContextMenuEvents& captured_context_menu_events() const {
return captured_context_menu_events_;
}
void clear_captured_context_menu_events() {
captured_context_menu_events_.clear();
}
void set_pending_extra_data(TestShellExtraData* extra_data) {
pending_extra_data_.reset(extra_data);
}
// Methods for modifying WebPreferences
void SetUserStyleSheetEnabled(bool is_enabled);
void SetUserStyleSheetLocation(const GURL& location);
void SetAuthorAndUserStylesEnabled(bool is_enabled);
// Sets the webview as a drop target.
void RegisterDragDrop();
void RevokeDragDrop();
void ResetDragDrop();
void SetCustomPolicyDelegate(bool is_custom, bool is_permissive);
void WaitForPolicyDelegate();
void set_clear_header(const std::string& header) {
clear_headers_.insert(header);
}
const std::set<std::string>& clear_headers() {
return clear_headers_;
}
void set_block_redirects(bool block_redirects) {
block_redirects_ = block_redirects;
}
bool block_redirects() const {
return block_redirects_;
}
void set_request_return_null(bool request_return_null) {
request_return_null_ = request_return_null;
}
bool request_return_null() const {
return request_return_null_;
}
void SetEditCommand(const std::string& name, const std::string& value) {
edit_command_name_ = name;
edit_command_value_ = value;
}
void ClearEditCommand() {
edit_command_name_.clear();
edit_command_value_.clear();
}
void SetGeolocationPermission(bool allowed);
private:
// Called the title of the page changes.
// Can be used to update the title of the window.
void SetPageTitle(const std::wstring& title);
// Called when the URL of the page changes.
// Extracts the URL and forwards on to SetAddressBarURL().
void UpdateAddressBar(WebKit::WebView* webView);
// Called when the URL of the page changes.
// Should be used to update the text of the URL bar.
void SetAddressBarURL(const GURL& url);
// Show a JavaScript alert as a popup message.
// The caller should test whether we're in layout test mode and only
// call this function when we really want a message to pop up.
void ShowJavaScriptAlert(const std::wstring& message);
// In the Mac code, this is called to trigger the end of a test after the
// page has finished loading. From here, we can generate the dump for the
// test.
void LocationChangeDone(WebKit::WebFrame*);
// Tests that require moving or resizing the main window (via resizeTo() or
// moveTo()) pass in Chrome even though Chrome disregards move requests for
// non-popup windows (see TabContents::RequestMove()). These functions allow
// the test shell to mimic its behavior. If setWindowRect() is called for
// the main window, the passed in WebRect is saved as fake_rect_ and we return
// it instead of the real window dimensions whenever rootWindowRect() is
// called.
WebKit::WebRect fake_window_rect();
void set_fake_window_rect(const WebKit::WebRect&);
WebWidgetHost* GetWidgetHost();
void UpdateForCommittedLoad(WebKit::WebFrame* frame, bool is_new_navigation);
void UpdateURL(WebKit::WebFrame* frame);
void UpdateSessionHistory(WebKit::WebFrame* frame);
void UpdateSelectionClipboard(bool is_empty_selection);
// Get a string suitable for dumping a frame to the console.
std::wstring GetFrameDescription(WebKit::WebFrame* webframe);
// Returns a TestGeolocationService owned by this delegate.
TestGeolocationService* GetTestGeolocationService();
// Causes navigation actions just printout the intended navigation instead
// of taking you to the page. This is used for cases like mailto, where you
// don't actually want to open the mail program.
bool policy_delegate_enabled_;
// Toggles the behavior of the policy delegate. If true, then navigations
// will be allowed. Otherwise, they will be ignored (dropped).
bool policy_delegate_is_permissive_;
// If true, the policy delegate will signal layout test completion.
bool policy_delegate_should_notify_done_;
// Non-owning pointer. The delegate is owned by the host.
TestShell* shell_;
// This is non-NULL IFF a load is in progress.
WebKit::WebFrame* top_loading_frame_;
// For tracking session history. See RenderView.
int page_id_;
int last_page_id_updated_;
scoped_ptr<TestShellExtraData> pending_extra_data_;
// Maps resource identifiers to a descriptive string.
typedef std::map<uint32, std::string> ResourceMap;
ResourceMap resource_identifier_map_;
std::string GetResourceDescription(uint32 identifier);
CapturedContextMenuEvents captured_context_menu_events_;
WebCursor current_cursor_;
WebKit::WebRect fake_rect_;
bool using_fake_rect_;
#if defined(OS_WIN)
// Classes needed by drag and drop.
scoped_refptr<TestDragDelegate> drag_delegate_;
scoped_refptr<TestDropDelegate> drop_delegate_;
#endif
#if defined(TOOLKIT_USES_GTK)
// The type of cursor the window is currently using.
// Used for judging whether a new SetCursor call is actually changing the
// cursor.
GdkCursorType cursor_type_;
#endif
#if defined(OS_MACOSX)
scoped_ptr<WebKit::WebPopupMenuInfo> popup_menu_info_;
WebKit::WebRect popup_bounds_;
#endif
// true if we want to enable smart insert/delete.
bool smart_insert_delete_enabled_;
// true if we want to enable selection of trailing whitespaces
bool select_trailing_whitespace_enabled_;
// Set of headers to clear in willSendRequest.
std::set<std::string> clear_headers_;
// true if we should block any redirects
bool block_redirects_;
// true if we should block (set an empty request for) any requests
bool request_return_null_;
// Edit command associated to the current keyboard event.
std::string edit_command_name_;
std::string edit_command_value_;
// The mock spellchecker used in TestWebViewDelegate::spellCheck().
MockSpellCheck mock_spellcheck_;
scoped_ptr<TestGeolocationService> test_geolocation_service_;
DISALLOW_COPY_AND_ASSIGN(TestWebViewDelegate);
};
#endif // WEBKIT_TOOLS_TEST_SHELL_TEST_WEBVIEW_DELEGATE_H_