blob: 96672c1932acac31c05bdc7ccd405bad66dbdb3d [file] [log] [blame]
/*
* Copyright (C) 2009 Google Inc. All rights reserved.
* Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following disclaimer
* in the documentation and/or other materials provided with the
* distribution.
* * Neither the name of Google Inc. nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_PAGE_CHROME_CLIENT_IMPL_H_
#define THIRD_PARTY_BLINK_RENDERER_CORE_PAGE_CHROME_CLIENT_IMPL_H_
#include <memory>
#include "base/gtest_prod_util.h"
#include "cc/input/overscroll_behavior.h"
#include "third_party/blink/public/common/widget/constants.h"
#include "third_party/blink/public/mojom/input/focus_type.mojom-blink-forward.h"
#include "third_party/blink/public/web/web_navigation_policy.h"
#include "third_party/blink/renderer/core/core_export.h"
#include "third_party/blink/renderer/core/page/chrome_client.h"
#include "third_party/blink/renderer/platform/graphics/touch_action.h"
#include "third_party/blink/renderer/platform/heap/collection_support/heap_hash_set.h"
#include "ui/base/cursor/cursor.h"
namespace ui {
class Cursor;
}
namespace blink {
class PagePopup;
class PagePopupClient;
class WebAutofillClient;
class WebViewImpl;
// Handles window-level notifications from core on behalf of a WebView.
class CORE_EXPORT ChromeClientImpl final : public ChromeClient {
public:
explicit ChromeClientImpl(WebViewImpl*);
~ChromeClientImpl() override;
void Trace(Visitor* visitor) const override;
// ChromeClient methods:
WebViewImpl* GetWebView() const override;
void ChromeDestroyed() override;
void SetWindowRect(const gfx::Rect&, LocalFrame&) override;
void Minimize(LocalFrame&) override;
void Maximize(LocalFrame&) override;
void Restore(LocalFrame&) override;
void SetResizable(bool resizable, LocalFrame& frame) override;
gfx::Rect RootWindowRect(LocalFrame&) override;
void DidAccessInitialMainDocument() override;
void FocusPage() override;
void DidFocusPage() override;
bool CanTakeFocus(mojom::blink::FocusType) override;
void TakeFocus(mojom::blink::FocusType) override;
void SetKeyboardFocusURL(Element* new_focus_element) override;
bool SupportsDraggableRegions() override;
void DraggableRegionsChanged() override;
void BeginLifecycleUpdates(LocalFrame& main_frame) override;
void RegisterForCommitObservation(CommitObserver*) override;
void UnregisterFromCommitObservation(CommitObserver*) override;
void WillCommitCompositorFrame() override;
bool StartDeferringCommits(LocalFrame& main_frame,
base::TimeDelta timeout,
cc::PaintHoldingReason reason) override;
void StopDeferringCommits(LocalFrame& main_frame,
cc::PaintHoldingCommitTrigger) override;
std::unique_ptr<cc::ScopedPauseRendering> PauseRendering(
LocalFrame&) override;
std::optional<int> GetMaxRenderBufferBounds(LocalFrame&) const override;
void StartDragging(LocalFrame*,
const WebDragData&,
DragOperationsMask,
const SkBitmap& drag_image,
const gfx::Vector2d& cursor_offset,
const gfx::Rect& drag_obj_rect) override;
bool AcceptsLoadDrops() const override;
Page* CreateWindowDelegate(LocalFrame*,
const FrameLoadRequest&,
const AtomicString& name,
const WebWindowFeatures&,
network::mojom::blink::WebSandboxFlags,
const SessionStorageNamespaceId&,
bool& consumed_user_gesture) override;
void Show(LocalFrame& frame,
LocalFrame& opener_frame,
NavigationPolicy navigation_policy,
bool user_gesture) override;
void DidOverscroll(const gfx::Vector2dF& overscroll_delta,
const gfx::Vector2dF& accumulated_overscroll,
const gfx::PointF& position_in_viewport,
const gfx::Vector2dF& velocity_in_viewport) override;
void SetOverscrollBehavior(LocalFrame& main_frame,
const cc::OverscrollBehavior&) override;
void InjectScrollbarGestureScroll(
LocalFrame& local_frame,
const gfx::Vector2dF& delta,
ui::ScrollGranularity granularity,
CompositorElementId scrollable_area_element_id,
WebInputEvent::Type injected_type) override;
void FinishScrollFocusedEditableIntoView(
const gfx::RectF& caret_rect_in_root_frame,
mojom::blink::ScrollIntoViewParamsPtr params) override;
bool ShouldReportDetailedMessageForSourceAndSeverity(
LocalFrame&,
mojom::blink::ConsoleMessageLevel log_level,
const String&) override;
void AddMessageToConsole(LocalFrame*,
mojom::ConsoleMessageSource,
mojom::ConsoleMessageLevel,
const String& message,
unsigned line_number,
const String& source_id,
const String& stack_trace) override;
bool CanOpenBeforeUnloadConfirmPanel() override;
bool OpenBeforeUnloadConfirmPanelDelegate(LocalFrame*,
bool is_reload) override;
// Used in tests to set a mock value for a before unload confirmation dialog
// box. The value is cleared after being read.
void SetBeforeUnloadConfirmPanelResultForTesting(bool result_success);
void CloseWindow() override;
bool OpenJavaScriptAlertDelegate(LocalFrame*, const String&) override;
bool OpenJavaScriptConfirmDelegate(LocalFrame*, const String&) override;
bool OpenJavaScriptPromptDelegate(LocalFrame*,
const String& message,
const String& default_value,
String& result) override;
bool TabsToLinks() override;
void InvalidateContainer() override;
void ScheduleAnimation(const LocalFrameView*, base::TimeDelta delay) override;
gfx::Rect LocalRootToScreenDIPs(const gfx::Rect&,
const LocalFrameView*) const override;
float WindowToViewportScalar(LocalFrame*, const float) const override;
const display::ScreenInfo& GetScreenInfo(LocalFrame&) const override;
const display::ScreenInfos& GetScreenInfos(LocalFrame&) const override;
float InputEventsScaleForEmulation() const override;
void ContentsSizeChanged(LocalFrame*, const gfx::Size&) const override;
bool DoubleTapToZoomEnabled() const override;
void EnablePreferredSizeChangedMode() override;
void ZoomToFindInPageRect(const gfx::Rect& rect_in_root_frame) override;
void PageScaleFactorChanged() const override;
float ClampPageScaleFactorToLimits(float scale) const override;
void OutermostMainFrameScrollOffsetChanged() const override;
void ResizeAfterLayout() const override;
void MainFrameLayoutUpdated() const override;
void ShowMouseOverURL(const HitTestResult&) override;
void UpdateTooltipUnderCursor(LocalFrame&,
const String&,
TextDirection) override;
void UpdateTooltipFromKeyboard(LocalFrame&,
const String&,
TextDirection,
const gfx::Rect&) override;
void ClearKeyboardTriggeredTooltip(LocalFrame&) override;
void DispatchViewportPropertiesDidChange(
const ViewportDescription&) const override;
void PrintDelegate(LocalFrame*) override;
ColorChooser* OpenColorChooser(LocalFrame*,
ColorChooserClient*,
const Color&) override;
DateTimeChooser* OpenDateTimeChooser(
LocalFrame* frame,
DateTimeChooserClient*,
const DateTimeChooserParameters&) override;
ExternalDateTimeChooser* GetExternalDateTimeChooserForTesting() override;
void OpenFileChooser(LocalFrame*, scoped_refptr<FileChooser>) override;
void SetCursor(const ui::Cursor&, LocalFrame*) override;
void SetCursorOverridden(bool) override;
ui::Cursor LastSetCursorForTesting() const override;
void SetEventListenerProperties(LocalFrame*,
cc::EventListenerClass,
cc::EventListenerProperties) override;
// Informs client about the existence of handlers for scroll events so
// appropriate scroll optimizations can be chosen.
void SetHasScrollEventHandlers(LocalFrame*, bool has_event_handlers) override;
void SetNeedsLowLatencyInput(LocalFrame*, bool needs_low_latency) override;
void SetNeedsUnbufferedInputForDebugger(LocalFrame*, bool immediate) override;
void RequestUnbufferedInputEvents(LocalFrame*) override;
void SetTouchAction(LocalFrame*, TouchAction) override;
void SetPanAction(LocalFrame*, mojom::blink::PanAction pan_action) override;
void AttachRootLayer(scoped_refptr<cc::Layer>,
LocalFrame* local_root) override;
cc::AnimationHost* GetCompositorAnimationHost(LocalFrame&) const override;
cc::AnimationTimeline* GetScrollAnimationTimeline(LocalFrame&) const override;
void EnterFullscreen(LocalFrame&,
const FullscreenOptions*,
FullscreenRequestType) override;
void ExitFullscreen(LocalFrame&) override;
void FullscreenElementChanged(Element* old_element,
Element* new_element,
const FullscreenOptions*,
FullscreenRequestType) override;
void AnimateDoubleTapZoom(const gfx::Point& point,
const gfx::Rect& rect) override;
// ChromeClient methods:
String AcceptLanguages() override;
void SetCursorForPlugin(const ui::Cursor&, LocalFrame*) override;
void SetDelegatedInkMetadata(
LocalFrame* frame,
std::unique_ptr<gfx::DelegatedInkMetadata> metadata) override;
// ChromeClientImpl:
void SetNewWindowNavigationPolicy(WebNavigationPolicy);
// FileChooser calls this function to kick pending file chooser
// requests.
void DidCompleteFileChooser(FileChooser& file_chooser);
void AutoscrollStart(const gfx::PointF& viewport_point, LocalFrame*) override;
void AutoscrollFling(const gfx::Vector2dF& velocity, LocalFrame*) override;
void AutoscrollEnd(LocalFrame*) override;
bool HasOpenedPopup() const override;
PopupMenu* OpenPopupMenu(LocalFrame&, HTMLSelectElement&) override;
PagePopup* OpenPagePopup(PagePopupClient*) override;
void ClosePagePopup(PagePopup*) override;
DOMWindow* PagePopupWindowForTesting() const override;
void SetBrowserControlsState(float top_height,
float bottom_height,
bool shrinks_layout) override;
void SetBrowserControlsShownRatio(float top_ratio,
float bottom_ratio) override;
bool ShouldOpenUIElementDuringPageDismissal(
LocalFrame&,
UIElementType,
const String& dialog_message,
Document::PageDismissalType) const override;
// AutofillClient pass throughs:
void DidChangeFormRelatedElementDynamically(
LocalFrame*,
HTMLElement*,
WebFormRelatedChangeType) override;
void HandleKeyboardEventOnTextField(HTMLInputElement&,
KeyboardEvent&) override;
void DidChangeValueInTextField(HTMLFormControlElement&) override;
void DidUserChangeContentEditableContent(Element&) override;
void DidEndEditingOnTextField(HTMLInputElement&) override;
void OpenTextDataListChooser(HTMLInputElement&) override;
void TextFieldDataListChanged(HTMLInputElement&) override;
void DidChangeSelectionInSelectControl(HTMLFormControlElement&) override;
void SelectOrSelectListFieldOptionsChanged(HTMLFormControlElement&) override;
void AjaxSucceeded(LocalFrame*) override;
void JavaScriptChangedValue(HTMLFormControlElement&,
const String& old_value,
bool was_autofilled) override;
void ShowVirtualKeyboardOnElementFocus(LocalFrame&) override;
gfx::Transform GetDeviceEmulationTransform() const override;
void OnMouseDown(Node&) override;
void DidUpdateBrowserControls() const override;
gfx::Vector2dF ElasticOverscroll() const override;
void RegisterPopupOpeningObserver(PopupOpeningObserver*) override;
void UnregisterPopupOpeningObserver(PopupOpeningObserver*) override;
void NotifyPopupOpeningObservers() const override;
viz::FrameSinkId GetFrameSinkId(LocalFrame*) override;
void RequestDecode(LocalFrame*,
const cc::PaintImage&,
base::OnceCallback<void(bool)>) override;
void NotifyPresentationTime(LocalFrame& frame,
ReportTimeCallback callback) override;
void RequestBeginMainFrameNotExpected(LocalFrame& frame,
bool request) override;
void DidUpdateTextAutosizerPageInfo(
const mojom::blink::TextAutosizerPageInfo& page_info) override;
int GetLayerTreeId(LocalFrame& frame) override;
void DocumentDetached(Document&) override;
double UserZoomFactor() const override;
void FormElementReset(HTMLFormElement& element) override;
void PasswordFieldReset(HTMLInputElement& element) override;
float ZoomFactorForViewportLayout() override;
private:
bool IsChromeClientImpl() const override { return true; }
void SetCursorInternal(const ui::Cursor&, LocalFrame*);
// Returns WebAutofillClient associated with the WebLocalFrame. This takes and
// returns nullable.
WebAutofillClient* AutofillClientFromFrame(LocalFrame*);
// Returns a copy of `pending_rect`, adjusted for the given minimum window
// size. Defaulting to `blink::kMinimumWindowSize`.
gfx::Rect AdjustWindowRectForMinimum(
const gfx::Rect& pending_rect,
int minimum_size = blink::kMinimumWindowSize);
// Returns a copy of |pending_rect|, adjusted for available screen area
// constraints. This is used to synchronously estimate, or preemptively apply,
// anticipated browser- or OS-imposed constraints. Note: This applies legacy
// same-screen constraints; use un-adjusted values if permission-gated
// cross-screen window placement requests may be honored.
// TODO(crbug.com/897300): Use permission state for better sync estimates or
// store unadjusted pending window rects if that will not break many sites.
gfx::Rect AdjustWindowRectForDisplay(
const gfx::Rect& pending_rect,
LocalFrame& frame,
int minimum_size = blink::kMinimumWindowSize);
WebViewImpl* web_view_; // Weak pointer.
HeapHashSet<WeakMember<PopupOpeningObserver>> popup_opening_observers_;
Vector<scoped_refptr<FileChooser>> file_chooser_queue_;
ui::Cursor last_set_mouse_cursor_for_testing_;
bool cursor_overridden_;
Member<ExternalDateTimeChooser> external_date_time_chooser_;
bool did_request_non_empty_tool_tip_;
std::optional<bool> before_unload_confirm_panel_result_for_testing_;
HeapHashSet<WeakMember<CommitObserver>> commit_observers_;
FRIEND_TEST_ALL_PREFIXES(FileChooserQueueTest, DerefQueuedChooser);
};
template <>
struct DowncastTraits<ChromeClientImpl> {
static bool AllowFrom(const ChromeClient& client) {
return client.IsChromeClientImpl();
}
};
} // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_CORE_PAGE_CHROME_CLIENT_IMPL_H_