blob: 26cb18dfad4cce5a26fa3f698ca883889367c788 [file] [log] [blame]
/*
* Copyright (C) 2012 Google Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following disclaimer
* in the documentation and/or other materials provided with the
* distribution.
* * Neither the name of Google Inc. nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef WebTestProxy_h
#define WebTestProxy_h
#include "WebScopedPtr.h"
#include "WebTask.h"
#include "WebTestCommon.h"
#include "public/platform/WebNonCopyable.h"
#include "public/platform/WebRect.h"
#include "public/platform/WebURLError.h"
#include "public/platform/WebURLRequest.h"
#include "public/web/WebAXEnums.h"
#include "public/web/WebDOMMessageEvent.h"
#include "public/web/WebDataSource.h"
#include "public/web/WebDragOperation.h"
#include "public/web/WebIconURL.h"
#include "public/web/WebNavigationPolicy.h"
#include "public/web/WebNavigationType.h"
#include "public/web/WebSecurityOrigin.h"
#include "public/web/WebTextAffinity.h"
#include "public/web/WebTextDirection.h"
#include <map>
#include <string>
namespace blink {
class WebAXObject;
class WebAudioDevice;
class WebCachedURLRequest;
class WebColorChooser;
class WebColorChooserClient;
class WebDataSource;
class WebDragData;
class WebFileChooserCompletion;
class WebFrame;
class WebGeolocationClient;
class WebGeolocationClientMock;
class WebImage;
class WebMIDIAccessor;
class WebMIDIAccessorClient;
class WebMIDIClient;
class WebMIDIClientMock;
class WebNode;
class WebNotificationPresenter;
class WebPlugin;
class WebRange;
class WebSerializedScriptValue;
class WebSpeechInputController;
class WebSpeechInputListener;
class WebSpeechRecognizer;
class WebSpellCheckClient;
class WebString;
class WebURL;
class WebURLResponse;
class WebUserMediaClient;
class WebValidationMessageClient;
class WebView;
class WebWidget;
struct WebColorSuggestion;
struct WebConsoleMessage;
struct WebContextMenuData;
struct WebFileChooserParams;
struct WebPluginParams;
struct WebPoint;
struct WebSize;
struct WebWindowFeatures;
typedef unsigned WebColor;
}
class SkCanvas;
namespace WebTestRunner {
class MockWebSpeechInputController;
class MockWebSpeechRecognizer;
class MockWebValidationMessageClient;
class SpellCheckClient;
class TestInterfaces;
class WebTestDelegate;
class WebTestInterfaces;
class WebTestRunner;
class WebUserMediaClientMock;
class WEBTESTRUNNER_EXPORT WebTestProxyBase {
public:
void setInterfaces(WebTestInterfaces*);
void setDelegate(WebTestDelegate*);
void setWidget(blink::WebWidget*);
void reset();
blink::WebSpellCheckClient *spellCheckClient() const;
blink::WebValidationMessageClient* validationMessageClient();
blink::WebColorChooser* createColorChooser(blink::WebColorChooserClient*, const blink::WebColor&);
blink::WebColorChooser* createColorChooser(blink::WebColorChooserClient*, const blink::WebColor&, const blink::WebVector<blink::WebColorSuggestion>& suggestions);
bool runFileChooser(const blink::WebFileChooserParams&, blink::WebFileChooserCompletion*);
std::string captureTree(bool debugRenderTree);
SkCanvas* capturePixels();
void setLogConsoleOutput(bool enabled);
// FIXME: Make this private again.
void scheduleComposite();
void didOpenChooser();
void didCloseChooser();
bool isChooserShown();
#if WEBTESTRUNNER_IMPLEMENTATION
void display();
void displayInvalidatedRegion();
void discardBackingStore();
blink::WebGeolocationClientMock* geolocationClientMock();
blink::WebMIDIClientMock* midiClientMock();
MockWebSpeechInputController* speechInputControllerMock();
MockWebSpeechRecognizer* speechRecognizerMock();
#endif
WebTaskList* taskList() { return &m_taskList; }
blink::WebView* webView();
void didForceResize();
void postSpellCheckEvent(const blink::WebString& eventName);
protected:
WebTestProxyBase();
~WebTestProxyBase();
void didInvalidateRect(const blink::WebRect&);
void didScrollRect(int, int, const blink::WebRect&);
void scheduleAnimation();
// 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::WebFrame*, const blink::WebDragData&, blink::WebDragOperationsMask, const blink::WebImage&, const blink::WebPoint&);
void didChangeSelection(bool isEmptySelection);
void didChangeContents();
void didEndEditing();
bool createView(blink::WebFrame* creator, const blink::WebURLRequest&, const blink::WebWindowFeatures&, const blink::WebString& frameName, blink::WebNavigationPolicy, bool suppressOpener);
blink::WebPlugin* createPlugin(blink::WebFrame*, const blink::WebPluginParams&);
void setStatusText(const blink::WebString&);
void didStopLoading();
void showContextMenu(blink::WebFrame*, const blink::WebContextMenuData&);
blink::WebUserMediaClient* userMediaClient();
void printPage(blink::WebFrame*);
blink::WebNotificationPresenter* notificationPresenter();
blink::WebGeolocationClient* geolocationClient();
blink::WebMIDIClient* webMIDIClient();
blink::WebSpeechInputController* speechInputController(blink::WebSpeechInputListener*);
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 runModalAlertDialog(blink::WebFrame*, const blink::WebString&);
bool runModalConfirmDialog(blink::WebFrame*, const blink::WebString&);
bool runModalPromptDialog(blink::WebFrame*, const blink::WebString& message, const blink::WebString& defaultValue, blink::WebString* actualValue);
bool runModalBeforeUnloadDialog(blink::WebFrame*, const blink::WebString&);
void didStartProvisionalLoad(blink::WebFrame*);
void didReceiveServerRedirectForProvisionalLoad(blink::WebFrame*);
bool didFailProvisionalLoad(blink::WebFrame*, const blink::WebURLError&);
void didCommitProvisionalLoad(blink::WebFrame*, bool isNewNavigation);
void didReceiveTitle(blink::WebFrame*, const blink::WebString& title, blink::WebTextDirection);
void didChangeIcon(blink::WebFrame*, blink::WebIconURL::Type);
void didFinishDocumentLoad(blink::WebFrame*);
void didHandleOnloadEvents(blink::WebFrame*);
void didFailLoad(blink::WebFrame*, const blink::WebURLError&);
void didFinishLoad(blink::WebFrame*);
void didChangeLocationWithinPage(blink::WebFrame*);
void didDetectXSS(blink::WebFrame*, const blink::WebURL& insecureURL, bool didBlockEntirePage);
void didDispatchPingLoader(blink::WebFrame*, const blink::WebURL&);
void willRequestResource(blink::WebFrame*, const blink::WebCachedURLRequest&);
void didCreateDataSource(blink::WebFrame*, blink::WebDataSource*);
void willSendRequest(blink::WebFrame*, unsigned identifier, blink::WebURLRequest&, const blink::WebURLResponse& redirectResponse);
void didReceiveResponse(blink::WebFrame*, unsigned identifier, const blink::WebURLResponse&);
void didChangeResourcePriority(blink::WebFrame*, unsigned identifier, const blink::WebURLRequest::Priority&);
void didFinishResourceLoad(blink::WebFrame*, unsigned identifier);
blink::WebNavigationPolicy decidePolicyForNavigation(blink::WebFrame*, blink::WebDataSource::ExtraData*, const blink::WebURLRequest&, blink::WebNavigationType, blink::WebNavigationPolicy defaultPolicy, bool isRedirect);
bool willCheckAndDispatchMessageEvent(blink::WebFrame* 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 displayRepaintMask();
void invalidateAll();
void animateNow();
blink::WebWidget* webWidget();
TestInterfaces* m_testInterfaces;
WebTestDelegate* m_delegate;
blink::WebWidget* m_webWidget;
WebTaskList m_taskList;
WebScopedPtr<SpellCheckClient> m_spellcheck;
WebScopedPtr<WebUserMediaClientMock> m_userMediaClient;
// Painting.
WebScopedPtr<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;
bool m_logConsoleOutput;
int m_chooserCount;
WebScopedPtr<blink::WebGeolocationClientMock> m_geolocationClient;
WebScopedPtr<blink::WebMIDIClientMock> m_midiClient;
WebScopedPtr<MockWebSpeechRecognizer> m_speechRecognizer;
WebScopedPtr<MockWebSpeechInputController> m_speechInputController;
WebScopedPtr<MockWebValidationMessageClient> m_validationMessageClient;
// FIXME:: We want to move away from this pattern and mark classes
// as Noncopyable, but this class is marked as WEBTESTRUNNER_EXPORT
// while WebNonCopyable is not, so we cannot inherit from WebNonCopyable.
// To overcome the problem, for now not inheriting from WebNonCopyable
// but plan to fix it when we make the change of making WebNonCopyable
// a macro rather than class. We will have a single way to mark all classes
// as Noncopyable.
// Tracked under: http://code.google.com/p/chromium/issues/detail?id=229178
private:
WebTestProxyBase(WebTestProxyBase&);
WebTestProxyBase& operator=(const 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 blink::WebNonCopyable {
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 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::WebFrame* 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 didChangeSelection(bool isEmptySelection)
{
WebTestProxyBase::didChangeSelection(isEmptySelection);
Base::didChangeSelection(isEmptySelection);
}
virtual void didChangeContents()
{
WebTestProxyBase::didChangeContents();
Base::didChangeContents();
}
virtual blink::WebView* createView(blink::WebFrame* 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 void didStopLoading()
{
WebTestProxyBase::didStopLoading();
Base::didStopLoading();
}
virtual void showContextMenu(blink::WebFrame* frame, const blink::WebContextMenuData& contextMenuData)
{
WebTestProxyBase::showContextMenu(frame, contextMenuData);
Base::showContextMenu(frame, contextMenuData);
}
virtual blink::WebUserMediaClient* userMediaClient()
{
return WebTestProxyBase::userMediaClient();
}
virtual void printPage(blink::WebFrame* frame)
{
WebTestProxyBase::printPage(frame);
}
virtual blink::WebNotificationPresenter* notificationPresenter()
{
return WebTestProxyBase::notificationPresenter();
}
virtual blink::WebGeolocationClient* geolocationClient()
{
return WebTestProxyBase::geolocationClient();
}
virtual blink::WebMIDIClient* webMIDIClient()
{
return WebTestProxyBase::webMIDIClient();
}
virtual blink::WebSpeechInputController* speechInputController(blink::WebSpeechInputListener* listener)
{
return WebTestProxyBase::speechInputController(listener);
}
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 void didStartProvisionalLoad(blink::WebFrame* frame)
{
WebTestProxyBase::didStartProvisionalLoad(frame);
Base::didStartProvisionalLoad(frame);
}
virtual void didReceiveServerRedirectForProvisionalLoad(blink::WebFrame* frame)
{
WebTestProxyBase::didReceiveServerRedirectForProvisionalLoad(frame);
Base::didReceiveServerRedirectForProvisionalLoad(frame);
}
virtual void didFailProvisionalLoad(blink::WebFrame* frame, const blink::WebURLError& error)
{
// If the test finished, don't notify the embedder of the failed load,
// as we already destroyed the document loader.
if (WebTestProxyBase::didFailProvisionalLoad(frame, error))
return;
Base::didFailProvisionalLoad(frame, error);
}
virtual void didCommitProvisionalLoad(blink::WebFrame* frame, bool isNewNavigation)
{
WebTestProxyBase::didCommitProvisionalLoad(frame, isNewNavigation);
Base::didCommitProvisionalLoad(frame, isNewNavigation);
}
virtual void didReceiveTitle(blink::WebFrame* frame, const blink::WebString& title, blink::WebTextDirection direction)
{
WebTestProxyBase::didReceiveTitle(frame, title, direction);
Base::didReceiveTitle(frame, title, direction);
}
virtual void didChangeIcon(blink::WebFrame* frame, blink::WebIconURL::Type iconType)
{
WebTestProxyBase::didChangeIcon(frame, iconType);
Base::didChangeIcon(frame, iconType);
}
virtual void didFinishDocumentLoad(blink::WebFrame* frame)
{
WebTestProxyBase::didFinishDocumentLoad(frame);
Base::didFinishDocumentLoad(frame);
}
virtual void didHandleOnloadEvents(blink::WebFrame* frame)
{
WebTestProxyBase::didHandleOnloadEvents(frame);
Base::didHandleOnloadEvents(frame);
}
virtual void didFailLoad(blink::WebFrame* frame, const blink::WebURLError& error)
{
WebTestProxyBase::didFailLoad(frame, error);
Base::didFailLoad(frame, error);
}
virtual void didFinishLoad(blink::WebFrame* frame)
{
WebTestProxyBase::didFinishLoad(frame);
Base::didFinishLoad(frame);
}
virtual void didDetectXSS(blink::WebFrame* frame, const blink::WebURL& insecureURL, bool didBlockEntirePage)
{
WebTestProxyBase::didDetectXSS(frame, insecureURL, didBlockEntirePage);
Base::didDetectXSS(frame, insecureURL, didBlockEntirePage);
}
virtual void willRequestResource(blink::WebFrame* frame, const blink::WebCachedURLRequest& request)
{
WebTestProxyBase::willRequestResource(frame, request);
Base::willRequestResource(frame, request);
}
virtual void didCreateDataSource(blink::WebFrame* frame, blink::WebDataSource* ds)
{
WebTestProxyBase::didCreateDataSource(frame, ds);
Base::didCreateDataSource(frame, ds);
}
virtual void willSendRequest(blink::WebFrame* frame, unsigned identifier, blink::WebURLRequest& request, const blink::WebURLResponse& redirectResponse)
{
WebTestProxyBase::willSendRequest(frame, identifier, request, redirectResponse);
Base::willSendRequest(frame, identifier, request, redirectResponse);
}
virtual void didReceiveResponse(blink::WebFrame* frame, unsigned identifier, const blink::WebURLResponse& response)
{
WebTestProxyBase::didReceiveResponse(frame, identifier, response);
Base::didReceiveResponse(frame, identifier, response);
}
virtual void didChangeResourcePriority(blink::WebFrame* frame, unsigned identifier, const blink::WebURLRequest::Priority& priority)
{
WebTestProxyBase::didChangeResourcePriority(frame, identifier, priority);
Base::didChangeResourcePriority(frame, identifier, priority);
}
virtual void didFinishResourceLoad(blink::WebFrame* frame, unsigned identifier)
{
WebTestProxyBase::didFinishResourceLoad(frame, identifier);
Base::didFinishResourceLoad(frame, identifier);
}
virtual void didAddMessageToConsole(const blink::WebConsoleMessage& message, const blink::WebString& sourceName, unsigned sourceLine, const blink::WebString& stackTrace)
{
WebTestProxyBase::didAddMessageToConsole(message, sourceName, sourceLine);
Base::didAddMessageToConsole(message, sourceName, sourceLine, stackTrace);
}
virtual void runModalAlertDialog(blink::WebFrame* frame, const blink::WebString& message)
{
WebTestProxyBase::runModalAlertDialog(frame, message);
Base::runModalAlertDialog(frame, message);
}
virtual bool runModalConfirmDialog(blink::WebFrame* frame, const blink::WebString& message)
{
WebTestProxyBase::runModalConfirmDialog(frame, message);
return Base::runModalConfirmDialog(frame, message);
}
virtual bool runModalPromptDialog(blink::WebFrame* frame, const blink::WebString& message, const blink::WebString& defaultValue, blink::WebString* actualValue)
{
WebTestProxyBase::runModalPromptDialog(frame, message, defaultValue, actualValue);
return Base::runModalPromptDialog(frame, message, defaultValue, actualValue);
}
virtual bool runModalBeforeUnloadDialog(blink::WebFrame* frame, const blink::WebString& message)
{
return WebTestProxyBase::runModalBeforeUnloadDialog(frame, message);
}
virtual blink::WebNavigationPolicy decidePolicyForNavigation(blink::WebFrame* frame, blink::WebDataSource::ExtraData* extraData, const blink::WebURLRequest& request, blink::WebNavigationType type, blink::WebNavigationPolicy defaultPolicy, bool isRedirect)
{
blink::WebNavigationPolicy policy = WebTestProxyBase::decidePolicyForNavigation(frame, extraData, request, type, defaultPolicy, isRedirect);
if (policy == blink::WebNavigationPolicyIgnore)
return policy;
return Base::decidePolicyForNavigation(frame, extraData, request, type, defaultPolicy, isRedirect);
}
virtual bool willCheckAndDispatchMessageEvent(blink::WebFrame* sourceFrame, blink::WebFrame* targetFrame, blink::WebSecurityOrigin target, blink::WebDOMMessageEvent event)
{
if (WebTestProxyBase::willCheckAndDispatchMessageEvent(sourceFrame, targetFrame, target, event))
return true;
return Base::willCheckAndDispatchMessageEvent(sourceFrame, targetFrame, target, event);
}
virtual blink::WebColorChooser* createColorChooser(blink::WebColorChooserClient* client, const blink::WebColor& color)
{
return WebTestProxyBase::createColorChooser(client, color);
}
virtual blink::WebColorChooser* createColorChooser(blink::WebColorChooserClient* client, const blink::WebColor& color, const blink::WebVector<blink::WebColorSuggestion>& suggestions)
{
return WebTestProxyBase::createColorChooser(client, color, suggestions);
}
virtual bool runFileChooser(const blink::WebFileChooserParams& params, blink::WebFileChooserCompletion* completion)
{
return WebTestProxyBase::runFileChooser(params, completion);
}
virtual void postSpellCheckEvent(const blink::WebString& eventName)
{
WebTestProxyBase::postSpellCheckEvent(eventName);
}
};
}
#endif // WebTestProxy_h