diff --git a/content/child/child_thread_impl.cc b/content/child/child_thread_impl.cc index f1d2d841766e2b3cad4fec566f320fdc1da4ba38..ae5779806a7115cf729ef71a6c2be6da81ab0020 100644 --- a/content/child/child_thread_impl.cc +++ b/content/child/child_thread_impl.cc @@ -298,6 +298,10 @@ class ChildThreadImpl::IOThreadState BindReceiver(std::move(receiver)); } +#if defined(OHOS_RENDERER_ANR_DUMP) + void SetWebkitInited() { webkit_inited_ = true; } +#endif + private: friend class base::RefCountedThreadSafe; @@ -342,6 +346,10 @@ class ChildThreadImpl::IOThreadState #if defined(OHOS_RENDERER_ANR_DUMP) void dumpCurrentJavaScriptStackInMainThread( dumpCurrentJavaScriptStackInMainThreadCallback callback) override { + if (!webkit_inited_) { + std::move(callback).Run(""); + return; + } AnrDumper::GetInstance()->DumpCurrentJavaScriptStack(std::move(callback)); } #endif @@ -472,6 +480,9 @@ class ChildThreadImpl::IOThreadState // Binding requests which should be handled by |interface_binders|, but which // have been queued because |allow_interface_binders_| is still |false|. std::vector pending_binding_requests_; +#if defined(OHOS_RENDERER_ANR_DUMP) + bool webkit_inited_ = false; +#endif }; ChildThread* ChildThread::Get() { @@ -972,4 +983,12 @@ void ChildThreadImpl::OnMemoryPressureFromBrowserReceived( } #endif +#if defined(OHOS_RENDERER_ANR_DUMP) +void ChildThreadImpl::SetWebkitInited() { + ChildThreadImpl::GetIOTaskRunner()->PostTask( + FROM_HERE, + base::BindOnce(&IOThreadState::SetWebkitInited, io_thread_state_)); +} +#endif + } // namespace content diff --git a/content/child/child_thread_impl.h b/content/child/child_thread_impl.h index 14602ad58f10c98441532d8e1d1bebcae3f5a6e8..2f013ca91bb0ec2c5eb20ab4013ec7878e25acf7 100644 --- a/content/child/child_thread_impl.h +++ b/content/child/child_thread_impl.h @@ -170,6 +170,9 @@ class ChildThreadImpl : public IPC::Listener, virtual public ChildThread { virtual void OnMemoryPressureFromBrowserReceived( base::MemoryPressureListener::MemoryPressureLevel level); #endif +#if defined(OHOS_RENDERER_ANR_DUMP) + void SetWebkitInited(); +#endif private: // TODO(crbug.com/1111231): This class is a friend so that it can call our diff --git a/content/renderer/anr_dumper.cc b/content/renderer/anr_dumper.cc index e8c0229fb808122b2a72b6bb7f4b270683bbbd51..fe7e529b8ec23fe6b3dc08043ed82b6d8b58c1dc 100644 --- a/content/renderer/anr_dumper.cc +++ b/content/renderer/anr_dumper.cc @@ -4,6 +4,7 @@ #include "content/renderer/anr_dumper.h" #include "base/lazy_instance.h" +#include "base/task/single_thread_task_runner.h" #include "content/common/child_process.mojom.h" #include "third_party/blink/renderer/platform/bindings/v8_per_isolate_data.h" #include "v8/include/v8-extension.h" @@ -29,7 +30,8 @@ class AnrDumper::InterruptData { InterruptData( mojom::ChildProcess::dumpCurrentJavaScriptStackInMainThreadCallback callback) - : callback_(std::move(callback)) {} + : callback_(std::move(callback)), + task_runner_(base::SingleThreadTaskRunner::GetCurrentDefault()) {} InterruptData(const InterruptData&) = delete; InterruptData& operator=(const InterruptData&) = delete; @@ -37,15 +39,19 @@ class AnrDumper::InterruptData { void RunCallback(std::ostringstream stack_trace_stream) { const std::string& stack_trace_stream_str = stack_trace_stream.str(); if (stack_trace_stream_str.length() > kMaxStackLength) { - std::move(callback_).Run( - stack_trace_stream_str.substr(0, kMaxStackLength)); + task_runner_->PostTask( + FROM_HERE, + base::BindOnce(std::move(callback_), + stack_trace_stream_str.substr(0, kMaxStackLength))); return; } - std::move(callback_).Run(stack_trace_stream_str); + task_runner_->PostTask(FROM_HERE, base::BindOnce(std::move(callback_), + stack_trace_stream_str)); } private: mojom::ChildProcess::dumpCurrentJavaScriptStackInMainThreadCallback callback_; + const scoped_refptr task_runner_; }; // Run in io thread, make sure MainThreadIsolate is inited. diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc index f5c7b329e3482c63c1e4097daf012a8f5f2a86b5..70cd86bdd5e75e6f154d5697f7f279ce4748212e 100644 --- a/content/renderer/render_thread_impl.cc +++ b/content/renderer/render_thread_impl.cc @@ -745,6 +745,9 @@ void RenderThreadImpl::Init() { } UpdateForegroundCrashKey( /*foreground=*/!blink::kLaunchingProcessIsBackgrounded); +#if defined(OHOS_RENDERER_ANR_DUMP) + ChildThreadImpl::SetWebkitInited(); +#endif } RenderThreadImpl::~RenderThreadImpl() {