From 33a2ae42db9b1bba2f91366cdba8e478ccae4382 Mon Sep 17 00:00:00 2001 From: "cbiesinger@chromium.org" Date: Mon, 22 Jul 2013 23:10:54 +0000 Subject: Revert "Add partial WebFrameClient implementation to RenderFrame." This reverts commit 928413313366792564237aac159abd2c05cb35af. Seems to break lots of plugin tests: http://build.chromium.org/p/chromium.webkit/builders/WebKit%20Linux/builds/14561 http://test-results.appspot.com/dashboards/flakiness_dashboard.html#tests=compositing%2Fplugins%2Fwebplugin-alpha.html TBR=nasko@chromium.org BUG=245126 Review URL: https://codereview.chromium.org/19929003 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@212995 0039d316-1c4b-4281-b951-d872f2087c98 --- content/renderer/render_frame_impl.cc | 604 +++------------------------------- content/renderer/render_frame_impl.h | 2 +- content/renderer/render_view_impl.cc | 445 ++++++++++++++++++++++--- content/renderer/render_view_impl.h | 16 - content/test/layouttest_support.cc | 1 - 5 files changed, 443 insertions(+), 625 deletions(-) diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc index ec350bc..83e86e8 100644 --- a/content/renderer/render_frame_impl.cc +++ b/content/renderer/render_frame_impl.cc @@ -4,74 +4,8 @@ #include "content/renderer/render_frame_impl.h" -#include "base/strings/utf_string_conversions.h" -#include "base/time/time.h" -#include "content/child/appcache_dispatcher.h" -#include "content/child/fileapi/file_system_dispatcher.h" -#include "content/child/fileapi/webfilesystem_callback_adapters.h" -#include "content/child/quota_dispatcher.h" -#include "content/child/request_extra_data.h" -#include "content/common/socket_stream_handle_data.h" -#include "content/common/view_messages.h" -#include "content/public/common/content_constants.h" -#include "content/public/common/url_constants.h" -#include "content/public/renderer/content_renderer_client.h" -#include "content/public/renderer/document_state.h" -#include "content/public/renderer/navigation_state.h" -#include "content/public/renderer/password_form_conversion_utils.h" -#include "content/renderer/browser_plugin/browser_plugin.h" -#include "content/renderer/browser_plugin/browser_plugin_manager.h" -#include "content/renderer/internal_document_state_data.h" -#include "content/renderer/media/rtc_peer_connection_handler.h" -#include "content/renderer/render_thread_impl.h" #include "content/renderer/render_view_impl.h" #include "content/renderer/renderer_webapplicationcachehost_impl.h" -#include "content/renderer/webplugin_impl.h" -#include "content/renderer/websharedworker_proxy.h" -#include "net/base/net_errors.h" -#include "net/http/http_util.h" -#include "third_party/WebKit/public/platform/WebString.h" -#include "third_party/WebKit/public/platform/WebURL.h" -#include "third_party/WebKit/public/platform/WebURLError.h" -#include "third_party/WebKit/public/platform/WebURLResponse.h" -#include "third_party/WebKit/public/platform/WebVector.h" -#include "third_party/WebKit/public/web/WebDocument.h" -#include "third_party/WebKit/public/web/WebFileSystemCallbacks.h" -#include "third_party/WebKit/public/web/WebFrame.h" -#include "third_party/WebKit/public/web/WebNavigationPolicy.h" -#include "third_party/WebKit/public/web/WebPlugin.h" -#include "third_party/WebKit/public/web/WebPluginParams.h" -#include "third_party/WebKit/public/web/WebSearchableFormData.h" -#include "third_party/WebKit/public/web/WebSecurityOrigin.h" -#include "third_party/WebKit/public/web/WebStorageQuotaCallbacks.h" -#include "third_party/WebKit/public/web/WebUserGestureIndicator.h" -#include "third_party/WebKit/public/web/WebView.h" -#include "webkit/glue/weburlresponse_extradata_impl.h" - -using WebKit::WebDataSource; -using WebKit::WebDocument; -using WebKit::WebFileSystemCallbacks; -using WebKit::WebFrame; -using WebKit::WebNavigationPolicy; -using WebKit::WebPluginParams; -using WebKit::WebReferrerPolicy; -using WebKit::WebSearchableFormData; -using WebKit::WebSecurityOrigin; -using WebKit::WebStorageQuotaCallbacks; -using WebKit::WebString; -using WebKit::WebURL; -using WebKit::WebURLError; -using WebKit::WebURLRequest; -using WebKit::WebURLResponse; -using WebKit::WebUserGestureIndicator; -using WebKit::WebVector; -using WebKit::WebView; - -using appcache::WebApplicationCacheHostImpl; -using base::Time; -using base::TimeDelta; - -using webkit_glue::WebURLResponseExtraDataImpl; namespace content { @@ -100,7 +34,6 @@ void RenderFrameImpl::InstallCreateHook( g_create_render_frame_impl = create_render_frame_impl; } -// RenderFrameImpl ---------------------------------------------------------- RenderFrameImpl::RenderFrameImpl(RenderViewImpl* render_view, int routing_id) : render_view_(render_view), routing_id_(routing_id) { @@ -109,13 +42,6 @@ RenderFrameImpl::RenderFrameImpl(RenderViewImpl* render_view, int routing_id) RenderFrameImpl::~RenderFrameImpl() { } -int RenderFrameImpl::GetRoutingID() const { - // TODO(nasko): Until we register RenderFrameHost in the browser process as - // a listener, we must route all messages to the RenderViewHost, so use the - // routing id of the RenderView for now. - return render_view_->GetRoutingID(); -} - bool RenderFrameImpl::Send(IPC::Message* message) { // TODO(nasko): Move away from using the RenderView's Send method once we // have enough infrastructure and state to make the right checks here. @@ -133,32 +59,7 @@ bool RenderFrameImpl::OnMessageReceived(const IPC::Message& msg) { WebKit::WebPlugin* RenderFrameImpl::createPlugin( WebKit::WebFrame* frame, const WebKit::WebPluginParams& params) { - WebKit::WebPlugin* plugin = NULL; - if (GetContentClient()->renderer()->OverrideCreatePlugin( - render_view_, frame, params, &plugin)) { - return plugin; - } - -#if defined(ENABLE_PLUGINS) - if (UTF16ToASCII(params.mimeType) == kBrowserPluginMimeType) { - return render_view_->GetBrowserPluginManager()->CreateBrowserPlugin( - render_view_, frame, params); - } - - WebPluginInfo info; - std::string mime_type; - bool found = render_view_->GetPluginInfo( - params.url, frame->top()->document().url(), params.mimeType.utf8(), - &info, &mime_type); - if (!found) - return NULL; - - WebPluginParams params_to_use = params; - params_to_use.mimeType = WebString::fromUTF8(mime_type); - return render_view_->CreatePlugin(frame, info, params_to_use); -#else - return NULL; -#endif // defined(ENABLE_PLUGINS) + return render_view_->createPlugin(frame, params); } WebKit::WebSharedWorker* RenderFrameImpl::createSharedWorker( @@ -166,47 +67,20 @@ WebKit::WebSharedWorker* RenderFrameImpl::createSharedWorker( const WebKit::WebURL& url, const WebKit::WebString& name, unsigned long long document_id) { - int route_id = MSG_ROUTING_NONE; - bool exists = false; - bool url_mismatch = false; - ViewHostMsg_CreateWorker_Params params; - params.url = url; - params.name = name; - params.document_id = document_id; - params.render_view_route_id = GetRoutingID(); - params.route_id = MSG_ROUTING_NONE; - params.script_resource_appcache_id = 0; - Send(new ViewHostMsg_LookupSharedWorker( - params, &exists, &route_id, &url_mismatch)); - if (url_mismatch) { - return NULL; - } else { - return new WebSharedWorkerProxy(RenderThreadImpl::current(), - document_id, - exists, - route_id, - GetRoutingID()); - } + return render_view_->createSharedWorker(frame, url, name, document_id); } WebKit::WebMediaPlayer* RenderFrameImpl::createMediaPlayer( WebKit::WebFrame* frame, const WebKit::WebURL& url, WebKit::WebMediaPlayerClient* client) { - // TODO(nasko): Moving the implementation here involves moving a few media - // related client objects here or referencing them in the RenderView. Needs - // more work to understand where the proper place for those objects is. return render_view_->createMediaPlayer(frame, url, client); } WebKit::WebApplicationCacheHost* RenderFrameImpl::createApplicationCacheHost( WebKit::WebFrame* frame, WebKit::WebApplicationCacheHostClient* client) { - if (!frame || !frame->view()) - return NULL; - return new RendererWebApplicationCacheHostImpl( - RenderViewImpl::FromWebView(frame->view()), client, - RenderThreadImpl::current()->appcache_dispatcher()->backend_proxy()); + return render_view_->createApplicationCacheHost(frame, client); } WebKit::WebCookieJar* RenderFrameImpl::cookieJar(WebKit::WebFrame* frame) { @@ -219,8 +93,7 @@ void RenderFrameImpl::didAccessInitialDocument(WebKit::WebFrame* frame) { void RenderFrameImpl::didCreateFrame(WebKit::WebFrame* parent, WebKit::WebFrame* child) { - Send(new ViewHostMsg_FrameAttached(GetRoutingID(), parent->identifier(), - child->identifier(), UTF16ToUTF8(child->assignedName()))); + render_view_->didCreateFrame(parent, child); } void RenderFrameImpl::didDisownOpener(WebKit::WebFrame* frame) { @@ -228,39 +101,22 @@ void RenderFrameImpl::didDisownOpener(WebKit::WebFrame* frame) { } void RenderFrameImpl::frameDetached(WebKit::WebFrame* frame) { - int64 parent_frame_id = -1; - if (frame->parent()) - parent_frame_id = frame->parent()->identifier(); - - Send(new ViewHostMsg_FrameDetached(GetRoutingID(), parent_frame_id, - frame->identifier())); - - // Call back to RenderViewImpl for observers to be notified. - // TODO(nasko): Remove once we have RenderFrameObserver. render_view_->frameDetached(frame); } void RenderFrameImpl::willClose(WebKit::WebFrame* frame) { - // Call back to RenderViewImpl for observers to be notified. - // TODO(nasko): Remove once we have RenderFrameObserver. render_view_->willClose(frame); } void RenderFrameImpl::didChangeName(WebKit::WebFrame* frame, const WebKit::WebString& name) { - if (!render_view_->renderer_preferences_.report_frame_name_changes) - return; - - Send(new ViewHostMsg_UpdateFrameName(GetRoutingID(), - frame->identifier(), - !frame->parent(), - UTF16ToUTF8(name))); + render_view_->didChangeName(frame, name); } void RenderFrameImpl::loadURLExternally(WebKit::WebFrame* frame, const WebKit::WebURLRequest& request, WebKit::WebNavigationPolicy policy) { - loadURLExternally(frame, request, policy, WebString()); + render_view_->loadURLExternally(frame, request, policy); } void RenderFrameImpl::loadURLExternally( @@ -268,15 +124,7 @@ void RenderFrameImpl::loadURLExternally( const WebKit::WebURLRequest& request, WebKit::WebNavigationPolicy policy, const WebKit::WebString& suggested_name) { - Referrer referrer( - GURL(request.httpHeaderField(WebString::fromUTF8("Referer"))), - RenderViewImpl::GetReferrerPolicyFromRequest(frame, request)); - if (policy == WebKit::WebNavigationPolicyDownload) { - Send(new ViewHostMsg_DownloadUrl(GetRoutingID(), request.url(), referrer, - suggested_name)); - } else { - render_view_->OpenURL(frame, request.url(), referrer, policy); - } + render_view_->loadURLExternally(frame, request, policy, suggested_name); } WebKit::WebNavigationPolicy RenderFrameImpl::decidePolicyForNavigation( @@ -292,77 +140,28 @@ WebKit::WebNavigationPolicy RenderFrameImpl::decidePolicyForNavigation( WebKit::WebURLError RenderFrameImpl::cannotHandleRequestError( WebKit::WebFrame* frame, const WebKit::WebURLRequest& request) { - NOTREACHED(); // Since we said we can handle all requests. - return WebURLError(); + return render_view_->cannotHandleRequestError(frame, request); } WebKit::WebURLError RenderFrameImpl::cancelledError( WebKit::WebFrame* frame, const WebKit::WebURLRequest& request) { - WebURLError error; - error.domain = WebString::fromUTF8(net::kErrorDomain); - error.reason = net::ERR_ABORTED; - error.unreachableURL = request.url(); - return error; + return render_view_->cancelledError(frame, request); } void RenderFrameImpl::unableToImplementPolicyWithError( WebKit::WebFrame* frame, const WebKit::WebURLError& error) { - NOTREACHED(); // Since we said we can handle all requests. + render_view_->unableToImplementPolicyWithError(frame, error); } void RenderFrameImpl::willSendSubmitEvent(WebKit::WebFrame* frame, const WebKit::WebFormElement& form) { - // Some login forms have onSubmit handlers that put a hash of the password - // into a hidden field and then clear the password. (Issue 28910.) - // This method gets called before any of those handlers run, so save away - // a copy of the password in case it gets lost. - DocumentState* document_state = - DocumentState::FromDataSource(frame->dataSource()); - document_state->set_password_form_data(CreatePasswordForm(form)); + render_view_->willSendSubmitEvent(frame, form); } void RenderFrameImpl::willSubmitForm(WebKit::WebFrame* frame, const WebKit::WebFormElement& form) { - DocumentState* document_state = - DocumentState::FromDataSource(frame->provisionalDataSource()); - NavigationState* navigation_state = document_state->navigation_state(); - InternalDocumentStateData* internal_data = - InternalDocumentStateData::FromDocumentState(document_state); - - if (PageTransitionCoreTypeIs(navigation_state->transition_type(), - PAGE_TRANSITION_LINK)) { - navigation_state->set_transition_type(PAGE_TRANSITION_FORM_SUBMIT); - } - - // Save these to be processed when the ensuing navigation is committed. - WebSearchableFormData web_searchable_form_data(form); - internal_data->set_searchable_form_url(web_searchable_form_data.url()); - internal_data->set_searchable_form_encoding( - web_searchable_form_data.encoding().utf8()); - scoped_ptr password_form_data = - CreatePasswordForm(form); - - // In order to save the password that the user actually typed and not one - // that may have gotten transformed by the site prior to submit, recover it - // from the form contents already stored by |willSendSubmitEvent| into the - // dataSource's NavigationState (as opposed to the provisionalDataSource's, - // which is what we're storing into now.) - if (password_form_data) { - DocumentState* old_document_state = - DocumentState::FromDataSource(frame->dataSource()); - if (old_document_state) { - PasswordForm* old_form_data = old_document_state->password_form_data(); - if (old_form_data && old_form_data->action == password_form_data->action) - password_form_data->password_value = old_form_data->password_value; - } - } - - document_state->set_password_form_data(password_form_data.Pass()); - - // Call back to RenderViewImpl for observers to be notified. - // TODO(nasko): Remove once we have RenderFrameObserver. render_view_->willSubmitForm(frame, form); } @@ -371,147 +170,85 @@ void RenderFrameImpl::willPerformClientRedirect(WebKit::WebFrame* frame, const WebKit::WebURL& to, double interval, double fire_time) { - // Call back to RenderViewImpl for observers to be notified. - // TODO(nasko): Remove once we have RenderFrameObserver. render_view_->willPerformClientRedirect(frame, from, to, interval, fire_time); } void RenderFrameImpl::didCancelClientRedirect(WebKit::WebFrame* frame) { - // Call back to RenderViewImpl for observers to be notified. - // TODO(nasko): Remove once we have RenderFrameObserver. render_view_->didCancelClientRedirect(frame); } void RenderFrameImpl::didCompleteClientRedirect(WebKit::WebFrame* frame, const WebKit::WebURL& from) { - // Call back to RenderViewImpl for observers to be notified. - // TODO(nasko): Remove once we have RenderFrameObserver. render_view_->didCompleteClientRedirect(frame, from); } void RenderFrameImpl::didCreateDataSource(WebKit::WebFrame* frame, WebKit::WebDataSource* datasource) { - // TODO(nasko): Move implementation here. Needed state: - // * pending_navigation_params_ - // * webview - // Needed methods: - // * PopulateDocumentStateFromPending - // * CreateNavigationStateFromPending render_view_->didCreateDataSource(frame, datasource); } void RenderFrameImpl::didStartProvisionalLoad(WebKit::WebFrame* frame) { - // TODO(nasko): Move implementation here. Needed state: - // * is_swapped_out_ - // * navigation_gesture_ - // * completed_client_redirect_src_ render_view_->didStartProvisionalLoad(frame); } void RenderFrameImpl::didReceiveServerRedirectForProvisionalLoad( WebKit::WebFrame* frame) { - // TODO(nasko): Move implementation here. Needed state: - // * page_id_ render_view_->didReceiveServerRedirectForProvisionalLoad(frame); } void RenderFrameImpl::didFailProvisionalLoad( WebKit::WebFrame* frame, const WebKit::WebURLError& error) { - // TODO(nasko): Move implementation here. Needed state: - // * page_id_ - // * pending_navigation_params_ - // Needed methods - // * MaybeLoadAlternateErrorPage - // * LoadNavigationErrorPage render_view_->didFailProvisionalLoad(frame, error); } void RenderFrameImpl::didCommitProvisionalLoad(WebKit::WebFrame* frame, bool is_new_navigation) { - // TODO(nasko): Move implementation here. Needed state: - // * page_id_ - // * next_page_id_ - // * history_list_offset_ - // * history_list_length_ - // * history_page_ids_ - // Needed methods - // * webview - // * UpdateSessionHistory - // * GetLoadingUrl render_view_->didCommitProvisionalLoad(frame, is_new_navigation); } void RenderFrameImpl::didClearWindowObject(WebKit::WebFrame* frame) { - // TODO(nasko): Move implementation here. Needed state: - // * enabled_bindings_ - // * dom_automation_controller_ - // * stats_collection_controller_ render_view_->didClearWindowObject(frame); } void RenderFrameImpl::didCreateDocumentElement(WebKit::WebFrame* frame) { - // Notify the browser about non-blank documents loading in the top frame. - GURL url = frame->document().url(); - if (url.is_valid() && url.spec() != kAboutBlankURL) { - // TODO(nasko): Check if webview()->mainFrame() is the same as the - // frame->tree()->top(). - if (frame == render_view_->webview()->mainFrame()) - Send(new ViewHostMsg_DocumentAvailableInMainFrame(GetRoutingID())); - } - - // Call back to RenderViewImpl for observers to be notified. - // TODO(nasko): Remove once we have RenderFrameObserver. render_view_->didCreateDocumentElement(frame); } void RenderFrameImpl::didReceiveTitle(WebKit::WebFrame* frame, const WebKit::WebString& title, WebKit::WebTextDirection direction) { - // TODO(nasko): Investigate wheather implementation should move here. render_view_->didReceiveTitle(frame, title, direction); } void RenderFrameImpl::didChangeIcon(WebKit::WebFrame* frame, WebKit::WebIconURL::Type icon_type) { - // TODO(nasko): Investigate wheather implementation should move here. render_view_->didChangeIcon(frame, icon_type); } void RenderFrameImpl::didFinishDocumentLoad(WebKit::WebFrame* frame) { - // TODO(nasko): Move implementation here. No state needed, just observers - // notification in before updating encoding. render_view_->didFinishDocumentLoad(frame); } void RenderFrameImpl::didHandleOnloadEvents(WebKit::WebFrame* frame) { - // TODO(nasko): Move implementation here. Needed state: - // * page_id_ render_view_->didHandleOnloadEvents(frame); } void RenderFrameImpl::didFailLoad(WebKit::WebFrame* frame, const WebKit::WebURLError& error) { - // TODO(nasko): Move implementation here. No state needed. render_view_->didFailLoad(frame, error); } void RenderFrameImpl::didFinishLoad(WebKit::WebFrame* frame) { - // TODO(nasko): Move implementation here. No state needed, just observers - // notification before sending message to the browser process. render_view_->didFinishLoad(frame); } void RenderFrameImpl::didNavigateWithinPage(WebKit::WebFrame* frame, bool is_new_navigation) { - // TODO(nasko): Move implementation here. No state needed, just observers - // notification before sending message to the browser process. render_view_->didNavigateWithinPage(frame, is_new_navigation); } void RenderFrameImpl::didUpdateCurrentHistoryItem(WebKit::WebFrame* frame) { - // TODO(nasko): Move implementation here. Needed methods: - // * StartNavStateSyncTimerIfNecessary render_view_->didUpdateCurrentHistoryItem(frame); } @@ -520,223 +257,62 @@ void RenderFrameImpl::willSendRequest( unsigned identifier, WebKit::WebURLRequest& request, const WebKit::WebURLResponse& redirect_response) { - // The request my be empty during tests. - if (request.url().isEmpty()) - return; - - WebFrame* top_frame = frame->top(); - if (!top_frame) - top_frame = frame; - WebDataSource* provisional_data_source = top_frame->provisionalDataSource(); - WebDataSource* top_data_source = top_frame->dataSource(); - WebDataSource* data_source = - provisional_data_source ? provisional_data_source : top_data_source; - - PageTransition transition_type = PAGE_TRANSITION_LINK; - DocumentState* document_state = DocumentState::FromDataSource(data_source); - DCHECK(document_state); - InternalDocumentStateData* internal_data = - InternalDocumentStateData::FromDocumentState(document_state); - NavigationState* navigation_state = document_state->navigation_state(); - transition_type = navigation_state->transition_type(); - - GURL request_url(request.url()); - GURL new_url; - if (GetContentClient()->renderer()->WillSendRequest( - frame, - transition_type, - request_url, - request.firstPartyForCookies(), - &new_url)) { - request.setURL(WebURL(new_url)); - } - - if (internal_data->is_cache_policy_override_set()) - request.setCachePolicy(internal_data->cache_policy_override()); - - WebKit::WebReferrerPolicy referrer_policy; - if (internal_data->is_referrer_policy_set()) { - referrer_policy = internal_data->referrer_policy(); - internal_data->clear_referrer_policy(); - } else { - referrer_policy = frame->document().referrerPolicy(); - } - - // The request's extra data may indicate that we should set a custom user - // agent. This needs to be done here, after WebKit is through with setting the - // user agent on its own. - WebString custom_user_agent; - if (request.extraData()) { - webkit_glue::WebURLRequestExtraDataImpl* old_extra_data = - static_cast( - request.extraData()); - custom_user_agent = old_extra_data->custom_user_agent(); - - if (!custom_user_agent.isNull()) { - if (custom_user_agent.isEmpty()) - request.clearHTTPHeaderField("User-Agent"); - else - request.setHTTPHeaderField("User-Agent", custom_user_agent); - } - } - - request.setExtraData( - new RequestExtraData(referrer_policy, - custom_user_agent, - (frame == top_frame), - frame->identifier(), - frame->parent() == top_frame, - frame->parent() ? frame->parent()->identifier() : -1, - navigation_state->allow_download(), - transition_type, - navigation_state->transferred_request_child_id(), - navigation_state->transferred_request_request_id())); - - DocumentState* top_document_state = - DocumentState::FromDataSource(top_data_source); - // TODO(gavinp): separate out prefetching and prerender field trials - // if the rel=prerender rel type is sticking around. - if (top_document_state && - request.targetType() == WebURLRequest::TargetIsPrefetch) - top_document_state->set_was_prefetcher(true); - - // This is an instance where we embed a copy of the routing id - // into the data portion of the message. This can cause problems if we - // don't register this id on the browser side, since the download manager - // expects to find a RenderViewHost based off the id. - request.setRequestorID(GetRoutingID()); - request.setHasUserGesture(WebUserGestureIndicator::isProcessingUserGesture()); - - if (!navigation_state->extra_headers().empty()) { - for (net::HttpUtil::HeadersIterator i( - navigation_state->extra_headers().begin(), - navigation_state->extra_headers().end(), "\n"); - i.GetNext(); ) { - request.setHTTPHeaderField(WebString::fromUTF8(i.name()), - WebString::fromUTF8(i.values())); - } - } - - if (!render_view_->renderer_preferences_.enable_referrers) - request.clearHTTPHeaderField("Referer"); + render_view_->willSendRequest(frame, identifier, request, redirect_response); } void RenderFrameImpl::didReceiveResponse( WebKit::WebFrame* frame, unsigned identifier, const WebKit::WebURLResponse& response) { - // Only do this for responses that correspond to a provisional data source - // of the top-most frame. If we have a provisional data source, then we - // can't have any sub-resources yet, so we know that this response must - // correspond to a frame load. - if (!frame->provisionalDataSource() || frame->parent()) - return; - - // If we are in view source mode, then just let the user see the source of - // the server's error page. - if (frame->isViewSourceModeEnabled()) - return; - - DocumentState* document_state = - DocumentState::FromDataSource(frame->provisionalDataSource()); - int http_status_code = response.httpStatusCode(); - - // Record page load flags. - WebURLResponseExtraDataImpl* extra_data = - RenderViewImpl::GetExtraDataFromResponse(response); - if (extra_data) { - document_state->set_was_fetched_via_spdy( - extra_data->was_fetched_via_spdy()); - document_state->set_was_npn_negotiated( - extra_data->was_npn_negotiated()); - document_state->set_npn_negotiated_protocol( - extra_data->npn_negotiated_protocol()); - document_state->set_was_alternate_protocol_available( - extra_data->was_alternate_protocol_available()); - document_state->set_connection_info( - extra_data->connection_info()); - document_state->set_was_fetched_via_proxy( - extra_data->was_fetched_via_proxy()); - } - InternalDocumentStateData* internal_data = - InternalDocumentStateData::FromDocumentState(document_state); - internal_data->set_http_status_code(http_status_code); - // Whether or not the http status code actually corresponds to an error is - // only checked when the page is done loading, if |use_error_page| is - // still true. - internal_data->set_use_error_page(true); + render_view_->didReceiveResponse(frame, identifier, response); } void RenderFrameImpl::didFinishResourceLoad(WebKit::WebFrame* frame, unsigned identifier) { - // TODO(nasko): Move implementation here. Needed state: - // * devtools_agent_ - // Needed methods: - // * LoadNavigationErrorPage render_view_->didFinishResourceLoad(frame, identifier); } void RenderFrameImpl::didFailResourceLoad(WebKit::WebFrame* frame, unsigned identifier, const WebKit::WebURLError& error) { - // Ignore + render_view_->didFailResourceLoad(frame, identifier, error); } void RenderFrameImpl::didLoadResourceFromMemoryCache( WebKit::WebFrame* frame, const WebKit::WebURLRequest& request, const WebKit::WebURLResponse& response) { - // The recipients of this message have no use for data: URLs: they don't - // affect the page's insecure content list and are not in the disk cache. To - // prevent large (1M+) data: URLs from crashing in the IPC system, we simply - // filter them out here. - GURL url(request.url()); - if (url.SchemeIs("data")) - return; - - // Let the browser know we loaded a resource from the memory cache. This - // message is needed to display the correct SSL indicators. - Send(new ViewHostMsg_DidLoadResourceFromMemoryCache( - GetRoutingID(), - url, - response.securityInfo(), - request.httpMethod().utf8(), - response.mimeType().utf8(), - ResourceType::FromTargetType(request.targetType()))); + render_view_->didLoadResourceFromMemoryCache(frame, request, response); } void RenderFrameImpl::didDisplayInsecureContent(WebKit::WebFrame* frame) { - Send(new ViewHostMsg_DidDisplayInsecureContent(GetRoutingID())); + render_view_->didDisplayInsecureContent(frame); } void RenderFrameImpl::didRunInsecureContent( WebKit::WebFrame* frame, const WebKit::WebSecurityOrigin& origin, const WebKit::WebURL& target) { - Send(new ViewHostMsg_DidRunInsecureContent( - GetRoutingID(), - origin.toString().utf8(), - target)); + render_view_->didRunInsecureContent(frame, origin, target); } void RenderFrameImpl::didExhaustMemoryAvailableForScript( WebKit::WebFrame* frame) { - Send(new ViewHostMsg_JSOutOfMemory(GetRoutingID())); + render_view_->didExhaustMemoryAvailableForScript(frame); } void RenderFrameImpl::didCreateScriptContext(WebKit::WebFrame* frame, v8::Handle context, int extension_group, int world_id) { - GetContentClient()->renderer()->DidCreateScriptContext( + render_view_->didCreateScriptContext( frame, context, extension_group, world_id); } void RenderFrameImpl::willReleaseScriptContext(WebKit::WebFrame* frame, v8::Handle context, int world_id) { - GetContentClient()->renderer()->WillReleaseScriptContext( - frame, context, world_id); + render_view_->willReleaseScriptContext(frame, context, world_id); } void RenderFrameImpl::didFirstVisuallyNonEmptyLayout(WebKit::WebFrame* frame) { @@ -745,48 +321,28 @@ void RenderFrameImpl::didFirstVisuallyNonEmptyLayout(WebKit::WebFrame* frame) { void RenderFrameImpl::didChangeContentsSize(WebKit::WebFrame* frame, const WebKit::WebSize& size) { - // TODO(nasko): Move implementation here. Needed state: - // * cached_has_main_frame_horizontal_scrollbar_ - // * cached_has_main_frame_vertical_scrollbar_ render_view_->didChangeContentsSize(frame, size); } void RenderFrameImpl::didChangeScrollOffset(WebKit::WebFrame* frame) { - // TODO(nasko): Move implementation here. Needed methods: - // * StartNavStateSyncTimerIfNecessary render_view_->didChangeScrollOffset(frame); } void RenderFrameImpl::willInsertBody(WebKit::WebFrame* frame) { - if (!frame->parent()) - Send(new ViewHostMsg_WillInsertBody(GetRoutingID())); + render_view_->willInsertBody(frame); } void RenderFrameImpl::reportFindInPageMatchCount(int request_id, int count, bool final_update) { - int active_match_ordinal = -1; // -1 = don't update active match ordinal - if (!count) - active_match_ordinal = 0; - - Send(new ViewHostMsg_Find_Reply(GetRoutingID(), - request_id, - count, - gfx::Rect(), - active_match_ordinal, - final_update)); -} - -void RenderFrameImpl::reportFindInPageSelection( - int request_id, - int active_match_ordinal, - const WebKit::WebRect& selection_rect) { - Send(new ViewHostMsg_Find_Reply(GetRoutingID(), - request_id, - -1, - selection_rect, - active_match_ordinal, - false)); + render_view_->reportFindInPageMatchCount(request_id, count, final_update); +} + +void RenderFrameImpl::reportFindInPageSelection(int request_id, + int active_match_ordinal, + const WebKit::WebRect& sel) { + render_view_->reportFindInPageSelection( + request_id, active_match_ordinal, sel); } void RenderFrameImpl::openFileSystem( @@ -795,56 +351,21 @@ void RenderFrameImpl::openFileSystem( long long size, bool create, WebKit::WebFileSystemCallbacks* callbacks) { - DCHECK(callbacks); - - WebSecurityOrigin origin = frame->document().securityOrigin(); - if (origin.isUnique()) { - // Unique origins cannot store persistent state. - callbacks->didFail(WebKit::WebFileErrorAbort); - return; - } - - ChildThread::current()->file_system_dispatcher()->OpenFileSystem( - GURL(origin.toString()), static_cast(type), - size, create, - base::Bind(&OpenFileSystemCallbackAdapter, callbacks), - base::Bind(&FileStatusCallbackAdapter, callbacks)); + render_view_->openFileSystem(frame, type, size, create, callbacks); } void RenderFrameImpl::deleteFileSystem( WebKit::WebFrame* frame, WebKit::WebFileSystemType type, WebKit::WebFileSystemCallbacks* callbacks) { - DCHECK(callbacks); - - WebSecurityOrigin origin = frame->document().securityOrigin(); - if (origin.isUnique()) { - // Unique origins cannot store persistent state. - callbacks->didSucceed(); - return; - } - - ChildThread::current()->file_system_dispatcher()->DeleteFileSystem( - GURL(origin.toString()), - static_cast(type), - base::Bind(&FileStatusCallbackAdapter, callbacks)); + render_view_->deleteFileSystem(frame, type, callbacks); } void RenderFrameImpl::queryStorageUsageAndQuota( WebKit::WebFrame* frame, WebKit::WebStorageQuotaType type, WebKit::WebStorageQuotaCallbacks* callbacks) { - DCHECK(frame); - WebSecurityOrigin origin = frame->document().securityOrigin(); - if (origin.isUnique()) { - // Unique origins cannot store persistent state. - callbacks->didFail(WebKit::WebStorageQuotaErrorAbort); - return; - } - ChildThread::current()->quota_dispatcher()->QueryStorageUsageAndQuota( - GURL(origin.toString()), - static_cast(type), - QuotaDispatcher::CreateWebStorageQuotaCallbacksWrapper(callbacks)); + render_view_->queryStorageUsageAndQuota(frame, type, callbacks); } void RenderFrameImpl::requestStorageQuota( @@ -852,30 +373,18 @@ void RenderFrameImpl::requestStorageQuota( WebKit::WebStorageQuotaType type, unsigned long long requested_size, WebKit::WebStorageQuotaCallbacks* callbacks) { - DCHECK(frame); - WebSecurityOrigin origin = frame->document().securityOrigin(); - if (origin.isUnique()) { - // Unique origins cannot store persistent state. - callbacks->didFail(WebKit::WebStorageQuotaErrorAbort); - return; - } - ChildThread::current()->quota_dispatcher()->RequestStorageQuota( - GetRoutingID(), GURL(origin.toString()), - static_cast(type), requested_size, - QuotaDispatcher::CreateWebStorageQuotaCallbacksWrapper(callbacks)); + render_view_->requestStorageQuota(frame, type, requested_size, callbacks); } void RenderFrameImpl::willOpenSocketStream( WebKit::WebSocketStreamHandle* handle) { - SocketStreamHandleData::AddToHandle(handle, GetRoutingID()); + render_view_->willOpenSocketStream(handle); } void RenderFrameImpl::willStartUsingPeerConnectionHandler( WebKit::WebFrame* frame, WebKit::WebRTCPeerConnectionHandler* handler) { -#if defined(ENABLE_WEBRTC) - static_cast(handler)->associateWithFrame(frame); -#endif + render_view_->willStartUsingPeerConnectionHandler(frame, handler); } bool RenderFrameImpl::willCheckAndDispatchMessageEvent( @@ -883,8 +392,6 @@ bool RenderFrameImpl::willCheckAndDispatchMessageEvent( WebKit::WebFrame* targetFrame, WebKit::WebSecurityOrigin targetOrigin, WebKit::WebDOMMessageEvent event) { - // TODO(nasko): Move implementation here. Needed state: - // * is_swapped_out_ return render_view_->willCheckAndDispatchMessageEvent( sourceFrame, targetFrame, targetOrigin, event); } @@ -892,53 +399,20 @@ bool RenderFrameImpl::willCheckAndDispatchMessageEvent( WebKit::WebString RenderFrameImpl::userAgentOverride( WebKit::WebFrame* frame, const WebKit::WebURL& url) { - if (!render_view_->webview() || !render_view_->webview()->mainFrame() || - render_view_->renderer_preferences_.user_agent_override.empty()) { - return WebKit::WebString(); - } - - // If we're in the middle of committing a load, the data source we need - // will still be provisional. - WebFrame* main_frame = render_view_->webview()->mainFrame(); - WebDataSource* data_source = NULL; - if (main_frame->provisionalDataSource()) - data_source = main_frame->provisionalDataSource(); - else - data_source = main_frame->dataSource(); - - InternalDocumentStateData* internal_data = data_source ? - InternalDocumentStateData::FromDataSource(data_source) : NULL; - if (internal_data && internal_data->is_overriding_user_agent()) - return WebString::fromUTF8( - render_view_->renderer_preferences_.user_agent_override); - return WebKit::WebString(); + return render_view_->userAgentOverride(frame, url); } WebKit::WebString RenderFrameImpl::doNotTrackValue(WebKit::WebFrame* frame) { - if (render_view_->renderer_preferences_.enable_do_not_track) - return WebString::fromUTF8("1"); - return WebString(); + return render_view_->doNotTrackValue(frame); } bool RenderFrameImpl::allowWebGL(WebKit::WebFrame* frame, bool default_value) { - if (!default_value) - return false; - - bool blocked = true; - Send(new ViewHostMsg_Are3DAPIsBlocked( - GetRoutingID(), - GURL(frame->top()->document().securityOrigin().toString()), - THREE_D_API_TYPE_WEBGL, - &blocked)); - return !blocked; + return render_view_->allowWebGL(frame, default_value); } void RenderFrameImpl::didLoseWebGLContext(WebKit::WebFrame* frame, int arb_robustness_status_code) { - Send(new ViewHostMsg_DidLose3DContext( - GURL(frame->top()->document().securityOrigin().toString()), - THREE_D_API_TYPE_WEBGL, - arb_robustness_status_code)); + render_view_->didLoseWebGLContext(frame, arb_robustness_status_code); } } // namespace content diff --git a/content/renderer/render_frame_impl.h b/content/renderer/render_frame_impl.h index e108edd..b8e75da 100644 --- a/content/renderer/render_frame_impl.h +++ b/content/renderer/render_frame_impl.h @@ -201,7 +201,7 @@ class CONTENT_EXPORT RenderFrameImpl int arb_robustness_status_code); // RenderFrameImpl methods - int GetRoutingID() const; + int routing_id() { return routing_id_; } protected: RenderFrameImpl(RenderViewImpl* render_view, int32 routing_id); diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc index 8388cea..9cf33c0 100644 --- a/content/renderer/render_view_impl.cc +++ b/content/renderer/render_view_impl.cc @@ -414,8 +414,7 @@ static bool IsReload(const ViewMsg_Navigate_Params& params) { ViewMsg_Navigate_Type::RELOAD_ORIGINAL_REQUEST_URL; } -// static -WebReferrerPolicy RenderViewImpl::GetReferrerPolicyFromRequest( +static WebReferrerPolicy GetReferrerPolicyFromRequest( WebFrame* frame, const WebURLRequest& request) { return request.extraData() ? @@ -423,8 +422,7 @@ WebReferrerPolicy RenderViewImpl::GetReferrerPolicyFromRequest( frame->document().referrerPolicy(); } -// static -WebURLResponseExtraDataImpl* RenderViewImpl::GetExtraDataFromResponse( +static WebURLResponseExtraDataImpl* GetExtraDataFromResponse( const WebURLResponse& response) { return static_cast( response.extraData()); @@ -2821,15 +2819,57 @@ void RenderViewImpl::didHandleGestureEvent( WebKit::WebPlugin* RenderViewImpl::createPlugin(WebFrame* frame, const WebPluginParams& params) { - NOTREACHED(); + WebKit::WebPlugin* plugin = NULL; + if (GetContentClient()->renderer()->OverrideCreatePlugin( + this, frame, params, &plugin)) { + return plugin; + } + +#if defined(ENABLE_PLUGINS) + if (UTF16ToASCII(params.mimeType) == kBrowserPluginMimeType) { + return GetBrowserPluginManager()->CreateBrowserPlugin(this, frame, params); + } + + WebPluginInfo info; + std::string mime_type; + bool found = GetPluginInfo(params.url, frame->top()->document().url(), + params.mimeType.utf8(), &info, &mime_type); + if (!found) + return NULL; + + WebPluginParams params_to_use = params; + params_to_use.mimeType = WebString::fromUTF8(mime_type); + return CreatePlugin(frame, info, params_to_use); +#else return NULL; +#endif // defined(ENABLE_PLUGINS) } WebSharedWorker* RenderViewImpl::createSharedWorker( WebFrame* frame, const WebURL& url, const WebString& name, unsigned long long document_id) { - NOTREACHED(); - return NULL; + + int route_id = MSG_ROUTING_NONE; + bool exists = false; + bool url_mismatch = false; + ViewHostMsg_CreateWorker_Params params; + params.url = url; + params.name = name; + params.document_id = document_id; + params.render_view_route_id = routing_id_; + params.route_id = MSG_ROUTING_NONE; + params.script_resource_appcache_id = 0; + Send(new ViewHostMsg_LookupSharedWorker( + params, &exists, &route_id, &url_mismatch)); + if (url_mismatch) { + return NULL; + } else { + return new WebSharedWorkerProxy(RenderThreadImpl::current(), + document_id, + exists, + route_id, + routing_id_); + } } WebMediaPlayer* RenderViewImpl::createMediaPlayer( @@ -2926,8 +2966,11 @@ WebMediaPlayer* RenderViewImpl::createMediaPlayer( WebApplicationCacheHost* RenderViewImpl::createApplicationCacheHost( WebFrame* frame, WebApplicationCacheHostClient* client) { - NOTREACHED(); - return NULL; + if (!frame || !frame->view()) + return NULL; + return new RendererWebApplicationCacheHostImpl( + FromWebView(frame->view()), client, + RenderThreadImpl::current()->appcache_dispatcher()->backend_proxy()); } WebCookieJar* RenderViewImpl::cookieJar(WebFrame* frame) { @@ -2942,7 +2985,8 @@ void RenderViewImpl::didAccessInitialDocument(WebFrame* frame) { } void RenderViewImpl::didCreateFrame(WebFrame* parent, WebFrame* child) { - NOTREACHED(); + Send(new ViewHostMsg_FrameAttached(routing_id_, parent->identifier(), + child->identifier(), UTF16ToUTF8(child->assignedName()))); } void RenderViewImpl::didDisownOpener(WebKit::WebFrame* frame) { @@ -2958,6 +3002,13 @@ void RenderViewImpl::didDisownOpener(WebKit::WebFrame* frame) { } void RenderViewImpl::frameDetached(WebFrame* frame) { + int64 parent_frame_id = -1; + if (frame->parent()) + parent_frame_id = frame->parent()->identifier(); + + Send(new ViewHostMsg_FrameDetached(routing_id_, parent_frame_id, + frame->identifier())); + FOR_EACH_OBSERVER(RenderViewObserver, observers_, FrameDetached(frame)); } @@ -2967,13 +3018,19 @@ void RenderViewImpl::willClose(WebFrame* frame) { void RenderViewImpl::didChangeName(WebFrame* frame, const WebString& name) { - NOTREACHED(); + if (!renderer_preferences_.report_frame_name_changes) + return; + + Send(new ViewHostMsg_UpdateFrameName(routing_id_, + frame->identifier(), + !frame->parent(), + UTF16ToUTF8(name))); } void RenderViewImpl::loadURLExternally( WebFrame* frame, const WebURLRequest& request, WebNavigationPolicy policy) { - NOTREACHED(); + loadURLExternally(frame, request, policy, WebString()); } void RenderViewImpl::Repaint(const gfx::Size& size) { @@ -2999,7 +3056,15 @@ void RenderViewImpl::loadURLExternally( WebFrame* frame, const WebURLRequest& request, WebNavigationPolicy policy, const WebString& suggested_name) { - NOTREACHED(); + Referrer referrer( + GURL(request.httpHeaderField(WebString::fromUTF8("Referer"))), + GetReferrerPolicyFromRequest(frame, request)); + if (policy == WebKit::WebNavigationPolicyDownload) { + Send(new ViewHostMsg_DownloadUrl(routing_id_, request.url(), referrer, + suggested_name)); + } else { + OpenURL(frame, request.url(), referrer, policy); + } } WebNavigationPolicy RenderViewImpl::decidePolicyForNavigation( @@ -3225,8 +3290,11 @@ WebURLError RenderViewImpl::cannotHandleRequestError( WebURLError RenderViewImpl::cancelledError( WebFrame* frame, const WebURLRequest& request) { - NOTREACHED(); - return WebURLError(); + WebURLError error; + error.domain = WebString::fromUTF8(net::kErrorDomain); + error.reason = net::ERR_ABORTED; + error.unreachableURL = request.url(); + return error; } void RenderViewImpl::unableToImplementPolicyWithError( @@ -3236,11 +3304,53 @@ void RenderViewImpl::unableToImplementPolicyWithError( void RenderViewImpl::willSendSubmitEvent(WebKit::WebFrame* frame, const WebKit::WebFormElement& form) { - NOTREACHED(); + // Some login forms have onSubmit handlers that put a hash of the password + // into a hidden field and then clear the password. (Issue 28910.) + // This method gets called before any of those handlers run, so save away + // a copy of the password in case it gets lost. + DocumentState* document_state = + DocumentState::FromDataSource(frame->dataSource()); + document_state->set_password_form_data(CreatePasswordForm(form)); } void RenderViewImpl::willSubmitForm(WebFrame* frame, const WebFormElement& form) { + DocumentState* document_state = + DocumentState::FromDataSource(frame->provisionalDataSource()); + NavigationState* navigation_state = document_state->navigation_state(); + InternalDocumentStateData* internal_data = + InternalDocumentStateData::FromDocumentState(document_state); + + if (PageTransitionCoreTypeIs(navigation_state->transition_type(), + PAGE_TRANSITION_LINK)) { + navigation_state->set_transition_type(PAGE_TRANSITION_FORM_SUBMIT); + } + + // Save these to be processed when the ensuing navigation is committed. + WebSearchableFormData web_searchable_form_data(form); + internal_data->set_searchable_form_url(web_searchable_form_data.url()); + internal_data->set_searchable_form_encoding( + web_searchable_form_data.encoding().utf8()); + scoped_ptr password_form_data = + CreatePasswordForm(form); + + // In order to save the password that the user actually typed and not one + // that may have gotten transformed by the site prior to submit, recover it + // from the form contents already stored by |willSendSubmitEvent| into the + // dataSource's NavigationState (as opposed to the provisionalDataSource's, + // which is what we're storing into now.) + if (password_form_data) { + DocumentState* old_document_state = + DocumentState::FromDataSource(frame->dataSource()); + if (old_document_state) { + PasswordForm* old_form_data = old_document_state->password_form_data(); + if (old_form_data && old_form_data->action == password_form_data->action) + password_form_data->password_value = old_form_data->password_value; + } + } + + document_state->set_password_form_data(password_form_data.Pass()); + FOR_EACH_OBSERVER( RenderViewObserver, observers_, WillSubmitForm(frame, form)); } @@ -3747,6 +3857,13 @@ void RenderViewImpl::didClearWindowObject(WebFrame* frame) { } void RenderViewImpl::didCreateDocumentElement(WebFrame* frame) { + // Notify the browser about non-blank documents loading in the top frame. + GURL url = frame->document().url(); + if (url.is_valid() && url.spec() != kAboutBlankURL) { + if (frame == webview()->mainFrame()) + Send(new ViewHostMsg_DocumentAvailableInMainFrame(routing_id_)); + } + FOR_EACH_OBSERVER(RenderViewObserver, observers_, DidCreateDocumentElement(frame)); } @@ -3874,12 +3991,145 @@ void RenderViewImpl::willSendRequest(WebFrame* frame, unsigned identifier, WebURLRequest& request, const WebURLResponse& redirect_response) { - NOTREACHED(); + // The request my be empty during tests. + if (request.url().isEmpty()) + return; + + WebFrame* top_frame = frame->top(); + if (!top_frame) + top_frame = frame; + WebDataSource* provisional_data_source = top_frame->provisionalDataSource(); + WebDataSource* top_data_source = top_frame->dataSource(); + WebDataSource* data_source = + provisional_data_source ? provisional_data_source : top_data_source; + + PageTransition transition_type = PAGE_TRANSITION_LINK; + DocumentState* document_state = DocumentState::FromDataSource(data_source); + DCHECK(document_state); + InternalDocumentStateData* internal_data = + InternalDocumentStateData::FromDocumentState(document_state); + NavigationState* navigation_state = document_state->navigation_state(); + transition_type = navigation_state->transition_type(); + + GURL request_url(request.url()); + GURL new_url; + if (GetContentClient()->renderer()->WillSendRequest( + frame, + transition_type, + request_url, + request.firstPartyForCookies(), + &new_url)) { + request.setURL(WebURL(new_url)); + } + + if (internal_data->is_cache_policy_override_set()) + request.setCachePolicy(internal_data->cache_policy_override()); + + WebKit::WebReferrerPolicy referrer_policy; + if (internal_data->is_referrer_policy_set()) { + referrer_policy = internal_data->referrer_policy(); + internal_data->clear_referrer_policy(); + } else { + referrer_policy = frame->document().referrerPolicy(); + } + + // The request's extra data may indicate that we should set a custom user + // agent. This needs to be done here, after WebKit is through with setting the + // user agent on its own. + WebString custom_user_agent; + if (request.extraData()) { + webkit_glue::WebURLRequestExtraDataImpl* old_extra_data = + static_cast( + request.extraData()); + custom_user_agent = old_extra_data->custom_user_agent(); + + if (!custom_user_agent.isNull()) { + if (custom_user_agent.isEmpty()) + request.clearHTTPHeaderField("User-Agent"); + else + request.setHTTPHeaderField("User-Agent", custom_user_agent); + } + } + + request.setExtraData( + new RequestExtraData(referrer_policy, + custom_user_agent, + (frame == top_frame), + frame->identifier(), + frame->parent() == top_frame, + frame->parent() ? frame->parent()->identifier() : -1, + navigation_state->allow_download(), + transition_type, + navigation_state->transferred_request_child_id(), + navigation_state->transferred_request_request_id())); + + DocumentState* top_document_state = + DocumentState::FromDataSource(top_data_source); + // TODO(gavinp): separate out prefetching and prerender field trials + // if the rel=prerender rel type is sticking around. + if (top_document_state && + request.targetType() == WebURLRequest::TargetIsPrefetch) + top_document_state->set_was_prefetcher(true); + + request.setRequestorID(routing_id_); + request.setHasUserGesture(WebUserGestureIndicator::isProcessingUserGesture()); + + if (!navigation_state->extra_headers().empty()) { + for (net::HttpUtil::HeadersIterator i( + navigation_state->extra_headers().begin(), + navigation_state->extra_headers().end(), "\n"); + i.GetNext(); ) { + request.setHTTPHeaderField(WebString::fromUTF8(i.name()), + WebString::fromUTF8(i.values())); + } + } + + if (!renderer_preferences_.enable_referrers) + request.clearHTTPHeaderField("Referer"); } void RenderViewImpl::didReceiveResponse( WebFrame* frame, unsigned identifier, const WebURLResponse& response) { - NOTREACHED(); + + // Only do this for responses that correspond to a provisional data source + // of the top-most frame. If we have a provisional data source, then we + // can't have any sub-resources yet, so we know that this response must + // correspond to a frame load. + if (!frame->provisionalDataSource() || frame->parent()) + return; + + // If we are in view source mode, then just let the user see the source of + // the server's error page. + if (frame->isViewSourceModeEnabled()) + return; + + DocumentState* document_state = + DocumentState::FromDataSource(frame->provisionalDataSource()); + int http_status_code = response.httpStatusCode(); + + // Record page load flags. + WebURLResponseExtraDataImpl* extra_data = GetExtraDataFromResponse(response); + if (extra_data) { + document_state->set_was_fetched_via_spdy( + extra_data->was_fetched_via_spdy()); + document_state->set_was_npn_negotiated( + extra_data->was_npn_negotiated()); + document_state->set_npn_negotiated_protocol( + extra_data->npn_negotiated_protocol()); + document_state->set_was_alternate_protocol_available( + extra_data->was_alternate_protocol_available()); + document_state->set_connection_info( + extra_data->connection_info()); + document_state->set_was_fetched_via_proxy( + extra_data->was_fetched_via_proxy()); + } + InternalDocumentStateData* internal_data = + InternalDocumentStateData::FromDocumentState(document_state); + internal_data->set_http_status_code(http_status_code); + // Whether or not the http status code actually corresponds to an error is + // only checked when the page is done loading, if |use_error_page| is + // still true. + internal_data->set_use_error_page(true); } void RenderViewImpl::didFinishResourceLoad( @@ -3938,33 +4188,54 @@ void RenderViewImpl::didFailResourceLoad( void RenderViewImpl::didLoadResourceFromMemoryCache( WebFrame* frame, const WebURLRequest& request, const WebURLResponse& response) { - NOTREACHED(); + // The recipients of this message have no use for data: URLs: they don't + // affect the page's insecure content list and are not in the disk cache. To + // prevent large (1M+) data: URLs from crashing in the IPC system, we simply + // filter them out here. + GURL url(request.url()); + if (url.SchemeIs("data")) + return; + + // Let the browser know we loaded a resource from the memory cache. This + // message is needed to display the correct SSL indicators. + Send(new ViewHostMsg_DidLoadResourceFromMemoryCache( + routing_id_, + url, + response.securityInfo(), + request.httpMethod().utf8(), + response.mimeType().utf8(), + ResourceType::FromTargetType(request.targetType()))); } void RenderViewImpl::didDisplayInsecureContent(WebFrame* frame) { - NOTREACHED(); + Send(new ViewHostMsg_DidDisplayInsecureContent(routing_id_)); } void RenderViewImpl::didRunInsecureContent( WebFrame* frame, const WebSecurityOrigin& origin, const WebURL& target) { - NOTREACHED(); + Send(new ViewHostMsg_DidRunInsecureContent( + routing_id_, + origin.toString().utf8(), + target)); } void RenderViewImpl::didExhaustMemoryAvailableForScript(WebFrame* frame) { - NOTREACHED(); + Send(new ViewHostMsg_JSOutOfMemory(routing_id_)); } void RenderViewImpl::didCreateScriptContext(WebFrame* frame, v8::Handle context, int extension_group, int world_id) { - NOTREACHED(); + GetContentClient()->renderer()->DidCreateScriptContext( + frame, context, extension_group, world_id); } void RenderViewImpl::willReleaseScriptContext(WebFrame* frame, v8::Handle context, int world_id) { - NOTREACHED(); + GetContentClient()->renderer()->WillReleaseScriptContext( + frame, context, world_id); } void RenderViewImpl::CheckPreferredSize() { @@ -4066,7 +4337,9 @@ void RenderViewImpl::didChangeScrollOffset(WebFrame* frame) { } void RenderViewImpl::willInsertBody(WebKit::WebFrame* frame) { - NOTREACHED(); + if (!frame->parent()) { + Send(new ViewHostMsg_WillInsertBody(routing_id())); + } } void RenderViewImpl::didFirstVisuallyNonEmptyLayout(WebFrame* frame) { @@ -4088,8 +4361,7 @@ void RenderViewImpl::didFirstVisuallyNonEmptyLayout(WebFrame* frame) { if (bg_color != body_background_color_) { body_background_color_ = bg_color; - Send(new ViewHostMsg_DidChangeBodyBackgroundColor( - GetRoutingID(), bg_color)); + Send(new ViewHostMsg_DidChangeBodyBackgroundColor(routing_id_, bg_color)); } #endif } @@ -4130,13 +4402,26 @@ bool RenderViewImpl::ShouldUpdateSelectionTextFromContextMenuParams( void RenderViewImpl::reportFindInPageMatchCount(int request_id, int count, bool final_update) { - NOTREACHED(); + int active_match_ordinal = -1; // -1 = don't update active match ordinal + if (!count) + active_match_ordinal = 0; + + // Send the search result over to the browser process. + SendFindReply(request_id, + count, + active_match_ordinal, + gfx::Rect(), + final_update); } void RenderViewImpl::reportFindInPageSelection(int request_id, int active_match_ordinal, const WebRect& selection_rect) { - NOTREACHED(); + SendFindReply(request_id, + -1, + active_match_ordinal, + selection_rect, + false); } void RenderViewImpl::openFileSystem( @@ -4145,21 +4430,56 @@ void RenderViewImpl::openFileSystem( long long size, bool create, WebFileSystemCallbacks* callbacks) { - NOTREACHED(); + DCHECK(callbacks); + + WebSecurityOrigin origin = frame->document().securityOrigin(); + if (origin.isUnique()) { + // Unique origins cannot store persistent state. + callbacks->didFail(WebKit::WebFileErrorAbort); + return; + } + + ChildThread::current()->file_system_dispatcher()->OpenFileSystem( + GURL(origin.toString()), static_cast(type), + size, create, + base::Bind(&OpenFileSystemCallbackAdapter, callbacks), + base::Bind(&FileStatusCallbackAdapter, callbacks)); } void RenderViewImpl::deleteFileSystem( WebFrame* frame, WebKit::WebFileSystemType type , WebFileSystemCallbacks* callbacks) { - NOTREACHED(); + DCHECK(callbacks); + + WebSecurityOrigin origin = frame->document().securityOrigin(); + if (origin.isUnique()) { + // Unique origins cannot store persistent state. + callbacks->didSucceed(); + return; + } + + ChildThread::current()->file_system_dispatcher()->DeleteFileSystem( + GURL(origin.toString()), + static_cast(type), + base::Bind(&FileStatusCallbackAdapter, callbacks)); } void RenderViewImpl::queryStorageUsageAndQuota( WebFrame* frame, WebStorageQuotaType type, WebStorageQuotaCallbacks* callbacks) { - NOTREACHED(); + DCHECK(frame); + WebSecurityOrigin origin = frame->document().securityOrigin(); + if (origin.isUnique()) { + // Unique origins cannot store persistent state. + callbacks->didFail(WebKit::WebStorageQuotaErrorAbort); + return; + } + ChildThread::current()->quota_dispatcher()->QueryStorageUsageAndQuota( + GURL(origin.toString()), + static_cast(type), + QuotaDispatcher::CreateWebStorageQuotaCallbacksWrapper(callbacks)); } void RenderViewImpl::requestStorageQuota( @@ -4167,7 +4487,17 @@ void RenderViewImpl::requestStorageQuota( WebStorageQuotaType type, unsigned long long requested_size, WebStorageQuotaCallbacks* callbacks) { - NOTREACHED(); + DCHECK(frame); + WebSecurityOrigin origin = frame->document().securityOrigin(); + if (origin.isUnique()) { + // Unique origins cannot store persistent state. + callbacks->didFail(WebKit::WebStorageQuotaErrorAbort); + return; + } + ChildThread::current()->quota_dispatcher()->RequestStorageQuota( + routing_id(), GURL(origin.toString()), + static_cast(type), requested_size, + QuotaDispatcher::CreateWebStorageQuotaCallbacksWrapper(callbacks)); } bool RenderViewImpl::willCheckAndDispatchMessageEvent( @@ -4198,12 +4528,14 @@ bool RenderViewImpl::willCheckAndDispatchMessageEvent( void RenderViewImpl::willOpenSocketStream( WebSocketStreamHandle* handle) { - NOTREACHED(); + SocketStreamHandleData::AddToHandle(handle, routing_id_); } void RenderViewImpl::willStartUsingPeerConnectionHandler( WebKit::WebFrame* frame, WebKit::WebRTCPeerConnectionHandler* handler) { - NOTREACHED(); +#if defined(ENABLE_WEBRTC) + static_cast(handler)->associateWithFrame(frame); +#endif } WebKit::WebString RenderViewImpl::acceptLanguages() { @@ -4213,24 +4545,53 @@ WebKit::WebString RenderViewImpl::acceptLanguages() { WebKit::WebString RenderViewImpl::userAgentOverride( WebKit::WebFrame* frame, const WebKit::WebURL& url) { - NOTREACHED(); + if (!webview() || !webview()->mainFrame() || + renderer_preferences_.user_agent_override.empty()) { + return WebKit::WebString(); + } + + // If we're in the middle of committing a load, the data source we need + // will still be provisional. + WebFrame* main_frame = webview()->mainFrame(); + WebDataSource* data_source = NULL; + if (main_frame->provisionalDataSource()) + data_source = main_frame->provisionalDataSource(); + else + data_source = main_frame->dataSource(); + + InternalDocumentStateData* internal_data = data_source ? + InternalDocumentStateData::FromDataSource(data_source) : NULL; + if (internal_data && internal_data->is_overriding_user_agent()) + return WebString::fromUTF8(renderer_preferences_.user_agent_override); return WebKit::WebString(); } WebString RenderViewImpl::doNotTrackValue(WebFrame* frame) { - NOTREACHED(); - return WebKit::WebString(); + if (renderer_preferences_.enable_do_not_track) + return WebString::fromUTF8("1"); + return WebString(); } bool RenderViewImpl::allowWebGL(WebFrame* frame, bool default_value) { - NOTREACHED(); - return false; + if (!default_value) + return false; + + bool blocked = true; + Send(new ViewHostMsg_Are3DAPIsBlocked( + routing_id_, + GURL(frame->top()->document().securityOrigin().toString()), + THREE_D_API_TYPE_WEBGL, + &blocked)); + return !blocked; } void RenderViewImpl::didLoseWebGLContext( WebKit::WebFrame* frame, int arb_robustness_status_code) { - NOTREACHED(); + Send(new ViewHostMsg_DidLose3DContext( + GURL(frame->top()->document().securityOrigin().toString()), + THREE_D_API_TYPE_WEBGL, + arb_robustness_status_code)); } // WebKit::WebPageSerializerClient implementation ------------------------------ @@ -4402,7 +4763,7 @@ void RenderViewImpl::LoadURLExternally( WebKit::WebFrame* frame, const WebKit::WebURLRequest& request, WebKit::WebNavigationPolicy policy) { - main_render_frame_->loadURLExternally(frame, request, policy); + loadURLExternally(frame, request, policy); } void RenderViewImpl::DidPlay(WebKit::WebMediaPlayer* player) { diff --git a/content/renderer/render_view_impl.h b/content/renderer/render_view_impl.h index 0a4f135..6e0e87d0 100644 --- a/content/renderer/render_view_impl.h +++ b/content/renderer/render_view_impl.h @@ -132,10 +132,6 @@ class WebHitTestResult; #endif } -namespace webkit_glue { -class WebURLResponseExtraDataImpl; -} - namespace content { class BrowserPluginManager; class DeviceOrientationDispatcher; @@ -830,11 +826,6 @@ class CONTENT_EXPORT RenderViewImpl friend class RendererAccessibilityTest; friend class RenderViewTest; - // TODO(nasko): Temporarily friend RenderFrameImpl, so we don't duplicate - // utility functions needed in both classes, while we move frame specific - // code away from this class. - friend class RenderFrameImpl; - FRIEND_TEST_ALL_PREFIXES(ExternalPopupMenuRemoveTest, RemoveOnChange); FRIEND_TEST_ALL_PREFIXES(ExternalPopupMenuTest, NormalCase); FRIEND_TEST_ALL_PREFIXES(ExternalPopupMenuTest, ShowPopupThenNavigate); @@ -885,13 +876,6 @@ class CONTENT_EXPORT RenderViewImpl CONNECTION_ERROR, }; - static WebKit::WebReferrerPolicy GetReferrerPolicyFromRequest( - WebKit::WebFrame* frame, - const WebKit::WebURLRequest& request); - - static webkit_glue::WebURLResponseExtraDataImpl* GetExtraDataFromResponse( - const WebKit::WebURLResponse& response); - void UpdateURL(WebKit::WebFrame* frame); void UpdateTitle(WebKit::WebFrame* frame, const string16& title, WebKit::WebTextDirection title_direction); diff --git a/content/test/layouttest_support.cc b/content/test/layouttest_support.cc index 3f1a0f6..2698330 100644 --- a/content/test/layouttest_support.cc +++ b/content/test/layouttest_support.cc @@ -61,7 +61,6 @@ RenderFrameImpl* CreateWebFrameTestProxy( WebTestProxyBase* base = static_cast(render_view_proxy); FrameProxy* render_frame_proxy = new FrameProxy(render_view, routing_id); render_frame_proxy->setBaseProxy(base); - render_frame_proxy->setVersion(2); return render_frame_proxy; } -- cgit v1.1