blob: daa595ea0e1adb0160b8756e33523a0ff7574c03 [file] [log] [blame]
// Copyright 2015 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef THIRD_PARTY_BLINK_PUBLIC_PLATFORM_SCHEDULER_WEB_THREAD_SCHEDULER_H_
#define THIRD_PARTY_BLINK_PUBLIC_PLATFORM_SCHEDULER_WEB_THREAD_SCHEDULER_H_
#include <memory>
#include "base/message_loop/message_pump.h"
#include "base/task/single_thread_task_runner.h"
#include "base/time/time.h"
#include "build/build_config.h"
#include "ipc/urgent_message_observer.h"
#include "third_party/blink/public/platform/scheduler/web_agent_group_scheduler.h"
#include "third_party/blink/public/platform/web_common.h"
namespace blink {
class MainThread;
} // namespace blink
namespace blink {
namespace scheduler {
enum class WebRendererProcessType;
class BLINK_PLATFORM_EXPORT WebThreadScheduler
: public IPC::UrgentMessageObserver {
public:
WebThreadScheduler(const WebThreadScheduler&) = delete;
WebThreadScheduler& operator=(const WebThreadScheduler&) = delete;
~WebThreadScheduler() override;
// ==== Functions for the main thread scheduler ============================
//
// Virtual functions below should only be called against the scheduler on
// the main thread. They have default implementation that only does
// NOTREACHED(), and are overridden only by the main thread scheduler.
// Shuts down the scheduler by dropping any remaining pending work in the work
// queues. After this call any work posted to the task runners will be
// silently dropped.
virtual void Shutdown() = 0;
// If |message_pump| is null caller must have registered one using
// base::MessageLoop.
static std::unique_ptr<WebThreadScheduler> CreateMainThreadScheduler(
std::unique_ptr<base::MessagePump> message_pump = nullptr);
// Returns main thread scheduler for the main thread of the current process.
static WebThreadScheduler& MainThreadScheduler();
// Returns a default task runner. This is basically same as the default task
// runner, but is explicitly allowed to run JavaScript. For the detail, see
// the comment at blink::ThreadScheduler::DeprecatedDefaultTaskRunner.
virtual scoped_refptr<base::SingleThreadTaskRunner>
DeprecatedDefaultTaskRunner();
// Creates a WebThread implementation for the renderer main thread.
virtual std::unique_ptr<MainThread> CreateMainThread();
// Creates a WebAgentGroupScheduler implementation. Must be called from the
// main thread.
virtual std::unique_ptr<WebAgentGroupScheduler>
CreateWebAgentGroupScheduler() = 0;
// Tells the scheduler about the change of renderer visibility status (e.g.
// "all widgets are hidden" condition). Used mostly for metric purposes.
// Must be called on the main thread.
virtual void SetRendererHidden(bool hidden);
// Tells the scheduler about the change of renderer background status, i.e.,
// there are no critical, user facing activities (visual, audio, etc...)
// driven by this process. A stricter condition than |SetRendererHidden()|,
// the process is assumed to be foregrounded when the scheduler is
// constructed. Must be called on the main thread.
virtual void SetRendererBackgrounded(bool backgrounded);
#if BUILDFLAG(IS_ANDROID)
// Android WebView has very strange WebView.pauseTimers/resumeTimers API.
// It's very old and very inconsistent. The API promises that this
// "pauses all layout, parsing, and JavaScript timers for all WebViews".
// Also CTS tests expect that loading tasks continue to run.
// We should change it to something consistent (e.g. stop all javascript)
// but changing WebView and CTS is a slow and painful process, so for
// the time being we're doing our best.
// DO NOT USE FOR ANYTHING EXCEPT ANDROID WEBVIEW API IMPLEMENTATION.
virtual void PauseTimersForAndroidWebView();
virtual void ResumeTimersForAndroidWebView();
#endif // BUILDFLAG(IS_ANDROID)
// Sets the kind of renderer process. Should be called on the main thread
// once.
virtual void SetRendererProcessType(WebRendererProcessType type);
// IPC::Channel::UrgentMessageDelegate implementation:
void OnUrgentMessageReceived() override;
void OnUrgentMessageProcessed() override;
protected:
WebThreadScheduler() = default;
};
} // namespace scheduler
} // namespace blink
#endif // THIRD_PARTY_BLINK_PUBLIC_PLATFORM_SCHEDULER_WEB_THREAD_SCHEDULER_H_