blob: adff5959a07c73250e00b095a6f42635a60812ad [file] [log] [blame]
// Copyright 2013 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.
#ifndef CONTENT_SHELL_RENDERER_TEST_RUNNER_WEBTESTPROXY_H_
#define CONTENT_SHELL_RENDERER_TEST_RUNNER_WEBTESTPROXY_H_
#include <deque>
#include <map>
#include <string>
#include "base/basictypes.h"
#include "base/callback.h"
#include "base/memory/scoped_ptr.h"
#include "content/shell/renderer/test_runner/WebTask.h"
#include "third_party/WebKit/public/platform/WebCompositeAndReadbackAsyncCallback.h"
#include "third_party/WebKit/public/platform/WebRect.h"
#include "third_party/WebKit/public/platform/WebURLError.h"
#include "third_party/WebKit/public/platform/WebURLRequest.h"
#include "third_party/WebKit/public/web/WebAXEnums.h"
#include "third_party/WebKit/public/web/WebDOMMessageEvent.h"
#include "third_party/WebKit/public/web/WebDataSource.h"
#include "third_party/WebKit/public/web/WebDragOperation.h"
#include "third_party/WebKit/public/web/WebFrame.h"
#include "third_party/WebKit/public/web/WebHistoryCommitType.h"
#include "third_party/WebKit/public/web/WebIconURL.h"
#include "third_party/WebKit/public/web/WebNavigationPolicy.h"
#include "third_party/WebKit/public/web/WebNavigationType.h"
#include "third_party/WebKit/public/web/WebSecurityOrigin.h"
#include "third_party/WebKit/public/web/WebTextAffinity.h"
#include "third_party/WebKit/public/web/WebTextDirection.h"
class SkCanvas;
namespace blink {
class WebAXObject;
class WebAudioDevice;
class WebCachedURLRequest;
class WebColorChooser;
class WebColorChooserClient;
class WebDataSource;
class WebDragData;
class WebFileChooserCompletion;
class WebFrame;
class WebImage;
class WebLocalFrame;
class WebMIDIAccessor;
class WebMIDIAccessorClient;
class WebMIDIClient;
class WebMIDIClientMock;
class WebNode;
class WebNotificationPresenter;
class WebPlugin;
class WebRange;
class WebSerializedScriptValue;
class WebSpeechRecognizer;
class WebSpellCheckClient;
class WebString;
class WebURL;
class WebURLResponse;
class WebUserMediaClient;
class WebView;
class WebWidget;
struct WebColorSuggestion;
struct WebConsoleMessage;
struct WebContextMenuData;
struct WebFileChooserParams;
struct WebPluginParams;
struct WebPoint;
struct WebSize;
struct WebWindowFeatures;
typedef unsigned WebColor;
}
namespace content {
class MockWebSpeechRecognizer;
class RenderFrame;
class SpellCheckClient;
class TestInterfaces;
class WebTestDelegate;
class WebTestInterfaces;
class WebUserMediaClientMock;
class WebTestProxyBase : public blink::WebCompositeAndReadbackAsyncCallback {
public:
void setInterfaces(WebTestInterfaces*);
void setDelegate(WebTestDelegate*);
void setWidget(blink::WebWidget*);
void reset();
blink::WebSpellCheckClient *spellCheckClient() const;
blink::WebColorChooser* createColorChooser(blink::WebColorChooserClient*, const blink::WebColor&, const blink::WebVector<blink::WebColorSuggestion>& suggestions);
bool runFileChooser(const blink::WebFileChooserParams&, blink::WebFileChooserCompletion*);
void showValidationMessage(const blink::WebRect& anchorInRootView, const blink::WebString& mainText, const blink::WebString& supplementalText, blink::WebTextDirection);
void hideValidationMessage();
void moveValidationMessage(const blink::WebRect& anchorInRootView);
std::string captureTree(bool debugRenderTree);
SkCanvas* capturePixels();
void CapturePixelsAsync(base::Callback<void(const SkBitmap&)> callback);
void setLogConsoleOutput(bool enabled);
// FIXME: Make this private again.
void scheduleComposite();
void didOpenChooser();
void didCloseChooser();
bool isChooserShown();
void displayAsyncThen(base::Closure callback);
void discardBackingStore();
blink::WebMIDIClientMock* midiClientMock();
MockWebSpeechRecognizer* speechRecognizerMock();
WebTaskList* taskList() { return &m_taskList; }
blink::WebView* webView();
void didForceResize();
void postSpellCheckEvent(const blink::WebString& eventName);
// WebCompositeAndReadbackAsyncCallback implementation.
virtual void didCompositeAndReadback(const SkBitmap& bitmap);
protected:
WebTestProxyBase();
~WebTestProxyBase();
void didInvalidateRect(const blink::WebRect&);
void didScrollRect(int, int, const blink::WebRect&);
void scheduleAnimation();
bool isCompositorFramePending() const;
// FIXME: Remove once we switch to use didForceResize.
void setWindowRect(const blink::WebRect&);
void show(blink::WebNavigationPolicy);
void didAutoResize(const blink::WebSize&);
void postAccessibilityEvent(const blink::WebAXObject&, blink::WebAXEvent);
void startDragging(blink::WebLocalFrame*, const blink::WebDragData&, blink::WebDragOperationsMask, const blink::WebImage&, const blink::WebPoint&);
void didChangeSelection(bool isEmptySelection);
void didChangeContents();
void didEndEditing();
bool createView(blink::WebLocalFrame* creator, const blink::WebURLRequest&, const blink::WebWindowFeatures&, const blink::WebString& frameName, blink::WebNavigationPolicy, bool suppressOpener);
blink::WebPlugin* createPlugin(blink::WebLocalFrame*, const blink::WebPluginParams&);
void setStatusText(const blink::WebString&);
void didStopLoading();
void showContextMenu(blink::WebLocalFrame*, const blink::WebContextMenuData&);
blink::WebUserMediaClient* userMediaClient();
void printPage(blink::WebLocalFrame*);
blink::WebNotificationPresenter* notificationPresenter();
blink::WebMIDIClient* webMIDIClient();
blink::WebSpeechRecognizer* speechRecognizer();
bool requestPointerLock();
void requestPointerUnlock();
bool isPointerLocked();
void didFocus();
void didBlur();
void setToolTipText(const blink::WebString&, blink::WebTextDirection);
void didAddMessageToConsole(const blink::WebConsoleMessage&, const blink::WebString& sourceName, unsigned sourceLine);
void loadURLExternally(blink::WebLocalFrame* frame, const blink::WebURLRequest& request, blink::WebNavigationPolicy policy, const blink::WebString& suggested_name);
void didStartProvisionalLoad(blink::WebLocalFrame*);
void didReceiveServerRedirectForProvisionalLoad(blink::WebLocalFrame*);
bool didFailProvisionalLoad(blink::WebLocalFrame*, const blink::WebURLError&);
void didCommitProvisionalLoad(blink::WebLocalFrame*, const blink::WebHistoryItem&, blink::WebHistoryCommitType);
void didReceiveTitle(blink::WebLocalFrame*, const blink::WebString& title, blink::WebTextDirection);
void didChangeIcon(blink::WebLocalFrame*, blink::WebIconURL::Type);
void didFinishDocumentLoad(blink::WebLocalFrame*);
void didHandleOnloadEvents(blink::WebLocalFrame*);
void didFailLoad(blink::WebLocalFrame*, const blink::WebURLError&);
void didFinishLoad(blink::WebLocalFrame*);
void didChangeLocationWithinPage(blink::WebLocalFrame*);
void didDetectXSS(blink::WebLocalFrame*, const blink::WebURL& insecureURL, bool didBlockEntirePage);
void didDispatchPingLoader(blink::WebLocalFrame*, const blink::WebURL&);
void willRequestResource(blink::WebLocalFrame*, const blink::WebCachedURLRequest&);
void willSendRequest(blink::WebLocalFrame*, unsigned identifier, blink::WebURLRequest&, const blink::WebURLResponse& redirectResponse);
void didReceiveResponse(blink::WebLocalFrame*, unsigned identifier, const blink::WebURLResponse&);
void didChangeResourcePriority(blink::WebLocalFrame*, unsigned identifier, const blink::WebURLRequest::Priority&, int intra_priority_value);
void didFinishResourceLoad(blink::WebLocalFrame*, unsigned identifier);
blink::WebNavigationPolicy decidePolicyForNavigation(blink::WebLocalFrame*, blink::WebDataSource::ExtraData*, const blink::WebURLRequest&, blink::WebNavigationType, blink::WebNavigationPolicy defaultPolicy, bool isRedirect);
bool willCheckAndDispatchMessageEvent(blink::WebLocalFrame* sourceFrame, blink::WebFrame* targetFrame, blink::WebSecurityOrigin target, blink::WebDOMMessageEvent);
void resetInputMethod();
private:
template<class, typename, typename> friend class WebFrameTestProxy;
void locationChangeDone(blink::WebFrame*);
void paintRect(const blink::WebRect&);
void paintInvalidatedRegion();
void paintPagesWithBoundaries();
SkCanvas* canvas();
void invalidateAll();
void animateNow();
void DrawSelectionRect(SkCanvas* canvas);
void DisplayForSoftwareMode(const base::Closure& callback);
void DidDisplayAsync(const base::Closure& callback, const SkBitmap& bitmap);
blink::WebWidget* webWidget();
TestInterfaces* m_testInterfaces;
WebTestDelegate* m_delegate;
blink::WebWidget* m_webWidget;
WebTaskList m_taskList;
scoped_ptr<SpellCheckClient> m_spellcheck;
scoped_ptr<WebUserMediaClientMock> m_userMediaClient;
// Painting.
scoped_ptr<SkCanvas> m_canvas;
blink::WebRect m_paintRect;
bool m_isPainting;
bool m_animateScheduled;
std::map<unsigned, std::string> m_resourceIdentifierMap;
std::map<unsigned, blink::WebURLRequest> m_requestMap;
std::deque<base::Callback<void(const SkBitmap&)> >
m_compositeAndReadbackCallbacks;
bool m_logConsoleOutput;
int m_chooserCount;
scoped_ptr<blink::WebMIDIClientMock> m_midiClient;
scoped_ptr<MockWebSpeechRecognizer> m_speechRecognizer;
private:
DISALLOW_COPY_AND_ASSIGN(WebTestProxyBase);
};
// Use this template to inject methods into your WebViewClient/WebFrameClient
// implementation required for the running layout tests.
template<class Base, typename T>
class WebTestProxy : public Base, public WebTestProxyBase {
public:
explicit WebTestProxy(T t)
: Base(t)
{
}
virtual ~WebTestProxy() { }
// WebViewClient implementation.
virtual void didInvalidateRect(const blink::WebRect& rect)
{
WebTestProxyBase::didInvalidateRect(rect);
}
virtual void didScrollRect(int dx, int dy, const blink::WebRect& clipRect)
{
WebTestProxyBase::didScrollRect(dx, dy, clipRect);
}
virtual void scheduleComposite()
{
WebTestProxyBase::scheduleComposite();
}
virtual void scheduleAnimation()
{
WebTestProxyBase::scheduleAnimation();
}
virtual bool isCompositorFramePending() const
{
return WebTestProxyBase::isCompositorFramePending();
}
virtual void setWindowRect(const blink::WebRect& rect)
{
WebTestProxyBase::setWindowRect(rect);
Base::setWindowRect(rect);
}
virtual void show(blink::WebNavigationPolicy policy)
{
WebTestProxyBase::show(policy);
Base::show(policy);
}
virtual void didAutoResize(const blink::WebSize& newSize)
{
WebTestProxyBase::didAutoResize(newSize);
Base::didAutoResize(newSize);
}
virtual void postAccessibilityEvent(const blink::WebAXObject& object, blink::WebAXEvent event)
{
WebTestProxyBase::postAccessibilityEvent(object, event);
Base::postAccessibilityEvent(object, event);
}
virtual void startDragging(blink::WebLocalFrame* frame, const blink::WebDragData& data, blink::WebDragOperationsMask mask, const blink::WebImage& image, const blink::WebPoint& point)
{
WebTestProxyBase::startDragging(frame, data, mask, image, point);
// Don't forward this call to Base because we don't want to do a real drag-and-drop.
}
virtual void didChangeContents()
{
WebTestProxyBase::didChangeContents();
Base::didChangeContents();
}
virtual blink::WebView* createView(blink::WebLocalFrame* creator, const blink::WebURLRequest& request, const blink::WebWindowFeatures& features, const blink::WebString& frameName, blink::WebNavigationPolicy policy, bool suppressOpener)
{
if (!WebTestProxyBase::createView(creator, request, features, frameName, policy, suppressOpener))
return 0;
return Base::createView(creator, request, features, frameName, policy, suppressOpener);
}
virtual void setStatusText(const blink::WebString& text)
{
WebTestProxyBase::setStatusText(text);
Base::setStatusText(text);
}
virtual blink::WebUserMediaClient* userMediaClient()
{
return WebTestProxyBase::userMediaClient();
}
virtual void printPage(blink::WebLocalFrame* frame)
{
WebTestProxyBase::printPage(frame);
}
virtual blink::WebMIDIClient* webMIDIClient()
{
return WebTestProxyBase::webMIDIClient();
}
virtual blink::WebSpeechRecognizer* speechRecognizer()
{
return WebTestProxyBase::speechRecognizer();
}
virtual bool requestPointerLock()
{
return WebTestProxyBase::requestPointerLock();
}
virtual void requestPointerUnlock()
{
WebTestProxyBase::requestPointerUnlock();
}
virtual bool isPointerLocked()
{
return WebTestProxyBase::isPointerLocked();
}
virtual void didFocus()
{
WebTestProxyBase::didFocus();
Base::didFocus();
}
virtual void didBlur()
{
WebTestProxyBase::didBlur();
Base::didBlur();
}
virtual void setToolTipText(const blink::WebString& text, blink::WebTextDirection hint)
{
WebTestProxyBase::setToolTipText(text, hint);
Base::setToolTipText(text, hint);
}
virtual void resetInputMethod()
{
WebTestProxyBase::resetInputMethod();
}
virtual bool runFileChooser(const blink::WebFileChooserParams& params, blink::WebFileChooserCompletion* completion)
{
return WebTestProxyBase::runFileChooser(params, completion);
}
virtual void showValidationMessage(const blink::WebRect& anchorInRootView, const blink::WebString& mainText, const blink::WebString& supplementalText, blink::WebTextDirection hint)
{
WebTestProxyBase::showValidationMessage(anchorInRootView, mainText, supplementalText, hint);
}
virtual void hideValidationMessage()
{
WebTestProxyBase::hideValidationMessage();
}
virtual void moveValidationMessage(const blink::WebRect& anchorInRootView)
{
WebTestProxyBase::moveValidationMessage(anchorInRootView);
}
virtual void postSpellCheckEvent(const blink::WebString& eventName)
{
WebTestProxyBase::postSpellCheckEvent(eventName);
}
private:
DISALLOW_COPY_AND_ASSIGN(WebTestProxy);
};
} // namespace content
#endif // CONTENT_SHELL_RENDERER_TEST_RUNNER_WEBTESTPROXY_H_