1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CONTENT_SHELL_RENDERER_TEST_RUNNER_WEB_FRAME_TEST_PROXY_H_ 6 #define CONTENT_SHELL_RENDERER_TEST_RUNNER_WEB_FRAME_TEST_PROXY_H_ 7 8 #include "base/basictypes.h" 9 #include "content/shell/renderer/test_runner/TestInterfaces.h" 10 #include "content/shell/renderer/test_runner/WebTestDelegate.h" 11 #include "content/shell/renderer/test_runner/test_runner.h" 12 #include "content/shell/renderer/test_runner/web_test_proxy.h" 13 #include "content/test/test_media_stream_renderer_factory.h" 14 #include "third_party/WebKit/public/platform/WebString.h" 15 16 namespace content { 17 18 // Templetized wrapper around RenderFrameImpl objects, which implement 19 // the WebFrameClient interface. 20 template <class Base, typename P, typename R> 21 class WebFrameTestProxy : public Base { 22 public: WebFrameTestProxy(P p,R r)23 WebFrameTestProxy(P p, R r) : Base(p, r), base_proxy_(NULL) {} 24 ~WebFrameTestProxy()25 virtual ~WebFrameTestProxy() {} 26 set_base_proxy(WebTestProxyBase * proxy)27 void set_base_proxy(WebTestProxyBase* proxy) { base_proxy_ = proxy; } 28 29 // WebFrameClient implementation. createPlugin(blink::WebLocalFrame * frame,const blink::WebPluginParams & params)30 virtual blink::WebPlugin* createPlugin(blink::WebLocalFrame* frame, 31 const blink::WebPluginParams& params) { 32 blink::WebPlugin* plugin = base_proxy_->CreatePlugin(frame, params); 33 if (plugin) return plugin; 34 return Base::createPlugin(frame, params); 35 } 36 didAddMessageToConsole(const blink::WebConsoleMessage & message,const blink::WebString & sourceName,unsigned sourceLine,const blink::WebString & stackTrace)37 virtual void didAddMessageToConsole(const blink::WebConsoleMessage& message, 38 const blink::WebString& sourceName, 39 unsigned sourceLine, 40 const blink::WebString& stackTrace) { 41 base_proxy_->DidAddMessageToConsole(message, sourceName, sourceLine); 42 Base::didAddMessageToConsole(message, sourceName, sourceLine, stackTrace); 43 } 44 canCreatePluginWithoutRenderer(const blink::WebString & mimeType)45 virtual bool canCreatePluginWithoutRenderer( 46 const blink::WebString& mimeType) { 47 using blink::WebString; 48 49 const CR_DEFINE_STATIC_LOCAL(WebString, suffix, 50 ("-can-create-without-renderer")); 51 return mimeType.utf8().find(suffix.utf8()) != std::string::npos; 52 } 53 loadURLExternally(blink::WebLocalFrame * frame,const blink::WebURLRequest & request,blink::WebNavigationPolicy policy,const blink::WebString & suggested_name)54 virtual void loadURLExternally(blink::WebLocalFrame* frame, 55 const blink::WebURLRequest& request, 56 blink::WebNavigationPolicy policy, 57 const blink::WebString& suggested_name) { 58 base_proxy_->LoadURLExternally(frame, request, policy, suggested_name); 59 Base::loadURLExternally(frame, request, policy, suggested_name); 60 } 61 didStartProvisionalLoad(blink::WebLocalFrame * frame)62 virtual void didStartProvisionalLoad(blink::WebLocalFrame* frame) { 63 base_proxy_->DidStartProvisionalLoad(frame); 64 Base::didStartProvisionalLoad(frame); 65 } 66 didReceiveServerRedirectForProvisionalLoad(blink::WebLocalFrame * frame)67 virtual void didReceiveServerRedirectForProvisionalLoad( 68 blink::WebLocalFrame* frame) { 69 base_proxy_->DidReceiveServerRedirectForProvisionalLoad(frame); 70 Base::didReceiveServerRedirectForProvisionalLoad(frame); 71 } 72 didFailProvisionalLoad(blink::WebLocalFrame * frame,const blink::WebURLError & error)73 virtual void didFailProvisionalLoad(blink::WebLocalFrame* frame, 74 const blink::WebURLError& error) { 75 // If the test finished, don't notify the embedder of the failed load, 76 // as we already destroyed the document loader. 77 if (base_proxy_->DidFailProvisionalLoad(frame, error)) return; 78 Base::didFailProvisionalLoad(frame, error); 79 } 80 didCommitProvisionalLoad(blink::WebLocalFrame * frame,const blink::WebHistoryItem & item,blink::WebHistoryCommitType commit_type)81 virtual void didCommitProvisionalLoad( 82 blink::WebLocalFrame* frame, const blink::WebHistoryItem& item, 83 blink::WebHistoryCommitType commit_type) { 84 base_proxy_->DidCommitProvisionalLoad(frame, item, commit_type); 85 Base::didCommitProvisionalLoad(frame, item, commit_type); 86 } 87 didReceiveTitle(blink::WebLocalFrame * frame,const blink::WebString & title,blink::WebTextDirection direction)88 virtual void didReceiveTitle(blink::WebLocalFrame* frame, 89 const blink::WebString& title, 90 blink::WebTextDirection direction) { 91 base_proxy_->DidReceiveTitle(frame, title, direction); 92 Base::didReceiveTitle(frame, title, direction); 93 } 94 didChangeIcon(blink::WebLocalFrame * frame,blink::WebIconURL::Type iconType)95 virtual void didChangeIcon(blink::WebLocalFrame* frame, 96 blink::WebIconURL::Type iconType) { 97 base_proxy_->DidChangeIcon(frame, iconType); 98 Base::didChangeIcon(frame, iconType); 99 } 100 didFinishDocumentLoad(blink::WebLocalFrame * frame)101 virtual void didFinishDocumentLoad(blink::WebLocalFrame* frame) { 102 base_proxy_->DidFinishDocumentLoad(frame); 103 Base::didFinishDocumentLoad(frame); 104 } 105 didHandleOnloadEvents(blink::WebLocalFrame * frame)106 virtual void didHandleOnloadEvents(blink::WebLocalFrame* frame) { 107 base_proxy_->DidHandleOnloadEvents(frame); 108 Base::didHandleOnloadEvents(frame); 109 } 110 didFailLoad(blink::WebLocalFrame * frame,const blink::WebURLError & error)111 virtual void didFailLoad(blink::WebLocalFrame* frame, 112 const blink::WebURLError& error) { 113 base_proxy_->DidFailLoad(frame, error); 114 Base::didFailLoad(frame, error); 115 } 116 didFinishLoad(blink::WebLocalFrame * frame)117 virtual void didFinishLoad(blink::WebLocalFrame* frame) { 118 Base::didFinishLoad(frame); 119 base_proxy_->DidFinishLoad(frame); 120 } 121 notificationPresenter()122 virtual blink::WebNotificationPresenter* notificationPresenter() { 123 return base_proxy_->GetNotificationPresenter(); 124 } 125 didChangeSelection(bool is_selection_empty)126 virtual void didChangeSelection(bool is_selection_empty) { 127 base_proxy_->DidChangeSelection(is_selection_empty); 128 Base::didChangeSelection(is_selection_empty); 129 } 130 createColorChooser(blink::WebColorChooserClient * client,const blink::WebColor & initial_color,const blink::WebVector<blink::WebColorSuggestion> & suggestions)131 virtual blink::WebColorChooser* createColorChooser( 132 blink::WebColorChooserClient* client, 133 const blink::WebColor& initial_color, 134 const blink::WebVector<blink::WebColorSuggestion>& suggestions) { 135 return base_proxy_->CreateColorChooser(client, initial_color, suggestions); 136 } 137 runModalAlertDialog(const blink::WebString & message)138 virtual void runModalAlertDialog(const blink::WebString& message) { 139 base_proxy_->delegate_->printMessage(std::string("ALERT: ") + 140 message.utf8().data() + "\n"); 141 } 142 runModalConfirmDialog(const blink::WebString & message)143 virtual bool runModalConfirmDialog(const blink::WebString& message) { 144 base_proxy_->delegate_->printMessage(std::string("CONFIRM: ") + 145 message.utf8().data() + "\n"); 146 return true; 147 } 148 runModalPromptDialog(const blink::WebString & message,const blink::WebString & defaultValue,blink::WebString *)149 virtual bool runModalPromptDialog(const blink::WebString& message, 150 const blink::WebString& defaultValue, 151 blink::WebString*) { 152 base_proxy_->delegate_->printMessage( 153 std::string("PROMPT: ") + message.utf8().data() + ", default text: " + 154 defaultValue.utf8().data() + "\n"); 155 return true; 156 } 157 runModalBeforeUnloadDialog(bool is_reload,const blink::WebString & message)158 virtual bool runModalBeforeUnloadDialog(bool is_reload, 159 const blink::WebString& message) { 160 base_proxy_->delegate_->printMessage(std::string("CONFIRM NAVIGATION: ") + 161 message.utf8().data() + "\n"); 162 return !base_proxy_->test_interfaces_->testRunner() 163 ->shouldStayOnPageAfterHandlingBeforeUnload(); 164 } 165 showContextMenu(const blink::WebContextMenuData & contextMenuData)166 virtual void showContextMenu( 167 const blink::WebContextMenuData& contextMenuData) { 168 base_proxy_->ShowContextMenu(Base::GetWebFrame()->toWebLocalFrame(), 169 contextMenuData); 170 Base::showContextMenu(contextMenuData); 171 } 172 didDetectXSS(blink::WebLocalFrame * frame,const blink::WebURL & insecureURL,bool didBlockEntirePage)173 virtual void didDetectXSS(blink::WebLocalFrame* frame, 174 const blink::WebURL& insecureURL, 175 bool didBlockEntirePage) { 176 // This is not implemented in RenderFrameImpl, so need to explicitly call 177 // into the base proxy. 178 base_proxy_->DidDetectXSS(frame, insecureURL, didBlockEntirePage); 179 Base::didDetectXSS(frame, insecureURL, didBlockEntirePage); 180 } 181 didDispatchPingLoader(blink::WebLocalFrame * frame,const blink::WebURL & url)182 virtual void didDispatchPingLoader(blink::WebLocalFrame* frame, 183 const blink::WebURL& url) { 184 // This is not implemented in RenderFrameImpl, so need to explicitly call 185 // into the base proxy. 186 base_proxy_->DidDispatchPingLoader(frame, url); 187 Base::didDispatchPingLoader(frame, url); 188 } 189 willRequestResource(blink::WebLocalFrame * frame,const blink::WebCachedURLRequest & request)190 virtual void willRequestResource(blink::WebLocalFrame* frame, 191 const blink::WebCachedURLRequest& request) { 192 // This is not implemented in RenderFrameImpl, so need to explicitly call 193 // into the base proxy. 194 base_proxy_->WillRequestResource(frame, request); 195 Base::willRequestResource(frame, request); 196 } 197 didCreateDataSource(blink::WebLocalFrame * frame,blink::WebDataSource * ds)198 virtual void didCreateDataSource(blink::WebLocalFrame* frame, 199 blink::WebDataSource* ds) { 200 Base::didCreateDataSource(frame, ds); 201 } 202 willSendRequest(blink::WebLocalFrame * frame,unsigned identifier,blink::WebURLRequest & request,const blink::WebURLResponse & redirectResponse)203 virtual void willSendRequest(blink::WebLocalFrame* frame, unsigned identifier, 204 blink::WebURLRequest& request, 205 const blink::WebURLResponse& redirectResponse) { 206 Base::willSendRequest(frame, identifier, request, redirectResponse); 207 base_proxy_->WillSendRequest(frame, identifier, request, redirectResponse); 208 } 209 didReceiveResponse(blink::WebLocalFrame * frame,unsigned identifier,const blink::WebURLResponse & response)210 virtual void didReceiveResponse(blink::WebLocalFrame* frame, 211 unsigned identifier, 212 const blink::WebURLResponse& response) { 213 base_proxy_->DidReceiveResponse(frame, identifier, response); 214 Base::didReceiveResponse(frame, identifier, response); 215 } 216 didChangeResourcePriority(blink::WebLocalFrame * frame,unsigned identifier,const blink::WebURLRequest::Priority & priority,int intra_priority_value)217 virtual void didChangeResourcePriority( 218 blink::WebLocalFrame* frame, unsigned identifier, 219 const blink::WebURLRequest::Priority& priority, 220 int intra_priority_value) { 221 // This is not implemented in RenderFrameImpl, so need to explicitly call 222 // into the base proxy. 223 base_proxy_->DidChangeResourcePriority(frame, identifier, priority, 224 intra_priority_value); 225 Base::didChangeResourcePriority(frame, identifier, priority, 226 intra_priority_value); 227 } 228 didFinishResourceLoad(blink::WebLocalFrame * frame,unsigned identifier)229 virtual void didFinishResourceLoad(blink::WebLocalFrame* frame, 230 unsigned identifier) { 231 base_proxy_->DidFinishResourceLoad(frame, identifier); 232 Base::didFinishResourceLoad(frame, identifier); 233 } 234 decidePolicyForNavigation(blink::WebLocalFrame * frame,blink::WebDataSource::ExtraData * extraData,const blink::WebURLRequest & request,blink::WebNavigationType type,blink::WebNavigationPolicy defaultPolicy,bool isRedirect)235 virtual blink::WebNavigationPolicy decidePolicyForNavigation( 236 blink::WebLocalFrame* frame, blink::WebDataSource::ExtraData* extraData, 237 const blink::WebURLRequest& request, blink::WebNavigationType type, 238 blink::WebNavigationPolicy defaultPolicy, bool isRedirect) { 239 blink::WebNavigationPolicy policy = base_proxy_->DecidePolicyForNavigation( 240 frame, extraData, request, type, defaultPolicy, isRedirect); 241 if (policy == blink::WebNavigationPolicyIgnore) return policy; 242 243 return Base::decidePolicyForNavigation(frame, extraData, request, type, 244 defaultPolicy, isRedirect); 245 } 246 willStartUsingPeerConnectionHandler(blink::WebLocalFrame * frame,blink::WebRTCPeerConnectionHandler * handler)247 virtual void willStartUsingPeerConnectionHandler( 248 blink::WebLocalFrame* frame, 249 blink::WebRTCPeerConnectionHandler* handler) { 250 // RenderFrameImpl::willStartUsingPeerConnectionHandler can not be mocked. 251 // See http://crbug/363285. 252 } 253 userMediaClient()254 virtual blink::WebUserMediaClient* userMediaClient() { 255 return base_proxy_->GetUserMediaClient(); 256 } 257 258 webMIDIClient()259 virtual blink::WebMIDIClient* webMIDIClient() { 260 return base_proxy_->GetWebMIDIClient(); 261 } 262 willCheckAndDispatchMessageEvent(blink::WebLocalFrame * sourceFrame,blink::WebFrame * targetFrame,blink::WebSecurityOrigin target,blink::WebDOMMessageEvent event)263 virtual bool willCheckAndDispatchMessageEvent( 264 blink::WebLocalFrame* sourceFrame, blink::WebFrame* targetFrame, 265 blink::WebSecurityOrigin target, blink::WebDOMMessageEvent event) { 266 if (base_proxy_->WillCheckAndDispatchMessageEvent(sourceFrame, targetFrame, 267 target, event)) 268 return true; 269 return Base::willCheckAndDispatchMessageEvent(sourceFrame, targetFrame, 270 target, event); 271 } 272 didStopLoading()273 virtual void didStopLoading() { 274 base_proxy_->DidStopLoading(); 275 Base::didStopLoading(); 276 } 277 278 private: 279 virtual scoped_ptr<MediaStreamRendererFactory> CreateRendererFactory()280 CreateRendererFactory() OVERRIDE { 281 return scoped_ptr<MediaStreamRendererFactory>( 282 new TestMediaStreamRendererFactory()); 283 } 284 285 WebTestProxyBase* base_proxy_; 286 287 DISALLOW_COPY_AND_ASSIGN(WebFrameTestProxy); 288 }; 289 290 } // namespace content 291 292 #endif // CONTENT_SHELL_RENDERER_TEST_RUNNER_WEB_FRAME_TEST_PROXY_H_ 293