Convert ColorChooser from ipc to mojo.
Using a Factory to provide dedicated pipes for ColorChooser
and ColorChooserClient. This removes the need for the identifier
currently in use for ipcs. ColorChooserEnd messages
have been replaced with connection error handlers, and
each side can simply close the connection without explicitly
sending EndColorChooser msgs.
Replaced struct content::ColorSuggestion with
content::mojom::ColorSuggestion in content/public/common.
Bug: 788960
Change-Id: I436e277738bf0e37eda8bfa0fd7428aede015c43
Reviewed-on: https://chromium-review.googlesource.com/800350
Reviewed-by: John Abd-El-Malek <[email protected]>
Reviewed-by: Ken Rockot <[email protected]>
Reviewed-by: Ken Buchanan <[email protected]>
Reviewed-by: Nicholas Verne <[email protected]>
Reviewed-by: Sam McNally <[email protected]>
Commit-Queue: Joel Hockey <[email protected]>
Cr-Commit-Position: refs/heads/master@{#523071}
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
index f22cf700..47657d0 100644
--- a/content/browser/web_contents/web_contents_impl.cc
+++ b/content/browser/web_contents/web_contents_impl.cc
@@ -393,26 +393,40 @@
DISALLOW_COPY_AND_ASSIGN(DestructionObserver);
};
-WebContentsImpl::ColorChooserInfo::ColorChooserInfo(int render_process_id,
- int render_frame_id,
- ColorChooser* chooser,
- int identifier)
- : render_process_id(render_process_id),
- render_frame_id(render_frame_id),
- chooser(chooser),
- identifier(identifier) {
-}
+// WebContentsImpl::ColorChooser ----------------------------------------------
+class WebContentsImpl::ColorChooser : public mojom::ColorChooser {
+ public:
+ ColorChooser(content::ColorChooser* chooser,
+ mojom::ColorChooserRequest request,
+ mojom::ColorChooserClientPtr client)
+ : chooser_(chooser),
+ binding_(this, std::move(request)),
+ client_(std::move(client)) {
+ binding_.set_connection_error_handler(
+ base::BindOnce([](content::ColorChooser* chooser) { chooser->End(); },
+ base::Unretained(chooser)));
+ }
-WebContentsImpl::ColorChooserInfo::~ColorChooserInfo() {
-}
+ ~ColorChooser() override { chooser_->End(); }
-bool WebContentsImpl::ColorChooserInfo::Matches(
- RenderFrameHostImpl* render_frame_host,
- int color_chooser_id) {
- return this->render_process_id == render_frame_host->GetProcess()->GetID() &&
- this->render_frame_id == render_frame_host->GetRoutingID() &&
- this->identifier == color_chooser_id;
-}
+ void SetSelectedColor(SkColor color) override {
+ chooser_->SetSelectedColor(color);
+ }
+
+ void DidChooseColorInColorChooser(SkColor color) {
+ client_->DidChooseColor(color);
+ }
+
+ private:
+ // Color chooser that was opened by this tab.
+ std::unique_ptr<content::ColorChooser> chooser_;
+
+ // mojo bindings.
+ mojo::Binding<mojom::ColorChooser> binding_;
+
+ // mojo renderer client.
+ content::mojom::ColorChooserClientPtr client_;
+};
// WebContentsImpl::WebContentsTreeNode ----------------------------------------
WebContentsImpl::WebContentsTreeNode::WebContentsTreeNode(
@@ -569,6 +583,9 @@
#if !defined(OS_ANDROID)
host_zoom_map_observer_.reset(new HostZoomMapObserver(this));
#endif // !defined(OS_ANDROID)
+
+ registry_.AddInterface(base::BindRepeating(
+ &WebContentsImpl::OnColorChooserFactoryRequest, base::Unretained(this)));
}
WebContentsImpl::~WebContentsImpl() {
@@ -612,8 +629,7 @@
dialog_manager_->CancelDialogs(this, /*reset_state=*/true);
}
- if (color_chooser_info_.get())
- color_chooser_info_->chooser->End();
+ color_chooser_.reset();
NotifyDisconnected();
@@ -837,10 +853,6 @@
IPC_MESSAGE_HANDLER(FrameHostMsg_DidFinishDocumentLoad,
OnDocumentLoadedInFrame)
IPC_MESSAGE_HANDLER(FrameHostMsg_DidFinishLoad, OnDidFinishLoad)
- IPC_MESSAGE_HANDLER(FrameHostMsg_OpenColorChooser, OnOpenColorChooser)
- IPC_MESSAGE_HANDLER(FrameHostMsg_EndColorChooser, OnEndColorChooser)
- IPC_MESSAGE_HANDLER(FrameHostMsg_SetSelectedColorInColorChooser,
- OnSetSelectedColorInColorChooser)
IPC_MESSAGE_HANDLER(FrameHostMsg_DidLoadResourceFromMemoryCache,
OnDidLoadResourceFromMemoryCache)
IPC_MESSAGE_HANDLER(FrameHostMsg_DidDisplayInsecureContent,
@@ -3513,30 +3525,11 @@
}
void WebContentsImpl::DidChooseColorInColorChooser(SkColor color) {
- if (!color_chooser_info_.get())
- return;
- RenderFrameHost* rfh = RenderFrameHost::FromID(
- color_chooser_info_->render_process_id,
- color_chooser_info_->render_frame_id);
- if (!rfh)
- return;
-
- rfh->Send(new FrameMsg_DidChooseColorResponse(
- rfh->GetRoutingID(), color_chooser_info_->identifier, color));
+ color_chooser_->DidChooseColorInColorChooser(color);
}
void WebContentsImpl::DidEndColorChooser() {
- if (!color_chooser_info_.get())
- return;
- RenderFrameHost* rfh = RenderFrameHost::FromID(
- color_chooser_info_->render_process_id,
- color_chooser_info_->render_frame_id);
- if (!rfh)
- return;
-
- rfh->Send(new FrameMsg_DidEndColorChooser(
- rfh->GetRoutingID(), color_chooser_info_->identifier));
- color_chooser_info_.reset();
+ color_chooser_.reset();
}
int WebContentsImpl::DownloadImage(
@@ -4212,38 +4205,25 @@
observer.AppCacheAccessed(manifest_url, blocked_by_policy);
}
-void WebContentsImpl::OnOpenColorChooser(
- RenderFrameHostImpl* source,
- int color_chooser_id,
+void WebContentsImpl::OnColorChooserFactoryRequest(
+ mojom::ColorChooserFactoryRequest request) {
+ color_chooser_factory_bindings_.AddBinding(this, std::move(request));
+}
+
+void WebContentsImpl::OpenColorChooser(
+ mojom::ColorChooserRequest chooser_request,
+ mojom::ColorChooserClientPtr client,
SkColor color,
- const std::vector<ColorSuggestion>& suggestions) {
- ColorChooser* new_color_chooser =
+ std::vector<mojom::ColorSuggestionPtr> suggestions) {
+ content::ColorChooser* new_color_chooser =
delegate_ ? delegate_->OpenColorChooser(this, color, suggestions)
: nullptr;
if (!new_color_chooser)
return;
- if (color_chooser_info_.get())
- color_chooser_info_->chooser->End();
- color_chooser_info_.reset(new ColorChooserInfo(
- source->GetProcess()->GetID(), source->GetRoutingID(), new_color_chooser,
- color_chooser_id));
-}
-
-void WebContentsImpl::OnEndColorChooser(RenderFrameHostImpl* source,
- int color_chooser_id) {
- if (color_chooser_info_ &&
- color_chooser_info_->Matches(source, color_chooser_id))
- color_chooser_info_->chooser->End();
-}
-
-void WebContentsImpl::OnSetSelectedColorInColorChooser(
- RenderFrameHostImpl* source,
- int color_chooser_id,
- SkColor color) {
- if (color_chooser_info_ &&
- color_chooser_info_->Matches(source, color_chooser_id))
- color_chooser_info_->chooser->SetSelectedColor(color);
+ color_chooser_.reset();
+ color_chooser_ = std::make_unique<ColorChooser>(
+ new_color_chooser, std::move(chooser_request), std::move(client));
}
#if BUILDFLAG(ENABLE_PLUGINS)
@@ -4563,6 +4543,7 @@
RenderFrameHost* render_frame_host,
const std::string& interface_name,
mojo::ScopedMessagePipeHandle* interface_pipe) {
+ registry_.TryBindInterface(interface_name, interface_pipe);
for (auto& observer : observers_) {
observer.OnInterfaceRequestFromFrame(render_frame_host, interface_name,
interface_pipe);