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() {
// AutotestPrivateSetClipboardTextDataFunction
///////////////////////////////////////////////////////////////////////////////
AutotestPrivateSetClipboardTextDataFunction::
AutotestPrivateSetClipboardTextDataFunction() = default;
AutotestPrivateSetClipboardTextDataFunction::
~AutotestPrivateSetClipboardTextDataFunction() = default;
ExtensionFunction::ResponseAction
AutotestPrivateSetClipboardTextDataFunction::Run() {
observation_.Observe(ui::ClipboardMonitor::GetInstance());
std::unique_ptr<api::autotest_private::SetClipboardTextData::Params> params(
api::autotest_private::SetClipboardTextData::Params::Create(*args_));
EXTENSION_FUNCTION_VALIDATE(params);
......@@ -1971,7 +1975,12 @@ AutotestPrivateSetClipboardTextDataFunction::Run() {
ui::ScopedClipboardWriter clipboard_writer(ui::ClipboardBuffer::kCopyPaste);
clipboard_writer.WriteText(data);
return RespondNow(NoArguments());
return did_respond() ? AlreadyResponded() : RespondLater();
}
void AutotestPrivateSetClipboardTextDataFunction::OnClipboardDataChanged() {
observation_.Reset();
Respond(NoArguments());
}
///////////////////////////////////////////////////////////////////////////////
......
......@@ -14,6 +14,7 @@
#include "ash/rotator/screen_rotation_animator_observer.h"
#include "base/compiler_specific.h"
#include "base/optional.h"
#include "base/scoped_observation.h"
#include "base/scoped_observer.h"
#include "base/timer/timer.h"
#include "chrome/browser/chromeos/printing/cups_printers_manager.h"
......@@ -378,14 +379,24 @@ class AutotestPrivateGetClipboardTextDataFunction : public ExtensionFunction {
ResponseAction Run() override;
};
class AutotestPrivateSetClipboardTextDataFunction : public ExtensionFunction {
class AutotestPrivateSetClipboardTextDataFunction
: public ExtensionFunction,
public ui::ClipboardObserver {
public:
AutotestPrivateSetClipboardTextDataFunction();
DECLARE_EXTENSION_FUNCTION("autotestPrivate.setClipboardTextData",
AUTOTESTPRIVATE_SETCLIPBOARDTEXTDATA)
private:
~AutotestPrivateSetClipboardTextDataFunction() override;
ResponseAction Run() override;
// ui::ClipboardObserver:
void OnClipboardDataChanged() override;
base::ScopedObservation<ui::ClipboardMonitor, ui::ClipboardObserver>
observation_{this};
};
class AutotestPrivateSetCrostiniEnabledFunction : public ExtensionFunction {
......
......@@ -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
// CHANGE THE SESSION STATE TO LOCKED STATE.
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