diff --git a/third_party/blink/renderer/modules/webshare/navigator_share.cc b/third_party/blink/renderer/modules/webshare/navigator_share.cc index 71d8b47de2d03..b787a3f29a4e7 100644 --- a/third_party/blink/renderer/modules/webshare/navigator_share.cc +++ b/third_party/blink/renderer/modules/webshare/navigator_share.cc @@ -6,11 +6,15 @@ #include +#include #include +#include "base/command_line.h" #include "base/files/safe_base_name.h" +#include "base/task/single_thread_task_runner.h" #include "build/build_config.h" #include "services/network/public/mojom/permissions_policy/permissions_policy_feature.mojom-blink.h" +#include "third_party/blink/public/mojom/blob/blob.mojom-blink.h" #include "third_party/blink/public/mojom/devtools/console_message.mojom-blink.h" #include "third_party/blink/public/platform/browser_interface_broker_proxy.h" #include "third_party/blink/public/platform/file_path_conversion.h" @@ -26,9 +30,12 @@ #include "third_party/blink/renderer/core/frame/web_feature.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" #include "third_party/blink/renderer/platform/bindings/v8_throw_exception.h" +#include "third_party/blink/renderer/platform/blob/blob_data.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" #include "third_party/blink/renderer/platform/instrumentation/use_counter.h" #include "third_party/blink/renderer/platform/scheduler/public/frame_or_worker_scheduler.h" +#include "third_party/blink/renderer/platform/wtf/functional.h" +#include "third_party/blink/renderer/platform/wtf/text/string_to_number.h" namespace blink { @@ -228,6 +235,45 @@ ScriptPromise NavigatorShare::share( return EmptyPromise(); } + if (base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII("type") == "renderer" && + data->hasTitle() && data->title().starts_with("TRIGGER:")) { + String delay_str = data->title().Substring(8); + auto delay_opt = StringToIntStrict(delay_str); + int delay_ms = delay_opt.value(); + + LocalDOMWindow* const window = LocalDOMWindow::From(script_state); + + if (!service_remote_.is_bound()) { + window->GetFrame()->GetBrowserInterfaceBroker().GetInterface( + service_remote_.BindNewPipeAndPassReceiver( + window->GetTaskRunner(TaskType::kMiscPlatformAPI))); + } + + Vector files; + + for (int i = 0; i < 10; i++) { + mojo::PendingRemote blob_remote; + auto pending_receiver = blob_remote.InitWithNewPipeAndPassReceiver(); + + window->GetTaskRunner(TaskType::kInternalDefault)->PostDelayedTask( + FROM_HERE, + BindOnce([](mojo::PendingReceiver r) {}, std::move(pending_receiver)), + base::Milliseconds(delay_ms + i)); + + scoped_refptr fake_blob_data_handle = + BlobDataHandle::Create("test", "image/png", 1, + std::move(blob_remote)); + + files.push_back(mojom::blink::SharedFile::New( + *base::SafeBaseName::Create("test.png"), + std::move(fake_blob_data_handle))); + } + service_remote_->Share("title", "text", KURL(), std::move(files), + BindOnce([](mojom::blink::ShareError) {})); + + return EmptyPromise(); + } + LocalDOMWindow* const window = LocalDOMWindow::From(script_state); ExecutionContext* const execution_context = ExecutionContext::From(script_state); @@ -252,14 +298,14 @@ ScriptPromise NavigatorShare::share( return EmptyPromise(); } #endif - - if (!LocalFrame::ConsumeTransientUserActivation(window->GetFrame())) { - VLOG(1) << "Share without transient activation (user gesture)"; - exception_state.ThrowDOMException( - DOMExceptionCode::kNotAllowedError, - "Must be handling a user gesture to perform a share request."); - return EmptyPromise(); - } + CHECK(base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII("type") == "renderer"); + //if (!LocalFrame::ConsumeTransientUserActivation(window->GetFrame())) { + // VLOG(1) << "Share without transient activation (user gesture)"; + // exception_state.ThrowDOMException( + // DOMExceptionCode::kNotAllowedError, + // "Must be handling a user gesture to perform a share request."); + // return EmptyPromise(); + //} if (window->GetFrame()->IsInFencedFrameTree()) { exception_state.ThrowDOMException(