Index: content/renderer/render_frame_impl.cc |
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc |
index 26d6d9c10ec419a973039f8cc330727dbccfc064..aab48006939db316fb35527142ec26c214c4b9e1 100644 |
--- a/content/renderer/render_frame_impl.cc |
+++ b/content/renderer/render_frame_impl.cc |
@@ -1104,8 +1104,10 @@ RenderFrameImpl::RenderFrameImpl(const CreateParams& params) |
focused_pepper_plugin_(nullptr), |
pepper_last_mouse_event_target_(nullptr), |
#endif |
+ engagement_binding_(this), |
frame_binding_(this), |
host_zoom_binding_(this), |
+ engagement_level_(blink::mojom::EngagementLevel::NONE), |
has_accessed_initial_document_(false), |
weak_factory_(this) { |
// We don't have a service_manager::Connection at this point, so use empty |
@@ -1628,8 +1630,13 @@ void RenderFrameImpl::OnNavigate( |
std::unique_ptr<StreamOverrideParameters>()); |
} |
-void RenderFrameImpl::Bind(mojom::FrameRequest request, |
- mojom::FrameHostPtr host) { |
+void RenderFrameImpl::BindEngagement( |
+ blink::mojom::EngagementClientAssociatedRequest request) { |
+ engagement_binding_.Bind(std::move(request)); |
+} |
+ |
+void RenderFrameImpl::BindFrame(mojom::FrameRequest request, |
+ mojom::FrameHostPtr host) { |
frame_binding_.Bind(std::move(request)); |
frame_host_ = std::move(host); |
frame_host_->GetInterfaceProvider( |
@@ -2645,6 +2652,22 @@ bool RenderFrameImpl::IsPasting() const { |
return is_pasting_; |
} |
+// blink::mojom::EngagementClient implementation ------------------------------- |
+ |
+void RenderFrameImpl::SetEngagementLevel(blink::mojom::EngagementLevel level) { |
+ engagement_level_ = level; |
+ |
+ // Set the engagement level on |frame_| if we have committed the current |
+ // navigation. Otherwise, it will be set in didCommitProvisionalLoad. |
+ if (!frame_ || !frame_->dataSource()) |
+ return; |
+ |
+ NavigationStateImpl* navigation_state = static_cast<NavigationStateImpl*>( |
+ DocumentState::FromDataSource(frame_->dataSource())->navigation_state()); |
+ if (navigation_state->request_committed()) |
+ frame_->setEngagementLevel(level); |
+} |
+ |
// mojom::Frame implementation ------------------------------------------------- |
void RenderFrameImpl::GetInterfaceProvider( |
@@ -3570,6 +3593,9 @@ void RenderFrameImpl::didCommitProvisionalLoad( |
} |
} |
+ // Ensure the frame has the correct engagement level before the load begins. |
+ frame_->setEngagementLevel(engagement_level_); |
nasko
2016/11/28 19:18:08
I would feel more comfortable if this is only set
dominickn
2016/11/29 07:41:22
Done.
|
+ |
// For new page navigations, the browser process needs to be notified of the |
// first paint of that page, so it can cancel the timer that waits for it. |
if (is_main_frame_ && !navigation_state->WasWithinSamePage()) { |
@@ -6481,6 +6507,9 @@ void RenderFrameImpl::HandlePepperImeCommit(const base::string16& text) { |
#endif // ENABLE_PLUGINS |
void RenderFrameImpl::RegisterMojoInterfaces() { |
+ GetAssociatedInterfaceRegistry()->AddInterface( |
+ base::Bind(&RenderFrameImpl::BindEngagement, weak_factory_.GetWeakPtr())); |
+ |
if (!frame_->parent()) { |
// Only main frame have ImageDownloader service. |
GetInterfaceRegistry()->AddInterface(base::Bind( |