Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(697)

Side by Side Diff: content/renderer/render_frame_impl.cc

Issue 1991273003: Fire visibilityChange event on out-of-process iframes. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/renderer/render_frame_impl.h" 5 #include "content/renderer/render_frame_impl.h"
6 6
7 #include <map> 7 #include <map>
8 #include <string> 8 #include <string>
9 #include <utility> 9 #include <utility>
10 #include <vector> 10 #include <vector>
(...skipping 868 matching lines...) Expand 10 before | Expand all | Expand 10 after
879 879
880 RenderFrameImpl* render_frame = 880 RenderFrameImpl* render_frame =
881 RenderFrameImpl::Create(render_view, routing_id); 881 RenderFrameImpl::Create(render_view, routing_id);
882 render_frame->InitializeBlameContext(nullptr); 882 render_frame->InitializeBlameContext(nullptr);
883 WebLocalFrame* web_frame = WebLocalFrame::create( 883 WebLocalFrame* web_frame = WebLocalFrame::create(
884 blink::WebTreeScopeType::Document, render_frame, opener); 884 blink::WebTreeScopeType::Document, render_frame, opener);
885 render_frame->BindToWebFrame(web_frame); 885 render_frame->BindToWebFrame(web_frame);
886 render_view->webview()->setMainFrame(web_frame); 886 render_view->webview()->setMainFrame(web_frame);
887 render_frame->render_widget_ = RenderWidget::CreateForFrame( 887 render_frame->render_widget_ = RenderWidget::CreateForFrame(
888 widget_routing_id, hidden, screen_info, compositor_deps, web_frame); 888 widget_routing_id, hidden, screen_info, compositor_deps, web_frame);
889 // TODO(kenrb): Observing shouldn't be necessary when we sort out
890 // WasShown and WasHidden, separating page-level visibility from
891 // frame-level visibility.
892 // TODO(avi): This DCHECK is to track cleanup for https://crbug.com/545684 889 // TODO(avi): This DCHECK is to track cleanup for https://crbug.com/545684
893 DCHECK_EQ(render_view->GetWidget(), render_frame->render_widget_) 890 DCHECK_EQ(render_view->GetWidget(), render_frame->render_widget_)
894 << "Main frame is no longer reusing the RenderView as its widget! " 891 << "Main frame is no longer reusing the RenderView as its widget! "
895 << "Does the RenderFrame need to register itself with the RenderWidget?"; 892 << "Does the RenderFrame need to register itself with the RenderWidget?";
896 return render_frame; 893 return render_frame;
897 } 894 }
898 895
899 // static 896 // static
900 void RenderFrameImpl::CreateFrame( 897 void RenderFrameImpl::CreateFrame(
901 int routing_id, 898 int routing_id,
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
959 956
960 if (widget_params.routing_id != MSG_ROUTING_NONE) { 957 if (widget_params.routing_id != MSG_ROUTING_NONE) {
961 CHECK(!web_frame->parent() || 958 CHECK(!web_frame->parent() ||
962 SiteIsolationPolicy::AreCrossProcessFramesPossible()); 959 SiteIsolationPolicy::AreCrossProcessFramesPossible());
963 render_frame->render_widget_ = RenderWidget::CreateForFrame( 960 render_frame->render_widget_ = RenderWidget::CreateForFrame(
964 widget_params.routing_id, widget_params.hidden, 961 widget_params.routing_id, widget_params.hidden,
965 render_frame->render_view_->screen_info(), compositor_deps, web_frame); 962 render_frame->render_view_->screen_info(), compositor_deps, web_frame);
966 // TODO(avi): The main frame re-uses the RenderViewImpl as its widget, so 963 // TODO(avi): The main frame re-uses the RenderViewImpl as its widget, so
967 // avoid double-registering the frame as an observer. 964 // avoid double-registering the frame as an observer.
968 // https://crbug.com/545684 965 // https://crbug.com/545684
969 if (web_frame->parent()) { 966 if (web_frame->parent())
970 // TODO(kenrb): Observing shouldn't be necessary when we sort out
971 // WasShown and WasHidden, separating page-level visibility from
972 // frame-level visibility.
973 render_frame->render_widget_->RegisterRenderFrame(render_frame); 967 render_frame->render_widget_->RegisterRenderFrame(render_frame);
974 }
975 } 968 }
976 969
977 render_frame->Initialize(); 970 render_frame->Initialize();
978 } 971 }
979 972
980 // static 973 // static
981 RenderFrame* RenderFrame::FromWebFrame(blink::WebFrame* web_frame) { 974 RenderFrame* RenderFrame::FromWebFrame(blink::WebFrame* web_frame) {
982 return RenderFrameImpl::FromWebFrame(web_frame); 975 return RenderFrameImpl::FromWebFrame(web_frame);
983 } 976 }
984 977
(...skipping 633 matching lines...) Expand 10 before | Expand all | Expand 10 after
1618 if (is_main_frame_) 1611 if (is_main_frame_)
1619 render_view_->SetSwappedOut(true); 1612 render_view_->SetSwappedOut(true);
1620 1613
1621 // Transfer settings such as initial drawing parameters to the remote frame, 1614 // Transfer settings such as initial drawing parameters to the remote frame,
1622 // if one is created, that will replace this frame. 1615 // if one is created, that will replace this frame.
1623 if (!is_main_frame_) 1616 if (!is_main_frame_)
1624 proxy->web_frame()->initializeFromFrame(frame_); 1617 proxy->web_frame()->initializeFromFrame(frame_);
1625 1618
1626 // Let WebKit know that this view is hidden so it can drop resources and 1619 // Let WebKit know that this view is hidden so it can drop resources and
1627 // stop compositing. 1620 // stop compositing.
1628 // TODO(creis): Support this for subframes as well.
1629 if (is_main_frame_) { 1621 if (is_main_frame_) {
1630 render_view_->webview()->setVisibilityState( 1622 render_view_->webview()->setVisibilityState(
1631 blink::WebPageVisibilityStateHidden, false); 1623 blink::WebPageVisibilityStateHidden, false);
1632 } 1624 }
1633 1625
1634 RenderViewImpl* render_view = render_view_.get(); 1626 RenderViewImpl* render_view = render_view_.get();
1635 bool is_main_frame = is_main_frame_; 1627 bool is_main_frame = is_main_frame_;
1636 int routing_id = GetRoutingID(); 1628 int routing_id = GetRoutingID();
1637 1629
1638 // Now that all of the cleanup is complete and the browser side is notified, 1630 // Now that all of the cleanup is complete and the browser side is notified,
(...skipping 2260 matching lines...) Expand 10 before | Expand all | Expand 10 after
3899 // Explicitly set the SkipServiceWorker flag here if the renderer process 3891 // Explicitly set the SkipServiceWorker flag here if the renderer process
3900 // hasn't received SetControllerServiceWorker message. 3892 // hasn't received SetControllerServiceWorker message.
3901 if (!provider->IsControlledByServiceWorker()) 3893 if (!provider->IsControlledByServiceWorker())
3902 request.setSkipServiceWorker(true); 3894 request.setSkipServiceWorker(true);
3903 } 3895 }
3904 3896
3905 WebFrame* parent = frame->parent(); 3897 WebFrame* parent = frame->parent();
3906 int parent_routing_id = parent ? GetRoutingIdForFrameOrProxy(parent) : -1; 3898 int parent_routing_id = parent ? GetRoutingIdForFrameOrProxy(parent) : -1;
3907 3899
3908 RequestExtraData* extra_data = new RequestExtraData(); 3900 RequestExtraData* extra_data = new RequestExtraData();
3909 extra_data->set_visibility_state(render_view_->visibilityState()); 3901 extra_data->set_visibility_state(visibilityState());
3910 extra_data->set_custom_user_agent(custom_user_agent); 3902 extra_data->set_custom_user_agent(custom_user_agent);
3911 extra_data->set_requested_with(requested_with); 3903 extra_data->set_requested_with(requested_with);
3912 extra_data->set_render_frame_id(routing_id_); 3904 extra_data->set_render_frame_id(routing_id_);
3913 extra_data->set_is_main_frame(!parent); 3905 extra_data->set_is_main_frame(!parent);
3914 extra_data->set_frame_origin( 3906 extra_data->set_frame_origin(
3915 blink::WebStringToGURL(frame->document().getSecurityOrigin().toString())); 3907 blink::WebStringToGURL(frame->document().getSecurityOrigin().toString()));
3916 extra_data->set_parent_is_main_frame(parent && !parent->parent()); 3908 extra_data->set_parent_is_main_frame(parent && !parent->parent());
3917 extra_data->set_parent_render_frame_id(parent_routing_id); 3909 extra_data->set_parent_render_frame_id(parent_routing_id);
3918 extra_data->set_allow_download( 3910 extra_data->set_allow_download(
3919 navigation_state->common_params().allow_download); 3911 navigation_state->common_params().allow_download);
(...skipping 464 matching lines...) Expand 10 before | Expand all | Expand 10 after
4384 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, OnStop()); 4376 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, OnStop());
4385 } 4377 }
4386 4378
4387 void RenderFrameImpl::WasHidden() { 4379 void RenderFrameImpl::WasHidden() {
4388 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, WasHidden()); 4380 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, WasHidden());
4389 4381
4390 #if defined(ENABLE_PLUGINS) 4382 #if defined(ENABLE_PLUGINS)
4391 for (auto* plugin : active_pepper_instances_) 4383 for (auto* plugin : active_pepper_instances_)
4392 plugin->PageVisibilityChanged(false); 4384 plugin->PageVisibilityChanged(false);
4393 #endif // ENABLE_PLUGINS 4385 #endif // ENABLE_PLUGINS
4386
4387 if (IsLocalRoot() && GetWebFrame()->frameWidget()) {
dcheng 2016/05/24 20:38:24 Why do we need both checks here? I would expect on
lfg 2016/05/24 23:33:50 Removed.
4388 static_cast<blink::WebFrameWidget*>(GetWebFrame()->frameWidget())
4389 ->setVisibilityState(visibilityState());
4390 }
4394 } 4391 }
4395 4392
4396 void RenderFrameImpl::WasShown() { 4393 void RenderFrameImpl::WasShown() {
4397 // TODO(kenrb): Need to figure out how to do this better. Should
4398 // VisibilityState remain a page-level concept or move to frames?
4399 // The semantics of 'Show' might have to change here.
4400 // TODO(avi): This DCHECK is to track cleanup for https://crbug.com/545684
4401 DCHECK(!IsMainFrame() || render_widget_.get() == render_view_.get())
4402 << "The main render frame is no longer reusing the RenderView as its "
4403 << "RenderWidget!";
4404 if (render_widget_ && render_widget_->webwidget() &&
4405 render_view_.get() != render_widget_.get()) {
4406 static_cast<blink::WebFrameWidget*>(render_widget_->webwidget())->
4407 setVisibilityState(blink::WebPageVisibilityStateVisible, false);
4408 }
4409 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, WasShown()); 4394 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, WasShown());
4410 4395
4411 #if defined(ENABLE_PLUGINS) 4396 #if defined(ENABLE_PLUGINS)
4412 for (auto* plugin : active_pepper_instances_) 4397 for (auto* plugin : active_pepper_instances_)
4413 plugin->PageVisibilityChanged(true); 4398 plugin->PageVisibilityChanged(true);
4414 #endif // ENABLE_PLUGINS 4399 #endif // ENABLE_PLUGINS
4400
4401 if (IsLocalRoot() && GetWebFrame()->frameWidget()) {
kenrb 2016/05/24 20:25:18 Can GetWebFrame() return nullptr here, if this is
lfg 2016/05/24 23:33:50 No, the RenderFrameImpl is synchronously deleted i
4402 static_cast<blink::WebFrameWidget*>(GetWebFrame()->frameWidget())
4403 ->setVisibilityState(visibilityState());
4404 }
4415 } 4405 }
4416 4406
4417 void RenderFrameImpl::WidgetWillClose() { 4407 void RenderFrameImpl::WidgetWillClose() {
4418 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, WidgetWillClose()); 4408 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, WidgetWillClose());
4419 } 4409 }
4420 4410
4421 bool RenderFrameImpl::IsMainFrame() { 4411 bool RenderFrameImpl::IsMainFrame() {
4422 return is_main_frame_; 4412 return is_main_frame_;
4423 } 4413 }
4424 4414
(...skipping 1657 matching lines...) Expand 10 before | Expand all | Expand 10 after
6082 media::ConvertToOutputDeviceStatusCB(web_callbacks); 6072 media::ConvertToOutputDeviceStatusCB(web_callbacks);
6083 callback.Run(AudioDeviceFactory::GetOutputDeviceInfo( 6073 callback.Run(AudioDeviceFactory::GetOutputDeviceInfo(
6084 routing_id_, 0, sink_id.utf8(), security_origin) 6074 routing_id_, 0, sink_id.utf8(), security_origin)
6085 .device_status()); 6075 .device_status());
6086 } 6076 }
6087 6077
6088 blink::ServiceRegistry* RenderFrameImpl::serviceRegistry() { 6078 blink::ServiceRegistry* RenderFrameImpl::serviceRegistry() {
6089 return &blink_service_registry_; 6079 return &blink_service_registry_;
6090 } 6080 }
6091 6081
6082 blink::WebPageVisibilityState RenderFrameImpl::visibilityState() const {
6083 RenderFrameImpl* local_root =
6084 RenderFrameImpl::FromWebFrame(frame_->localRoot());
6085 blink::WebPageVisibilityState current_state =
6086 local_root->render_widget_->is_hidden()
6087 ? blink::WebPageVisibilityStateHidden
6088 : blink::WebPageVisibilityStateVisible;
6089 blink::WebPageVisibilityState override_state = current_state;
6090 if (GetContentClient()->renderer()->ShouldOverridePageVisibilityState(
6091 this, &override_state))
6092 return override_state;
6093 return current_state;
6094 }
6095
6096 blink::WebPageVisibilityState RenderFrameImpl::GetVisibilityState() const {
6097 return visibilityState();
6098 }
6099
6092 blink::WebPlugin* RenderFrameImpl::GetWebPluginForFind() { 6100 blink::WebPlugin* RenderFrameImpl::GetWebPluginForFind() {
6093 if (!is_main_frame_) 6101 if (!is_main_frame_)
6094 return nullptr; 6102 return nullptr;
6095 6103
6096 if (frame_->document().isPluginDocument()) 6104 if (frame_->document().isPluginDocument())
6097 return frame_->document().to<WebPluginDocument>().plugin(); 6105 return frame_->document().to<WebPluginDocument>().plugin();
6098 6106
6099 #if defined(ENABLE_PLUGINS) 6107 #if defined(ENABLE_PLUGINS)
6100 if (plugin_find_handler_) 6108 if (plugin_find_handler_)
6101 return plugin_find_handler_->container()->plugin(); 6109 return plugin_find_handler_->container()->plugin();
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
6166 // event target. Potentially a Pepper plugin will receive the event. 6174 // event target. Potentially a Pepper plugin will receive the event.
6167 // In order to tell whether a plugin gets the last mouse event and which it 6175 // In order to tell whether a plugin gets the last mouse event and which it
6168 // is, we set |pepper_last_mouse_event_target_| to null here. If a plugin gets 6176 // is, we set |pepper_last_mouse_event_target_| to null here. If a plugin gets
6169 // the event, it will notify us via DidReceiveMouseEvent() and set itself as 6177 // the event, it will notify us via DidReceiveMouseEvent() and set itself as
6170 // |pepper_last_mouse_event_target_|. 6178 // |pepper_last_mouse_event_target_|.
6171 pepper_last_mouse_event_target_ = nullptr; 6179 pepper_last_mouse_event_target_ = nullptr;
6172 #endif 6180 #endif
6173 } 6181 }
6174 6182
6175 } // namespace content 6183 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698