diff options
author | Andras Becsi <andras.becsi@digia.com> | 2014-03-18 13:16:26 +0100 |
---|---|---|
committer | Frederik Gladhorn <frederik.gladhorn@digia.com> | 2014-03-20 15:55:39 +0100 |
commit | 3f0f86b0caed75241fa71c95a5d73bc0164348c5 (patch) | |
tree | 92b9fb00f2e9e90b0be2262093876d4f43b6cd13 /chromium/content/renderer/render_frame_impl.cc | |
parent | e90d7c4b152c56919d963987e2503f9909a666d2 (diff) | |
download | qtwebengine-chromium-3f0f86b0caed75241fa71c95a5d73bc0164348c5.tar.gz |
Update to new stable branch 1750
This also includes an updated ninja and chromium dependencies
needed on Windows.
Change-Id: Icd597d80ed3fa4425933c9f1334c3c2e31291c42
Reviewed-by: Zoltan Arvai <zarvai@inf.u-szeged.hu>
Reviewed-by: Zeno Albisser <zeno.albisser@digia.com>
Diffstat (limited to 'chromium/content/renderer/render_frame_impl.cc')
-rw-r--r-- | chromium/content/renderer/render_frame_impl.cc | 882 |
1 files changed, 692 insertions, 190 deletions
diff --git a/chromium/content/renderer/render_frame_impl.cc b/chromium/content/renderer/render_frame_impl.cc index 2cec72d37c3..2d9628e41b9 100644 --- a/chromium/content/renderer/render_frame_impl.cc +++ b/chromium/content/renderer/render_frame_impl.cc @@ -4,12 +4,19 @@ #include "content/renderer/render_frame_impl.h" +#include <map> +#include <string> + #include "base/command_line.h" +#include "base/i18n/char_iterator.h" #include "base/strings/utf_string_conversions.h" #include "base/time/time.h" #include "content/child/appcache/appcache_dispatcher.h" +#include "content/child/plugin_messages.h" #include "content/child/quota_dispatcher.h" #include "content/child/request_extra_data.h" +#include "content/child/service_worker/web_service_worker_provider_impl.h" +#include "content/common/frame_messages.h" #include "content/common/socket_stream_handle_data.h" #include "content/common/swapped_out_messages.h" #include "content/common/view_messages.h" @@ -19,15 +26,20 @@ #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/render_frame_observer.h" +#include "content/renderer/accessibility/renderer_accessibility.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/npapi/plugin_channel_host.h" #include "content/renderer/render_thread_impl.h" #include "content/renderer/render_view_impl.h" +#include "content/renderer/render_widget_fullscreen_pepper.h" #include "content/renderer/renderer_webapplicationcachehost_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/WebStorageQuotaCallbacks.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" @@ -40,38 +52,53 @@ #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/child/weburlresponse_extradata_impl.h" +#if defined(ENABLE_PLUGINS) +#include "content/renderer/npapi/webplugin_impl.h" +#include "content/renderer/pepper/pepper_browser_connection.h" +#include "content/renderer/pepper/pepper_plugin_instance_impl.h" +#include "content/renderer/pepper/pepper_webplugin_impl.h" +#include "content/renderer/pepper/plugin_module.h" +#endif + #if defined(ENABLE_WEBRTC) #include "content/renderer/media/rtc_peer_connection_handler.h" #endif -using WebKit::WebDataSource; -using WebKit::WebDocument; -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 blink::WebDataSource; +using blink::WebDocument; +using blink::WebFrame; +using blink::WebNavigationPolicy; +using blink::WebPluginParams; +using blink::WebReferrerPolicy; +using blink::WebSearchableFormData; +using blink::WebSecurityOrigin; +using blink::WebServiceWorkerProvider; +using blink::WebStorageQuotaCallbacks; +using blink::WebString; +using blink::WebURL; +using blink::WebURLError; +using blink::WebURLRequest; +using blink::WebURLResponse; +using blink::WebUserGestureIndicator; +using blink::WebVector; +using blink::WebView; using base::Time; using base::TimeDelta; using webkit_glue::WebURLResponseExtraDataImpl; namespace content { +namespace { + +typedef std::map<blink::WebFrame*, RenderFrameImpl*> FrameMap; +base::LazyInstance<FrameMap> g_child_frame_map = LAZY_INSTANCE_INITIALIZER; + +} // namespace + static RenderFrameImpl* (*g_create_render_frame_impl)(RenderViewImpl*, int32) = NULL; @@ -80,13 +107,10 @@ RenderFrameImpl* RenderFrameImpl::Create(RenderViewImpl* render_view, int32 routing_id) { DCHECK(routing_id != MSG_ROUTING_NONE); - RenderFrameImpl* render_frame = NULL; if (g_create_render_frame_impl) - render_frame = g_create_render_frame_impl(render_view, routing_id); + return g_create_render_frame_impl(render_view, routing_id); else - render_frame = new RenderFrameImpl(render_view, routing_id); - - return render_frame; + return new RenderFrameImpl(render_view, routing_id); } // static @@ -102,18 +126,318 @@ RenderFrameImpl::RenderFrameImpl(RenderViewImpl* render_view, int routing_id) routing_id_(routing_id), is_swapped_out_(false), is_detaching_(false) { + RenderThread::Get()->AddRoute(routing_id_, this); +#if defined(ENABLE_PLUGINS) + new PepperBrowserConnection(this); +#endif + + GetContentClient()->renderer()->RenderFrameCreated(this); } RenderFrameImpl::~RenderFrameImpl() { + FOR_EACH_OBSERVER(RenderFrameObserver, observers_, RenderFrameGone()); + FOR_EACH_OBSERVER(RenderFrameObserver, observers_, OnDestruct()); + RenderThread::Get()->RemoveRoute(routing_id_); } -int RenderFrameImpl::GetRoutingID() const { - return routing_id_; +RenderWidget* RenderFrameImpl::GetRenderWidget() { + return render_view_; +} + +#if defined(ENABLE_PLUGINS) +void RenderFrameImpl::PepperPluginCreated(RendererPpapiHost* host) { + FOR_EACH_OBSERVER(RenderFrameObserver, observers_, + DidCreatePepperPlugin(host)); +} + +void RenderFrameImpl::PepperInstanceCreated( + PepperPluginInstanceImpl* instance) { + active_pepper_instances_.insert(instance); +} + +void RenderFrameImpl::PepperInstanceDeleted( + PepperPluginInstanceImpl* instance) { + active_pepper_instances_.erase(instance); + + if (render_view_->pepper_last_mouse_event_target() == instance) + render_view_->set_pepper_last_mouse_event_target(NULL); + if (render_view_->focused_pepper_plugin() == instance) + PepperFocusChanged(instance, false); +} + +void RenderFrameImpl::PepperDidChangeCursor( + PepperPluginInstanceImpl* instance, + const blink::WebCursorInfo& cursor) { + // Update the cursor appearance immediately if the requesting plugin is the + // one which receives the last mouse event. Otherwise, the new cursor won't be + // picked up until the plugin gets the next input event. That is bad if, e.g., + // the plugin would like to set an invisible cursor when there isn't any user + // input for a while. + if (instance == render_view_->pepper_last_mouse_event_target()) + GetRenderWidget()->didChangeCursor(cursor); +} + +void RenderFrameImpl::PepperDidReceiveMouseEvent( + PepperPluginInstanceImpl* instance) { + render_view_->set_pepper_last_mouse_event_target(instance); +} + +void RenderFrameImpl::PepperFocusChanged(PepperPluginInstanceImpl* instance, + bool focused) { + if (focused) + render_view_->set_focused_pepper_plugin(instance); + else if (render_view_->focused_pepper_plugin() == instance) + render_view_->set_focused_pepper_plugin(NULL); + + GetRenderWidget()->UpdateTextInputType(); + GetRenderWidget()->UpdateSelectionBounds(); +} + +void RenderFrameImpl::PepperTextInputTypeChanged( + PepperPluginInstanceImpl* instance) { + if (instance != render_view_->focused_pepper_plugin()) + return; + + GetRenderWidget()->UpdateTextInputType(); + if (render_view_->renderer_accessibility()) { + render_view_->renderer_accessibility()->FocusedNodeChanged( + blink::WebNode()); + } +} + +void RenderFrameImpl::PepperCaretPositionChanged( + PepperPluginInstanceImpl* instance) { + if (instance != render_view_->focused_pepper_plugin()) + return; + GetRenderWidget()->UpdateSelectionBounds(); +} + +void RenderFrameImpl::PepperCancelComposition( + PepperPluginInstanceImpl* instance) { + if (instance != render_view_->focused_pepper_plugin()) + return; + Send(new ViewHostMsg_ImeCancelComposition(render_view_->GetRoutingID()));; +#if defined(OS_MACOSX) || defined(OS_WIN) || defined(USE_AURA) + GetRenderWidget()->UpdateCompositionInfo(true); +#endif +} + +void RenderFrameImpl::PepperSelectionChanged( + PepperPluginInstanceImpl* instance) { + if (instance != render_view_->focused_pepper_plugin()) + return; + render_view_->SyncSelectionIfRequired(); +} + +RenderWidgetFullscreenPepper* RenderFrameImpl::CreatePepperFullscreenContainer( + PepperPluginInstanceImpl* plugin) { + GURL active_url; + if (render_view_->webview() && render_view_->webview()->mainFrame()) + active_url = GURL(render_view_->webview()->mainFrame()->document().url()); + RenderWidgetFullscreenPepper* widget = RenderWidgetFullscreenPepper::Create( + GetRenderWidget()->routing_id(), plugin, active_url, + GetRenderWidget()->screenInfo()); + widget->show(blink::WebNavigationPolicyIgnore); + return widget; +} + +bool RenderFrameImpl::IsPepperAcceptingCompositionEvents() const { + if (!render_view_->focused_pepper_plugin()) + return false; + return render_view_->focused_pepper_plugin()-> + IsPluginAcceptingCompositionEvents(); +} + +void RenderFrameImpl::PluginCrashed(const base::FilePath& plugin_path, + base::ProcessId plugin_pid) { + // TODO(jam): dispatch this IPC in RenderFrameHost and switch to use + // routing_id_ as a result. + Send(new FrameHostMsg_PluginCrashed(routing_id_, plugin_path, plugin_pid)); +} + +void RenderFrameImpl::DidInitiatePaint() { + // Notify all instances that we painted. The same caveats apply as for + // ViewFlushedPaint regarding instances closing themselves, so we take + // similar precautions. + PepperPluginSet plugins = active_pepper_instances_; + for (PepperPluginSet::iterator i = plugins.begin(); i != plugins.end(); ++i) { + if (active_pepper_instances_.find(*i) != active_pepper_instances_.end()) + (*i)->ViewInitiatedPaint(); + } +} + +void RenderFrameImpl::DidFlushPaint() { + // Notify all instances that we flushed. This will call into the plugin, and + // we it may ask to close itself as a result. This will, in turn, modify our + // set, possibly invalidating the iterator. So we iterate on a copy that + // won't change out from under us. + PepperPluginSet plugins = active_pepper_instances_; + for (PepperPluginSet::iterator i = plugins.begin(); i != plugins.end(); ++i) { + // The copy above makes sure our iterator is never invalid if some plugins + // are destroyed. But some plugin may decide to close all of its views in + // response to a paint in one of them, so we need to make sure each one is + // still "current" before using it. + // + // It's possible that a plugin was destroyed, but another one was created + // with the same address. In this case, we'll call ViewFlushedPaint on that + // new plugin. But that's OK for this particular case since we're just + // notifying all of our instances that the view flushed, and the new one is + // one of our instances. + // + // What about the case where a new one is created in a callback at a new + // address and we don't issue the callback? We're still OK since this + // callback is used for flush callbacks and we could not have possibly + // started a new paint for the new plugin while processing a previous paint + // for an existing one. + if (active_pepper_instances_.find(*i) != active_pepper_instances_.end()) + (*i)->ViewFlushedPaint(); + } +} + +PepperPluginInstanceImpl* RenderFrameImpl::GetBitmapForOptimizedPluginPaint( + const gfx::Rect& paint_bounds, + TransportDIB** dib, + gfx::Rect* location, + gfx::Rect* clip, + float* scale_factor) { + for (PepperPluginSet::iterator i = active_pepper_instances_.begin(); + i != active_pepper_instances_.end(); ++i) { + PepperPluginInstanceImpl* instance = *i; + // In Flash fullscreen , the plugin contents should be painted onto the + // fullscreen widget instead of the web page. + if (!instance->FlashIsFullscreenOrPending() && + instance->GetBitmapForOptimizedPluginPaint(paint_bounds, dib, location, + clip, scale_factor)) + return *i; + } + return NULL; +} + +void RenderFrameImpl::PageVisibilityChanged(bool shown) { + // Inform PPAPI plugins that their page is no longer visible. + for (PepperPluginSet::iterator i = active_pepper_instances_.begin(); + i != active_pepper_instances_.end(); ++i) + (*i)->PageVisibilityChanged(shown); +} + +void RenderFrameImpl::OnSetFocus(bool enable) { + // Notify all Pepper plugins. + for (PepperPluginSet::iterator i = active_pepper_instances_.begin(); + i != active_pepper_instances_.end(); ++i) + (*i)->SetContentAreaFocus(enable); +} + +void RenderFrameImpl::WillHandleMouseEvent(const blink::WebMouseEvent& event) { + // This method is called for every mouse event that the render view receives. + // And then the mouse event is forwarded to WebKit, which dispatches it to the + // event target. Potentially a Pepper plugin will receive the event. + // In order to tell whether a plugin gets the last mouse event and which it + // is, we set |pepper_last_mouse_event_target_| to NULL here. If a plugin gets + // the event, it will notify us via DidReceiveMouseEvent() and set itself as + // |pepper_last_mouse_event_target_|. + render_view_->set_pepper_last_mouse_event_target(NULL); } +void RenderFrameImpl::SimulateImeSetComposition( + const base::string16& text, + const std::vector<blink::WebCompositionUnderline>& underlines, + int selection_start, + int selection_end) { + render_view_->OnImeSetComposition( + text, underlines, selection_start, selection_end); +} + +void RenderFrameImpl::SimulateImeConfirmComposition( + const base::string16& text, + const gfx::Range& replacement_range) { + render_view_->OnImeConfirmComposition(text, replacement_range, false); +} + + +void RenderFrameImpl::OnImeSetComposition( + const base::string16& text, + const std::vector<blink::WebCompositionUnderline>& underlines, + int selection_start, + int selection_end) { + // When a PPAPI plugin has focus, we bypass WebKit. + if (!IsPepperAcceptingCompositionEvents()) { + pepper_composition_text_ = text; + } else { + // TODO(kinaba) currently all composition events are sent directly to + // plugins. Use DOM event mechanism after WebKit is made aware about + // plugins that support composition. + // The code below mimics the behavior of WebCore::Editor::setComposition. + + // Empty -> nonempty: composition started. + if (pepper_composition_text_.empty() && !text.empty()) { + render_view_->focused_pepper_plugin()->HandleCompositionStart( + base::string16()); + } + // Nonempty -> empty: composition canceled. + if (!pepper_composition_text_.empty() && text.empty()) { + render_view_->focused_pepper_plugin()->HandleCompositionEnd( + base::string16()); + } + pepper_composition_text_ = text; + // Nonempty: composition is ongoing. + if (!pepper_composition_text_.empty()) { + render_view_->focused_pepper_plugin()->HandleCompositionUpdate( + pepper_composition_text_, underlines, selection_start, + selection_end); + } + } +} + +void RenderFrameImpl::OnImeConfirmComposition( + const base::string16& text, + const gfx::Range& replacement_range, + bool keep_selection) { + // When a PPAPI plugin has focus, we bypass WebKit. + // Here, text.empty() has a special meaning. It means to commit the last + // update of composition text (see + // RenderWidgetHost::ImeConfirmComposition()). + const base::string16& last_text = text.empty() ? pepper_composition_text_ + : text; + + // last_text is empty only when both text and pepper_composition_text_ is. + // Ignore it. + if (last_text.empty()) + return; + + if (!IsPepperAcceptingCompositionEvents()) { + base::i18n::UTF16CharIterator iterator(&last_text); + int32 i = 0; + while (iterator.Advance()) { + blink::WebKeyboardEvent char_event; + char_event.type = blink::WebInputEvent::Char; + char_event.timeStampSeconds = base::Time::Now().ToDoubleT(); + char_event.modifiers = 0; + char_event.windowsKeyCode = last_text[i]; + char_event.nativeKeyCode = last_text[i]; + + const int32 char_start = i; + for (; i < iterator.array_pos(); ++i) { + char_event.text[i - char_start] = last_text[i]; + char_event.unmodifiedText[i - char_start] = last_text[i]; + } + + if (GetRenderWidget()->webwidget()) + GetRenderWidget()->webwidget()->handleInputEvent(char_event); + } + } else { + // Mimics the order of events sent by WebKit. + // See WebCore::Editor::setComposition() for the corresponding code. + render_view_->focused_pepper_plugin()->HandleCompositionEnd(last_text); + render_view_->focused_pepper_plugin()->HandleTextInput(last_text); + } + pepper_composition_text_.clear(); +} + +#endif // ENABLE_PLUGINS + bool RenderFrameImpl::Send(IPC::Message* message) { if (is_detaching_ || - (is_swapped_out_ && + ((is_swapped_out_ || render_view_->is_swapped_out()) && !SwappedOutMessages::CanSendWhileSwappedOut(message))) { delete message; return false; @@ -123,85 +447,121 @@ bool RenderFrameImpl::Send(IPC::Message* message) { } bool RenderFrameImpl::OnMessageReceived(const IPC::Message& msg) { + ObserverListBase<RenderFrameObserver>::Iterator it(observers_); + RenderFrameObserver* observer; + while ((observer = it.GetNext()) != NULL) { + if (observer->OnMessageReceived(msg)) + return true; + } + // TODO(ajwong): Fill in with message handlers as various components // are migrated over to understand frames. return false; } -// WebKit::WebFrameClient implementation ------------------------------------- +RenderView* RenderFrameImpl::GetRenderView() { + return render_view_; +} + +int RenderFrameImpl::GetRoutingID() { + return routing_id_; +} + +WebPreferences& RenderFrameImpl::GetWebkitPreferences() { + return render_view_->GetWebkitPreferences(); +} + +int RenderFrameImpl::ShowContextMenu(ContextMenuClient* client, + const ContextMenuParams& params) { + return render_view_->ShowContextMenu(client, params); +} + +void RenderFrameImpl::CancelContextMenu(int request_id) { + return render_view_->CancelContextMenu(request_id); +} + +blink::WebPlugin* RenderFrameImpl::CreatePlugin( + blink::WebFrame* frame, + const WebPluginInfo& info, + const blink::WebPluginParams& params) { +#if defined(ENABLE_PLUGINS) + bool pepper_plugin_was_registered = false; + scoped_refptr<PluginModule> pepper_module(PluginModule::Create( + this, info, &pepper_plugin_was_registered)); + if (pepper_plugin_was_registered) { + if (pepper_module.get()) { + // TODO(jam): change to take RenderFrame. + return new PepperWebPluginImpl( + pepper_module.get(), params, render_view_->AsWeakPtr(), this); + } + } +#if defined(OS_CHROMEOS) + LOG(WARNING) << "Pepper module/plugin creation failed."; + return NULL; +#else + // TODO(jam): change to take RenderFrame. + return new WebPluginImpl(frame, params, info.path, render_view_->AsWeakPtr(), + this); +#endif +#else + return NULL; +#endif +} -WebKit::WebPlugin* RenderFrameImpl::createPlugin( - WebKit::WebFrame* frame, - const WebKit::WebPluginParams& params) { - WebKit::WebPlugin* plugin = NULL; +void RenderFrameImpl::LoadURLExternally( + blink::WebFrame* frame, + const blink::WebURLRequest& request, + blink::WebNavigationPolicy policy) { + loadURLExternally(frame, request, policy); +} + +// blink::WebFrameClient implementation ---------------------------------------- + +blink::WebPlugin* RenderFrameImpl::createPlugin( + blink::WebFrame* frame, + const blink::WebPluginParams& params) { + blink::WebPlugin* plugin = NULL; if (GetContentClient()->renderer()->OverrideCreatePlugin( - render_view_, frame, params, &plugin)) { + this, frame, params, &plugin)) { return plugin; } -#if defined(ENABLE_PLUGINS) if (UTF16ToASCII(params.mimeType) == kBrowserPluginMimeType) { return render_view_->GetBrowserPluginManager()->CreateBrowserPlugin( - render_view_, frame, params); + render_view_, frame); } +#if defined(ENABLE_PLUGINS) WebPluginInfo info; std::string mime_type; - bool found = render_view_->GetPluginInfo( - params.url, frame->top()->document().url(), params.mimeType.utf8(), - &info, &mime_type); + bool found = false; + Send(new FrameHostMsg_GetPluginInfo( + routing_id_, params.url, frame->top()->document().url(), + params.mimeType.utf8(), &found, &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); + return CreatePlugin(frame, info, params_to_use); #else return NULL; #endif // defined(ENABLE_PLUGINS) } -WebKit::WebSharedWorker* RenderFrameImpl::createSharedWorker( - WebKit::WebFrame* frame, - 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 = render_view_->GetRoutingID(); - params.route_id = MSG_ROUTING_NONE; - params.script_resource_appcache_id = 0; - render_view_->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, - render_view_->GetRoutingID()); - } -} - -WebKit::WebMediaPlayer* RenderFrameImpl::createMediaPlayer( - WebKit::WebFrame* frame, - const WebKit::WebURL& url, - WebKit::WebMediaPlayerClient* client) { +blink::WebMediaPlayer* RenderFrameImpl::createMediaPlayer( + blink::WebFrame* frame, + const blink::WebURL& url, + blink::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); + return render_view_->CreateMediaPlayer(this, frame, url, client); } -WebKit::WebApplicationCacheHost* RenderFrameImpl::createApplicationCacheHost( - WebKit::WebFrame* frame, - WebKit::WebApplicationCacheHostClient* client) { +blink::WebApplicationCacheHost* RenderFrameImpl::createApplicationCacheHost( + blink::WebFrame* frame, + blink::WebApplicationCacheHostClient* client) { if (!frame || !frame->view()) return NULL; return new RendererWebApplicationCacheHostImpl( @@ -209,26 +569,75 @@ WebKit::WebApplicationCacheHost* RenderFrameImpl::createApplicationCacheHost( RenderThreadImpl::current()->appcache_dispatcher()->backend_proxy()); } -WebKit::WebCookieJar* RenderFrameImpl::cookieJar(WebKit::WebFrame* frame) { +blink::WebWorkerPermissionClientProxy* +RenderFrameImpl::createWorkerPermissionClientProxy(WebFrame* frame) { + if (!frame || !frame->view()) + return NULL; + return GetContentClient()->renderer()->CreateWorkerPermissionClientProxy( + RenderViewImpl::FromWebView(frame->view()), frame); +} + +blink::WebCookieJar* RenderFrameImpl::cookieJar(blink::WebFrame* frame) { return render_view_->cookieJar(frame); } -void RenderFrameImpl::didAccessInitialDocument(WebKit::WebFrame* frame) { +blink::WebServiceWorkerProvider* RenderFrameImpl::createServiceWorkerProvider( + blink::WebFrame* frame, + blink::WebServiceWorkerProviderClient* client) { + return new WebServiceWorkerProviderImpl( + ChildThread::current()->thread_safe_sender(), + make_scoped_ptr(client)); +} + +void RenderFrameImpl::didAccessInitialDocument(blink::WebFrame* frame) { render_view_->didAccessInitialDocument(frame); } -void RenderFrameImpl::didCreateFrame(WebKit::WebFrame* parent, - WebKit::WebFrame* child) { - render_view_->Send(new ViewHostMsg_FrameAttached( - render_view_->GetRoutingID(), parent->identifier(), child->identifier(), - UTF16ToUTF8(child->assignedName()))); +blink::WebFrame* RenderFrameImpl::createChildFrame( + blink::WebFrame* parent, + const blink::WebString& name) { + RenderFrameImpl* child_render_frame = this; + long long child_frame_identifier = WebFrame::generateEmbedderIdentifier(); + if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess)) { + // Synchronously notify the browser of a child frame creation to get the + // routing_id for the RenderFrame. + int routing_id; + Send(new FrameHostMsg_CreateChildFrame(routing_id_, + parent->identifier(), + child_frame_identifier, + UTF16ToUTF8(name), + &routing_id)); + child_render_frame = RenderFrameImpl::Create(render_view_, routing_id); + } + + blink::WebFrame* web_frame = WebFrame::create(child_render_frame, + child_frame_identifier); + + if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess)) { + g_child_frame_map.Get().insert( + std::make_pair(web_frame, child_render_frame)); + } + + return web_frame; } -void RenderFrameImpl::didDisownOpener(WebKit::WebFrame* frame) { +void RenderFrameImpl::didDisownOpener(blink::WebFrame* frame) { render_view_->didDisownOpener(frame); } -void RenderFrameImpl::frameDetached(WebKit::WebFrame* frame) { +void RenderFrameImpl::frameDetached(blink::WebFrame* frame) { + // NOTE: This function is called on the frame that is being detached and not + // the parent frame. This is different from createChildFrame() which is + // called on the parent frame. + CHECK(!is_detaching_); + + int64 parent_frame_id = -1; + if (frame->parent()) + parent_frame_id = frame->parent()->identifier(); + + Send(new FrameHostMsg_Detach(routing_id_, parent_frame_id, + frame->identifier())); + // Currently multiple WebCore::Frames can send frameDetached to a single // RenderFrameImpl. This is legacy behavior from when RenderViewImpl served // as a shared WebFrameClient for multiple Webcore::Frame objects. It also @@ -236,32 +645,42 @@ void RenderFrameImpl::frameDetached(WebKit::WebFrame* frame) { // even though one WebCore::Frame may have detached itself, others will // still need to use this object. if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess)) { - // TODO(ajwong): Add CHECK(!is_detaching_) once we guarantee each - // RenderFrameImpl is only used by one WebCore::Frame. + // The |is_detaching_| flag disables Send(). FrameHostMsg_Detach must be + // sent before setting |is_detaching_| to true. In contrast, Observers + // should only be notified afterwards so they cannot call back into and + // have IPCs fired off. is_detaching_ = true; } - int64 parent_frame_id = -1; - if (frame->parent()) - parent_frame_id = frame->parent()->identifier(); - - render_view_->Send(new ViewHostMsg_FrameDetached(render_view_->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); + + frame->close(); + + if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess)) { + // If the frame does not have a parent, it is the main frame. The main + // frame is owned by the containing RenderViewHost so it does not require + // any cleanup here. + if (frame->parent()) { + FrameMap::iterator it = g_child_frame_map.Get().find(frame); + DCHECK(it != g_child_frame_map.Get().end()); + DCHECK_EQ(it->second, this); + g_child_frame_map.Get().erase(it); + delete this; + // Object is invalid after this point. + } + } } -void RenderFrameImpl::willClose(WebKit::WebFrame* frame) { +void RenderFrameImpl::willClose(blink::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) { +void RenderFrameImpl::didChangeName(blink::WebFrame* frame, + const blink::WebString& name) { if (!render_view_->renderer_preferences_.report_frame_name_changes) return; @@ -272,19 +691,27 @@ void RenderFrameImpl::didChangeName(WebKit::WebFrame* frame, UTF16ToUTF8(name))); } -void RenderFrameImpl::loadURLExternally(WebKit::WebFrame* frame, - const WebKit::WebURLRequest& request, - WebKit::WebNavigationPolicy policy) { +void RenderFrameImpl::didMatchCSS( + blink::WebFrame* frame, + const blink::WebVector<blink::WebString>& newly_matching_selectors, + const blink::WebVector<blink::WebString>& stopped_matching_selectors) { + render_view_->didMatchCSS( + frame, newly_matching_selectors, stopped_matching_selectors); +} + +void RenderFrameImpl::loadURLExternally(blink::WebFrame* frame, + const blink::WebURLRequest& request, + blink::WebNavigationPolicy policy) { loadURLExternally(frame, request, policy, WebString()); } void RenderFrameImpl::loadURLExternally( - WebKit::WebFrame* frame, - const WebKit::WebURLRequest& request, - WebKit::WebNavigationPolicy policy, - const WebKit::WebString& suggested_name) { + blink::WebFrame* frame, + const blink::WebURLRequest& request, + blink::WebNavigationPolicy policy, + const blink::WebString& suggested_name) { Referrer referrer(RenderViewImpl::GetReferrerFromRequest(frame, request)); - if (policy == WebKit::WebNavigationPolicyDownload) { + if (policy == blink::WebNavigationPolicyDownload) { render_view_->Send(new ViewHostMsg_DownloadUrl(render_view_->GetRoutingID(), request.url(), referrer, suggested_name)); @@ -293,36 +720,36 @@ void RenderFrameImpl::loadURLExternally( } } -WebKit::WebNavigationPolicy RenderFrameImpl::decidePolicyForNavigation( - WebKit::WebFrame* frame, - WebKit::WebDataSource::ExtraData* extra_data, - const WebKit::WebURLRequest& request, - WebKit::WebNavigationType type, - WebKit::WebNavigationPolicy default_policy, +blink::WebNavigationPolicy RenderFrameImpl::decidePolicyForNavigation( + blink::WebFrame* frame, + blink::WebDataSource::ExtraData* extra_data, + const blink::WebURLRequest& request, + blink::WebNavigationType type, + blink::WebNavigationPolicy default_policy, bool is_redirect) { return render_view_->decidePolicyForNavigation( frame, extra_data, request, type, default_policy, is_redirect); } -WebKit::WebNavigationPolicy RenderFrameImpl::decidePolicyForNavigation( - WebKit::WebFrame* frame, - const WebKit::WebURLRequest& request, - WebKit::WebNavigationType type, - WebKit::WebNavigationPolicy default_policy, +blink::WebNavigationPolicy RenderFrameImpl::decidePolicyForNavigation( + blink::WebFrame* frame, + const blink::WebURLRequest& request, + blink::WebNavigationType type, + blink::WebNavigationPolicy default_policy, bool is_redirect) { return render_view_->decidePolicyForNavigation( frame, request, type, default_policy, is_redirect); } -void RenderFrameImpl::willSendSubmitEvent(WebKit::WebFrame* frame, - const WebKit::WebFormElement& form) { +void RenderFrameImpl::willSendSubmitEvent(blink::WebFrame* frame, + const blink::WebFormElement& form) { // Call back to RenderViewImpl for observers to be notified. // TODO(nasko): Remove once we have RenderFrameObserver. render_view_->willSendSubmitEvent(frame, form); } -void RenderFrameImpl::willSubmitForm(WebKit::WebFrame* frame, - const WebKit::WebFormElement& form) { +void RenderFrameImpl::willSubmitForm(blink::WebFrame* frame, + const blink::WebFormElement& form) { DocumentState* document_state = DocumentState::FromDataSource(frame->provisionalDataSource()); NavigationState* navigation_state = document_state->navigation_state(); @@ -345,8 +772,8 @@ void RenderFrameImpl::willSubmitForm(WebKit::WebFrame* frame, render_view_->willSubmitForm(frame, form); } -void RenderFrameImpl::didCreateDataSource(WebKit::WebFrame* frame, - WebKit::WebDataSource* datasource) { +void RenderFrameImpl::didCreateDataSource(blink::WebFrame* frame, + blink::WebDataSource* datasource) { // TODO(nasko): Move implementation here. Needed state: // * pending_navigation_params_ // * webview @@ -356,24 +783,64 @@ void RenderFrameImpl::didCreateDataSource(WebKit::WebFrame* frame, 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::didStartProvisionalLoad(blink::WebFrame* frame) { + WebDataSource* ds = frame->provisionalDataSource(); + + // In fast/loader/stop-provisional-loads.html, we abort the load before this + // callback is invoked. + if (!ds) + return; + + DocumentState* document_state = DocumentState::FromDataSource(ds); + + // We should only navigate to swappedout:// when is_swapped_out_ is true. + CHECK((ds->request().url() != GURL(kSwappedOutURL)) || + render_view_->is_swapped_out()) << + "Heard swappedout:// when not swapped out."; + + // Update the request time if WebKit has better knowledge of it. + if (document_state->request_time().is_null()) { + double event_time = ds->triggeringEventTime(); + if (event_time != 0.0) + document_state->set_request_time(Time::FromDoubleT(event_time)); + } + + // Start time is only set after request time. + document_state->set_start_load_time(Time::Now()); + + bool is_top_most = !frame->parent(); + if (is_top_most) { + render_view_->set_navigation_gesture( + WebUserGestureIndicator::isProcessingUserGesture() ? + NavigationGestureUser : NavigationGestureAuto); + } else if (ds->replacesCurrentHistoryItem()) { + // Subframe navigations that don't add session history items must be + // marked with AUTO_SUBFRAME. See also didFailProvisionalLoad for how we + // handle loading of error pages. + document_state->navigation_state()->set_transition_type( + PAGE_TRANSITION_AUTO_SUBFRAME); + } + + FOR_EACH_OBSERVER( + RenderViewObserver, render_view_->observers(), + DidStartProvisionalLoad(frame)); + + Send(new FrameHostMsg_DidStartProvisionalLoadForFrame( + routing_id_, frame->identifier(), + frame->parent() ? frame->parent()->identifier() : -1, + is_top_most, ds->request().url())); } void RenderFrameImpl::didReceiveServerRedirectForProvisionalLoad( - WebKit::WebFrame* frame) { + blink::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) { + blink::WebFrame* frame, + const blink::WebURLError& error) { // TODO(nasko): Move implementation here. Needed state: // * page_id_ // * pending_navigation_params_ @@ -383,7 +850,7 @@ void RenderFrameImpl::didFailProvisionalLoad( render_view_->didFailProvisionalLoad(frame, error); } -void RenderFrameImpl::didCommitProvisionalLoad(WebKit::WebFrame* frame, +void RenderFrameImpl::didCommitProvisionalLoad(blink::WebFrame* frame, bool is_new_navigation) { // TODO(nasko): Move implementation here. Needed state: // * page_id_ @@ -398,7 +865,7 @@ void RenderFrameImpl::didCommitProvisionalLoad(WebKit::WebFrame* frame, render_view_->didCommitProvisionalLoad(frame, is_new_navigation); } -void RenderFrameImpl::didClearWindowObject(WebKit::WebFrame* frame) { +void RenderFrameImpl::didClearWindowObject(blink::WebFrame* frame) { // TODO(nasko): Move implementation here. Needed state: // * enabled_bindings_ // * dom_automation_controller_ @@ -406,7 +873,7 @@ void RenderFrameImpl::didClearWindowObject(WebKit::WebFrame* frame) { render_view_->didClearWindowObject(frame); } -void RenderFrameImpl::didCreateDocumentElement(WebKit::WebFrame* frame) { +void RenderFrameImpl::didCreateDocumentElement(blink::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) { @@ -423,60 +890,60 @@ void RenderFrameImpl::didCreateDocumentElement(WebKit::WebFrame* frame) { render_view_->didCreateDocumentElement(frame); } -void RenderFrameImpl::didReceiveTitle(WebKit::WebFrame* frame, - const WebKit::WebString& title, - WebKit::WebTextDirection direction) { +void RenderFrameImpl::didReceiveTitle(blink::WebFrame* frame, + const blink::WebString& title, + blink::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) { +void RenderFrameImpl::didChangeIcon(blink::WebFrame* frame, + blink::WebIconURL::Type icon_type) { // TODO(nasko): Investigate wheather implementation should move here. render_view_->didChangeIcon(frame, icon_type); } -void RenderFrameImpl::didFinishDocumentLoad(WebKit::WebFrame* frame) { +void RenderFrameImpl::didFinishDocumentLoad(blink::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) { +void RenderFrameImpl::didHandleOnloadEvents(blink::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) { +void RenderFrameImpl::didFailLoad(blink::WebFrame* frame, + const blink::WebURLError& error) { // TODO(nasko): Move implementation here. No state needed. render_view_->didFailLoad(frame, error); } -void RenderFrameImpl::didFinishLoad(WebKit::WebFrame* frame) { +void RenderFrameImpl::didFinishLoad(blink::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, +void RenderFrameImpl::didNavigateWithinPage(blink::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) { +void RenderFrameImpl::didUpdateCurrentHistoryItem(blink::WebFrame* frame) { // TODO(nasko): Move implementation here. Needed methods: // * StartNavStateSyncTimerIfNecessary render_view_->didUpdateCurrentHistoryItem(frame); } void RenderFrameImpl::willRequestAfterPreconnect( - WebKit::WebFrame* frame, - WebKit::WebURLRequest& request) { - WebKit::WebReferrerPolicy referrer_policy = WebKit::WebReferrerPolicyDefault; + blink::WebFrame* frame, + blink::WebURLRequest& request) { + blink::WebReferrerPolicy referrer_policy = blink::WebReferrerPolicyDefault; WebString custom_user_agent; if (request.extraData()) { @@ -498,10 +965,10 @@ void RenderFrameImpl::willRequestAfterPreconnect( } void RenderFrameImpl::willSendRequest( - WebKit::WebFrame* frame, + blink::WebFrame* frame, unsigned identifier, - WebKit::WebURLRequest& request, - const WebKit::WebURLResponse& redirect_response) { + blink::WebURLRequest& request, + const blink::WebURLResponse& redirect_response) { // The request my be empty during tests. if (request.url().isEmpty()) return; @@ -536,7 +1003,7 @@ void RenderFrameImpl::willSendRequest( if (internal_data->is_cache_policy_override_set()) request.setCachePolicy(internal_data->cache_policy_override()); - WebKit::WebReferrerPolicy referrer_policy; + blink::WebReferrerPolicy referrer_policy; if (internal_data->is_referrer_policy_set()) { referrer_policy = internal_data->referrer_policy(); internal_data->clear_referrer_policy(); @@ -565,10 +1032,26 @@ void RenderFrameImpl::willSendRequest( } } + // Attach |should_replace_current_entry| state to requests so that, should + // this navigation later require a request transfer, all state is preserved + // when it is re-created in the new process. + bool should_replace_current_entry = false; + if (navigation_state->is_content_initiated()) { + should_replace_current_entry = data_source->replacesCurrentHistoryItem(); + } else { + // If the navigation is browser-initiated, the NavigationState contains the + // correct value instead of the WebDataSource. + // + // TODO(davidben): Avoid this awkward duplication of state. See comment on + // NavigationState::should_replace_current_entry(). + should_replace_current_entry = + navigation_state->should_replace_current_entry(); + } request.setExtraData( new RequestExtraData(referrer_policy, custom_user_agent, was_after_preconnect_request, + routing_id_, (frame == top_frame), frame->identifier(), GURL(frame->document().securityOrigin().toString()), @@ -576,6 +1059,7 @@ void RenderFrameImpl::willSendRequest( frame->parent() ? frame->parent()->identifier() : -1, navigation_state->allow_download(), transition_type, + should_replace_current_entry, navigation_state->transferred_request_child_id(), navigation_state->transferred_request_request_id())); @@ -613,9 +1097,9 @@ void RenderFrameImpl::willSendRequest( } void RenderFrameImpl::didReceiveResponse( - WebKit::WebFrame* frame, + blink::WebFrame* frame, unsigned identifier, - const WebKit::WebURLResponse& response) { + const blink::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 @@ -658,7 +1142,7 @@ void RenderFrameImpl::didReceiveResponse( internal_data->set_use_error_page(true); } -void RenderFrameImpl::didFinishResourceLoad(WebKit::WebFrame* frame, +void RenderFrameImpl::didFinishResourceLoad(blink::WebFrame* frame, unsigned identifier) { // TODO(nasko): Move implementation here. Needed state: // * devtools_agent_ @@ -668,9 +1152,9 @@ void RenderFrameImpl::didFinishResourceLoad(WebKit::WebFrame* frame, } void RenderFrameImpl::didLoadResourceFromMemoryCache( - WebKit::WebFrame* frame, - const WebKit::WebURLRequest& request, - const WebKit::WebURLResponse& response) { + blink::WebFrame* frame, + const blink::WebURLRequest& request, + const blink::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 @@ -690,28 +1174,37 @@ void RenderFrameImpl::didLoadResourceFromMemoryCache( ResourceType::FromTargetType(request.targetType()))); } -void RenderFrameImpl::didDisplayInsecureContent(WebKit::WebFrame* frame) { +void RenderFrameImpl::didDisplayInsecureContent(blink::WebFrame* frame) { render_view_->Send(new ViewHostMsg_DidDisplayInsecureContent( render_view_->GetRoutingID())); } void RenderFrameImpl::didRunInsecureContent( - WebKit::WebFrame* frame, - const WebKit::WebSecurityOrigin& origin, - const WebKit::WebURL& target) { + blink::WebFrame* frame, + const blink::WebSecurityOrigin& origin, + const blink::WebURL& target) { render_view_->Send(new ViewHostMsg_DidRunInsecureContent( render_view_->GetRoutingID(), origin.toString().utf8(), target)); } +void RenderFrameImpl::didAbortLoading(blink::WebFrame* frame) { +#if defined(ENABLE_PLUGINS) + if (frame != render_view_->webview()->mainFrame()) + return; + PluginChannelHost::Broadcast( + new PluginHostMsg_DidAbortLoading(render_view_->GetRoutingID())); +#endif +} + void RenderFrameImpl::didExhaustMemoryAvailableForScript( - WebKit::WebFrame* frame) { + blink::WebFrame* frame) { render_view_->Send(new ViewHostMsg_JSOutOfMemory( render_view_->GetRoutingID())); } -void RenderFrameImpl::didCreateScriptContext(WebKit::WebFrame* frame, +void RenderFrameImpl::didCreateScriptContext(blink::WebFrame* frame, v8::Handle<v8::Context> context, int extension_group, int world_id) { @@ -719,32 +1212,32 @@ void RenderFrameImpl::didCreateScriptContext(WebKit::WebFrame* frame, frame, context, extension_group, world_id); } -void RenderFrameImpl::willReleaseScriptContext(WebKit::WebFrame* frame, +void RenderFrameImpl::willReleaseScriptContext(blink::WebFrame* frame, v8::Handle<v8::Context> context, int world_id) { GetContentClient()->renderer()->WillReleaseScriptContext( frame, context, world_id); } -void RenderFrameImpl::didFirstVisuallyNonEmptyLayout(WebKit::WebFrame* frame) { +void RenderFrameImpl::didFirstVisuallyNonEmptyLayout(blink::WebFrame* frame) { render_view_->didFirstVisuallyNonEmptyLayout(frame); } -void RenderFrameImpl::didChangeContentsSize(WebKit::WebFrame* frame, - const WebKit::WebSize& size) { +void RenderFrameImpl::didChangeContentsSize(blink::WebFrame* frame, + const blink::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) { +void RenderFrameImpl::didChangeScrollOffset(blink::WebFrame* frame) { // TODO(nasko): Move implementation here. Needed methods: // * StartNavStateSyncTimerIfNecessary render_view_->didChangeScrollOffset(frame); } -void RenderFrameImpl::willInsertBody(WebKit::WebFrame* frame) { +void RenderFrameImpl::willInsertBody(blink::WebFrame* frame) { if (!frame->parent()) { render_view_->Send(new ViewHostMsg_WillInsertBody( render_view_->GetRoutingID())); @@ -766,22 +1259,22 @@ void RenderFrameImpl::reportFindInPageMatchCount(int request_id, void RenderFrameImpl::reportFindInPageSelection( int request_id, int active_match_ordinal, - const WebKit::WebRect& selection_rect) { + const blink::WebRect& selection_rect) { render_view_->Send(new ViewHostMsg_Find_Reply( render_view_->GetRoutingID(), request_id, -1, selection_rect, active_match_ordinal, false)); } void RenderFrameImpl::requestStorageQuota( - WebKit::WebFrame* frame, - WebKit::WebStorageQuotaType type, + blink::WebFrame* frame, + blink::WebStorageQuotaType type, unsigned long long requested_size, - WebKit::WebStorageQuotaCallbacks* callbacks) { + blink::WebStorageQuotaCallbacks* callbacks) { DCHECK(frame); WebSecurityOrigin origin = frame->document().securityOrigin(); if (origin.isUnique()) { // Unique origins cannot store persistent state. - callbacks->didFail(WebKit::WebStorageQuotaErrorAbort); + callbacks->didFail(blink::WebStorageQuotaErrorAbort); return; } ChildThread::current()->quota_dispatcher()->RequestStorageQuota( @@ -791,35 +1284,35 @@ void RenderFrameImpl::requestStorageQuota( } void RenderFrameImpl::willOpenSocketStream( - WebKit::WebSocketStreamHandle* handle) { + blink::WebSocketStreamHandle* handle) { SocketStreamHandleData::AddToHandle(handle, render_view_->GetRoutingID()); } void RenderFrameImpl::willStartUsingPeerConnectionHandler( - WebKit::WebFrame* frame, - WebKit::WebRTCPeerConnectionHandler* handler) { + blink::WebFrame* frame, + blink::WebRTCPeerConnectionHandler* handler) { #if defined(ENABLE_WEBRTC) static_cast<RTCPeerConnectionHandler*>(handler)->associateWithFrame(frame); #endif } bool RenderFrameImpl::willCheckAndDispatchMessageEvent( - WebKit::WebFrame* sourceFrame, - WebKit::WebFrame* targetFrame, - WebKit::WebSecurityOrigin targetOrigin, - WebKit::WebDOMMessageEvent event) { + blink::WebFrame* sourceFrame, + blink::WebFrame* targetFrame, + blink::WebSecurityOrigin targetOrigin, + blink::WebDOMMessageEvent event) { // TODO(nasko): Move implementation here. Needed state: // * is_swapped_out_ return render_view_->willCheckAndDispatchMessageEvent( sourceFrame, targetFrame, targetOrigin, event); } -WebKit::WebString RenderFrameImpl::userAgentOverride( - WebKit::WebFrame* frame, - const WebKit::WebURL& url) { +blink::WebString RenderFrameImpl::userAgentOverride( + blink::WebFrame* frame, + const blink::WebURL& url) { if (!render_view_->webview() || !render_view_->webview()->mainFrame() || render_view_->renderer_preferences_.user_agent_override.empty()) { - return WebKit::WebString(); + return blink::WebString(); } // If we're in the middle of committing a load, the data source we need @@ -836,16 +1329,16 @@ WebKit::WebString RenderFrameImpl::userAgentOverride( if (internal_data && internal_data->is_overriding_user_agent()) return WebString::fromUTF8( render_view_->renderer_preferences_.user_agent_override); - return WebKit::WebString(); + return blink::WebString(); } -WebKit::WebString RenderFrameImpl::doNotTrackValue(WebKit::WebFrame* frame) { +blink::WebString RenderFrameImpl::doNotTrackValue(blink::WebFrame* frame) { if (render_view_->renderer_preferences_.enable_do_not_track) return WebString::fromUTF8("1"); return WebString(); } -bool RenderFrameImpl::allowWebGL(WebKit::WebFrame* frame, bool default_value) { +bool RenderFrameImpl::allowWebGL(blink::WebFrame* frame, bool default_value) { if (!default_value) return false; @@ -858,7 +1351,7 @@ bool RenderFrameImpl::allowWebGL(WebKit::WebFrame* frame, bool default_value) { return !blocked; } -void RenderFrameImpl::didLoseWebGLContext(WebKit::WebFrame* frame, +void RenderFrameImpl::didLoseWebGLContext(blink::WebFrame* frame, int arb_robustness_status_code) { render_view_->Send(new ViewHostMsg_DidLose3DContext( GURL(frame->top()->document().securityOrigin().toString()), @@ -866,4 +1359,13 @@ void RenderFrameImpl::didLoseWebGLContext(WebKit::WebFrame* frame, arb_robustness_status_code)); } +void RenderFrameImpl::AddObserver(RenderFrameObserver* observer) { + observers_.AddObserver(observer); +} + +void RenderFrameImpl::RemoveObserver(RenderFrameObserver* observer) { + observer->RenderFrameGone(); + observers_.RemoveObserver(observer); +} + } // namespace content |