blob: d614fa0f0d93e9991041a0149d28b9ddd9ae8484 [file] [log] [blame]
/*
* Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple, Inc. All rights
* reserved.
* Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
* Copyright (C) 2012 Samsung Electronics. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this library; see the file COPYING.LIB. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_PAGE_CHROME_CLIENT_H_
#define THIRD_PARTY_BLINK_RENDERER_CORE_PAGE_CHROME_CLIENT_H_
#include <memory>
#include "base/gtest_prod_util.h"
#include "base/time/time.h"
#include "cc/input/event_listener_properties.h"
#include "cc/input/overscroll_behavior.h"
#include "cc/paint/paint_image.h"
#include "cc/trees/paint_holding_commit_trigger.h"
#include "cc/trees/paint_holding_reason.h"
#include "components/viz/common/surfaces/frame_sink_id.h"
#include "third_party/blink/public/common/dom_storage/session_storage_namespace_id.h"
#include "third_party/blink/public/common/input/web_gesture_event.h"
#include "third_party/blink/public/common/input/web_input_event.h"
#include "third_party/blink/public/common/page/drag_operation.h"
#include "third_party/blink/public/common/permissions_policy/permissions_policy_features.h"
#include "third_party/blink/public/mojom/devtools/console_message.mojom-blink-forward.h"
#include "third_party/blink/public/mojom/input/focus_type.mojom-blink-forward.h"
#include "third_party/blink/public/mojom/input/input_handler.mojom-blink-forward.h"
#include "third_party/blink/public/mojom/scroll/scroll_into_view_params.mojom-blink.h"
#include "third_party/blink/renderer/core/core_export.h"
#include "third_party/blink/renderer/core/html/forms/external_date_time_chooser.h"
#include "third_party/blink/renderer/core/html/forms/popup_menu.h"
#include "third_party/blink/renderer/core/layout/geometry/physical_offset.h"
#include "third_party/blink/renderer/core/loader/frame_loader.h"
#include "third_party/blink/renderer/core/loader/navigation_policy.h"
#include "third_party/blink/renderer/core/scroll/scroll_types.h"
#include "third_party/blink/renderer/core/style/computed_style_constants.h"
#include "third_party/blink/renderer/platform/graphics/touch_action.h"
#include "third_party/blink/renderer/platform/heap/garbage_collected.h"
#include "third_party/blink/renderer/platform/text/text_direction.h"
#include "third_party/blink/renderer/platform/wtf/forward.h"
#include "third_party/blink/renderer/platform/wtf/functional.h"
#include "ui/gfx/delegated_ink_metadata.h"
#include "ui/gfx/geometry/transform.h"
#include "ui/gfx/geometry/vector2d_f.h"
// To avoid conflicts with the CreateWindow macro from the Windows SDK...
#undef CreateWindow
namespace cc {
class AnimationHost;
class AnimationTimeline;
struct ElementId;
class Layer;
struct OverscrollBehavior;
class ScopedPauseRendering;
}
namespace display {
struct ScreenInfo;
struct ScreenInfos;
} // namespace display
namespace ui {
class Cursor;
}
namespace viz {
struct FrameTimingDetails;
}
namespace blink {
class ColorChooser;
class ColorChooserClient;
class DateTimeChooser;
class DateTimeChooserClient;
class Element;
class FileChooser;
class Frame;
class FullscreenOptions;
class HTMLFormControlElement;
class HTMLFormElement;
class HTMLInputElement;
class HTMLSelectElement;
class HitTestLocation;
class HitTestResult;
class KeyboardEvent;
class LocalFrame;
class LocalFrameView;
class Node;
class Page;
class PagePopup;
class PagePopupClient;
class PopupOpeningObserver;
class WebDragData;
class WebViewImpl;
enum class FullscreenRequestType;
struct DateTimeChooserParameters;
struct FrameLoadRequest;
struct ViewportDescription;
struct WebWindowFeatures;
namespace mojom {
namespace blink {
class TextAutosizerPageInfo;
}
} // namespace mojom
using CompositorElementId = cc::ElementId;
class CORE_EXPORT ChromeClient : public GarbageCollected<ChromeClient> {
public:
ChromeClient(const ChromeClient&) = delete;
ChromeClient& operator=(const ChromeClient&) = delete;
virtual ~ChromeClient() = default;
virtual WebViewImpl* GetWebView() const = 0;
// Converts the scalar value from window coordinates to viewport scale.
virtual float WindowToViewportScalar(LocalFrame*,
const float value) const = 0;
virtual bool IsPopup() { return false; }
virtual void ChromeDestroyed() = 0;
virtual void SetWindowRect(const gfx::Rect&, LocalFrame&) = 0;
virtual void Minimize(LocalFrame&) = 0;
virtual void Maximize(LocalFrame&) = 0;
virtual void Restore(LocalFrame&) = 0;
virtual void SetResizable(bool resizable, LocalFrame&) = 0;
// For non-composited WebViews that exist to contribute to a "parent" WebView
// painting. This informs the client of the area that needs to be redrawn.
virtual void InvalidateContainer() = 0;
// Converts the rect from local root coordinates (using the local root of the
// given LocalFrameView) to screen coordinates. Performs the visual viewport
// transform.
virtual gfx::Rect LocalRootToScreenDIPs(const gfx::Rect&,
const LocalFrameView*) const = 0;
void ScheduleAnimation(const LocalFrameView* view) {
ScheduleAnimation(view, base::TimeDelta());
}
virtual void ScheduleAnimation(const LocalFrameView*,
base::TimeDelta delay) = 0;
// Tells the browser that another page has accessed the DOM of the initial
// empty document of a main frame.
virtual void DidAccessInitialMainDocument() = 0;
// This gives the rect of the top level window that the given LocalFrame is a
// part of.
virtual gfx::Rect RootWindowRect(LocalFrame&) = 0;
virtual void FocusPage() = 0;
virtual void DidFocusPage() = 0;
virtual bool CanTakeFocus(mojom::blink::FocusType) = 0;
virtual void TakeFocus(mojom::blink::FocusType) = 0;
virtual void SetKeyboardFocusURL(Element*) {}
// Returns true if the page should support drag regions via the app-region
// CSS property.
virtual bool SupportsDraggableRegions() = 0;
// Sends the draggable regions defined by the app-region CSS property to the
// browser.
virtual void DraggableRegionsChanged() = 0;
// Allow document lifecycle updates to be run in order to produce composited
// outputs. Updates are blocked from occurring during loading navigation in
// order to prevent contention and allow Blink to proceed more quickly. This
// signals that enough progress has been made and document lifecycle updates
// are desirable. This will allow visual updates to occur unless the caller
// also uses StartDeferringCommits().
//
// This may only be called for the main frame, and takes it as
// reference to make it clear that callers may only call this while a local
// main frame is present and the values does not persist between instances of
// local main frames.
virtual void BeginLifecycleUpdates(LocalFrame& main_frame) = 0;
// Notifies clients immediately before a newly committed main frame is pushed
// to the compositor thread.
struct CORE_EXPORT CommitObserver : public GarbageCollectedMixin {
virtual void WillCommitCompositorFrame() {}
protected:
virtual ~CommitObserver() = default;
};
virtual void RegisterForCommitObservation(CommitObserver*) = 0;
virtual void UnregisterFromCommitObservation(CommitObserver*) = 0;
virtual void WillCommitCompositorFrame() = 0;
virtual bool StartDeferringCommits(LocalFrame& main_frame,
base::TimeDelta timeout,
cc::PaintHoldingReason reason) = 0;
virtual void StopDeferringCommits(LocalFrame& main_frame,
cc::PaintHoldingCommitTrigger) = 0;
virtual std::unique_ptr<cc::ScopedPauseRendering> PauseRendering(
LocalFrame& main_frame) = 0;
// Returns the maximum bounds for buffers allocated for rasterization and
// compositing.
// Returns null if the compositing stack has not been initialized yet.
// |frame| must be a local frame.
virtual std::optional<int> GetMaxRenderBufferBounds(
LocalFrame& frame) const = 0;
// Start a system drag and drop operation.
//
// The `cursor_offset` is the offset of the drag-point from the top-left of
// `drag_image`, which may not be the same as the top-left of
// `drag_obj_rect`. For details, see the function header comment for:
// `blink::DragController::StartDrag()`.
virtual void StartDragging(LocalFrame*,
const WebDragData&,
DragOperationsMask,
const SkBitmap& drag_image,
const gfx::Vector2d& cursor_offset,
const gfx::Rect& drag_obj_rect) = 0;
virtual bool AcceptsLoadDrops() const = 0;
// The LocalFrame pointer provides the ChromeClient with context about which
// LocalFrame wants to create the new Page. Also, the newly created window
// should not be shown to the user until the ChromeClient of the newly
// created Page has its show method called.
// The FrameLoadRequest parameter is only for ChromeClient to check if the
// request could be fulfilled. The ChromeClient should not load the request.
Page* CreateWindow(LocalFrame*,
const FrameLoadRequest&,
const AtomicString& frame_name,
const WebWindowFeatures&,
network::mojom::blink::WebSandboxFlags,
const SessionStorageNamespaceId&,
bool& consumed_user_gesture);
// Show a previously created Page that was created via CreateWindow. This
// should only be called once the newly created window when it is ready to be
// shown. Under some circumstances CreateWindow's implementation may return a
// previously shown page. Calling this method should still work and the
// browser will discard the unnecessary show request.
virtual void Show(LocalFrame& frame,
LocalFrame& opener_frame,
NavigationPolicy navigation_policy,
bool consumed_user_gesture) = 0;
// All the parameters should be in viewport space. That is, if an event
// scrolls by 10 px, but due to a 2X page scale we apply a 5px scroll to the
// root frame, all of which is handled as overscroll, we should return 10px
// as the |overscroll_delta|.
virtual void DidOverscroll(const gfx::Vector2dF& overscroll_delta,
const gfx::Vector2dF& accumulated_overscroll,
const gfx::PointF& position_in_viewport,
const gfx::Vector2dF& velocity_in_viewport) = 0;
// For a scrollbar scroll action, injects a gesture event of |injected_type|
// to be dispatched at a later point in time. |injected_type| is required to
// be one of GestureScroll{Begin,Update,End}. If the main thread is currently
// handling an input event, the gesture will be dispatched immediately after
// the current event is finished being processed.
// If there is no input event being handled, the gesture is queued up
// on the main thread's input event queue.
// The dispatched gesture will scroll the ScrollableArea identified by
// |scrollable_area_element_id| by the given delta+granularity.
// See also InputHandlerProxy::InjectScrollbarGestureScroll() which may
// shortcut callers of this function for composited scrollbars.
virtual void InjectScrollbarGestureScroll(
LocalFrame& local_frame,
const gfx::Vector2dF& delta,
ui::ScrollGranularity granularity,
CompositorElementId scrollable_area_element_id,
WebInputEvent::Type injected_type) {}
// Finishes a ScrollIntoView for a focused editable element by performing a
// view-level reveal. That is, when an embedder requests to reveal a focused
// editable, the editable is first ScrollIntoView'ed in the layout tree to
// ensure it's visible in the outermost document but stops short of scrolling
// the outermost frame. This method will then perform a platform-specific
// reveal of the editable, e.g. by animating a scroll and zoom in to a
// legible scale. This should only be called in a WebView where the main
// frame is local and outermost.
virtual void FinishScrollFocusedEditableIntoView(
const gfx::RectF& caret_rect_in_root_frame,
mojom::blink::ScrollIntoViewParamsPtr params) {}
// Set the browser's behavior when overscroll happens, e.g. whether to glow
// or navigate. This may only be called for the main frame, and takes it as
// reference to make it clear that callers may only call this while a local
// main frame is present and the values do not persist between instances of
// local main frames.
virtual void SetOverscrollBehavior(LocalFrame& main_frame,
const cc::OverscrollBehavior&) = 0;
virtual bool ShouldReportDetailedMessageForSourceAndSeverity(
LocalFrame&,
mojom::blink::ConsoleMessageLevel log_level,
const String& source) = 0;
virtual void AddMessageToConsole(LocalFrame*,
mojom::ConsoleMessageSource,
mojom::ConsoleMessageLevel,
const String& message,
unsigned line_number,
const String& source_id,
const String& stack_trace) = 0;
virtual bool CanOpenBeforeUnloadConfirmPanel() = 0;
bool OpenBeforeUnloadConfirmPanel(const String& message,
LocalFrame*,
bool is_reload);
virtual void CloseWindow() = 0;
bool OpenJavaScriptAlert(LocalFrame*, const String&);
bool OpenJavaScriptConfirm(LocalFrame*, const String&);
bool OpenJavaScriptPrompt(LocalFrame*,
const String& message,
const String& default_value,
String& result);
virtual bool TabsToLinks() = 0;
virtual const display::ScreenInfo& GetScreenInfo(LocalFrame& frame) const = 0;
virtual const display::ScreenInfos& GetScreenInfos(
LocalFrame& frame) const = 0;
virtual void SetCursor(const ui::Cursor&, LocalFrame* local_root) = 0;
virtual void SetCursorOverridden(bool) = 0;
virtual void AutoscrollStart(const gfx::PointF& position, LocalFrame*) {}
virtual void AutoscrollFling(const gfx::Vector2dF& velocity, LocalFrame*) {}
virtual void AutoscrollEnd(LocalFrame*) {}
virtual ui::Cursor LastSetCursorForTesting() const = 0;
Node* LastSetTooltipNodeForTesting() const {
return last_mouse_over_node_.Get();
}
virtual void SetCursorForPlugin(const ui::Cursor&, LocalFrame*) = 0;
// Returns the scale used to convert incoming input events while emulating
// device metics.
virtual float InputEventsScaleForEmulation() const { return 1; }
virtual void DispatchViewportPropertiesDidChange(
const ViewportDescription&) const {}
virtual bool DoubleTapToZoomEnabled() const { return false; }
virtual void EnablePreferredSizeChangedMode() {}
virtual void ZoomToFindInPageRect(const gfx::Rect&) {}
virtual void ContentsSizeChanged(LocalFrame*, const gfx::Size&) const = 0;
// Call during pinch gestures, or when page-scale changes on main-frame load.
virtual void PageScaleFactorChanged() const {}
virtual float ClampPageScaleFactorToLimits(float scale) const {
return scale;
}
virtual void OutermostMainFrameScrollOffsetChanged() const = 0;
virtual void ResizeAfterLayout() const {}
virtual void MainFrameLayoutUpdated() const {}
void MouseDidMoveOverElement(LocalFrame&,
const HitTestLocation&,
const HitTestResult&);
virtual void UpdateTooltipUnderCursor(LocalFrame&,
const String&,
TextDirection) = 0;
void ElementFocusedFromKeypress(LocalFrame&, const Element*);
// This function allows us to trigger a tooltip to show from a keypress. The
// tooltip will be positioned in the gfx::Rect passed by parameter. That rect
// corresponds to the focused element's bounds, which are in viewport
// coordinates at this point. They will be converted to enclosed DIPS before
// being passed to the browser process.
virtual void UpdateTooltipFromKeyboard(LocalFrame&,
const String&,
TextDirection,
const gfx::Rect&) = 0;
virtual void ClearKeyboardTriggeredTooltip(LocalFrame&) = 0;
void ClearToolTip(LocalFrame&);
String GetLastToolTipTextForTesting() {
return current_tool_tip_text_for_test_;
}
bool Print(LocalFrame*);
virtual ColorChooser* OpenColorChooser(LocalFrame*,
ColorChooserClient*,
const Color&) = 0;
// This function is used for:
// - Mandatory date/time choosers if InputMultipleFieldsUI flag is not set
// - Date/time choosers for types for which
// LayoutTheme::SupportsCalendarPicker returns true, if
// InputMultipleFieldsUI flag is set
// - <datalist> UI for date/time input types regardless of
// InputMultipleFieldsUI flag
// |LocalFrame| should not be null.
virtual DateTimeChooser* OpenDateTimeChooser(
LocalFrame*,
DateTimeChooserClient*,
const DateTimeChooserParameters&) = 0;
virtual ExternalDateTimeChooser* GetExternalDateTimeChooserForTesting() {
return nullptr;
}
virtual void OpenTextDataListChooser(HTMLInputElement&) = 0;
virtual void OpenFileChooser(LocalFrame*, scoped_refptr<FileChooser>) = 0;
// Pass nullptr as the cc::Layer to detach the root layer.
// This sets the cc::Layer for the LocalFrame's WebWidget, if it has
// one. Otherwise it sets it for the WebViewImpl.
virtual void AttachRootLayer(scoped_refptr<cc::Layer>,
LocalFrame* local_root) = 0;
virtual cc::AnimationHost* GetCompositorAnimationHost(LocalFrame&) const = 0;
virtual cc::AnimationTimeline* GetScrollAnimationTimeline(
LocalFrame&) const = 0;
virtual void EnterFullscreen(LocalFrame&,
const FullscreenOptions*,
FullscreenRequestType) {}
virtual void ExitFullscreen(LocalFrame&) {}
virtual void FullscreenElementChanged(Element* old_element,
Element* new_element,
const FullscreenOptions* options,
FullscreenRequestType) {}
virtual void AnimateDoubleTapZoom(const gfx::Point& point,
const gfx::Rect& rect) {}
// The client keeps track of which touch/mousewheel event types have handlers,
// and if they do, whether the handlers are passive and/or blocking. This
// allows the client to know which optimizations can be used for the
// associated event classes.
virtual void SetEventListenerProperties(LocalFrame*,
cc::EventListenerClass,
cc::EventListenerProperties) = 0;
virtual void SetHasScrollEventHandlers(LocalFrame*, bool) = 0;
virtual void SetNeedsLowLatencyInput(LocalFrame*, bool) = 0;
virtual void SetNeedsUnbufferedInputForDebugger(LocalFrame*, bool) = 0;
virtual void RequestUnbufferedInputEvents(LocalFrame*) = 0;
virtual void SetTouchAction(LocalFrame*, TouchAction) = 0;
virtual void SetPanAction(LocalFrame*,
mojom::blink::PanAction pan_action) = 0;
// Checks if there is an opened popup, called by LayoutMenuList::showPopUp().
virtual bool HasOpenedPopup() const = 0;
virtual PopupMenu* OpenPopupMenu(LocalFrame&, HTMLSelectElement&) = 0;
virtual PagePopup* OpenPagePopup(PagePopupClient*) = 0;
virtual void ClosePagePopup(PagePopup*) = 0;
virtual DOMWindow* PagePopupWindowForTesting() const = 0;
virtual void SetBrowserControlsState(float top_height,
float bottom_height,
bool shrinks_layout) {}
virtual void SetBrowserControlsShownRatio(float top_ratio,
float bottom_ratio) {}
virtual String AcceptLanguages() = 0;
enum class UIElementType {
kAlertDialog = 0,
kConfirmDialog = 1,
kPromptDialog = 2,
kPrintDialog = 3,
kPopup = 4
};
virtual bool ShouldOpenUIElementDuringPageDismissal(
LocalFrame&,
UIElementType,
const String&,
Document::PageDismissalType) const {
return false;
}
virtual bool IsIsolatedSVGChromeClient() const { return false; }
virtual gfx::Size MinimumWindowSize() const { return gfx::Size(100, 100); }
virtual bool IsChromeClientImpl() const { return false; }
virtual void DidChangeFormRelatedElementDynamically(
LocalFrame*,
HTMLElement*,
WebFormRelatedChangeType) {}
virtual void DidChangeValueInTextField(HTMLFormControlElement&) {}
virtual void DidUserChangeContentEditableContent(Element&) {}
virtual void DidEndEditingOnTextField(HTMLInputElement&) {}
virtual void HandleKeyboardEventOnTextField(HTMLInputElement&,
KeyboardEvent&) {}
virtual void TextFieldDataListChanged(HTMLInputElement&) {}
// Called when the selected option of a <select> control is changed as a
// result of user activation - see
// https://html.spec.whatwg.org/multipage/interaction.html#tracking-user-activation
virtual void DidChangeSelectionInSelectControl(HTMLFormControlElement&) {}
virtual void SelectOrSelectListFieldOptionsChanged(HTMLFormControlElement&) {}
virtual void AjaxSucceeded(LocalFrame*) {}
// Called when the value of `element` has been changed by JavaScript.
// `old_value` contains the value before being changed.
// `was_autofilled` is the state of the field prior to the JS change.
// Only called if there is an observable change in the actual value, i.e.
// JavaScript setting it to the current value will not trigger this.
virtual void JavaScriptChangedValue(HTMLFormControlElement&,
const String& old_value,
bool was_autofilled) {}
// Input method editor related functions.
virtual void ShowVirtualKeyboardOnElementFocus(LocalFrame&) {}
virtual gfx::Transform GetDeviceEmulationTransform() const {
return gfx::Transform();
}
virtual void OnMouseDown(Node&) {}
virtual void DidUpdateBrowserControls() const {}
virtual void RegisterPopupOpeningObserver(PopupOpeningObserver*) = 0;
virtual void UnregisterPopupOpeningObserver(PopupOpeningObserver*) = 0;
virtual void NotifyPopupOpeningObservers() const = 0;
virtual gfx::Vector2dF ElasticOverscroll() const { return gfx::Vector2dF(); }
virtual void InstallSupplements(LocalFrame&);
virtual viz::FrameSinkId GetFrameSinkId(LocalFrame*) {
return viz::FrameSinkId();
}
virtual void RequestDecode(LocalFrame*,
const cc::PaintImage& image,
base::OnceCallback<void(bool)> callback) {
std::move(callback).Run(false);
}
// The `callback` will be fired when the corresponding renderer frame for the
// `frame` is presented in the display compositor. If there is no update in
// the frame to be presented, the `callback` will run with the time of the
// failure.
using ReportTimeCallback =
WTF::CrossThreadOnceFunction<void(const viz::FrameTimingDetails&)>;
virtual void NotifyPresentationTime(LocalFrame& frame,
ReportTimeCallback callback) {}
// Enable or disable BeginMainFrameNotExpected signals from the compositor of
// the local root of |frame|. These signals would be consumed by the blink
// scheduler.
virtual void RequestBeginMainFrameNotExpected(LocalFrame& frame,
bool request) = 0;
// A stable numeric Id for |frame|'s local root's compositor. For
// tracing/debugging purposes.
virtual int GetLayerTreeId(LocalFrame& frame) = 0;
virtual void Trace(Visitor*) const;
virtual void DidUpdateTextAutosizerPageInfo(
const mojom::blink::TextAutosizerPageInfo&) {}
virtual void DocumentDetached(Document&) {}
// Return the user's zoom factor which is different from the typical usage
// of "zoom factor" in blink (e.g., |LocalFrame::PageZoomFactor()|) which
// includes CSS zoom and the device scale factor (if use-zoom-for-dsf is
// enabled). This only includes the zoom initiated by the user (ctrl +/-).
virtual double UserZoomFactor() const { return 1; }
virtual void SetDelegatedInkMetadata(
LocalFrame* frame,
std::unique_ptr<gfx::DelegatedInkMetadata> metadata) {}
virtual void FormElementReset(HTMLFormElement& element) {}
virtual void PasswordFieldReset(HTMLInputElement& element) {}
virtual float ZoomFactorForViewportLayout() { return 1; }
protected:
ChromeClient() = default;
virtual void ShowMouseOverURL(const HitTestResult&) = 0;
virtual bool OpenBeforeUnloadConfirmPanelDelegate(LocalFrame*,
bool is_reload) = 0;
virtual bool OpenJavaScriptAlertDelegate(LocalFrame*, const String&) = 0;
virtual bool OpenJavaScriptConfirmDelegate(LocalFrame*, const String&) = 0;
virtual bool OpenJavaScriptPromptDelegate(LocalFrame*,
const String& message,
const String& default_value,
String& result) = 0;
virtual void PrintDelegate(LocalFrame*) = 0;
virtual Page* CreateWindowDelegate(LocalFrame*,
const FrameLoadRequest&,
const AtomicString& frame_name,
const WebWindowFeatures&,
network::mojom::blink::WebSandboxFlags,
const SessionStorageNamespaceId&,
bool& consumed_user_gesture) = 0;
private:
bool CanOpenUIElementIfDuringPageDismissal(Frame& main_frame,
UIElementType,
const String& message);
void UpdateTooltipUnderCursor(LocalFrame&,
const HitTestLocation&,
const HitTestResult&);
WeakMember<Node> last_mouse_over_node_;
PhysicalOffset last_tool_tip_point_;
String last_tool_tip_text_;
// |last_tool_tip_text_| is kept even if ClearToolTip is called. This is for
// the tooltip text that is cleared when ClearToolTip is called.
String current_tool_tip_text_for_test_;
FRIEND_TEST_ALL_PREFIXES(ChromeClientTest, UpdateTooltipUnderCursorFlood);
FRIEND_TEST_ALL_PREFIXES(ChromeClientTest,
UpdateTooltipUnderCursorEmptyString);
};
} // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_CORE_PAGE_CHROME_CLIENT_H_