Commit e1bc1516 authored by Alex Chau's avatar Alex Chau Committed by Commit Bot

Introduce callback mechanism for AckMessage

- ResponseMessage is passed in SendMessageToDeviceCallback
- SharingMessageHandler is requried to call done callback when done

Bug: 1016714
Change-Id: I12e5729d39c9a9046ca7e8ffdfae0047a79d1464
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1869218
Commit-Queue: Alex Chau <alexchau@chromium.org>
Reviewed-by: default avatarRichard Knoll <knollr@chromium.org>
Cr-Commit-Position: refs/heads/master@{#708973}
parent 7cdb47f3
...@@ -4,23 +4,27 @@ ...@@ -4,23 +4,27 @@
#include "chrome/browser/sharing/ack_message_handler.h" #include "chrome/browser/sharing/ack_message_handler.h"
#include "base/memory/ptr_util.h"
#include "chrome/browser/sharing/proto/sharing_message.pb.h" #include "chrome/browser/sharing/proto/sharing_message.pb.h"
AckMessageHandler::AckMessageHandler() = default; AckMessageHandler::AckMessageHandler(AckReceivedCallback ack_received_callback)
: ack_received_callback_(std::move(ack_received_callback)) {}
AckMessageHandler::~AckMessageHandler() = default; AckMessageHandler::~AckMessageHandler() = default;
void AckMessageHandler::OnMessage( void AckMessageHandler::OnMessage(
const chrome_browser_sharing::SharingMessage& message) { chrome_browser_sharing::SharingMessage message,
for (AckMessageObserver& observer : observers_) SharingMessageHandler::DoneCallback done_callback) {
observer.OnAckReceived(message.ack_message().original_message_type(), DCHECK(message.has_ack_message());
message.ack_message().original_message_id()); chrome_browser_sharing::AckMessage* ack_message =
} message.mutable_ack_message();
std::unique_ptr<chrome_browser_sharing::ResponseMessage> response;
if (ack_message->has_response_message())
response = base::WrapUnique(ack_message->release_response_message());
void AckMessageHandler::AddObserver(AckMessageObserver* observer) { ack_received_callback_.Run(ack_message->original_message_type(),
observers_.AddObserver(observer); ack_message->original_message_id(),
} std::move(response));
void AckMessageHandler::RemoveObserver(AckMessageObserver* observer) { std::move(done_callback).Run(/*response=*/nullptr);
observers_.RemoveObserver(observer);
} }
...@@ -5,46 +5,35 @@ ...@@ -5,46 +5,35 @@
#ifndef CHROME_BROWSER_SHARING_ACK_MESSAGE_HANDLER_H_ #ifndef CHROME_BROWSER_SHARING_ACK_MESSAGE_HANDLER_H_
#define CHROME_BROWSER_SHARING_ACK_MESSAGE_HANDLER_H_ #define CHROME_BROWSER_SHARING_ACK_MESSAGE_HANDLER_H_
#include <memory>
#include <string> #include <string>
#include "base/callback_forward.h"
#include "base/macros.h" #include "base/macros.h"
#include "base/observer_list.h"
#include "chrome/browser/sharing/sharing_message_handler.h" #include "chrome/browser/sharing/sharing_message_handler.h"
namespace chrome_browser_sharing { namespace chrome_browser_sharing {
enum MessageType : int; enum MessageType : int;
class ResponseMessage;
} // namespace chrome_browser_sharing } // namespace chrome_browser_sharing
// Class to managae ack message and notify observers. // Class to managae ack message and notify observers.
class AckMessageHandler : public SharingMessageHandler { class AckMessageHandler : public SharingMessageHandler {
public: public:
// Interface for objects observing ack message received events. using AckReceivedCallback = base::RepeatingCallback<void(
class AckMessageObserver : public base::CheckedObserver { chrome_browser_sharing::MessageType message_type,
public: std::string message_id,
// Called when an ack message is received, where |message_type| is the type std::unique_ptr<chrome_browser_sharing::ResponseMessage> response)>;
// of the original message, and |message_id| is the identifier of the
// original message.
virtual void OnAckReceived(chrome_browser_sharing::MessageType message_type,
const std::string& message_id) = 0;
};
AckMessageHandler();
~AckMessageHandler() override;
// Add an observer ack message received events. An observer should not be
// added more than once.
void AddObserver(AckMessageObserver* observer);
// Removes the given observer from ack message received events. Does nothing explicit AckMessageHandler(AckReceivedCallback ack_received_callback);
// if this observer has not been added. ~AckMessageHandler() override;
void RemoveObserver(AckMessageObserver* observer);
// SharingMessageHandler implementation: // SharingMessageHandler implementation:
void OnMessage( void OnMessage(chrome_browser_sharing::SharingMessage message,
const chrome_browser_sharing::SharingMessage& message) override; SharingMessageHandler::DoneCallback done_callback) override;
private: private:
base::ObserverList<AckMessageObserver> observers_; AckReceivedCallback ack_received_callback_;
DISALLOW_COPY_AND_ASSIGN(AckMessageHandler); DISALLOW_COPY_AND_ASSIGN(AckMessageHandler);
}; };
......
...@@ -4,41 +4,86 @@ ...@@ -4,41 +4,86 @@
#include "chrome/browser/sharing/ack_message_handler.h" #include "chrome/browser/sharing/ack_message_handler.h"
#include "base/bind_helpers.h"
#include "base/test/mock_callback.h"
#include "chrome/browser/sharing/proto/sharing_message.pb.h" #include "chrome/browser/sharing/proto/sharing_message.pb.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
namespace { namespace {
class TestObserver : public AckMessageHandler::AckMessageObserver { class TestObserver {
public: public:
void OnAckReceived(chrome_browser_sharing::MessageType message_type, void OnAckReceived(
const std::string& message_id) override { chrome_browser_sharing::MessageType message_type,
std::string message_id,
std::unique_ptr<chrome_browser_sharing::ResponseMessage> response) {
received_message_type_ = message_type; received_message_type_ = message_type;
received_message_id_ = message_id; received_message_id_ = std::move(message_id);
received_response_ = std::move(response);
} }
chrome_browser_sharing::MessageType received_message_type() const { chrome_browser_sharing::MessageType received_message_type() const {
return received_message_type_; return received_message_type_;
} }
std::string received_message_id() const { return received_message_id_; } const std::string& received_message_id() const {
return received_message_id_;
}
const chrome_browser_sharing::ResponseMessage* received_response() const {
return received_response_.get();
}
private: private:
chrome_browser_sharing::MessageType received_message_type_; chrome_browser_sharing::MessageType received_message_type_;
std::string received_message_id_; std::string received_message_id_;
std::unique_ptr<chrome_browser_sharing::ResponseMessage> received_response_;
}; };
class AckMessageHandlerTest : public testing::Test { class AckMessageHandlerTest : public testing::Test {
protected: protected:
AckMessageHandlerTest() { ack_message_handler_.AddObserver(&test_observer_); } AckMessageHandlerTest()
: ack_message_handler_(
base::BindRepeating(&TestObserver::OnAckReceived,
base::Unretained(&test_observer_))) {}
AckMessageHandler ack_message_handler_;
TestObserver test_observer_; TestObserver test_observer_;
AckMessageHandler ack_message_handler_;
}; };
bool ProtoEquals(const google::protobuf::MessageLite& expected,
const google::protobuf::MessageLite& actual) {
std::string expected_serialized, actual_serialized;
expected.SerializeToString(&expected_serialized);
actual.SerializeToString(&actual_serialized);
return expected_serialized == actual_serialized;
}
} // namespace } // namespace
TEST_F(AckMessageHandlerTest, OnMessage) { TEST_F(AckMessageHandlerTest, OnMessageNoResponse) {
constexpr char kTestMessageId[] = "test_message_id";
chrome_browser_sharing::SharingMessage sharing_message;
sharing_message.mutable_ack_message()->set_original_message_id(
kTestMessageId);
sharing_message.mutable_ack_message()->set_original_message_type(
chrome_browser_sharing::CLICK_TO_CALL_MESSAGE);
base::MockCallback<SharingMessageHandler::DoneCallback> done_callback;
EXPECT_CALL(done_callback, Run(testing::Eq(nullptr))).Times(1);
ack_message_handler_.OnMessage(std::move(sharing_message),
done_callback.Get());
EXPECT_EQ(kTestMessageId, test_observer_.received_message_id());
EXPECT_EQ(chrome_browser_sharing::CLICK_TO_CALL_MESSAGE,
test_observer_.received_message_type());
EXPECT_FALSE(test_observer_.received_response());
}
TEST_F(AckMessageHandlerTest, OnMessageWithResponse) {
constexpr char kTestMessageId[] = "test_message_id"; constexpr char kTestMessageId[] = "test_message_id";
chrome_browser_sharing::SharingMessage sharing_message; chrome_browser_sharing::SharingMessage sharing_message;
...@@ -46,10 +91,21 @@ TEST_F(AckMessageHandlerTest, OnMessage) { ...@@ -46,10 +91,21 @@ TEST_F(AckMessageHandlerTest, OnMessage) {
kTestMessageId); kTestMessageId);
sharing_message.mutable_ack_message()->set_original_message_type( sharing_message.mutable_ack_message()->set_original_message_type(
chrome_browser_sharing::CLICK_TO_CALL_MESSAGE); chrome_browser_sharing::CLICK_TO_CALL_MESSAGE);
sharing_message.mutable_ack_message()->mutable_response_message();
chrome_browser_sharing::ResponseMessage response_message_copy =
sharing_message.ack_message().response_message();
base::MockCallback<SharingMessageHandler::DoneCallback> done_callback;
EXPECT_CALL(done_callback, Run(testing::Eq(nullptr))).Times(1);
ack_message_handler_.OnMessage(sharing_message); ack_message_handler_.OnMessage(std::move(sharing_message),
done_callback.Get());
EXPECT_EQ(kTestMessageId, test_observer_.received_message_id()); EXPECT_EQ(kTestMessageId, test_observer_.received_message_id());
EXPECT_EQ(chrome_browser_sharing::CLICK_TO_CALL_MESSAGE, EXPECT_EQ(chrome_browser_sharing::CLICK_TO_CALL_MESSAGE,
test_observer_.received_message_type()); test_observer_.received_message_type());
ASSERT_TRUE(test_observer_.received_response());
EXPECT_TRUE(
ProtoEquals(response_message_copy, *test_observer_.received_response()));
} }
...@@ -145,7 +145,7 @@ TEST_F(ClickToCallContextMenuObserverTest, SingleDevice_ShowMenu) { ...@@ -145,7 +145,7 @@ TEST_F(ClickToCallContextMenuObserverTest, SingleDevice_ShowMenu) {
EXPECT_EQ(item_id, static_cast<int>(menu_.GetMenuSize())); EXPECT_EQ(item_id, static_cast<int>(menu_.GetMenuSize()));
// Emulate click on the device. // Emulate click on the device.
EXPECT_CALL(*service(), SendMessageToDevice(Eq(guid), Eq(kSharingMessageTTL), EXPECT_CALL(*service(), SendMessageToDevice(Eq(guid), Eq(kSendMessageTimeout),
ProtoEquals(sharing_message), _)) ProtoEquals(sharing_message), _))
.Times(1); .Times(1);
menu_.ExecuteCommand(IDC_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_SINGLE_DEVICE, menu_.ExecuteCommand(IDC_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_SINGLE_DEVICE,
...@@ -189,7 +189,7 @@ TEST_F(ClickToCallContextMenuObserverTest, MultipleDevices_ShowMenu) { ...@@ -189,7 +189,7 @@ TEST_F(ClickToCallContextMenuObserverTest, MultipleDevices_ShowMenu) {
for (int i = 0; i < kMaxDevicesShown; i++) { for (int i = 0; i < kMaxDevicesShown; i++) {
if (i < device_count) { if (i < device_count) {
EXPECT_CALL(*service(), EXPECT_CALL(*service(),
SendMessageToDevice(Eq(guids[i]), Eq(kSharingMessageTTL), SendMessageToDevice(Eq(guids[i]), Eq(kSendMessageTimeout),
ProtoEquals(sharing_message), _)) ProtoEquals(sharing_message), _))
.Times(1); .Times(1);
} else { } else {
...@@ -238,7 +238,7 @@ TEST_F(ClickToCallContextMenuObserverTest, ...@@ -238,7 +238,7 @@ TEST_F(ClickToCallContextMenuObserverTest,
for (int i = 0; i < device_count; i++) { for (int i = 0; i < device_count; i++) {
if (i < kMaxDevicesShown) { if (i < kMaxDevicesShown) {
EXPECT_CALL(*service(), EXPECT_CALL(*service(),
SendMessageToDevice(Eq(guids[i]), Eq(kSharingMessageTTL), SendMessageToDevice(Eq(guids[i]), Eq(kSendMessageTimeout),
ProtoEquals(sharing_message), _)) ProtoEquals(sharing_message), _))
.Times(1); .Times(1);
} else { } else {
......
...@@ -15,11 +15,14 @@ ClickToCallMessageHandler::ClickToCallMessageHandler() = default; ...@@ -15,11 +15,14 @@ ClickToCallMessageHandler::ClickToCallMessageHandler() = default;
ClickToCallMessageHandler::~ClickToCallMessageHandler() = default; ClickToCallMessageHandler::~ClickToCallMessageHandler() = default;
void ClickToCallMessageHandler::OnMessage( void ClickToCallMessageHandler::OnMessage(
const chrome_browser_sharing::SharingMessage& message) { chrome_browser_sharing::SharingMessage message,
SharingMessageHandler::DoneCallback done_callback) {
DCHECK(message.has_click_to_call_message()); DCHECK(message.has_click_to_call_message());
std::string phone_number = message.click_to_call_message().phone_number(); std::string phone_number = message.click_to_call_message().phone_number();
JNIEnv* env = base::android::AttachCurrentThread(); JNIEnv* env = base::android::AttachCurrentThread();
Java_ClickToCallMessageHandler_handleMessage( Java_ClickToCallMessageHandler_handleMessage(
env, base::android::ConvertUTF8ToJavaString(env, phone_number)); env, base::android::ConvertUTF8ToJavaString(env, phone_number));
std::move(done_callback).Run(/*response=*/nullptr);
} }
...@@ -15,8 +15,8 @@ class ClickToCallMessageHandler : public SharingMessageHandler { ...@@ -15,8 +15,8 @@ class ClickToCallMessageHandler : public SharingMessageHandler {
~ClickToCallMessageHandler() override; ~ClickToCallMessageHandler() override;
// SharingMessageHandler implementation: // SharingMessageHandler implementation:
void OnMessage( void OnMessage(chrome_browser_sharing::SharingMessage message,
const chrome_browser_sharing::SharingMessage& message) override; SharingMessageHandler::DoneCallback done_callback) override;
private: private:
DISALLOW_COPY_AND_ASSIGN(ClickToCallMessageHandler); DISALLOW_COPY_AND_ASSIGN(ClickToCallMessageHandler);
......
...@@ -86,7 +86,7 @@ TEST_F(ClickToCallUiControllerTest, OnDeviceChosen) { ...@@ -86,7 +86,7 @@ TEST_F(ClickToCallUiControllerTest, OnDeviceChosen) {
kExpectedPhoneNumber); kExpectedPhoneNumber);
EXPECT_CALL(*service(), EXPECT_CALL(*service(),
SendMessageToDevice(testing::Eq(kReceiverGuid), SendMessageToDevice(testing::Eq(kReceiverGuid),
testing::Eq(kSharingMessageTTL), testing::Eq(kSendMessageTimeout),
ProtoEquals(sharing_message), testing::_)); ProtoEquals(sharing_message), testing::_));
controller_->OnDeviceChosen(device_info); controller_->OnDeviceChosen(device_info);
} }
......
...@@ -21,7 +21,7 @@ class MockSharingService : public SharingService { ...@@ -21,7 +21,7 @@ class MockSharingService : public SharingService {
MOCK_METHOD4(SendMessageToDevice, MOCK_METHOD4(SendMessageToDevice,
void(const std::string& device_guid, void(const std::string& device_guid,
base::TimeDelta time_to_live, base::TimeDelta response_timeout,
chrome_browser_sharing::SharingMessage message, chrome_browser_sharing::SharingMessage message,
SharingService::SendMessageCallback callback)); SharingService::SendMessageCallback callback));
......
...@@ -4,11 +4,15 @@ ...@@ -4,11 +4,15 @@
#include "chrome/browser/sharing/ping_message_handler.h" #include "chrome/browser/sharing/ping_message_handler.h"
#include "chrome/browser/sharing/proto/sharing_message.pb.h"
PingMessageHandler::PingMessageHandler() = default; PingMessageHandler::PingMessageHandler() = default;
PingMessageHandler::~PingMessageHandler() = default; PingMessageHandler::~PingMessageHandler() = default;
void PingMessageHandler::OnMessage( void PingMessageHandler::OnMessage(
const chrome_browser_sharing::SharingMessage& message) { chrome_browser_sharing::SharingMessage message,
// TODO SharingMessageHandler::DoneCallback done_callback) {
// Delibrately empty.
std::move(done_callback).Run(/*response=*/nullptr);
} }
...@@ -14,8 +14,8 @@ class PingMessageHandler : public SharingMessageHandler { ...@@ -14,8 +14,8 @@ class PingMessageHandler : public SharingMessageHandler {
~PingMessageHandler() override; ~PingMessageHandler() override;
// SharingMessageHandler implementation: // SharingMessageHandler implementation:
void OnMessage( void OnMessage(chrome_browser_sharing::SharingMessage message,
const chrome_browser_sharing::SharingMessage& message) override; SharingMessageHandler::DoneCallback done_callback) override;
private: private:
DISALLOW_COPY_AND_ASSIGN(PingMessageHandler); DISALLOW_COPY_AND_ASSIGN(PingMessageHandler);
......
...@@ -16,6 +16,6 @@ proto_library("proto") { ...@@ -16,6 +16,6 @@ proto_library("proto") {
"click_to_call_message.proto", "click_to_call_message.proto",
"shared_clipboard_message.proto", "shared_clipboard_message.proto",
"sharing_message.proto", "sharing_message.proto",
"sms_fetch_request.proto", "sms_fetch_message.proto",
] ]
} }
...@@ -6,7 +6,7 @@ syntax = "proto3"; ...@@ -6,7 +6,7 @@ syntax = "proto3";
import "click_to_call_message.proto"; import "click_to_call_message.proto";
import "shared_clipboard_message.proto"; import "shared_clipboard_message.proto";
import "sms_fetch_request.proto"; import "sms_fetch_message.proto";
package chrome_browser_sharing; package chrome_browser_sharing;
...@@ -60,6 +60,15 @@ message AckMessage { ...@@ -60,6 +60,15 @@ message AckMessage {
// The type of message that this is acknowledging. optional. // The type of message that this is acknowledging. optional.
MessageType original_message_type = 2; MessageType original_message_type = 2;
// Response of the message, optional.
ResponseMessage response_message = 3;
}
// Message for responding to a SharingMessage.
message ResponseMessage {
// Payload of the response, contains one of the messages below. required.
oneof payload { SmsFetchResponse sms_fetch_response = 1; }
} }
// Message for data necessary to send an AckMessage to the sender. // Message for data necessary to send an AckMessage to the sender.
......
...@@ -11,3 +11,6 @@ option optimize_for = LITE_RUNTIME; ...@@ -11,3 +11,6 @@ option optimize_for = LITE_RUNTIME;
// Request message to fetch a SMS from a remote device. // Request message to fetch a SMS from a remote device.
message SmsFetchRequest {} message SmsFetchRequest {}
// Response message to fetch a SMS from a remote device.
message SmsFetchResponse {}
...@@ -141,7 +141,7 @@ TEST_F(SharedClipboardContextMenuObserverTest, SingleDevice_ShowMenu) { ...@@ -141,7 +141,7 @@ TEST_F(SharedClipboardContextMenuObserverTest, SingleDevice_ShowMenu) {
item.command_id); item.command_id);
// Emulate click on the device. // Emulate click on the device.
EXPECT_CALL(*service(), SendMessageToDevice(Eq(guid), Eq(kSharingMessageTTL), EXPECT_CALL(*service(), SendMessageToDevice(Eq(guid), Eq(kSendMessageTimeout),
ProtoEquals(sharing_message), _)) ProtoEquals(sharing_message), _))
.Times(1); .Times(1);
menu_.ExecuteCommand( menu_.ExecuteCommand(
...@@ -181,7 +181,7 @@ TEST_F(SharedClipboardContextMenuObserverTest, MultipleDevices_ShowMenu) { ...@@ -181,7 +181,7 @@ TEST_F(SharedClipboardContextMenuObserverTest, MultipleDevices_ShowMenu) {
for (int i = 0; i < kMaxDevicesShown; i++) { for (int i = 0; i < kMaxDevicesShown; i++) {
if (i < device_count) { if (i < device_count) {
EXPECT_CALL(*service(), EXPECT_CALL(*service(),
SendMessageToDevice(Eq(guids[i]), Eq(kSharingMessageTTL), SendMessageToDevice(Eq(guids[i]), Eq(kSendMessageTimeout),
ProtoEquals(sharing_message), _)) ProtoEquals(sharing_message), _))
.Times(1); .Times(1);
} else { } else {
...@@ -226,7 +226,7 @@ TEST_F(SharedClipboardContextMenuObserverTest, ...@@ -226,7 +226,7 @@ TEST_F(SharedClipboardContextMenuObserverTest,
for (int i = 0; i < device_count; i++) { for (int i = 0; i < device_count; i++) {
if (i < kMaxDevicesShown) { if (i < kMaxDevicesShown) {
EXPECT_CALL(*service(), EXPECT_CALL(*service(),
SendMessageToDevice(Eq(guids[i]), Eq(kSharingMessageTTL), SendMessageToDevice(Eq(guids[i]), Eq(kSendMessageTimeout),
ProtoEquals(sharing_message), _)) ProtoEquals(sharing_message), _))
.Times(1); .Times(1);
} else { } else {
......
...@@ -22,7 +22,8 @@ SharedClipboardMessageHandler::SharedClipboardMessageHandler( ...@@ -22,7 +22,8 @@ SharedClipboardMessageHandler::SharedClipboardMessageHandler(
SharedClipboardMessageHandler::~SharedClipboardMessageHandler() = default; SharedClipboardMessageHandler::~SharedClipboardMessageHandler() = default;
void SharedClipboardMessageHandler::OnMessage( void SharedClipboardMessageHandler::OnMessage(
const chrome_browser_sharing::SharingMessage& message) { chrome_browser_sharing::SharingMessage message,
SharingMessageHandler::DoneCallback done_callback) {
DCHECK(message.has_shared_clipboard_message()); DCHECK(message.has_shared_clipboard_message());
ui::ScopedClipboardWriter(ui::ClipboardBuffer::kCopyPaste) ui::ScopedClipboardWriter(ui::ClipboardBuffer::kCopyPaste)
...@@ -33,4 +34,6 @@ void SharedClipboardMessageHandler::OnMessage( ...@@ -33,4 +34,6 @@ void SharedClipboardMessageHandler::OnMessage(
const std::string& device_name = const std::string& device_name =
device ? device->client_name() : message.sender_device_name(); device ? device->client_name() : message.sender_device_name();
ShowNotification(device_name); ShowNotification(device_name);
std::move(done_callback).Run(/*response=*/nullptr);
} }
...@@ -19,8 +19,8 @@ class SharedClipboardMessageHandler : public SharingMessageHandler { ...@@ -19,8 +19,8 @@ class SharedClipboardMessageHandler : public SharingMessageHandler {
~SharedClipboardMessageHandler() override; ~SharedClipboardMessageHandler() override;
// SharingMessageHandler implementation: // SharingMessageHandler implementation:
void OnMessage( void OnMessage(chrome_browser_sharing::SharingMessage message,
const chrome_browser_sharing::SharingMessage& message) override; SharingMessageHandler::DoneCallback done_callback) override;
protected: protected:
// Called after the message has been copied to the clipboard. Implementers // Called after the message has been copied to the clipboard. Implementers
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include "base/guid.h" #include "base/guid.h"
#include "base/strings/utf_string_conversions.h" #include "base/strings/utf_string_conversions.h"
#include "base/test/mock_callback.h"
#include "chrome/browser/notifications/stub_notification_display_service.h" #include "chrome/browser/notifications/stub_notification_display_service.h"
#include "chrome/browser/sharing/mock_sharing_service.h" #include "chrome/browser/sharing/mock_sharing_service.h"
#include "chrome/browser/sharing/proto/shared_clipboard_message.pb.h" #include "chrome/browser/sharing/proto/shared_clipboard_message.pb.h"
...@@ -94,7 +95,10 @@ TEST_F(SharedClipboardMessageHandlerTest, NotificationWithoutDeviceName) { ...@@ -94,7 +95,10 @@ TEST_F(SharedClipboardMessageHandlerTest, NotificationWithoutDeviceName) {
[](const std::string& guid) -> std::unique_ptr<syncer::DeviceInfo> { [](const std::string& guid) -> std::unique_ptr<syncer::DeviceInfo> {
return nullptr; return nullptr;
}); });
message_handler_->OnMessage(CreateMessage(guid, kEmptyDeviceName)); base::MockCallback<SharingMessageHandler::DoneCallback> done_callback;
EXPECT_CALL(done_callback, Run(testing::Eq(nullptr))).Times(1);
message_handler_->OnMessage(CreateMessage(guid, kEmptyDeviceName),
done_callback.Get());
} }
EXPECT_EQ(GetClipboardText(), kText); EXPECT_EQ(GetClipboardText(), kText);
...@@ -122,7 +126,10 @@ TEST_F(SharedClipboardMessageHandlerTest, ...@@ -122,7 +126,10 @@ TEST_F(SharedClipboardMessageHandlerTest,
/*send_tab_to_self_receiving_enabled=*/false, /*send_tab_to_self_receiving_enabled=*/false,
/*sharing_info=*/base::nullopt); /*sharing_info=*/base::nullopt);
}); });
message_handler_->OnMessage(CreateMessage(guid, kEmptyDeviceName)); base::MockCallback<SharingMessageHandler::DoneCallback> done_callback;
EXPECT_CALL(done_callback, Run(testing::Eq(nullptr))).Times(1);
message_handler_->OnMessage(CreateMessage(guid, kEmptyDeviceName),
done_callback.Get());
} }
message_center::Notification notification = GetNotification(); message_center::Notification notification = GetNotification();
EXPECT_EQ(l10n_util::GetStringFUTF16( EXPECT_EQ(l10n_util::GetStringFUTF16(
...@@ -140,7 +147,10 @@ TEST_F(SharedClipboardMessageHandlerTest, ...@@ -140,7 +147,10 @@ TEST_F(SharedClipboardMessageHandlerTest,
[](const std::string& guid) -> std::unique_ptr<syncer::DeviceInfo> { [](const std::string& guid) -> std::unique_ptr<syncer::DeviceInfo> {
return nullptr; return nullptr;
}); });
message_handler_->OnMessage(CreateMessage(guid, kDeviceNameInMessage)); base::MockCallback<SharingMessageHandler::DoneCallback> done_callback;
EXPECT_CALL(done_callback, Run(testing::Eq(nullptr))).Times(1);
message_handler_->OnMessage(CreateMessage(guid, kDeviceNameInMessage),
done_callback.Get());
} }
EXPECT_EQ(GetClipboardText(), kText); EXPECT_EQ(GetClipboardText(), kText);
......
...@@ -90,7 +90,7 @@ TEST_F(SharedClipboardUiControllerTest, OnDeviceChosen) { ...@@ -90,7 +90,7 @@ TEST_F(SharedClipboardUiControllerTest, OnDeviceChosen) {
sharing_message.mutable_shared_clipboard_message()->set_text(kExpectedText); sharing_message.mutable_shared_clipboard_message()->set_text(kExpectedText);
EXPECT_CALL(*service(), EXPECT_CALL(*service(),
SendMessageToDevice(testing::Eq(kReceiverGuid), SendMessageToDevice(testing::Eq(kReceiverGuid),
testing::Eq(kSharingMessageTTL), testing::Eq(kSendMessageTimeout),
ProtoEquals(sharing_message), testing::_)); ProtoEquals(sharing_message), testing::_));
controller_->OnDeviceChosen(device_info); controller_->OnDeviceChosen(device_info);
} }
......
...@@ -8,8 +8,14 @@ const char kFCMScope[] = "GCM"; ...@@ -8,8 +8,14 @@ const char kFCMScope[] = "GCM";
const char kSharingFCMAppID[] = "com.google.chrome.sharing.fcm"; const char kSharingFCMAppID[] = "com.google.chrome.sharing.fcm";
// Based on Stable + Beta metrics on 23-Oct-2019, 95th percentile of round trip
// time (Sharing.MessageAckTime) is ~16 seconds. Message timeout is set as round
// trip expected time, and ack TTL is set as half of the value.
const constexpr base::TimeDelta kSendMessageTimeout =
base::TimeDelta::FromSeconds(16);
const constexpr base::TimeDelta kAckTimeToLive = const constexpr base::TimeDelta kAckTimeToLive =
base::TimeDelta::FromMinutes(30); base::TimeDelta::FromSeconds(8);
const constexpr base::TimeDelta kDeviceExpiration = const constexpr base::TimeDelta kDeviceExpiration =
base::TimeDelta::FromDays(2); base::TimeDelta::FromDays(2);
...@@ -17,9 +23,6 @@ const constexpr base::TimeDelta kDeviceExpiration = ...@@ -17,9 +23,6 @@ const constexpr base::TimeDelta kDeviceExpiration =
const constexpr base::TimeDelta kRegistrationExpiration = const constexpr base::TimeDelta kRegistrationExpiration =
base::TimeDelta::FromDays(1); base::TimeDelta::FromDays(1);
const constexpr base::TimeDelta kSendMessageTimeout =
base::TimeDelta::FromSeconds(15);
const constexpr net::BackoffEntry::Policy kRetryBackoffPolicy = { const constexpr net::BackoffEntry::Policy kRetryBackoffPolicy = {
// Number of initial errors (in sequence) to ignore before applying // Number of initial errors (in sequence) to ignore before applying
// exponential back-off rules. // exponential back-off rules.
...@@ -52,8 +55,6 @@ const constexpr net::BackoffEntry::Policy kRetryBackoffPolicy = { ...@@ -52,8 +55,6 @@ const constexpr net::BackoffEntry::Policy kRetryBackoffPolicy = {
false, false,
}; };
constexpr base::TimeDelta kSharingMessageTTL = base::TimeDelta::FromSeconds(10);
constexpr int kMaxDevicesShown = 10; constexpr int kMaxDevicesShown = 10;
constexpr int kSubMenuFirstDeviceCommandId = 2150; constexpr int kSubMenuFirstDeviceCommandId = 2150;
......
...@@ -14,6 +14,9 @@ extern const char kFCMScope[]; ...@@ -14,6 +14,9 @@ extern const char kFCMScope[];
// Sender ID linked to GCM messages for Sharing. // Sender ID linked to GCM messages for Sharing.
extern const char kSharingFCMAppID[]; extern const char kSharingFCMAppID[];
// Amount of time before a message is considered timeout if no ack is received.
extern const base::TimeDelta kSendMessageTimeout;
// Amount of time before an ack message is expired. // Amount of time before an ack message is expired.
extern const base::TimeDelta kAckTimeToLive; extern const base::TimeDelta kAckTimeToLive;
...@@ -23,15 +26,9 @@ extern const base::TimeDelta kDeviceExpiration; ...@@ -23,15 +26,9 @@ extern const base::TimeDelta kDeviceExpiration;
// Amount of time before FCM registration should happen again. // Amount of time before FCM registration should happen again.
extern const base::TimeDelta kRegistrationExpiration; extern const base::TimeDelta kRegistrationExpiration;
// Amount of time before a message is considered timeout if no ack is received.
extern const base::TimeDelta kSendMessageTimeout;
// Backoff policy for registration retry. // Backoff policy for registration retry.
extern const net::BackoffEntry::Policy kRetryBackoffPolicy; extern const net::BackoffEntry::Policy kRetryBackoffPolicy;
// Time limit for message expiration.
extern const base::TimeDelta kSharingMessageTTL;
// Maximum number of devices to be shown in dialog and context menu. // Maximum number of devices to be shown in dialog and context menu.
extern const int kMaxDevicesShown; extern const int kMaxDevicesShown;
......
...@@ -122,10 +122,14 @@ void SharingFCMHandler::OnMessage(const std::string& app_id, ...@@ -122,10 +122,14 @@ void SharingFCMHandler::OnMessage(const std::string& app_id,
LOG(ERROR) << "No handler found for payload : " LOG(ERROR) << "No handler found for payload : "
<< sharing_message.payload_case(); << sharing_message.payload_case();
} else { } else {
it->second->OnMessage(sharing_message); SharingMessageHandler::DoneCallback done_callback = base::DoNothing();
if (sharing_message.payload_case() != SharingMessage::kAckMessage) {
if (sharing_message.payload_case() != SharingMessage::kAckMessage) done_callback = base::BindOnce(
SendAckMessage(sharing_message, message_id); &SharingFCMHandler::SendAckMessage, weak_ptr_factory_.GetWeakPtr(),
std::move(message_id), message_type, GetSharingInfo(sharing_message));
}
it->second->OnMessage(std::move(sharing_message), std::move(done_callback));
} }
} }
...@@ -157,18 +161,11 @@ SharingFCMHandler::GetSharingInfo(const SharingMessage& original_message) { ...@@ -157,18 +161,11 @@ SharingFCMHandler::GetSharingInfo(const SharingMessage& original_message) {
return sync_preference_->GetSharingInfo(original_message.sender_guid()); return sync_preference_->GetSharingInfo(original_message.sender_guid());
} }
void SharingFCMHandler::SendAckMessage(const SharingMessage& original_message, void SharingFCMHandler::SendAckMessage(
const std::string& original_message_id) { std::string original_message_id,
SharingMessage ack_message; chrome_browser_sharing::MessageType original_message_type,
ack_message.mutable_ack_message()->set_original_message_id( base::Optional<syncer::DeviceInfo::SharingInfo> sharing_info,
original_message_id); std::unique_ptr<chrome_browser_sharing::ResponseMessage> response) {
chrome_browser_sharing::MessageType original_message_type =
SharingPayloadCaseToMessageType(original_message.payload_case());
ack_message.mutable_ack_message()->set_original_message_type(
original_message_type);
base::Optional<syncer::DeviceInfo::SharingInfo> sharing_info =
GetSharingInfo(original_message);
if (!sharing_info) { if (!sharing_info) {
LOG(ERROR) << "Unable to find sharing info"; LOG(ERROR) << "Unable to find sharing info";
LogSendSharingAckMessageResult(original_message_type, LogSendSharingAckMessageResult(original_message_type,
...@@ -176,16 +173,24 @@ void SharingFCMHandler::SendAckMessage(const SharingMessage& original_message, ...@@ -176,16 +173,24 @@ void SharingFCMHandler::SendAckMessage(const SharingMessage& original_message,
return; return;
} }
SharingMessage sharing_message;
chrome_browser_sharing::AckMessage* ack_message =
sharing_message.mutable_ack_message();
ack_message->set_original_message_id(original_message_id);
ack_message->set_original_message_type(original_message_type);
if (response)
ack_message->set_allocated_response_message(response.release());
sharing_fcm_sender_->SendMessageToDevice( sharing_fcm_sender_->SendMessageToDevice(
std::move(*sharing_info), kAckTimeToLive, std::move(ack_message), std::move(*sharing_info), kAckTimeToLive, std::move(sharing_message),
/*sender_device_info=*/nullptr, /*sender_device_info=*/nullptr,
base::BindOnce(&SharingFCMHandler::OnAckMessageSent, base::BindOnce(&SharingFCMHandler::OnAckMessageSent,
weak_ptr_factory_.GetWeakPtr(), original_message_id, weak_ptr_factory_.GetWeakPtr(),
original_message_type)); std::move(original_message_id), original_message_type));
} }
void SharingFCMHandler::OnAckMessageSent( void SharingFCMHandler::OnAckMessageSent(
const std::string& original_message_id, std::string original_message_id,
chrome_browser_sharing::MessageType original_message_type, chrome_browser_sharing::MessageType original_message_type,
SharingSendMessageResult result, SharingSendMessageResult result,
base::Optional<std::string> message_id) { base::Optional<std::string> message_id) {
......
...@@ -73,11 +73,14 @@ class SharingFCMHandler : public gcm::GCMAppHandler { ...@@ -73,11 +73,14 @@ class SharingFCMHandler : public gcm::GCMAppHandler {
const SharingMessage& original_message); const SharingMessage& original_message);
// Ack message sent back to the original sender of message. // Ack message sent back to the original sender of message.
void SendAckMessage(const SharingMessage& original_message, void SendAckMessage(
const std::string& original_message_id); std::string original_message_id,
chrome_browser_sharing::MessageType original_message_type,
base::Optional<syncer::DeviceInfo::SharingInfo> sharing_info,
std::unique_ptr<chrome_browser_sharing::ResponseMessage> response);
void OnAckMessageSent( void OnAckMessageSent(
const std::string& original_message_id, std::string original_message_id,
chrome_browser_sharing::MessageType original_message_type, chrome_browser_sharing::MessageType original_message_type,
SharingSendMessageResult result, SharingSendMessageResult result,
base::Optional<std::string> message_id); base::Optional<std::string> message_id);
......
...@@ -38,7 +38,9 @@ class MockSharingMessageHandler : public SharingMessageHandler { ...@@ -38,7 +38,9 @@ class MockSharingMessageHandler : public SharingMessageHandler {
~MockSharingMessageHandler() override = default; ~MockSharingMessageHandler() override = default;
// SharingMessageHandler implementation: // SharingMessageHandler implementation:
MOCK_METHOD1(OnMessage, void(const SharingMessage& message)); MOCK_METHOD2(OnMessage,
void(SharingMessage message,
SharingMessageHandler::DoneCallback done_callback));
}; };
class MockSharingFCMSender : public SharingFCMSender { class MockSharingFCMSender : public SharingFCMSender {
...@@ -123,7 +125,7 @@ TEST_F(SharingFCMHandlerTest, AckMessageHandler) { ...@@ -123,7 +125,7 @@ TEST_F(SharingFCMHandlerTest, AckMessageHandler) {
CreateGCMIncomingMessage(kTestMessageId, sharing_message); CreateGCMIncomingMessage(kTestMessageId, sharing_message);
EXPECT_CALL(mock_sharing_message_handler_, EXPECT_CALL(mock_sharing_message_handler_,
OnMessage(ProtoEquals(sharing_message))); OnMessage(ProtoEquals(sharing_message), _));
EXPECT_CALL(mock_sharing_fcm_sender_, SendMessageToDevice(_, _, _, _, _)) EXPECT_CALL(mock_sharing_fcm_sender_, SendMessageToDevice(_, _, _, _, _))
.Times(0); .Times(0);
sharing_fcm_handler_->AddSharingHandler(SharingMessage::kAckMessage, sharing_fcm_handler_->AddSharingHandler(SharingMessage::kAckMessage,
...@@ -149,14 +151,20 @@ TEST_F(SharingFCMHandlerTest, PingMessageHandler) { ...@@ -149,14 +151,20 @@ TEST_F(SharingFCMHandlerTest, PingMessageHandler) {
chrome_browser_sharing::PING_MESSAGE); chrome_browser_sharing::PING_MESSAGE);
// Tests OnMessage flow in SharingFCMHandler when no handler is registered. // Tests OnMessage flow in SharingFCMHandler when no handler is registered.
EXPECT_CALL(mock_sharing_message_handler_, OnMessage(_)).Times(0); EXPECT_CALL(mock_sharing_message_handler_, OnMessage(_, _)).Times(0);
EXPECT_CALL(mock_sharing_fcm_sender_, SendMessageToDevice(_, _, _, _, _)) EXPECT_CALL(mock_sharing_fcm_sender_, SendMessageToDevice(_, _, _, _, _))
.Times(0); .Times(0);
sharing_fcm_handler_->OnMessage(kTestAppId, incoming_message); sharing_fcm_handler_->OnMessage(kTestAppId, incoming_message);
// Tests OnMessage flow in SharingFCMHandler after handler is added. // Tests OnMessage flow in SharingFCMHandler after handler is added.
EXPECT_CALL(mock_sharing_message_handler_, ON_CALL(mock_sharing_message_handler_,
OnMessage(ProtoEquals(sharing_message))); OnMessage(ProtoEquals(sharing_message), _))
.WillByDefault(testing::Invoke(
[](const SharingMessage& message,
SharingMessageHandler::DoneCallback done_callback) {
std::move(done_callback).Run(/*response=*/nullptr);
}));
EXPECT_CALL(mock_sharing_message_handler_, OnMessage(_, _));
EXPECT_CALL(mock_sharing_fcm_sender_, EXPECT_CALL(mock_sharing_fcm_sender_,
SendMessageToDevice(DeviceMatcher(), testing::Eq(kAckTimeToLive), SendMessageToDevice(DeviceMatcher(), testing::Eq(kAckTimeToLive),
ProtoEquals(sharing_ack_message), ProtoEquals(sharing_ack_message),
...@@ -167,13 +175,49 @@ TEST_F(SharingFCMHandlerTest, PingMessageHandler) { ...@@ -167,13 +175,49 @@ TEST_F(SharingFCMHandlerTest, PingMessageHandler) {
// Tests OnMessage flow in SharingFCMHandler after registered handler is // Tests OnMessage flow in SharingFCMHandler after registered handler is
// removed. // removed.
EXPECT_CALL(mock_sharing_message_handler_, OnMessage(_)).Times(0); EXPECT_CALL(mock_sharing_message_handler_, OnMessage(_, _)).Times(0);
EXPECT_CALL(mock_sharing_fcm_sender_, SendMessageToDevice(_, _, _, _, _)) EXPECT_CALL(mock_sharing_fcm_sender_, SendMessageToDevice(_, _, _, _, _))
.Times(0); .Times(0);
sharing_fcm_handler_->RemoveSharingHandler(SharingMessage::kPingMessage); sharing_fcm_handler_->RemoveSharingHandler(SharingMessage::kPingMessage);
sharing_fcm_handler_->OnMessage(kTestAppId, incoming_message); sharing_fcm_handler_->OnMessage(kTestAppId, incoming_message);
} }
TEST_F(SharingFCMHandlerTest, PingMessageHandlerWithResponse) {
fake_device_info_sync_service_.GetDeviceInfoTracker()->Add(
fake_device_info_.get());
SharingMessage sharing_message;
sharing_message.set_sender_guid(kSenderGuid);
sharing_message.mutable_ping_message();
gcm::IncomingMessage incoming_message =
CreateGCMIncomingMessage(kTestMessageId, sharing_message);
SharingMessage sharing_ack_message;
sharing_ack_message.mutable_ack_message()->set_original_message_id(
kTestMessageId);
sharing_ack_message.mutable_ack_message()->set_original_message_type(
chrome_browser_sharing::PING_MESSAGE);
sharing_ack_message.mutable_ack_message()->mutable_response_message();
// Tests OnMessage flow in SharingFCMHandler after handler is added.
ON_CALL(mock_sharing_message_handler_,
OnMessage(ProtoEquals(sharing_message), _))
.WillByDefault(testing::Invoke([](const SharingMessage& message,
SharingMessageHandler::DoneCallback
done_callback) {
std::move(done_callback)
.Run(std::make_unique<chrome_browser_sharing::ResponseMessage>());
}));
EXPECT_CALL(mock_sharing_message_handler_, OnMessage(_, _));
EXPECT_CALL(mock_sharing_fcm_sender_,
SendMessageToDevice(DeviceMatcher(), testing::Eq(kAckTimeToLive),
ProtoEquals(sharing_ack_message),
testing::Eq(nullptr), _));
sharing_fcm_handler_->AddSharingHandler(SharingMessage::kPingMessage,
&mock_sharing_message_handler_);
sharing_fcm_handler_->OnMessage(kTestAppId, incoming_message);
}
// Test for handling of SharingMessage payload other than AckMessage for // Test for handling of SharingMessage payload other than AckMessage for
// secondary users in Android. // secondary users in Android.
TEST_F(SharingFCMHandlerTest, PingMessageHandlerSecondaryUser) { TEST_F(SharingFCMHandlerTest, PingMessageHandlerSecondaryUser) {
...@@ -193,8 +237,13 @@ TEST_F(SharingFCMHandlerTest, PingMessageHandlerSecondaryUser) { ...@@ -193,8 +237,13 @@ TEST_F(SharingFCMHandlerTest, PingMessageHandlerSecondaryUser) {
chrome_browser_sharing::PING_MESSAGE); chrome_browser_sharing::PING_MESSAGE);
// Tests OnMessage flow in SharingFCMHandler after handler is added. // Tests OnMessage flow in SharingFCMHandler after handler is added.
EXPECT_CALL(mock_sharing_message_handler_, ON_CALL(mock_sharing_message_handler_,
OnMessage(ProtoEquals(sharing_message))); OnMessage(ProtoEquals(sharing_message), _))
.WillByDefault(testing::Invoke(
[](const SharingMessage& message,
SharingMessageHandler::DoneCallback done_callback) {
std::move(done_callback).Run(/*response=*/nullptr);
}));
EXPECT_CALL(mock_sharing_fcm_sender_, EXPECT_CALL(mock_sharing_fcm_sender_,
SendMessageToDevice(DeviceMatcher(), testing::Eq(kAckTimeToLive), SendMessageToDevice(DeviceMatcher(), testing::Eq(kAckTimeToLive),
ProtoEquals(sharing_ack_message), ProtoEquals(sharing_ack_message),
...@@ -224,8 +273,13 @@ TEST_F(SharingFCMHandlerTest, PingMessageHandlerWithRecipientInfo) { ...@@ -224,8 +273,13 @@ TEST_F(SharingFCMHandlerTest, PingMessageHandlerWithRecipientInfo) {
sharing_ack_message.mutable_ack_message()->set_original_message_type( sharing_ack_message.mutable_ack_message()->set_original_message_type(
chrome_browser_sharing::PING_MESSAGE); chrome_browser_sharing::PING_MESSAGE);
EXPECT_CALL(mock_sharing_message_handler_, ON_CALL(mock_sharing_message_handler_,
OnMessage(ProtoEquals(sharing_message))); OnMessage(ProtoEquals(sharing_message), _))
.WillByDefault(testing::Invoke(
[](const SharingMessage& message,
SharingMessageHandler::DoneCallback done_callback) {
std::move(done_callback).Run(/*response=*/nullptr);
}));
EXPECT_CALL(mock_sharing_fcm_sender_, EXPECT_CALL(mock_sharing_fcm_sender_,
SendMessageToDevice(DeviceMatcher(), testing::Eq(kAckTimeToLive), SendMessageToDevice(DeviceMatcher(), testing::Eq(kAckTimeToLive),
ProtoEquals(sharing_ack_message), ProtoEquals(sharing_ack_message),
......
...@@ -5,18 +5,27 @@ ...@@ -5,18 +5,27 @@
#ifndef CHROME_BROWSER_SHARING_SHARING_MESSAGE_HANDLER_H_ #ifndef CHROME_BROWSER_SHARING_SHARING_MESSAGE_HANDLER_H_
#define CHROME_BROWSER_SHARING_SHARING_MESSAGE_HANDLER_H_ #define CHROME_BROWSER_SHARING_SHARING_MESSAGE_HANDLER_H_
#include <memory>
#include "base/callback.h"
namespace chrome_browser_sharing { namespace chrome_browser_sharing {
class SharingMessage; class SharingMessage;
class ResponseMessage;
} // namespace chrome_browser_sharing } // namespace chrome_browser_sharing
// Interface for handling incoming SharingMessage. // Interface for handling incoming SharingMessage.
class SharingMessageHandler { class SharingMessageHandler {
public: public:
using DoneCallback = base::OnceCallback<void(
std::unique_ptr<chrome_browser_sharing::ResponseMessage>)>;
virtual ~SharingMessageHandler() = default; virtual ~SharingMessageHandler() = default;
// Called when a SharingMessage has been received. // Called when a SharingMessage has been received. |done_callback| must be
virtual void OnMessage( // invoked after work to determine response is done.
const chrome_browser_sharing::SharingMessage& message) = 0; virtual void OnMessage(chrome_browser_sharing::SharingMessage message,
DoneCallback done_callback) = 0;
}; };
#endif // CHROME_BROWSER_SHARING_SHARING_MESSAGE_HANDLER_H_ #endif // CHROME_BROWSER_SHARING_SHARING_MESSAGE_HANDLER_H_
...@@ -168,11 +168,27 @@ void LogSharingSelectedAppIndex(SharingFeatureName feature, ...@@ -168,11 +168,27 @@ void LogSharingSelectedAppIndex(SharingFeatureName feature,
void LogSharingMessageAckTime(chrome_browser_sharing::MessageType message_type, void LogSharingMessageAckTime(chrome_browser_sharing::MessageType message_type,
base::TimeDelta time) { base::TimeDelta time) {
base::UmaHistogramMediumTimes("Sharing.MessageAckTime", time); std::string suffixed_name = base::StrCat(
base::UmaHistogramMediumTimes( {"Sharing.MessageAckTime.", MessageTypeToMessageSuffix(message_type)});
base::StrCat({"Sharing.MessageAckTime.", switch (message_type) {
MessageTypeToMessageSuffix(message_type)}), case chrome_browser_sharing::MessageType::UNKNOWN_MESSAGE:
time); case chrome_browser_sharing::MessageType::PING_MESSAGE:
case chrome_browser_sharing::MessageType::CLICK_TO_CALL_MESSAGE:
case chrome_browser_sharing::MessageType::SHARED_CLIPBOARD_MESSAGE:
base::UmaHistogramMediumTimes(suffixed_name, time);
break;
case chrome_browser_sharing::MessageType::SMS_FETCH_REQUEST:
base::UmaHistogramCustomTimes(
suffixed_name, time, /*min=*/base::TimeDelta::FromMilliseconds(1),
/*max=*/base::TimeDelta::FromMinutes(10), /*buckets=*/50);
break;
case chrome_browser_sharing::MessageType::ACK_MESSAGE:
default:
// For proto3 enums unrecognized enum values are kept, so message_type may
// not fall into any switch case. However, as an ack message, original
// message type should always be known.
NOTREACHED();
}
} }
void LogSharingDialogShown(SharingFeatureName feature, SharingDialogType type) { void LogSharingDialogShown(SharingFeatureName feature, SharingDialogType type) {
......
...@@ -172,10 +172,12 @@ SharingService::SharingService( ...@@ -172,10 +172,12 @@ SharingService::SharingService(
chrome_browser_sharing::SharingMessage::kPingMessage, chrome_browser_sharing::SharingMessage::kPingMessage,
&ping_message_handler_); &ping_message_handler_);
ack_message_handler_ =
std::make_unique<AckMessageHandler>(base::BindRepeating(
&SharingService::OnAckReceived, weak_ptr_factory_.GetWeakPtr()));
fcm_handler_->AddSharingHandler( fcm_handler_->AddSharingHandler(
chrome_browser_sharing::SharingMessage::kAckMessage, chrome_browser_sharing::SharingMessage::kAckMessage,
&ack_message_handler_); ack_message_handler_.get());
ack_message_handler_.AddObserver(this);
#if defined(OS_ANDROID) #if defined(OS_ANDROID)
// Note: IsClickToCallSupported() is not used as it requires JNI call. // Note: IsClickToCallSupported() is not used as it requires JNI call.
...@@ -224,8 +226,6 @@ SharingService::SharingService( ...@@ -224,8 +226,6 @@ SharingService::SharingService(
} }
SharingService::~SharingService() { SharingService::~SharingService() {
ack_message_handler_.RemoveObserver(this);
if (sync_service_ && sync_service_->HasObserver(this)) if (sync_service_ && sync_service_->HasObserver(this))
sync_service_->RemoveObserver(this); sync_service_->RemoveObserver(this);
} }
...@@ -285,7 +285,7 @@ void SharingService::AddDeviceCandidatesInitializedObserver( ...@@ -285,7 +285,7 @@ void SharingService::AddDeviceCandidatesInitializedObserver(
void SharingService::SendMessageToDevice( void SharingService::SendMessageToDevice(
const std::string& device_guid, const std::string& device_guid,
base::TimeDelta time_to_live, base::TimeDelta response_timeout,
chrome_browser_sharing::SharingMessage message, chrome_browser_sharing::SharingMessage message,
SendMessageCallback callback) { SendMessageCallback callback) {
std::string message_guid = base::GenerateGUID(); std::string message_guid = base::GenerateGUID();
...@@ -297,8 +297,9 @@ void SharingService::SendMessageToDevice( ...@@ -297,8 +297,9 @@ void SharingService::SendMessageToDevice(
FROM_HERE, {base::TaskPriority::USER_VISIBLE, content::BrowserThread::UI}, FROM_HERE, {base::TaskPriority::USER_VISIBLE, content::BrowserThread::UI},
base::BindOnce(&SharingService::InvokeSendMessageCallback, base::BindOnce(&SharingService::InvokeSendMessageCallback,
weak_ptr_factory_.GetWeakPtr(), message_guid, message_type, weak_ptr_factory_.GetWeakPtr(), message_guid, message_type,
SharingSendMessageResult::kAckTimeout), SharingSendMessageResult::kAckTimeout,
kSendMessageTimeout); /*response=*/nullptr),
response_timeout);
// TODO(crbug/1015411): Here we assume caller gets |device_guid| from // TODO(crbug/1015411): Here we assume caller gets |device_guid| from
// GetDeviceCandidates, so both DeviceInfoTracker and LocalDeviceInfoProvider // GetDeviceCandidates, so both DeviceInfoTracker and LocalDeviceInfoProvider
...@@ -308,7 +309,8 @@ void SharingService::SendMessageToDevice( ...@@ -308,7 +309,8 @@ void SharingService::SendMessageToDevice(
sync_prefs_->GetSharingInfo(device_guid); sync_prefs_->GetSharingInfo(device_guid);
if (!target_sharing_info) { if (!target_sharing_info) {
InvokeSendMessageCallback(message_guid, message_type, InvokeSendMessageCallback(message_guid, message_type,
SharingSendMessageResult::kDeviceNotFound); SharingSendMessageResult::kDeviceNotFound,
/*response=*/nullptr);
return; return;
} }
...@@ -316,7 +318,8 @@ void SharingService::SendMessageToDevice( ...@@ -316,7 +318,8 @@ void SharingService::SendMessageToDevice(
local_device_info_provider_->GetLocalDeviceInfo(); local_device_info_provider_->GetLocalDeviceInfo();
if (!local_device_info) { if (!local_device_info) {
InvokeSendMessageCallback(message_guid, message_type, InvokeSendMessageCallback(message_guid, message_type,
SharingSendMessageResult::kInternalError); SharingSendMessageResult::kInternalError,
/*response=*/nullptr);
return; return;
} }
...@@ -327,13 +330,15 @@ void SharingService::SendMessageToDevice( ...@@ -327,13 +330,15 @@ void SharingService::SendMessageToDevice(
if (!sender_device_info->sharing_info()) { if (!sender_device_info->sharing_info()) {
InvokeSendMessageCallback(message_guid, message_type, InvokeSendMessageCallback(message_guid, message_type,
SharingSendMessageResult::kInternalError); SharingSendMessageResult::kInternalError,
/*response=*/nullptr);
return; return;
} }
DCHECK_GE(response_timeout, kAckTimeToLive);
fcm_sender_->SendMessageToDevice( fcm_sender_->SendMessageToDevice(
std::move(*target_sharing_info), time_to_live, std::move(message), std::move(*target_sharing_info), response_timeout - kAckTimeToLive,
std::move(sender_device_info), std::move(message), std::move(sender_device_info),
base::BindOnce(&SharingService::OnMessageSent, base::BindOnce(&SharingService::OnMessageSent,
weak_ptr_factory_.GetWeakPtr(), base::TimeTicks::Now(), weak_ptr_factory_.GetWeakPtr(), base::TimeTicks::Now(),
message_guid, message_type)); message_guid, message_type));
...@@ -359,7 +364,8 @@ void SharingService::OnMessageSent( ...@@ -359,7 +364,8 @@ void SharingService::OnMessageSent(
SharingSendMessageResult result, SharingSendMessageResult result,
base::Optional<std::string> message_id) { base::Optional<std::string> message_id) {
if (result != SharingSendMessageResult::kSuccessful) { if (result != SharingSendMessageResult::kSuccessful) {
InvokeSendMessageCallback(message_guid, message_type, result); InvokeSendMessageCallback(message_guid, message_type, result,
/*response=*/nullptr);
return; return;
} }
...@@ -369,7 +375,8 @@ void SharingService::OnMessageSent( ...@@ -369,7 +375,8 @@ void SharingService::OnMessageSent(
void SharingService::OnAckReceived( void SharingService::OnAckReceived(
chrome_browser_sharing::MessageType message_type, chrome_browser_sharing::MessageType message_type,
const std::string& message_id) { std::string message_id,
std::unique_ptr<chrome_browser_sharing::ResponseMessage> response) {
auto times_iter = send_message_times_.find(message_id); auto times_iter = send_message_times_.find(message_id);
if (times_iter != send_message_times_.end()) { if (times_iter != send_message_times_.end()) {
LogSharingMessageAckTime(message_type, LogSharingMessageAckTime(message_type,
...@@ -384,20 +391,22 @@ void SharingService::OnAckReceived( ...@@ -384,20 +391,22 @@ void SharingService::OnAckReceived(
std::string message_guid = std::move(iter->second); std::string message_guid = std::move(iter->second);
message_guids_.erase(iter); message_guids_.erase(iter);
InvokeSendMessageCallback(message_guid, message_type, InvokeSendMessageCallback(message_guid, message_type,
SharingSendMessageResult::kSuccessful); SharingSendMessageResult::kSuccessful,
std::move(response));
} }
void SharingService::InvokeSendMessageCallback( void SharingService::InvokeSendMessageCallback(
const std::string& message_guid, const std::string& message_guid,
chrome_browser_sharing::MessageType message_type, chrome_browser_sharing::MessageType message_type,
SharingSendMessageResult result) { SharingSendMessageResult result,
std::unique_ptr<chrome_browser_sharing::ResponseMessage> response) {
auto iter = send_message_callbacks_.find(message_guid); auto iter = send_message_callbacks_.find(message_guid);
if (iter == send_message_callbacks_.end()) if (iter == send_message_callbacks_.end())
return; return;
SendMessageCallback callback = std::move(iter->second); SendMessageCallback callback = std::move(iter->second);
send_message_callbacks_.erase(iter); send_message_callbacks_.erase(iter);
std::move(callback).Run(result); std::move(callback).Run(result, std::move(response));
LogSendSharingMessageResult(message_type, result); LogSendSharingMessageResult(message_type, result);
} }
......
...@@ -55,11 +55,11 @@ enum class SharingDeviceRegistrationResult; ...@@ -55,11 +55,11 @@ enum class SharingDeviceRegistrationResult;
// sharing messages to other devices. // sharing messages to other devices.
class SharingService : public KeyedService, class SharingService : public KeyedService,
syncer::SyncServiceObserver, syncer::SyncServiceObserver,
AckMessageHandler::AckMessageObserver,
syncer::DeviceInfoTracker::Observer { syncer::DeviceInfoTracker::Observer {
public: public:
using SendMessageCallback = using SendMessageCallback = base::OnceCallback<void(
base::OnceCallback<void(SharingSendMessageResult)>; SharingSendMessageResult,
std::unique_ptr<chrome_browser_sharing::ResponseMessage>)>;
using SharingDeviceList = std::vector<std::unique_ptr<syncer::DeviceInfo>>; using SharingDeviceList = std::vector<std::unique_ptr<syncer::DeviceInfo>>;
enum class State { enum class State {
...@@ -99,12 +99,16 @@ class SharingService : public KeyedService, ...@@ -99,12 +99,16 @@ class SharingService : public KeyedService,
// GetDeviceCandidates are ready. // GetDeviceCandidates are ready.
void AddDeviceCandidatesInitializedObserver(base::OnceClosure callback); void AddDeviceCandidatesInitializedObserver(base::OnceClosure callback);
// Sends a message to the device specified by GUID. // Sends a Sharing message to remote device.
// |callback| will be invoked with message_id if synchronous operation // |device_guid|: Sync GUID of receiver device.
// succeeded, or base::nullopt if operation failed. // |response_timeout|: Maximum amount of time waiting for a response before
// invoking |callback| with kAckTimeout.
// |message|: Message to be sent.
// |callback| will be invoked once a response has received from remote device,
// or if operation has failed or timed out.
virtual void SendMessageToDevice( virtual void SendMessageToDevice(
const std::string& device_guid, const std::string& device_guid,
base::TimeDelta time_to_live, base::TimeDelta response_timeout,
chrome_browser_sharing::SharingMessage message, chrome_browser_sharing::SharingMessage message,
SendMessageCallback callback); SendMessageCallback callback);
...@@ -128,9 +132,10 @@ class SharingService : public KeyedService, ...@@ -128,9 +132,10 @@ class SharingService : public KeyedService,
void OnStateChanged(syncer::SyncService* sync) override; void OnStateChanged(syncer::SyncService* sync) override;
void OnSyncCycleCompleted(syncer::SyncService* sync) override; void OnSyncCycleCompleted(syncer::SyncService* sync) override;
// AckMessageHandler::AckMessageObserver override. void OnAckReceived(
void OnAckReceived(chrome_browser_sharing::MessageType message_type, chrome_browser_sharing::MessageType message_type,
const std::string& message_id) override; std::string message_id,
std::unique_ptr<chrome_browser_sharing::ResponseMessage> response);
// syncer::DeviceInfoTracker::Observer. // syncer::DeviceInfoTracker::Observer.
void OnDeviceInfoChange() override; void OnDeviceInfoChange() override;
...@@ -150,7 +155,8 @@ class SharingService : public KeyedService, ...@@ -150,7 +155,8 @@ class SharingService : public KeyedService,
void InvokeSendMessageCallback( void InvokeSendMessageCallback(
const std::string& message_guid, const std::string& message_guid,
chrome_browser_sharing::MessageType message_type, chrome_browser_sharing::MessageType message_type,
SharingSendMessageResult result); SharingSendMessageResult result,
std::unique_ptr<chrome_browser_sharing::ResponseMessage> response);
// Returns true if required sync feature is enabled. // Returns true if required sync feature is enabled.
bool IsSyncEnabled() const; bool IsSyncEnabled() const;
...@@ -207,7 +213,7 @@ class SharingService : public KeyedService, ...@@ -207,7 +213,7 @@ class SharingService : public KeyedService,
#endif // defined(OS_ANDROID) #endif // defined(OS_ANDROID)
PingMessageHandler ping_message_handler_; PingMessageHandler ping_message_handler_;
AckMessageHandler ack_message_handler_; std::unique_ptr<AckMessageHandler> ack_message_handler_;
#if defined(OS_ANDROID) #if defined(OS_ANDROID)
ClickToCallMessageHandler click_to_call_message_handler_; ClickToCallMessageHandler click_to_call_message_handler_;
std::unique_ptr<SmsFetchRequestHandler> sms_fetch_request_handler_; std::unique_ptr<SmsFetchRequestHandler> sms_fetch_request_handler_;
......
...@@ -56,7 +56,9 @@ void SharingServiceProxyAndroid::SendSharedClipboardMessage( ...@@ -56,7 +56,9 @@ void SharingServiceProxyAndroid::SendSharedClipboardMessage(
guid, kSendMessageTimeout, std::move(sharing_message), guid, kSendMessageTimeout, std::move(sharing_message),
base::BindOnce( base::BindOnce(
[](base::OnceCallback<void(int)> callback, [](base::OnceCallback<void(int)> callback,
SharingSendMessageResult result) { SharingSendMessageResult result,
std::unique_ptr<chrome_browser_sharing::ResponseMessage>
response) {
std::move(callback).Run(static_cast<int>(result)); std::move(callback).Run(static_cast<int>(result));
}, },
std::move(callback))); std::move(callback)));
......
...@@ -42,7 +42,7 @@ const char kFcmToken[] = "fcm_token"; ...@@ -42,7 +42,7 @@ const char kFcmToken[] = "fcm_token";
const char kDeviceName[] = "other_name"; const char kDeviceName[] = "other_name";
const char kMessageId[] = "message_id"; const char kMessageId[] = "message_id";
const char kAuthorizedEntity[] = "authorized_entity"; const char kAuthorizedEntity[] = "authorized_entity";
constexpr base::TimeDelta kTtl = base::TimeDelta::FromSeconds(10); constexpr base::TimeDelta kTimeout = base::TimeDelta::FromSeconds(15);
const char kSenderFcmToken[] = "sender_fcm_token"; const char kSenderFcmToken[] = "sender_fcm_token";
const char kSenderP256dh[] = "sender_p256dh"; const char kSenderP256dh[] = "sender_p256dh";
const char kSenderAuthSecret[] = "sender_auth_secret"; const char kSenderAuthSecret[] = "sender_auth_secret";
...@@ -194,14 +194,21 @@ class SharingServiceTest : public testing::Test { ...@@ -194,14 +194,21 @@ class SharingServiceTest : public testing::Test {
SharingSyncPreference::RegisterProfilePrefs(prefs_.registry()); SharingSyncPreference::RegisterProfilePrefs(prefs_.registry());
} }
void OnMessageSent(SharingSendMessageResult result) { void OnMessageSent(
SharingSendMessageResult result,
std::unique_ptr<chrome_browser_sharing::ResponseMessage> response) {
send_message_result_ = base::make_optional(result); send_message_result_ = base::make_optional(result);
send_message_response_ = std::move(response);
} }
base::Optional<SharingSendMessageResult> send_message_result() { const base::Optional<SharingSendMessageResult>& send_message_result() {
return send_message_result_; return send_message_result_;
} }
const chrome_browser_sharing::ResponseMessage* send_message_response() {
return send_message_response_.get();
}
void OnDeviceCandidatesInitialized() { void OnDeviceCandidatesInitialized() {
device_candidates_initialized_ = true; device_candidates_initialized_ = true;
} }
...@@ -268,8 +275,17 @@ class SharingServiceTest : public testing::Test { ...@@ -268,8 +275,17 @@ class SharingServiceTest : public testing::Test {
private: private:
std::unique_ptr<SharingService> sharing_service_ = nullptr; std::unique_ptr<SharingService> sharing_service_ = nullptr;
base::Optional<SharingSendMessageResult> send_message_result_; base::Optional<SharingSendMessageResult> send_message_result_;
std::unique_ptr<chrome_browser_sharing::ResponseMessage>
send_message_response_;
}; };
bool ProtoEquals(const google::protobuf::MessageLite& expected,
const google::protobuf::MessageLite& actual) {
std::string expected_serialized, actual_serialized;
expected.SerializeToString(&expected_serialized);
actual.SerializeToString(&actual_serialized);
return expected_serialized == actual_serialized;
}
} // namespace } // namespace
TEST_F(SharingServiceTest, SharedClipboard_IsAdded) { TEST_F(SharingServiceTest, SharedClipboard_IsAdded) {
...@@ -400,7 +416,7 @@ TEST_F(SharingServiceTest, SendMessageToDeviceSuccess) { ...@@ -400,7 +416,7 @@ TEST_F(SharingServiceTest, SendMessageToDeviceSuccess) {
kAuthorizedEntity, base::Time::Now())); kAuthorizedEntity, base::Time::Now()));
GetSharingService()->SendMessageToDevice( GetSharingService()->SendMessageToDevice(
id, kTtl, chrome_browser_sharing::SharingMessage(), id, kTimeout, chrome_browser_sharing::SharingMessage(),
base::BindOnce(&SharingServiceTest::OnMessageSent, base::BindOnce(&SharingServiceTest::OnMessageSent,
base::Unretained(this))); base::Unretained(this)));
...@@ -422,9 +438,13 @@ TEST_F(SharingServiceTest, SendMessageToDeviceSuccess) { ...@@ -422,9 +438,13 @@ TEST_F(SharingServiceTest, SendMessageToDeviceSuccess) {
chrome_browser_sharing::SharingMessage ack_message; chrome_browser_sharing::SharingMessage ack_message;
ack_message.mutable_ack_message()->set_original_message_id(kMessageId); ack_message.mutable_ack_message()->set_original_message_id(kMessageId);
ack_message_handler->OnMessage(ack_message); ack_message.mutable_ack_message()->mutable_response_message();
ack_message_handler->OnMessage(ack_message, base::DoNothing());
EXPECT_EQ(SharingSendMessageResult::kSuccessful, send_message_result()); EXPECT_EQ(SharingSendMessageResult::kSuccessful, send_message_result());
ASSERT_TRUE(send_message_response());
EXPECT_TRUE(ProtoEquals(ack_message.ack_message().response_message(),
*send_message_response()));
} }
TEST_F(SharingServiceTest, SendMessageToDeviceFCMNotResponding) { TEST_F(SharingServiceTest, SendMessageToDeviceFCMNotResponding) {
...@@ -442,7 +462,7 @@ TEST_F(SharingServiceTest, SendMessageToDeviceFCMNotResponding) { ...@@ -442,7 +462,7 @@ TEST_F(SharingServiceTest, SendMessageToDeviceFCMNotResponding) {
fake_gcm_driver_.set_should_respond(false); fake_gcm_driver_.set_should_respond(false);
GetSharingService()->SendMessageToDevice( GetSharingService()->SendMessageToDevice(
id, kTtl, chrome_browser_sharing::SharingMessage(), id, kTimeout, chrome_browser_sharing::SharingMessage(),
base::BindOnce(&SharingServiceTest::OnMessageSent, base::BindOnce(&SharingServiceTest::OnMessageSent,
base::Unretained(this))); base::Unretained(this)));
...@@ -451,7 +471,7 @@ TEST_F(SharingServiceTest, SendMessageToDeviceFCMNotResponding) { ...@@ -451,7 +471,7 @@ TEST_F(SharingServiceTest, SendMessageToDeviceFCMNotResponding) {
EXPECT_EQ(kFcmToken, fake_gcm_driver_.fcm_token()); EXPECT_EQ(kFcmToken, fake_gcm_driver_.fcm_token());
// Advance time so send message will expire. // Advance time so send message will expire.
task_environment_.FastForwardBy(kSendMessageTimeout); task_environment_.FastForwardBy(kTimeout);
EXPECT_EQ(SharingSendMessageResult::kAckTimeout, send_message_result()); EXPECT_EQ(SharingSendMessageResult::kAckTimeout, send_message_result());
// Simulate ack message received by AckMessageHandler, which will be // Simulate ack message received by AckMessageHandler, which will be
...@@ -462,7 +482,7 @@ TEST_F(SharingServiceTest, SendMessageToDeviceFCMNotResponding) { ...@@ -462,7 +482,7 @@ TEST_F(SharingServiceTest, SendMessageToDeviceFCMNotResponding) {
chrome_browser_sharing::SharingMessage ack_message; chrome_browser_sharing::SharingMessage ack_message;
ack_message.mutable_ack_message()->set_original_message_id(kMessageId); ack_message.mutable_ack_message()->set_original_message_id(kMessageId);
ack_message_handler->OnMessage(ack_message); ack_message_handler->OnMessage(ack_message, base::DoNothing());
EXPECT_EQ(SharingSendMessageResult::kAckTimeout, send_message_result()); EXPECT_EQ(SharingSendMessageResult::kAckTimeout, send_message_result());
} }
...@@ -479,7 +499,7 @@ TEST_F(SharingServiceTest, SendMessageToDeviceExpired) { ...@@ -479,7 +499,7 @@ TEST_F(SharingServiceTest, SendMessageToDeviceExpired) {
kAuthorizedEntity, base::Time::Now())); kAuthorizedEntity, base::Time::Now()));
GetSharingService()->SendMessageToDevice( GetSharingService()->SendMessageToDevice(
id, kTtl, chrome_browser_sharing::SharingMessage(), id, kTimeout, chrome_browser_sharing::SharingMessage(),
base::BindOnce(&SharingServiceTest::OnMessageSent, base::BindOnce(&SharingServiceTest::OnMessageSent,
base::Unretained(this))); base::Unretained(this)));
...@@ -499,7 +519,7 @@ TEST_F(SharingServiceTest, SendMessageToDeviceExpired) { ...@@ -499,7 +519,7 @@ TEST_F(SharingServiceTest, SendMessageToDeviceExpired) {
chrome_browser_sharing::SharingMessage ack_message; chrome_browser_sharing::SharingMessage ack_message;
ack_message.mutable_ack_message()->set_original_message_id(kMessageId); ack_message.mutable_ack_message()->set_original_message_id(kMessageId);
ack_message_handler->OnMessage(ack_message); ack_message_handler->OnMessage(ack_message, base::DoNothing());
EXPECT_EQ(SharingSendMessageResult::kAckTimeout, send_message_result()); EXPECT_EQ(SharingSendMessageResult::kAckTimeout, send_message_result());
} }
......
...@@ -177,7 +177,7 @@ void SharingUiController::SendMessageToDevice( ...@@ -177,7 +177,7 @@ void SharingUiController::SendMessageToDevice(
UpdateIcon(); UpdateIcon();
sharing_service_->SendMessageToDevice( sharing_service_->SendMessageToDevice(
device.guid(), kSharingMessageTTL, std::move(sharing_message), device.guid(), kSendMessageTimeout, std::move(sharing_message),
base::Bind(&SharingUiController::OnMessageSentToDevice, base::Bind(&SharingUiController::OnMessageSentToDevice,
weak_ptr_factory_.GetWeakPtr(), last_dialog_id_)); weak_ptr_factory_.GetWeakPtr(), last_dialog_id_));
} }
...@@ -223,7 +223,8 @@ base::string16 SharingUiController::GetTargetDeviceName() const { ...@@ -223,7 +223,8 @@ base::string16 SharingUiController::GetTargetDeviceName() const {
void SharingUiController::OnMessageSentToDevice( void SharingUiController::OnMessageSentToDevice(
int dialog_id, int dialog_id,
SharingSendMessageResult result) { SharingSendMessageResult result,
std::unique_ptr<chrome_browser_sharing::ResponseMessage> response) {
if (dialog_id != last_dialog_id_) if (dialog_id != last_dialog_id_)
return; return;
......
...@@ -121,7 +121,10 @@ class SharingUiController { ...@@ -121,7 +121,10 @@ class SharingUiController {
// Called after a message got sent to a device. Shows a new error dialog if // Called after a message got sent to a device. Shows a new error dialog if
// |success| is false and updates the omnibox icon. // |success| is false and updates the omnibox icon.
void OnMessageSentToDevice(int dialog_id, SharingSendMessageResult result); void OnMessageSentToDevice(
int dialog_id,
SharingSendMessageResult result,
std::unique_ptr<chrome_browser_sharing::ResponseMessage> response);
void OnAppsReceived(int dialog_id, void OnAppsReceived(int dialog_id,
const base::Optional<url::Origin>& initiating_origin, const base::Optional<url::Origin>& initiating_origin,
......
...@@ -5,14 +5,15 @@ ...@@ -5,14 +5,15 @@
#include "chrome/browser/sharing/sms/sms_fetch_request_handler.h" #include "chrome/browser/sharing/sms/sms_fetch_request_handler.h"
#include "base/logging.h" #include "base/logging.h"
#include "chrome/browser/sharing/proto/sms_fetch_request.pb.h" #include "chrome/browser/sharing/proto/sms_fetch_message.pb.h"
SmsFetchRequestHandler::SmsFetchRequestHandler() = default; SmsFetchRequestHandler::SmsFetchRequestHandler() = default;
SmsFetchRequestHandler::~SmsFetchRequestHandler() = default; SmsFetchRequestHandler::~SmsFetchRequestHandler() = default;
void SmsFetchRequestHandler::OnMessage( void SmsFetchRequestHandler::OnMessage(
const chrome_browser_sharing::SharingMessage& message) { chrome_browser_sharing::SharingMessage message,
SharingMessageHandler::DoneCallback done_callback) {
DCHECK(message.has_sms_fetch_request()); DCHECK(message.has_sms_fetch_request());
// TODO(crbug.com/1015645): implementation left pending deliberately. // TODO(crbug.com/1015645): implementation left pending deliberately.
NOTIMPLEMENTED(); NOTIMPLEMENTED();
......
...@@ -16,8 +16,8 @@ class SmsFetchRequestHandler : public SharingMessageHandler { ...@@ -16,8 +16,8 @@ class SmsFetchRequestHandler : public SharingMessageHandler {
~SmsFetchRequestHandler() override; ~SmsFetchRequestHandler() override;
// SharingMessageHandler // SharingMessageHandler
void OnMessage( void OnMessage(chrome_browser_sharing::SharingMessage message,
const chrome_browser_sharing::SharingMessage& message) override; SharingMessageHandler::DoneCallback done_callback) override;
private: private:
DISALLOW_COPY_AND_ASSIGN(SmsFetchRequestHandler); DISALLOW_COPY_AND_ASSIGN(SmsFetchRequestHandler);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment