Commit 416fbe44 authored by Jun Mukai's avatar Jun Mukai Committed by Chromium LUCI CQ

Make autotestPrivate.setClipboardTextData synchronous

The ChromeOS clipboard used to be synchronously written within
the browser process, but now it is asynchronously updated
(see ui/base/clipboard/clipboard_ozone.cc for the details).

Because of that, autotestPrivate.setClipboardTextData may return
earlier than the clipboard data is actually set occasionally.
To deal with such case, this CL introduces a clipboard observer
to ensure that the clipboard is written.

Bug: 1167256
Test: the new test cases
Change-Id: I167be3aee090465e30951fbb7a9db688429059c2
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2634121
Commit-Queue: Jun Mukai <mukai@chromium.org>
Reviewed-by: default avatarXiyuan Xia <xiyuan@chromium.org>
Cr-Commit-Position: refs/heads/master@{#845060}
parent 494b2d3b
...@@ -1958,11 +1958,15 @@ AutotestPrivateGetClipboardTextDataFunction::Run() { ...@@ -1958,11 +1958,15 @@ AutotestPrivateGetClipboardTextDataFunction::Run() {
// AutotestPrivateSetClipboardTextDataFunction // AutotestPrivateSetClipboardTextDataFunction
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
AutotestPrivateSetClipboardTextDataFunction::
AutotestPrivateSetClipboardTextDataFunction() = default;
AutotestPrivateSetClipboardTextDataFunction:: AutotestPrivateSetClipboardTextDataFunction::
~AutotestPrivateSetClipboardTextDataFunction() = default; ~AutotestPrivateSetClipboardTextDataFunction() = default;
ExtensionFunction::ResponseAction ExtensionFunction::ResponseAction
AutotestPrivateSetClipboardTextDataFunction::Run() { AutotestPrivateSetClipboardTextDataFunction::Run() {
observation_.Observe(ui::ClipboardMonitor::GetInstance());
std::unique_ptr<api::autotest_private::SetClipboardTextData::Params> params( std::unique_ptr<api::autotest_private::SetClipboardTextData::Params> params(
api::autotest_private::SetClipboardTextData::Params::Create(*args_)); api::autotest_private::SetClipboardTextData::Params::Create(*args_));
EXTENSION_FUNCTION_VALIDATE(params); EXTENSION_FUNCTION_VALIDATE(params);
...@@ -1971,7 +1975,12 @@ AutotestPrivateSetClipboardTextDataFunction::Run() { ...@@ -1971,7 +1975,12 @@ AutotestPrivateSetClipboardTextDataFunction::Run() {
ui::ScopedClipboardWriter clipboard_writer(ui::ClipboardBuffer::kCopyPaste); ui::ScopedClipboardWriter clipboard_writer(ui::ClipboardBuffer::kCopyPaste);
clipboard_writer.WriteText(data); clipboard_writer.WriteText(data);
return RespondNow(NoArguments()); return did_respond() ? AlreadyResponded() : RespondLater();
}
void AutotestPrivateSetClipboardTextDataFunction::OnClipboardDataChanged() {
observation_.Reset();
Respond(NoArguments());
} }
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#include "ash/rotator/screen_rotation_animator_observer.h" #include "ash/rotator/screen_rotation_animator_observer.h"
#include "base/compiler_specific.h" #include "base/compiler_specific.h"
#include "base/optional.h" #include "base/optional.h"
#include "base/scoped_observation.h"
#include "base/scoped_observer.h" #include "base/scoped_observer.h"
#include "base/timer/timer.h" #include "base/timer/timer.h"
#include "chrome/browser/chromeos/printing/cups_printers_manager.h" #include "chrome/browser/chromeos/printing/cups_printers_manager.h"
...@@ -378,14 +379,24 @@ class AutotestPrivateGetClipboardTextDataFunction : public ExtensionFunction { ...@@ -378,14 +379,24 @@ class AutotestPrivateGetClipboardTextDataFunction : public ExtensionFunction {
ResponseAction Run() override; ResponseAction Run() override;
}; };
class AutotestPrivateSetClipboardTextDataFunction : public ExtensionFunction { class AutotestPrivateSetClipboardTextDataFunction
: public ExtensionFunction,
public ui::ClipboardObserver {
public: public:
AutotestPrivateSetClipboardTextDataFunction();
DECLARE_EXTENSION_FUNCTION("autotestPrivate.setClipboardTextData", DECLARE_EXTENSION_FUNCTION("autotestPrivate.setClipboardTextData",
AUTOTESTPRIVATE_SETCLIPBOARDTEXTDATA) AUTOTESTPRIVATE_SETCLIPBOARDTEXTDATA)
private: private:
~AutotestPrivateSetClipboardTextDataFunction() override; ~AutotestPrivateSetClipboardTextDataFunction() override;
ResponseAction Run() override; ResponseAction Run() override;
// ui::ClipboardObserver:
void OnClipboardDataChanged() override;
base::ScopedObservation<ui::ClipboardMonitor, ui::ClipboardObserver>
observation_{this};
}; };
class AutotestPrivateSetCrostiniEnabledFunction : public ExtensionFunction { class AutotestPrivateSetCrostiniEnabledFunction : public ExtensionFunction {
......
...@@ -993,6 +993,31 @@ var defaultTests = [ ...@@ -993,6 +993,31 @@ var defaultTests = [
}); });
}, },
function setAndGetClipboardTextData() {
const textData = 'foo bar';
chrome.autotestPrivate.getClipboardTextData(function(beforeData) {
chrome.test.assertTrue(textData != beforeData);
chrome.autotestPrivate.setClipboardTextData(textData, function() {
chrome.autotestPrivate.getClipboardTextData(function(afterData) {
chrome.test.assertEq(afterData, textData);
chrome.test.succeed();
});
});
});
},
function setClipboardTextDataTwice() {
const textData = 'twice clipboard data';
chrome.autotestPrivate.setClipboardTextData(textData, function() {
chrome.autotestPrivate.setClipboardTextData(textData, function() {
chrome.autotestPrivate.getClipboardTextData(function(data) {
chrome.test.assertEq(data, textData);
chrome.test.succeed();
});
});
});
},
// KEEP |lockScreen()| TESTS AT THE BOTTOM OF THE defaultTests AS IT WILL // KEEP |lockScreen()| TESTS AT THE BOTTOM OF THE defaultTests AS IT WILL
// CHANGE THE SESSION STATE TO LOCKED STATE. // CHANGE THE SESSION STATE TO LOCKED STATE.
function lockScreen() { function lockScreen() {
......
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