diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2020-10-12 14:27:29 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2020-10-13 09:35:20 +0000 |
commit | c30a6232df03e1efbd9f3b226777b07e087a1122 (patch) | |
tree | e992f45784689f373bcc38d1b79a239ebe17ee23 /chromium/third_party/blink/renderer/core/exported | |
parent | 7b5b123ac58f58ffde0f4f6e488bcd09aa4decd3 (diff) | |
download | qtwebengine-chromium-85-based.tar.gz |
BASELINE: Update Chromium to 85.0.4183.14085-based
Change-Id: Iaa42f4680837c57725b1344f108c0196741f6057
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'chromium/third_party/blink/renderer/core/exported')
35 files changed, 1056 insertions, 552 deletions
diff --git a/chromium/third_party/blink/renderer/core/exported/BUILD.gn b/chromium/third_party/blink/renderer/core/exported/BUILD.gn index f1ed480efe6..e597f828369 100644 --- a/chromium/third_party/blink/renderer/core/exported/BUILD.gn +++ b/chromium/third_party/blink/renderer/core/exported/BUILD.gn @@ -62,6 +62,7 @@ blink_core_sources("exported") { "web_remote_frame_impl.cc", "web_remote_frame_impl.h", "web_render_theme.cc", + "web_savable_resources_test_support.cc", "web_scoped_page_pauser.cc", "web_scoped_window_focus_allowed_indicator.cc", "web_script_controller.cc", @@ -86,7 +87,7 @@ blink_core_sources("exported") { } deps = [ - "//ui/base/cursor", + "//ui/base/cursor:cursor_base", "//ui/base/cursor/mojom:cursor_type_blink", ] diff --git a/chromium/third_party/blink/renderer/core/exported/local_frame_client_impl.cc b/chromium/third_party/blink/renderer/core/exported/local_frame_client_impl.cc index e8cc8ddcd59..adc00866f43 100644 --- a/chromium/third_party/blink/renderer/core/exported/local_frame_client_impl.cc +++ b/chromium/third_party/blink/renderer/core/exported/local_frame_client_impl.cc @@ -74,6 +74,7 @@ #include "third_party/blink/renderer/core/frame/local_dom_window.h" #include "third_party/blink/renderer/core/frame/local_frame_view.h" #include "third_party/blink/renderer/core/frame/settings.h" +#include "third_party/blink/renderer/core/frame/web_frame_widget_base.h" #include "third_party/blink/renderer/core/frame/web_local_frame_impl.h" #include "third_party/blink/renderer/core/fullscreen/fullscreen.h" #include "third_party/blink/renderer/core/html/html_frame_element_base.h" @@ -204,6 +205,20 @@ WebString ConvertToPublic( return "navigate-to"; case CSPDirectiveName::FrameAncestors: return "frame-ancestors"; + case CSPDirectiveName::ImgSrc: + return "img-src"; + case CSPDirectiveName::MediaSrc: + return "media-src"; + case CSPDirectiveName::ObjectSrc: + return "object-src"; + case CSPDirectiveName::ScriptSrc: + return "script-src"; + case CSPDirectiveName::StyleSrc: + return "style-src"; + case CSPDirectiveName::WorkerSrc: + return "worker-src"; + case CSPDirectiveName::ConnectSrc: + return "connect-src"; case CSPDirectiveName::Unknown: NOTREACHED(); return ""; @@ -238,7 +253,7 @@ LocalFrameClientImpl::LocalFrameClientImpl(WebLocalFrameImpl* frame) LocalFrameClientImpl::~LocalFrameClientImpl() = default; -void LocalFrameClientImpl::Trace(Visitor* visitor) { +void LocalFrameClientImpl::Trace(Visitor* visitor) const { visitor->Trace(web_frame_); LocalFrameClient::Trace(visitor); } @@ -391,13 +406,6 @@ Frame* LocalFrameClientImpl::Opener() const { return ToCoreFrame(web_frame_->Opener()); } -void LocalFrameClientImpl::SetOpener(Frame* opener) { - WebFrame* opener_frame = WebFrame::FromFrame(opener); - if (web_frame_->Client() && web_frame_->Opener() != opener_frame) - web_frame_->Client()->DidChangeOpener(opener_frame); - web_frame_->SetOpener(opener_frame); -} - Frame* LocalFrameClientImpl::Parent() const { return ToCoreFrame(web_frame_->Parent()); } @@ -562,7 +570,7 @@ void LocalFrameClientImpl::BeginNavigation( navigation_info->triggering_event_info = triggering_event_info; navigation_info->should_check_main_world_content_security_policy = should_check_main_world_content_security_policy; - navigation_info->blob_url_token = blob_url_token.PassPipe(); + navigation_info->blob_url_token = std::move(blob_url_token); navigation_info->input_start = input_start_time; if (origin_document && origin_document->GetFrame()) { navigation_info->initiator_frame = @@ -943,15 +951,6 @@ void LocalFrameClientImpl::DidChangeName(const String& name) { web_frame_->Client()->DidChangeName(name); } -void LocalFrameClientImpl::DidChangeFramePolicy( - Frame* child_frame, - const FramePolicy& frame_policy) { - if (!web_frame_->Client()) - return; - web_frame_->Client()->DidChangeFramePolicy(WebFrame::FromFrame(child_frame), - frame_policy); -} - void LocalFrameClientImpl::DidSetFramePolicyHeaders( network::mojom::blink::WebSandboxFlags sandbox_flags, const ParsedFeaturePolicy& feature_policy_header, @@ -1051,9 +1050,9 @@ String LocalFrameClientImpl::evaluateInInspectorOverlayForTesting( } bool LocalFrameClientImpl::HandleCurrentKeyboardEvent() { - if (web_frame_->Client()) - return web_frame_->Client()->HandleCurrentKeyboardEvent(); - return false; + return web_frame_->LocalRoot() + ->FrameWidgetImpl() + ->HandleCurrentKeyboardEvent(); } void LocalFrameClientImpl::DidChangeSelection(bool is_selection_empty) { @@ -1122,6 +1121,14 @@ LocalFrameClientImpl::CreateWorkerContentSettingsClient() { return web_frame_->Client()->CreateWorkerContentSettingsClient(); } +std::unique_ptr<media::SpeechRecognitionClient> +LocalFrameClientImpl::CreateSpeechRecognitionClient( + media::SpeechRecognitionClient::OnReadyCallback callback) { + DCHECK(web_frame_->Client()); + return web_frame_->Client()->CreateSpeechRecognitionClient( + std::move(callback)); +} + void LocalFrameClientImpl::SetMouseCapture(bool capture) { web_frame_->Client()->SetMouseCapture(capture); } diff --git a/chromium/third_party/blink/renderer/core/exported/local_frame_client_impl.h b/chromium/third_party/blink/renderer/core/exported/local_frame_client_impl.h index cac29c6af0f..23a196c7216 100644 --- a/chromium/third_party/blink/renderer/core/exported/local_frame_client_impl.h +++ b/chromium/third_party/blink/renderer/core/exported/local_frame_client_impl.h @@ -54,12 +54,12 @@ class WebLocalFrameImpl; class WebSpellCheckPanelHostClient; enum class GlobalObjectReusePolicy; -class LocalFrameClientImpl final : public LocalFrameClient { +class CORE_EXPORT LocalFrameClientImpl final : public LocalFrameClient { public: explicit LocalFrameClientImpl(WebLocalFrameImpl*); ~LocalFrameClientImpl() override; - void Trace(Visitor*) override; + void Trace(Visitor*) const override; WebLocalFrameImpl* GetWebFrame() const override; @@ -87,7 +87,6 @@ class LocalFrameClientImpl final : public LocalFrameClient { bool HasWebView() const override; bool InShadowTree() const override; Frame* Opener() const override; - void SetOpener(Frame*) override; Frame* Parent() const override; Frame* Top() const override; Frame* NextSibling() const override; @@ -201,7 +200,6 @@ class LocalFrameClientImpl final : public LocalFrameClient { bool AllowContentInitiatedDataUrlNavigations(const KURL&) override; void DidChangeName(const String&) override; - void DidChangeFramePolicy(Frame* child_frame, const FramePolicy&) override; void DidSetFramePolicyHeaders( network::mojom::blink::WebSandboxFlags, const ParsedFeaturePolicy& fp_header, @@ -268,6 +266,9 @@ class LocalFrameClientImpl final : public LocalFrameClient { std::unique_ptr<WebContentSettingsClient> CreateWorkerContentSettingsClient() override; + std::unique_ptr<media::SpeechRecognitionClient> CreateSpeechRecognitionClient( + media::SpeechRecognitionClient::OnReadyCallback callback) override; + void SetMouseCapture(bool capture) override; bool UsePrintingLayout() const override; diff --git a/chromium/third_party/blink/renderer/core/exported/web_dev_tools_agent_impl.cc b/chromium/third_party/blink/renderer/core/exported/web_dev_tools_agent_impl.cc index 8681f8fc39a..7fdd2692f55 100644 --- a/chromium/third_party/blink/renderer/core/exported/web_dev_tools_agent_impl.cc +++ b/chromium/third_party/blink/renderer/core/exported/web_dev_tools_agent_impl.cc @@ -338,7 +338,7 @@ WebDevToolsAgentImpl::WebDevToolsAgentImpl( WebDevToolsAgentImpl::~WebDevToolsAgentImpl() {} -void WebDevToolsAgentImpl::Trace(Visitor* visitor) { +void WebDevToolsAgentImpl::Trace(Visitor* visitor) const { visitor->Trace(agent_); visitor->Trace(network_agents_); visitor->Trace(page_agents_); diff --git a/chromium/third_party/blink/renderer/core/exported/web_dev_tools_agent_impl.h b/chromium/third_party/blink/renderer/core/exported/web_dev_tools_agent_impl.h index 78f38f0b9c3..6bde1bb591c 100644 --- a/chromium/third_party/blink/renderer/core/exported/web_dev_tools_agent_impl.h +++ b/chromium/third_party/blink/renderer/core/exported/web_dev_tools_agent_impl.h @@ -69,7 +69,7 @@ class CORE_EXPORT WebDevToolsAgentImpl final WebDevToolsAgentImpl(WebLocalFrameImpl*, bool include_view_agents); ~WebDevToolsAgentImpl() override; - virtual void Trace(Visitor*); + virtual void Trace(Visitor*) const; DevToolsAgent* GetDevToolsAgent() const { return agent_.Get(); } void WillBeDestroyed(); diff --git a/chromium/third_party/blink/renderer/core/exported/web_document.cc b/chromium/third_party/blink/renderer/core/exported/web_document.cc index fa67cdafef0..2a8df3bf4c0 100644 --- a/chromium/third_party/blink/renderer/core/exported/web_document.cc +++ b/chromium/third_party/blink/renderer/core/exported/web_document.cc @@ -90,7 +90,7 @@ WebSecurityOrigin WebDocument::GetSecurityOrigin() const { bool WebDocument::IsSecureContext() const { const Document* document = ConstUnwrap<Document>(); - return document && document->IsSecureContext(); + return document && document->GetExecutionContext()->IsSecureContext(); } WebString WebDocument::Encoding() const { @@ -233,11 +233,12 @@ void WebDocument::WatchCSSSelectors(const WebVector<WebString>& web_selectors) { } network::mojom::ReferrerPolicy WebDocument::GetReferrerPolicy() const { - return ConstUnwrap<Document>()->GetReferrerPolicy(); + return ConstUnwrap<Document>()->GetExecutionContext()->GetReferrerPolicy(); } WebString WebDocument::OutgoingReferrer() { - return WebString(Unwrap<Document>()->OutgoingReferrer()); + return WebString( + Unwrap<Document>()->GetExecutionContext()->OutgoingReferrer()); } WebVector<WebDraggableRegion> WebDocument::DraggableRegions() const { diff --git a/chromium/third_party/blink/renderer/core/exported/web_document_loader_impl.cc b/chromium/third_party/blink/renderer/core/exported/web_document_loader_impl.cc index 5f0864cc2c8..277bc8b1718 100644 --- a/chromium/third_party/blink/renderer/core/exported/web_document_loader_impl.cc +++ b/chromium/third_party/blink/renderer/core/exported/web_document_loader_impl.cc @@ -196,7 +196,7 @@ bool WebDocumentLoaderImpl::IsListingFtpDirectory() const { return DocumentLoader::IsListingFtpDirectory(); } -void WebDocumentLoaderImpl::Trace(Visitor* visitor) { +void WebDocumentLoaderImpl::Trace(Visitor* visitor) const { DocumentLoader::Trace(visitor); } diff --git a/chromium/third_party/blink/renderer/core/exported/web_document_loader_impl.h b/chromium/third_party/blink/renderer/core/exported/web_document_loader_impl.h index cfef7567b18..16549497a87 100644 --- a/chromium/third_party/blink/renderer/core/exported/web_document_loader_impl.h +++ b/chromium/third_party/blink/renderer/core/exported/web_document_loader_impl.h @@ -90,7 +90,7 @@ class CORE_EXPORT WebDocumentLoaderImpl final : public DocumentLoader, bool HadUserGesture() const override; bool IsListingFtpDirectory() const override; - void Trace(Visitor*) override; + void Trace(Visitor*) const override; private: ~WebDocumentLoaderImpl() override; diff --git a/chromium/third_party/blink/renderer/core/exported/web_document_subresource_filter_test.cc b/chromium/third_party/blink/renderer/core/exported/web_document_subresource_filter_test.cc index a14aabd78ea..78eb4796198 100644 --- a/chromium/third_party/blink/renderer/core/exported/web_document_subresource_filter_test.cc +++ b/chromium/third_party/blink/renderer/core/exported/web_document_subresource_filter_test.cc @@ -36,7 +36,7 @@ class TestDocumentSubresourceFilter : public WebDocumentSubresourceFilter { queried_subresource_paths_.push_back(resource_path); } String resource_string = resource_url.GetString(); - for (const String& suffix : blacklisted_suffixes_) { + for (const String& suffix : blocklisted_suffixes_) { if (resource_string.EndsWith(suffix)) return load_policy_; } @@ -51,8 +51,8 @@ class TestDocumentSubresourceFilter : public WebDocumentSubresourceFilter { bool ShouldLogToConsole() override { return false; } - void AddToBlacklist(const String& suffix) { - blacklisted_suffixes_.push_back(suffix); + void AddToBlocklist(const String& suffix) { + blocklisted_suffixes_.push_back(suffix); } const Vector<String>& QueriedSubresourcePaths() const { @@ -62,7 +62,7 @@ class TestDocumentSubresourceFilter : public WebDocumentSubresourceFilter { private: // Using STL types for compatibility with gtest/gmock. Vector<String> queried_subresource_paths_; - Vector<String> blacklisted_suffixes_; + Vector<String> blocklisted_suffixes_; LoadPolicy load_policy_; }; @@ -74,7 +74,7 @@ class SubresourceFilteringWebFrameClient bool) override { subresource_filter_ = new TestDocumentSubresourceFilter(load_policy_for_next_load_); - subresource_filter_->AddToBlacklist("1x1.png"); + subresource_filter_->AddToBlocklist("1x1.png"); Frame()->GetDocumentLoader()->SetSubresourceFilter(subresource_filter_); } diff --git a/chromium/third_party/blink/renderer/core/exported/web_dom_message_event.cc b/chromium/third_party/blink/renderer/core/exported/web_dom_message_event.cc index 7b2058b124a..e7ff1a4c527 100644 --- a/chromium/third_party/blink/renderer/core/exported/web_dom_message_event.cc +++ b/chromium/third_party/blink/renderer/core/exported/web_dom_message_event.cc @@ -67,61 +67,8 @@ WebDOMMessageEvent::WebDOMMessageEvent( ports, nullptr /*user_activation*/); } -WebDOMMessageEvent::WebDOMMessageEvent(TransferableMessage message, - const WebString& origin, - const WebFrame* source_frame, - const WebDocument& target_document) - : WebDOMMessageEvent(MessageEvent::Create(), - message.locked_agent_cluster_id) { - DOMWindow* window = nullptr; - if (source_frame) - window = WebFrame::ToCoreFrame(*source_frame)->DomWindow(); - BlinkTransferableMessage msg = ToBlinkTransferableMessage(std::move(message)); - MessagePortArray* ports = nullptr; - if (!target_document.IsNull()) { - Document* core_document = target_document; - ports = MessagePort::EntanglePorts(*core_document->GetExecutionContext(), - std::move(msg.ports)); - } - - UserActivation* user_activation = nullptr; - if (msg.user_activation) { - user_activation = MakeGarbageCollected<UserActivation>( - msg.user_activation->has_been_active, msg.user_activation->was_active); - } - - // TODO(esprehn): Chromium always passes empty string for lastEventId, is that - // right? - Unwrap<MessageEvent>()->initMessageEvent( - "message", false, false, std::move(msg.message), origin, - "" /*lastEventId*/, window, ports, user_activation, - msg.transfer_user_activation, msg.allow_autoplay); - - // If the agent cluster id had a value it means this was locked when it - // was serialized. - if (locked_agent_cluster_id_.has_value()) - Unwrap<MessageEvent>()->LockToAgentCluster(); -} - WebString WebDOMMessageEvent::Origin() const { return WebString(ConstUnwrap<MessageEvent>()->origin()); } -TransferableMessage WebDOMMessageEvent::AsMessage() { - BlinkTransferableMessage msg; - msg.message = Unwrap<MessageEvent>()->DataAsSerializedScriptValue(); - msg.ports = Unwrap<MessageEvent>()->ReleaseChannels(); - msg.transfer_user_activation = - Unwrap<MessageEvent>()->transferUserActivation(); - msg.allow_autoplay = Unwrap<MessageEvent>()->allowAutoplay(); - msg.locked_agent_cluster_id = locked_agent_cluster_id_; - UserActivation* user_activation = Unwrap<MessageEvent>()->userActivation(); - TransferableMessage transferable_msg = ToTransferableMessage(std::move(msg)); - if (user_activation) { - transferable_msg.user_activation = mojom::UserActivationSnapshot::New( - user_activation->hasBeenActive(), user_activation->isActive()); - } - return transferable_msg; -} - } // namespace blink diff --git a/chromium/third_party/blink/renderer/core/exported/web_external_widget_impl.cc b/chromium/third_party/blink/renderer/core/exported/web_external_widget_impl.cc index 7ba828c0f6f..9b889b9037f 100644 --- a/chromium/third_party/blink/renderer/core/exported/web_external_widget_impl.cc +++ b/chromium/third_party/blink/renderer/core/exported/web_external_widget_impl.cc @@ -6,6 +6,7 @@ #include "cc/trees/layer_tree_host.h" #include "cc/trees/ukm_manager.h" +#include "third_party/blink/public/mojom/input/input_handler.mojom-blink.h" #include "third_party/blink/public/platform/scheduler/web_render_widget_scheduling_state.h" #include "third_party/blink/renderer/platform/widget/widget_base.h" @@ -97,6 +98,65 @@ void WebExternalWidgetImpl::SetCursor(const ui::Cursor& cursor) { widget_base_->SetCursor(cursor); } +bool WebExternalWidgetImpl::HandlingInputEvent() { + return widget_base_->input_handler().handling_input_event(); +} + +void WebExternalWidgetImpl::SetHandlingInputEvent(bool handling) { + widget_base_->input_handler().set_handling_input_event(handling); +} + +void WebExternalWidgetImpl::ProcessInputEventSynchronously( + const WebCoalescedInputEvent& event, + HandledEventCallback callback) { + widget_base_->input_handler().HandleInputEvent(event, std::move(callback)); +} + +void WebExternalWidgetImpl::UpdateTextInputState() { + widget_base_->UpdateTextInputState(); +} + +void WebExternalWidgetImpl::UpdateCompositionInfo() { + widget_base_->UpdateCompositionInfo(/*immediate_request=*/false); +} + +void WebExternalWidgetImpl::UpdateSelectionBounds() { + widget_base_->UpdateSelectionBounds(); +} + +void WebExternalWidgetImpl::ShowVirtualKeyboard() { + widget_base_->ShowVirtualKeyboard(); +} + +void WebExternalWidgetImpl::ForceTextInputStateUpdate() { + widget_base_->ForceTextInputStateUpdate(); +} + +void WebExternalWidgetImpl::RequestCompositionUpdates(bool immediate_request, + bool monitor_updates) { + widget_base_->RequestCompositionUpdates(immediate_request, monitor_updates); +} + +void WebExternalWidgetImpl::SetFocus(bool focus) { + widget_base_->SetFocus(focus); +} + +bool WebExternalWidgetImpl::HasFocus() { + return widget_base_->has_focus(); +} + +void WebExternalWidgetImpl::DidOverscrollForTesting( + const gfx::Vector2dF& overscroll_delta, + const gfx::Vector2dF& accumulated_overscroll, + const gfx::PointF& position, + const gfx::Vector2dF& velocity) { + cc::OverscrollBehavior overscroll_behavior = + widget_base_->LayerTreeHost()->overscroll_behavior(); + widget_base_->input_handler().DidOverscrollFromBlink( + overscroll_delta, accumulated_overscroll, position, velocity, + overscroll_behavior); +} + void WebExternalWidgetImpl::SetRootLayer(scoped_refptr<cc::Layer> layer) { widget_base_->LayerTreeHost()->SetNonBlinkManagedRootLayer(layer); } @@ -115,4 +175,50 @@ void WebExternalWidgetImpl::DidCommitAndDrawCompositorFrame() { client_->DidCommitAndDrawCompositorFrame(); } +bool WebExternalWidgetImpl::WillHandleGestureEvent( + const WebGestureEvent& event) { + return client_->WillHandleGestureEvent(event); +} + +bool WebExternalWidgetImpl::WillHandleMouseEvent(const WebMouseEvent& event) { + return false; +} + +void WebExternalWidgetImpl::ObserveGestureEventAndResult( + const WebGestureEvent& gesture_event, + const gfx::Vector2dF& unused_delta, + const cc::OverscrollBehavior& overscroll_behavior, + bool event_processed) { + client_->DidHandleGestureScrollEvent(gesture_event, unused_delta, + overscroll_behavior, event_processed); +} + +bool WebExternalWidgetImpl::SupportsBufferedTouchEvents() { + return client_->SupportsBufferedTouchEvents(); +} + +void WebExternalWidgetImpl::QueueSyntheticEvent( + std::unique_ptr<blink::WebCoalescedInputEvent>) {} + +void WebExternalWidgetImpl::GetWidgetInputHandler( + mojo::PendingReceiver<mojom::blink::WidgetInputHandler> request, + mojo::PendingRemote<mojom::blink::WidgetInputHandlerHost> host) { + client_->GetWidgetInputHandler(std::move(request), std::move(host)); +} + +bool WebExternalWidgetImpl::HasCurrentImeGuard( + bool request_to_show_virtual_keyboard) { + return client_->HasCurrentImeGuard(request_to_show_virtual_keyboard); +} + +void WebExternalWidgetImpl::SendCompositionRangeChanged( + const gfx::Range& range, + const std::vector<gfx::Rect>& character_bounds) { + client_->SendCompositionRangeChanged(range, character_bounds); +} + +void WebExternalWidgetImpl::FocusChanged(bool enabled) { + client_->FocusChanged(enabled); +} + } // namespace blink diff --git a/chromium/third_party/blink/renderer/core/exported/web_external_widget_impl.h b/chromium/third_party/blink/renderer/core/exported/web_external_widget_impl.h index 7b6ce058a13..61958dffb1f 100644 --- a/chromium/third_party/blink/renderer/core/exported/web_external_widget_impl.h +++ b/chromium/third_party/blink/renderer/core/exported/web_external_widget_impl.h @@ -45,6 +45,24 @@ class WebExternalWidgetImpl : public WebExternalWidget, scheduler::WebRenderWidgetSchedulingState* RendererWidgetSchedulingState() override; void SetCursor(const ui::Cursor& cursor) override; + bool HandlingInputEvent() override; + void SetHandlingInputEvent(bool handling) override; + void ProcessInputEventSynchronously(const WebCoalescedInputEvent&, + HandledEventCallback) override; + void DidOverscrollForTesting( + const gfx::Vector2dF& overscroll_delta, + const gfx::Vector2dF& accumulated_overscroll, + const gfx::PointF& position_in_viewport, + const gfx::Vector2dF& velocity_in_viewport) override; + void UpdateTextInputState() override; + void UpdateCompositionInfo() override; + void UpdateSelectionBounds() override; + void ShowVirtualKeyboard() override; + void ForceTextInputStateUpdate() override; + void RequestCompositionUpdates(bool immediate_request, + bool monitor_updates) override; + bool HasFocus() override; + void SetFocus(bool focus) override; // WebExternalWidget overrides: void SetRootLayer(scoped_refptr<cc::Layer>) override; @@ -58,6 +76,24 @@ class WebExternalWidgetImpl : public WebExternalWidget, void RequestNewLayerTreeFrameSink( LayerTreeFrameSinkCallback callback) override; void DidCommitAndDrawCompositorFrame() override; + bool WillHandleGestureEvent(const WebGestureEvent& event) override; + bool WillHandleMouseEvent(const WebMouseEvent& event) override; + void ObserveGestureEventAndResult( + const WebGestureEvent& gesture_event, + const gfx::Vector2dF& unused_delta, + const cc::OverscrollBehavior& overscroll_behavior, + bool event_processed) override; + bool SupportsBufferedTouchEvents() override; + void QueueSyntheticEvent( + std::unique_ptr<blink::WebCoalescedInputEvent>) override; + void GetWidgetInputHandler( + mojo::PendingReceiver<mojom::blink::WidgetInputHandler> request, + mojo::PendingRemote<mojom::blink::WidgetInputHandlerHost> host) override; + bool HasCurrentImeGuard(bool request_to_show_virtual_keyboard) override; + void SendCompositionRangeChanged( + const gfx::Range& range, + const std::vector<gfx::Rect>& character_bounds) override; + void FocusChanged(bool enabled) override; private: WebExternalWidgetClient* const client_; diff --git a/chromium/third_party/blink/renderer/core/exported/web_form_element_observer_impl.cc b/chromium/third_party/blink/renderer/core/exported/web_form_element_observer_impl.cc index af156496334..c4f6df8a2f8 100644 --- a/chromium/third_party/blink/renderer/core/exported/web_form_element_observer_impl.cc +++ b/chromium/third_party/blink/renderer/core/exported/web_form_element_observer_impl.cc @@ -27,7 +27,7 @@ class WebFormElementObserverImpl::ObserverCallback void Disconnect(); - void Trace(Visitor*) override; + void Trace(Visitor*) const override; private: Member<HTMLElement> element_; @@ -98,7 +98,7 @@ void WebFormElementObserverImpl::ObserverCallback::Disconnect() { } void WebFormElementObserverImpl::ObserverCallback::Trace( - blink::Visitor* visitor) { + blink::Visitor* visitor) const { visitor->Trace(element_); visitor->Trace(parents_); visitor->Trace(mutation_observer_); @@ -138,7 +138,7 @@ void WebFormElementObserverImpl::Disconnect() { self_keep_alive_.Clear(); } -void WebFormElementObserverImpl::Trace(Visitor* visitor) { +void WebFormElementObserverImpl::Trace(Visitor* visitor) const { visitor->Trace(mutation_callback_); } diff --git a/chromium/third_party/blink/renderer/core/exported/web_form_element_observer_impl.h b/chromium/third_party/blink/renderer/core/exported/web_form_element_observer_impl.h index 90c03eeb302..b8ae2bf04a7 100644 --- a/chromium/third_party/blink/renderer/core/exported/web_form_element_observer_impl.h +++ b/chromium/third_party/blink/renderer/core/exported/web_form_element_observer_impl.h @@ -29,7 +29,7 @@ class CORE_EXPORT WebFormElementObserverImpl final // WebFormElementObserver implementation. void Disconnect() override; - virtual void Trace(Visitor*); + virtual void Trace(Visitor*) const; private: class ObserverCallback; diff --git a/chromium/third_party/blink/renderer/core/exported/web_frame_test.cc b/chromium/third_party/blink/renderer/core/exported/web_frame_test.cc index 195abffa156..89127f5cf59 100644 --- a/chromium/third_party/blink/renderer/core/exported/web_frame_test.cc +++ b/chromium/third_party/blink/renderer/core/exported/web_frame_test.cc @@ -41,6 +41,7 @@ #include "build/build_config.h" #include "cc/input/overscroll_behavior.h" #include "cc/layers/picture_layer.h" +#include "cc/paint/paint_op_buffer.h" #include "cc/trees/layer_tree_host.h" #include "cc/trees/scroll_node.h" #include "mojo/public/cpp/bindings/pending_remote.h" @@ -82,6 +83,7 @@ #include "third_party/blink/public/web/web_local_frame.h" #include "third_party/blink/public/web/web_local_frame_client.h" #include "third_party/blink/public/web/web_navigation_timings.h" +#include "third_party/blink/public/web/web_print_page_description.h" #include "third_party/blink/public/web/web_print_params.h" #include "third_party/blink/public/web/web_range.h" #include "third_party/blink/public/web/web_remote_frame.h" @@ -94,6 +96,7 @@ #include "third_party/blink/public/web/web_text_checking_completion.h" #include "third_party/blink/public/web/web_text_checking_result.h" #include "third_party/blink/public/web/web_view_client.h" +#include "third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value.h" #include "third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value_factory.h" #include "third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_serializer.h" #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h" @@ -117,6 +120,7 @@ #include "third_party/blink/renderer/core/editing/selection_template.h" #include "third_party/blink/renderer/core/editing/spellcheck/idle_spell_check_controller.h" #include "third_party/blink/renderer/core/editing/spellcheck/spell_checker.h" +#include "third_party/blink/renderer/core/events/message_event.h" #include "third_party/blink/renderer/core/events/mouse_event.h" #include "third_party/blink/renderer/core/exported/web_remote_frame_impl.h" #include "third_party/blink/renderer/core/exported/web_view_impl.h" @@ -176,6 +180,7 @@ #include "third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h" #include "third_party/blink/renderer/platform/loader/fetch/resource_fetcher_properties.h" #include "third_party/blink/renderer/platform/loader/fetch/resource_timing_info.h" +#include "third_party/blink/renderer/platform/runtime_enabled_features.h" #include "third_party/blink/renderer/platform/scheduler/public/thread.h" #include "third_party/blink/renderer/platform/testing/histogram_tester.h" #include "third_party/blink/renderer/platform/testing/unit_test_helpers.h" @@ -186,6 +191,7 @@ #include "third_party/blink/renderer/platform/wtf/forward.h" #include "third_party/blink/renderer/platform/wtf/hash_map.h" #include "third_party/blink/renderer/platform/wtf/hash_set.h" +#include "ui/base/ime/mojom/text_input_state.mojom-blink.h" #include "ui/events/keycodes/dom/dom_key.h" #include "v8/include/v8.h" @@ -1122,24 +1128,26 @@ TEST_F(WebFrameTest, PostMessageEvent) { frame_test_helpers::WebViewHelper web_view_helper; web_view_helper.InitializeAndLoad(base_url_ + "postmessage_test.html"); - WebSerializedScriptValue data(WebSerializedScriptValue::CreateInvalid()); - WebDOMMessageEvent message(data, "http://origin.com"); auto* frame = To<LocalFrame>(web_view_helper.GetWebView()->GetPage()->MainFrame()); + scoped_refptr<SerializedScriptValue> data = SerializedScriptValue::Create(); + MessageEvent* message_event = MessageEvent::Create( + /*ports=*/nullptr, std::move(data), "http://origin.com"); + // Send a message with the correct origin. scoped_refptr<SecurityOrigin> correct_origin = SecurityOrigin::Create(ToKURL(base_url_)); - frame->PostMessageEvent(base::nullopt, g_empty_string, - correct_origin->ToString(), - ToBlinkTransferableMessage(message.AsMessage())); + frame->PostMessageEvent( + base::nullopt, g_empty_string, correct_origin->ToString(), + BlinkTransferableMessage::FromMessageEvent(message_event)); // Send another message with incorrect origin. scoped_refptr<SecurityOrigin> incorrect_origin = SecurityOrigin::Create(ToKURL(chrome_url_)); - frame->PostMessageEvent(base::nullopt, g_empty_string, - incorrect_origin->ToString(), - ToBlinkTransferableMessage(message.AsMessage())); + frame->PostMessageEvent( + base::nullopt, g_empty_string, incorrect_origin->ToString(), + BlinkTransferableMessage::FromMessageEvent(message_event)); // Verify that only the first addition is in the body of the page. std::string content = WebFrameContentDumper::DumpWebViewAsText( @@ -4561,6 +4569,11 @@ TEST_F(WebFrameTest, ContextNotificationsIsolatedWorlds) { ASSERT_NE(web_view_helper.LocalMainFrame()->MainWorldScriptContext(), v8::Local<v8::Context>::New(isolate, notification->context)); + // Check that the context we got has the right isolated world id. + ASSERT_EQ(isolated_world_id, + web_view_helper.LocalMainFrame()->GetScriptContextWorldId( + v8::Local<v8::Context>::New(isolate, notification->context))); + web_view_helper.Reset(); // We should have gotten three release notifications (one for each of the @@ -5195,7 +5208,7 @@ TEST_F(WebFrameTest, FindInPageJavaScriptUpdatesDOM) { EXPECT_TRUE(find_in_page_client.FindResultsAreReady()); // Find in a <div> element. - options->find_next = true; + options->new_session = false; EXPECT_TRUE(frame->GetFindInPage()->FindInternal( kFindIdentifier, search_text, *options, false, &active_now)); EXPECT_TRUE(active_now); @@ -5248,7 +5261,7 @@ TEST_F(WebFrameTest, FindInPageJavaScriptUpdatesDOMProperOrdinal) { auto options = mojom::blink::FindOptions::New(); options->run_synchronously_for_testing = true; - options->find_next = false; + options->new_session = true; options->forward = true; // The first search that will start the scoping process. frame->GetFindInPage()->Find(kFindIdentifier, search_pattern, @@ -5259,7 +5272,7 @@ TEST_F(WebFrameTest, FindInPageJavaScriptUpdatesDOMProperOrdinal) { EXPECT_EQ(2, find_in_page_client.Count()); EXPECT_EQ(1, find_in_page_client.ActiveIndex()); - options->find_next = true; + options->new_session = false; // The second search will jump to the next match without any scoping. frame->GetFindInPage()->Find(kFindIdentifier, search_pattern, options->Clone()); @@ -5327,7 +5340,7 @@ TEST_F(WebFrameTest, FindInPageForcedRedoOfFindInPage) { auto options = mojom::blink::FindOptions::New(); options->run_synchronously_for_testing = true; - options->find_next = false; + options->new_session = true; options->forward = true; // First run. frame->GetFindInPage()->Find(kFindIdentifier, search_pattern, @@ -5343,7 +5356,7 @@ TEST_F(WebFrameTest, FindInPageForcedRedoOfFindInPage) { EXPECT_EQ(2, find_in_page_client.Count()); EXPECT_EQ(1, find_in_page_client.ActiveIndex()); - options->find_next = true; + options->new_session = false; options->force = false; frame->GetFindInPage()->Find(kFindIdentifier, search_pattern, @@ -5352,7 +5365,7 @@ TEST_F(WebFrameTest, FindInPageForcedRedoOfFindInPage) { EXPECT_EQ(2, find_in_page_client.Count()); EXPECT_EQ(2, find_in_page_client.ActiveIndex()); - options->find_next = false; + options->new_session = true; options->force = true; frame->GetFindInPage()->Find(kFindIdentifier, search_pattern, @@ -5820,24 +5833,24 @@ TEST_F(WebFrameTest, MoveRangeSelectionExtentScollsInputField) { TEST_F(WebFrameTest, SmartClipData) { static const char kExpectedClipText[] = "\nPrice 10,000,000won"; static const char kExpectedClipHtml[] = - "<div id=\"div4\" style=\"padding: 10px; margin: 10px; border: 2px " - "solid skyblue; float: left; width: 190px; height: 30px; " - "color: rgb(0, 0, 0); font-family: myahem; font-size: 8px; font-style: " - "normal; font-variant-ligatures: normal; font-variant-caps: normal; " - "font-weight: 400; letter-spacing: " - "normal; orphans: 2; text-align: start; " - "text-indent: 0px; text-transform: none; white-space: normal; widows: " - "2; word-spacing: 0px; -webkit-text-stroke-width: 0px; " - "text-decoration-style: initial; text-decoration-color: initial;\">Air " - "conditioner</div><div id=\"div5\" style=\"padding: 10px; margin: 10px; " - "border: 2px solid skyblue; float: left; width: 190px; height: 30px; " - "color: rgb(0, 0, 0); font-family: myahem; font-size: 8px; font-style: " - "normal; font-variant-ligatures: normal; font-variant-caps: normal; " - "font-weight: 400; letter-spacing: normal; orphans: 2; text-align: " - "start; text-indent: 0px; text-transform: none; white-space: normal; " - "widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; " - "text-decoration-style: initial; text-decoration-color: initial;\">Price " - "10,000,000won</div>"; + "<div id=\"div4\" style=\"padding: 10px; margin: 10px; border: 2px solid " + "skyblue; float: left; width: 190px; height: 30px; color: rgb(0, 0, 0); " + "font-family: myahem; font-size: 8px; font-style: normal; " + "font-variant-ligatures: normal; font-variant-caps: normal; font-weight: " + "400; letter-spacing: normal; orphans: 2; text-align: start; " + "text-indent: 0px; text-transform: none; white-space: normal; widows: 2; " + "word-spacing: 0px; -webkit-text-stroke-width: 0px; " + "text-decoration-thickness: initial; text-decoration-style: initial; " + "text-decoration-color: initial;\">Air conditioner</div><div id=\"div5\" " + "style=\"padding: 10px; margin: 10px; border: 2px solid skyblue; float: " + "left; width: 190px; height: 30px; color: rgb(0, 0, 0); font-family: " + "myahem; font-size: 8px; font-style: normal; font-variant-ligatures: " + "normal; font-variant-caps: normal; font-weight: 400; letter-spacing: " + "normal; orphans: 2; text-align: start; text-indent: 0px; " + "text-transform: none; white-space: normal; widows: 2; word-spacing: " + "0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: " + "initial; text-decoration-style: initial; text-decoration-color: " + "initial;\">Price 10,000,000won</div>"; WebString clip_text; WebString clip_html; WebRect clip_rect; @@ -5857,24 +5870,24 @@ TEST_F(WebFrameTest, SmartClipData) { TEST_F(WebFrameTest, SmartClipDataWithPinchZoom) { static const char kExpectedClipText[] = "\nPrice 10,000,000won"; static const char kExpectedClipHtml[] = - "<div id=\"div4\" style=\"padding: 10px; margin: 10px; border: 2px " - "solid skyblue; float: left; width: 190px; height: 30px; " - "color: rgb(0, 0, 0); font-family: myahem; font-size: 8px; font-style: " - "normal; font-variant-ligatures: normal; font-variant-caps: normal; " - "font-weight: 400; letter-spacing: " - "normal; orphans: 2; text-align: start; " - "text-indent: 0px; text-transform: none; white-space: normal; widows: " - "2; word-spacing: 0px; -webkit-text-stroke-width: 0px; " - "text-decoration-style: initial; text-decoration-color: initial;\">Air " - "conditioner</div><div id=\"div5\" style=\"padding: 10px; margin: 10px; " - "border: 2px solid skyblue; float: left; width: 190px; height: 30px; " - "color: rgb(0, 0, 0); font-family: myahem; font-size: 8px; font-style: " - "normal; font-variant-ligatures: normal; font-variant-caps: normal; " - "font-weight: 400; letter-spacing: normal; orphans: 2; text-align: " - "start; text-indent: 0px; text-transform: none; white-space: normal; " - "widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; " - "text-decoration-style: initial; text-decoration-color: initial;\">Price " - "10,000,000won</div>"; + "<div id=\"div4\" style=\"padding: 10px; margin: 10px; border: 2px solid " + "skyblue; float: left; width: 190px; height: 30px; color: rgb(0, 0, 0); " + "font-family: myahem; font-size: 8px; font-style: normal; " + "font-variant-ligatures: normal; font-variant-caps: normal; font-weight: " + "400; letter-spacing: normal; orphans: 2; text-align: start; " + "text-indent: 0px; text-transform: none; white-space: normal; widows: 2; " + "word-spacing: 0px; -webkit-text-stroke-width: 0px; " + "text-decoration-thickness: initial; text-decoration-style: initial; " + "text-decoration-color: initial;\">Air conditioner</div><div id=\"div5\" " + "style=\"padding: 10px; margin: 10px; border: 2px solid skyblue; float: " + "left; width: 190px; height: 30px; color: rgb(0, 0, 0); font-family: " + "myahem; font-size: 8px; font-style: normal; font-variant-ligatures: " + "normal; font-variant-caps: normal; font-weight: 400; letter-spacing: " + "normal; orphans: 2; text-align: start; text-indent: 0px; " + "text-transform: none; white-space: normal; widows: 2; word-spacing: " + "0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: " + "initial; text-decoration-style: initial; text-decoration-color: " + "initial;\">Price 10,000,000won</div>"; WebString clip_text; WebString clip_html; WebRect clip_rect; @@ -9480,7 +9493,7 @@ class RemoteNavigationClient bool initiator_frame_has_download_sandbox_flag, bool blocking_downloads_in_sandbox_enabled, bool initiator_frame_is_ad, - mojo::ScopedMessagePipeHandle, + CrossVariantMojoRemote<mojom::blink::BlobURLTokenInterfaceBase>, const base::Optional<WebImpression>& impression) override { last_request_.CopyFrom(request); } @@ -9664,46 +9677,6 @@ TEST_F(WebFrameTest, RemoteFrameInitialCommitType) { helper.Reset(); } -class GestureEventTestWebWidgetClient - : public frame_test_helpers::TestWebWidgetClient { - public: - GestureEventTestWebWidgetClient() : did_handle_gesture_event_(false) {} - ~GestureEventTestWebWidgetClient() override = default; - - // frame_test_helpers::TestWebWidgetClient: - void DidHandleGestureEvent(const WebGestureEvent& event, - bool event_cancelled) override { - did_handle_gesture_event_ = true; - } - bool DidHandleGestureEvent() const { return did_handle_gesture_event_; } - - private: - bool did_handle_gesture_event_; -}; - -TEST_F(WebFrameTest, FrameWidgetTest) { - frame_test_helpers::WebViewHelper helper; - helper.InitializeRemote(); - - GestureEventTestWebWidgetClient child_widget_client; - WebLocalFrame* child_frame = frame_test_helpers::CreateLocalChild( - *helper.RemoteMainFrame(), WebString(), WebFrameOwnerProperties(), - nullptr, nullptr, &child_widget_client); - - helper.GetWebView()->Resize(WebSize(1000, 1000)); - - WebGestureEvent event(WebInputEvent::Type::kGestureTap, - WebInputEvent::kNoModifiers, - WebInputEvent::GetStaticTimeStampForTests(), - WebGestureDevice::kTouchscreen); - event.SetPositionInWidget(gfx::PointF(20, 20)); - child_frame->FrameWidget()->HandleInputEvent( - WebCoalescedInputEvent(event, ui::LatencyInfo())); - EXPECT_TRUE(child_widget_client.DidHandleGestureEvent()); - - helper.Reset(); -} - TEST_F(WebFrameTest, DetachRemoteFrame) { frame_test_helpers::WebViewHelper helper; helper.InitializeRemote(); @@ -10012,11 +9985,12 @@ TEST_F(WebFrameTest, PausedPageLoadWithRemoteMainFrame) { class OverscrollWebWidgetClient : public frame_test_helpers::TestWebWidgetClient { public: - MOCK_METHOD4(DidOverscroll, + MOCK_METHOD5(DidOverscroll, void(const gfx::Vector2dF&, const gfx::Vector2dF&, const gfx::PointF&, - const gfx::Vector2dF&)); + const gfx::Vector2dF&, + cc::OverscrollBehavior)); }; class WebFrameOverscrollTest @@ -10088,40 +10062,44 @@ TEST_P(WebFrameOverscrollTest, ScrollBegin(&web_view_helper, -300, -316); EXPECT_CALL(client, DidOverscroll(gfx::Vector2dF(8, 16), gfx::Vector2dF(8, 16), - gfx::PointF(100, 100), gfx::Vector2dF())); + gfx::PointF(100, 100), gfx::Vector2dF(), + kOverscrollBehaviorAuto)); ScrollUpdate(&web_view_helper, -308, -316); Mock::VerifyAndClearExpectations(&client); EXPECT_CALL(client, DidOverscroll(gfx::Vector2dF(0, 13), gfx::Vector2dF(8, 29), - gfx::PointF(100, 100), gfx::Vector2dF())); + gfx::PointF(100, 100), gfx::Vector2dF(), + kOverscrollBehaviorAuto)); ScrollUpdate(&web_view_helper, 0, -13); Mock::VerifyAndClearExpectations(&client); EXPECT_CALL(client, DidOverscroll(gfx::Vector2dF(20, 13), gfx::Vector2dF(28, 42), - gfx::PointF(100, 100), gfx::Vector2dF())); + gfx::PointF(100, 100), gfx::Vector2dF(), + kOverscrollBehaviorAuto)); ScrollUpdate(&web_view_helper, -20, -13); Mock::VerifyAndClearExpectations(&client); // Overscroll is not reported. - EXPECT_CALL(client, DidOverscroll(_, _, _, _)).Times(0); + EXPECT_CALL(client, DidOverscroll(_, _, _, _, _)).Times(0); ScrollUpdate(&web_view_helper, 0, 1); Mock::VerifyAndClearExpectations(&client); - EXPECT_CALL(client, DidOverscroll(_, _, _, _)).Times(0); + EXPECT_CALL(client, DidOverscroll(_, _, _, _, _)).Times(0); ScrollUpdate(&web_view_helper, 1, 0); Mock::VerifyAndClearExpectations(&client); // Overscroll is reported. EXPECT_CALL(client, DidOverscroll(gfx::Vector2dF(0, -701), gfx::Vector2dF(0, -701), - gfx::PointF(100, 100), gfx::Vector2dF())); + gfx::PointF(100, 100), gfx::Vector2dF(), + kOverscrollBehaviorAuto)); ScrollUpdate(&web_view_helper, 0, 1000); Mock::VerifyAndClearExpectations(&client); // Overscroll is not reported. - EXPECT_CALL(client, DidOverscroll(_, _, _, _)).Times(0); + EXPECT_CALL(client, DidOverscroll(_, _, _, _, _)).Times(0); ScrollEnd(&web_view_helper); Mock::VerifyAndClearExpectations(&client); } @@ -10140,7 +10118,7 @@ TEST_P(WebFrameOverscrollTest, ScrollBegin(&web_view_helper, 0, -316); // Scroll the Div to the end. - EXPECT_CALL(client, DidOverscroll(_, _, _, _)).Times(0); + EXPECT_CALL(client, DidOverscroll(_, _, _, _, _)).Times(0); ScrollUpdate(&web_view_helper, 0, -316); Mock::VerifyAndClearExpectations(&client); @@ -10150,7 +10128,8 @@ TEST_P(WebFrameOverscrollTest, // Now On Scrolling DIV, scroll is bubbled and root layer is over-scrolled. EXPECT_CALL(client, DidOverscroll(gfx::Vector2dF(0, 100), gfx::Vector2dF(0, 100), - gfx::PointF(100, 100), gfx::Vector2dF())); + gfx::PointF(100, 100), gfx::Vector2dF(), + kOverscrollBehaviorAuto)); ScrollUpdate(&web_view_helper, 0, -100); ScrollUpdate(&web_view_helper, 0, -100); Mock::VerifyAndClearExpectations(&client); @@ -10189,7 +10168,7 @@ TEST_P(WebFrameOverscrollTest, RootLayerOverscrolledOnInnerDivOverScroll) { ScrollBegin(&web_view_helper, 0, -316); // Scroll the Div to the end. - EXPECT_CALL(client, DidOverscroll(_, _, _, _)).Times(0); + EXPECT_CALL(client, DidOverscroll(_, _, _, _, _)).Times(0); ScrollUpdate(&web_view_helper, 0, -316); Mock::VerifyAndClearExpectations(&client); @@ -10199,7 +10178,8 @@ TEST_P(WebFrameOverscrollTest, RootLayerOverscrolledOnInnerDivOverScroll) { // Now On Scrolling DIV, scroll is bubbled and root layer is over-scrolled. EXPECT_CALL(client, DidOverscroll(gfx::Vector2dF(0, 50), gfx::Vector2dF(0, 50), - gfx::PointF(100, 100), gfx::Vector2dF())); + gfx::PointF(100, 100), gfx::Vector2dF(), + kOverscrollBehaviorAuto)); ScrollUpdate(&web_view_helper, 0, -150); Mock::VerifyAndClearExpectations(&client); } @@ -10217,7 +10197,7 @@ TEST_P(WebFrameOverscrollTest, RootLayerOverscrolledOnInnerIFrameOverScroll) { ScrollBegin(&web_view_helper, 0, -320); // Scroll the IFrame to the end. - EXPECT_CALL(client, DidOverscroll(_, _, _, _)).Times(0); + EXPECT_CALL(client, DidOverscroll(_, _, _, _, _)).Times(0); // This scroll will fully scroll the iframe but will be consumed before being // counted as overscroll. @@ -10234,7 +10214,8 @@ TEST_P(WebFrameOverscrollTest, RootLayerOverscrolledOnInnerIFrameOverScroll) { // Now On Scrolling IFrame, scroll is bubbled and root layer is over-scrolled. EXPECT_CALL(client, DidOverscroll(gfx::Vector2dF(0, 50), gfx::Vector2dF(0, 50), - gfx::PointF(100, 100), gfx::Vector2dF())); + gfx::PointF(100, 100), gfx::Vector2dF(), + kOverscrollBehaviorAuto)); ScrollUpdate(&web_view_helper, 0, -150); Mock::VerifyAndClearExpectations(&client); @@ -10256,32 +10237,34 @@ TEST_P(WebFrameOverscrollTest, ScaledPageRootLayerOverscrolled) { // The point is (99, 99) because we clamp in the division by 3 to 33 so when // we go back to viewport coordinates it becomes (99, 99). ScrollBegin(&web_view_helper, 0, 30); - EXPECT_CALL(client, - DidOverscroll(gfx::Vector2dF(0, -30), gfx::Vector2dF(0, -30), - gfx::PointF(99, 99), gfx::Vector2dF())); + EXPECT_CALL(client, DidOverscroll(gfx::Vector2dF(0, -30), + gfx::Vector2dF(0, -30), gfx::PointF(99, 99), + gfx::Vector2dF(), kOverscrollBehaviorAuto)); ScrollUpdate(&web_view_helper, 0, 30); Mock::VerifyAndClearExpectations(&client); - EXPECT_CALL(client, - DidOverscroll(gfx::Vector2dF(0, -30), gfx::Vector2dF(0, -60), - gfx::PointF(99, 99), gfx::Vector2dF())); + EXPECT_CALL(client, DidOverscroll(gfx::Vector2dF(0, -30), + gfx::Vector2dF(0, -60), gfx::PointF(99, 99), + gfx::Vector2dF(), kOverscrollBehaviorAuto)); ScrollUpdate(&web_view_helper, 0, 30); Mock::VerifyAndClearExpectations(&client); EXPECT_CALL(client, DidOverscroll(gfx::Vector2dF(-30, -30), gfx::Vector2dF(-30, -90), - gfx::PointF(99, 99), gfx::Vector2dF())); + gfx::PointF(99, 99), gfx::Vector2dF(), + kOverscrollBehaviorAuto)); ScrollUpdate(&web_view_helper, 30, 30); Mock::VerifyAndClearExpectations(&client); EXPECT_CALL(client, DidOverscroll(gfx::Vector2dF(-30, 0), gfx::Vector2dF(-60, -90), - gfx::PointF(99, 99), gfx::Vector2dF())); + gfx::PointF(99, 99), gfx::Vector2dF(), + kOverscrollBehaviorAuto)); ScrollUpdate(&web_view_helper, 30, 0); Mock::VerifyAndClearExpectations(&client); // Overscroll is not reported. - EXPECT_CALL(client, DidOverscroll(_, _, _, _)).Times(0); + EXPECT_CALL(client, DidOverscroll(_, _, _, _, _)).Times(0); ScrollEnd(&web_view_helper); Mock::VerifyAndClearExpectations(&client); } @@ -10299,49 +10282,52 @@ TEST_P(WebFrameOverscrollTest, NoOverscrollForSmallvalues) { ScrollBegin(&web_view_helper, 10, 10); EXPECT_CALL(client, DidOverscroll(gfx::Vector2dF(-10, -10), gfx::Vector2dF(-10, -10), - gfx::PointF(100, 100), gfx::Vector2dF())); + gfx::PointF(100, 100), gfx::Vector2dF(), + kOverscrollBehaviorAuto)); ScrollUpdate(&web_view_helper, 10, 10); Mock::VerifyAndClearExpectations(&client); - EXPECT_CALL(client, DidOverscroll(gfx::Vector2dF(0, -0.10), - gfx::Vector2dF(-10, -10.10), - gfx::PointF(100, 100), gfx::Vector2dF())); + EXPECT_CALL(client, + DidOverscroll(gfx::Vector2dF(0, -0.10), + gfx::Vector2dF(-10, -10.10), gfx::PointF(100, 100), + gfx::Vector2dF(), kOverscrollBehaviorAuto)); ScrollUpdate(&web_view_helper, 0, 0.10); Mock::VerifyAndClearExpectations(&client); EXPECT_CALL(client, DidOverscroll(gfx::Vector2dF(-0.10, 0), gfx::Vector2dF(-10.10, -10.10), - gfx::PointF(100, 100), gfx::Vector2dF())); + gfx::PointF(100, 100), gfx::Vector2dF(), + kOverscrollBehaviorAuto)); ScrollUpdate(&web_view_helper, 0.10, 0); Mock::VerifyAndClearExpectations(&client); // For residual values overscrollDelta should be reset and DidOverscroll // shouldn't be called. - EXPECT_CALL(client, DidOverscroll(_, _, _, _)).Times(0); + EXPECT_CALL(client, DidOverscroll(_, _, _, _, _)).Times(0); ScrollUpdate(&web_view_helper, 0, 0.09); Mock::VerifyAndClearExpectations(&client); - EXPECT_CALL(client, DidOverscroll(_, _, _, _)).Times(0); + EXPECT_CALL(client, DidOverscroll(_, _, _, _, _)).Times(0); ScrollUpdate(&web_view_helper, 0.09, 0.09); Mock::VerifyAndClearExpectations(&client); - EXPECT_CALL(client, DidOverscroll(_, _, _, _)).Times(0); + EXPECT_CALL(client, DidOverscroll(_, _, _, _, _)).Times(0); ScrollUpdate(&web_view_helper, 0.09, 0); Mock::VerifyAndClearExpectations(&client); - EXPECT_CALL(client, DidOverscroll(_, _, _, _)).Times(0); + EXPECT_CALL(client, DidOverscroll(_, _, _, _, _)).Times(0); ScrollUpdate(&web_view_helper, 0, -0.09); Mock::VerifyAndClearExpectations(&client); - EXPECT_CALL(client, DidOverscroll(_, _, _, _)).Times(0); + EXPECT_CALL(client, DidOverscroll(_, _, _, _, _)).Times(0); ScrollUpdate(&web_view_helper, -0.09, -0.09); Mock::VerifyAndClearExpectations(&client); - EXPECT_CALL(client, DidOverscroll(_, _, _, _)).Times(0); + EXPECT_CALL(client, DidOverscroll(_, _, _, _, _)).Times(0); ScrollUpdate(&web_view_helper, -0.09, 0); Mock::VerifyAndClearExpectations(&client); - EXPECT_CALL(client, DidOverscroll(_, _, _, _)).Times(0); + EXPECT_CALL(client, DidOverscroll(_, _, _, _, _)).Times(0); ScrollEnd(&web_view_helper); Mock::VerifyAndClearExpectations(&client); } @@ -10359,14 +10345,15 @@ TEST_P(WebFrameOverscrollTest, OverscrollBehaviorGoesToCompositor) { WebLocalFrame* mainFrame = web_view_helper.GetWebView()->MainFrame()->ToWebLocalFrame(); EXPECT_EQ(web_view_helper.GetLayerTreeHost()->overscroll_behavior(), - cc::OverscrollBehavior()); + kOverscrollBehaviorAuto); mainFrame->ExecuteScript( WebScriptSource(WebString("document.body.style=" "'overscroll-behavior: auto;'"))); ScrollBegin(&web_view_helper, 100, 116); - EXPECT_CALL(client, DidOverscroll(gfx::Vector2dF(-100, -100), - gfx::Vector2dF(-100, -100), - gfx::PointF(100, 100), gfx::Vector2dF())); + EXPECT_CALL(client, + DidOverscroll(gfx::Vector2dF(-100, -100), + gfx::Vector2dF(-100, -100), gfx::PointF(100, 100), + gfx::Vector2dF(), kOverscrollBehaviorAuto)); ScrollUpdate(&web_view_helper, 100, 100); Mock::VerifyAndClearExpectations(&client); EXPECT_EQ(web_view_helper.GetLayerTreeHost()->overscroll_behavior(), @@ -10376,9 +10363,10 @@ TEST_P(WebFrameOverscrollTest, OverscrollBehaviorGoesToCompositor) { WebScriptSource(WebString("document.body.style=" "'overscroll-behavior: contain;'"))); ScrollBegin(&web_view_helper, 100, 116); - EXPECT_CALL(client, DidOverscroll(gfx::Vector2dF(-100, -100), - gfx::Vector2dF(-200, -200), - gfx::PointF(100, 100), gfx::Vector2dF())); + EXPECT_CALL(client, + DidOverscroll(gfx::Vector2dF(-100, -100), + gfx::Vector2dF(-200, -200), gfx::PointF(100, 100), + gfx::Vector2dF(), kOverscrollBehaviorContain)); ScrollUpdate(&web_view_helper, 100, 100); Mock::VerifyAndClearExpectations(&client); EXPECT_EQ(web_view_helper.GetLayerTreeHost()->overscroll_behavior(), @@ -10388,9 +10376,10 @@ TEST_P(WebFrameOverscrollTest, OverscrollBehaviorGoesToCompositor) { WebScriptSource(WebString("document.body.style=" "'overscroll-behavior: none;'"))); ScrollBegin(&web_view_helper, 100, 116); - EXPECT_CALL(client, DidOverscroll(gfx::Vector2dF(-100, -100), - gfx::Vector2dF(-300, -300), - gfx::PointF(100, 100), gfx::Vector2dF())); + EXPECT_CALL(client, + DidOverscroll(gfx::Vector2dF(-100, -100), + gfx::Vector2dF(-300, -300), gfx::PointF(100, 100), + gfx::Vector2dF(), kOverscrollBehaviorNone)); ScrollUpdate(&web_view_helper, 100, 100); Mock::VerifyAndClearExpectations(&client); EXPECT_EQ(web_view_helper.GetLayerTreeHost()->overscroll_behavior(), @@ -10422,9 +10411,10 @@ TEST_P(WebFrameOverscrollTest, OnlyMainFrameOverscrollBehaviorHasEffect) { "'overscroll-behavior: none;'"))); ScrollBegin(&web_view_helper, 100, 116); - EXPECT_CALL(client, DidOverscroll(gfx::Vector2dF(-100, -100), - gfx::Vector2dF(-100, -100), - gfx::PointF(100, 100), gfx::Vector2dF())); + EXPECT_CALL(client, + DidOverscroll(gfx::Vector2dF(-100, -100), + gfx::Vector2dF(-100, -100), gfx::PointF(100, 100), + gfx::Vector2dF(), kOverscrollBehaviorAuto)); ScrollUpdate(&web_view_helper, 100, 100); Mock::VerifyAndClearExpectations(&client); EXPECT_EQ(web_view_helper.GetLayerTreeHost()->overscroll_behavior(), @@ -10433,9 +10423,10 @@ TEST_P(WebFrameOverscrollTest, OnlyMainFrameOverscrollBehaviorHasEffect) { mainFrame->ExecuteScript( WebScriptSource(WebString("document.body.style=" "'overscroll-behavior: contain;'"))); - EXPECT_CALL(client, DidOverscroll(gfx::Vector2dF(-100, -100), - gfx::Vector2dF(-200, -200), - gfx::PointF(100, 100), gfx::Vector2dF())); + EXPECT_CALL(client, + DidOverscroll(gfx::Vector2dF(-100, -100), + gfx::Vector2dF(-200, -200), gfx::PointF(100, 100), + gfx::Vector2dF(), kOverscrollBehaviorContain)); ScrollUpdate(&web_view_helper, 100, 100); Mock::VerifyAndClearExpectations(&client); EXPECT_EQ(web_view_helper.GetLayerTreeHost()->overscroll_behavior(), @@ -10458,7 +10449,7 @@ TEST_F(WebFrameTest, MaxFrames) { WebLocalFrameImpl* frame = frame_test_helpers::CreateLocalChild(*web_view_helper.RemoteMainFrame()); - while (page->SubframeCount() < Page::kMaxNumberOfFrames) { + while (page->SubframeCount() < Page::MaxNumberOfFrames()) { frame_test_helpers::CreateRemoteChild(*web_view_helper.RemoteMainFrame()); } auto* iframe = MakeGarbageCollected<HTMLIFrameElement>( @@ -10606,7 +10597,7 @@ class WebRemoteFrameVisibilityChangeTest : public WebFrameTest { ->MainFrameImpl(); web_view_helper_.Resize(WebSize(640, 480)); remote_frame_host_.Init( - remote_frame_client_.GetAssociatedInterfaceProvider()); + remote_frame_client_.GetRemoteAssociatedInterfaces()); web_remote_frame_ = frame_test_helpers::CreateRemote(&remote_frame_client_); } @@ -10914,10 +10905,7 @@ class TestLocalFrameHostForSaveImageFromDataURL : public FakeLocalFrameHost { // FakeLocalFrameHost: void DownloadURL(mojom::blink::DownloadURLParamsPtr params) override { - mojo::PendingRemote<mojom::blink::Blob> blob_data_remote( - std::move(params->data_url_blob), mojom::blink::Blob::Version_); - - mojo::Remote<mojom::blink::Blob> blob(std::move(blob_data_remote)); + mojo::Remote<mojom::blink::Blob> blob(std::move(params->data_url_blob)); mojo::ScopedDataPipeProducerHandle producer_handle; mojo::ScopedDataPipeConsumerHandle consumer_handle; auto result = @@ -12464,19 +12452,19 @@ TEST_F(WebFrameTest, ClearClosedOpener) { class ShowVirtualKeyboardObserverWidgetClient : public frame_test_helpers::TestWebWidgetClient { public: - ShowVirtualKeyboardObserverWidgetClient() - : did_show_virtual_keyboard_(false) {} + ShowVirtualKeyboardObserverWidgetClient() = default; ~ShowVirtualKeyboardObserverWidgetClient() override = default; // frame_test_helpers::TestWebWidgetClient: - void ShowVirtualKeyboardOnElementFocus() override { - did_show_virtual_keyboard_ = true; + void TextInputStateChanged( + ui::mojom::blink::TextInputStatePtr state) override { + did_show_virtual_keyboard_ |= state->show_ime_if_needed; } bool DidShowVirtualKeyboard() const { return did_show_virtual_keyboard_; } private: - bool did_show_virtual_keyboard_; + bool did_show_virtual_keyboard_ = false; }; TEST_F(WebFrameTest, ShowVirtualKeyboardOnElementFocus) { @@ -12499,9 +12487,13 @@ TEST_F(WebFrameTest, ShowVirtualKeyboardOnElementFocus) { WebScriptSource("window.focus();" "document.querySelector('input').focus();")); + RunPendingTasks(); // Verify that the right WebWidgetClient has been notified. +#if defined(OS_CHROMEOS) + EXPECT_FALSE(web_widget_client.DidShowVirtualKeyboard()); +#else EXPECT_TRUE(web_widget_client.DidShowVirtualKeyboard()); - +#endif web_view_helper.Reset(); } @@ -12695,8 +12687,7 @@ class TestFallbackWebFrameClient TestWebFrameClient::BeginNavigation(std::move(info)); return; } - Frame()->WillStartNavigation( - *info, false /* is_history_navigation_in_new_child_frame */); + Frame()->WillStartNavigation(*info); } private: @@ -12832,7 +12823,8 @@ static void TestFramePrinting(WebLocalFrameImpl* frame) { print_params.print_content_area.height = page_size.height; EXPECT_EQ(1, frame->PrintBegin(print_params, WebNode())); PaintRecorder recorder; - frame->PrintPagesForTesting(recorder.beginRecording(IntRect()), page_size); + frame->PrintPagesForTesting(recorder.beginRecording(IntRect()), page_size, + page_size); frame->PrintEnd(); } @@ -12852,6 +12844,90 @@ TEST_F(WebFrameTest, PrintIframeUnderDetached) { web_view_helper.LocalMainFrame()->FirstChild()->FirstChild())); } +namespace { + +struct TextRunDOMNodeIdInfo { + int glyph_len; + DOMNodeId dom_node_id; +}; + +// Given a PaintRecord and a starting DOMNodeId, recursively iterate over all of +// the (nested) paint ops, and populate |text_runs| with the number of glyphs +// and the DOMNodeId of each text run. +void RecursiveCollectTextRunDOMNodeIds( + sk_sp<const PaintRecord> paint_record, + DOMNodeId dom_node_id, + std::vector<TextRunDOMNodeIdInfo>* text_runs) { + for (cc::PaintOpBuffer::Iterator it(paint_record.get()); it; ++it) { + if ((*it)->GetType() == cc::PaintOpType::DrawRecord) { + cc::DrawRecordOp* draw_record_op = static_cast<cc::DrawRecordOp*>(*it); + RecursiveCollectTextRunDOMNodeIds(draw_record_op->record, dom_node_id, + text_runs); + } else if ((*it)->GetType() == cc::PaintOpType::SetNodeId) { + cc::SetNodeIdOp* set_node_id_op = static_cast<cc::SetNodeIdOp*>(*it); + dom_node_id = set_node_id_op->node_id; + } else if ((*it)->GetType() == cc::PaintOpType::DrawTextBlob) { + cc::DrawTextBlobOp* draw_text_op = static_cast<cc::DrawTextBlobOp*>(*it); + SkTextBlob::Iter iter(*draw_text_op->blob); + SkTextBlob::Iter::Run run; + while (iter.next(&run)) { + TextRunDOMNodeIdInfo text_run_info; + text_run_info.glyph_len = run.fGlyphCount; + text_run_info.dom_node_id = dom_node_id; + text_runs->push_back(text_run_info); + } + } + } +} + +} // namespace + +TEST_F(WebFrameTest, FirstLetterHasDOMNodeIdWhenPrinting) { + // When printing, every DrawText painting op needs to have an associated + // DOM Node ID. This test ensures that when the first-letter style is used, + // the drawing op for the first letter is correctly associated with the same + // DOM Node ID as the following text. + + // Load a web page with two elements containing the text + // "Hello" and "World", where "World" has a first-letter style. + RegisterMockedHttpURLLoad("first-letter.html"); + frame_test_helpers::WebViewHelper web_view_helper; + web_view_helper.InitializeAndLoad(base_url_ + "first-letter.html"); + + // Print the page and capture the PaintRecord. + WebPrintParams print_params; + WebSize page_size(500, 500); + print_params.print_content_area.width = page_size.width; + print_params.print_content_area.height = page_size.height; + WebLocalFrameImpl* frame = web_view_helper.LocalMainFrame(); + EXPECT_EQ(1, frame->PrintBegin(print_params, WebNode())); + PaintRecorder recorder; + frame->PrintPagesForTesting(recorder.beginRecording(IntRect()), page_size, + page_size); + frame->PrintEnd(); + sk_sp<PaintRecord> paint_record = recorder.finishRecordingAsPicture(); + + // Unpack the paint record and collect info about the text runs. + std::vector<TextRunDOMNodeIdInfo> text_runs; + RecursiveCollectTextRunDOMNodeIds(paint_record, 0, &text_runs); + + // The first text run should be "Hello". + ASSERT_EQ(3U, text_runs.size()); + EXPECT_EQ(5, text_runs[0].glyph_len); + EXPECT_NE(kInvalidDOMNodeId, text_runs[0].dom_node_id); + + // The second text run should be "W", the first letter of "World". + EXPECT_EQ(1, text_runs[1].glyph_len); + EXPECT_NE(kInvalidDOMNodeId, text_runs[1].dom_node_id); + + // The last text run should be "orld", the rest of "World". + EXPECT_EQ(4, text_runs[2].glyph_len); + EXPECT_NE(kInvalidDOMNodeId, text_runs[2].dom_node_id); + + // The second and third text runs should have the same DOM Node ID. + EXPECT_EQ(text_runs[1].dom_node_id, text_runs[2].dom_node_id); +} + TEST_F(WebFrameTest, ExecuteCommandProducesUserGesture) { frame_test_helpers::WebViewHelper web_view_helper; web_view_helper.InitializeAndLoad("about:blank"); @@ -13027,6 +13103,58 @@ TEST_F(WebFrameSimTest, GetPageSizeType) { } } +TEST_F(WebFrameSimTest, PageOrientation) { + ScopedNamedPagesForTest named_pages_enabler(true); + WebSize page_size(500, 500); + WebView().MainFrameWidget()->Resize(page_size); + + SimRequest request("https://example.com/test.html", "text/html"); + LoadURL("https://example.com/test.html"); + request.Complete(R"HTML( + <!DOCTYPE html> + <style> + @page upright { page-orientation: upright; } + @page clockwise { page-orientation: rotate-right; } + @page counter-clockwise { page-orientation: rotate-left; } + div { height: 10px; } + </style> + <!-- First page: --> + <div style="page:upright;"></div> + <!-- Second page: --> + <div style="page:counter-clockwise;"></div> + <!-- Third page: --> + <div style="page:clockwise;"></div> + <div style="page:clockwise;"></div> + <!-- Fourth page: --> + <div></div> + )HTML"); + + Compositor().BeginFrame(); + RunPendingTasks(); + + auto* frame = WebView().MainFrame()->ToWebLocalFrame(); + WebPrintParams print_params; + print_params.print_content_area.width = page_size.width; + print_params.print_content_area.height = page_size.height; + EXPECT_EQ(4, frame->PrintBegin(print_params, WebNode())); + + WebPrintPageDescription description; + + frame->GetPageDescription(0, &description); + EXPECT_EQ(description.orientation, PageOrientation::kUpright); + + frame->GetPageDescription(1, &description); + EXPECT_EQ(description.orientation, PageOrientation::kRotateLeft); + + frame->GetPageDescription(2, &description); + EXPECT_EQ(description.orientation, PageOrientation::kRotateRight); + + frame->GetPageDescription(3, &description); + EXPECT_EQ(description.orientation, PageOrientation::kUpright); + + frame->PrintEnd(); +} + TEST_F(WebFrameTest, MediaQueriesInLocalFrameInsideRemote) { frame_test_helpers::WebViewHelper helper; helper.InitializeRemote(); @@ -13222,4 +13350,31 @@ TEST_F(WebFrameTest, FocusElementCallsFocusedElementChanged) { EXPECT_TRUE(frame_host.did_notify_); } +// Tests that form.submit() cancels any navigations already sent to the browser +// process. +TEST_F(WebFrameTest, FormSubmitCancelsNavigation) { + frame_test_helpers::TestWebFrameClient web_frame_client; + frame_test_helpers::WebViewHelper web_view_helper; + web_view_helper.Initialize(&web_frame_client); + RegisterMockedHttpURLLoad("foo.html"); + RegisterMockedHttpURLLoad("bar.html"); + auto* main_frame = web_view_helper.GetWebView()->MainFrameImpl(); + auto* local_frame = main_frame->GetFrame(); + auto* document = local_frame->GetDocument(); + + document->documentElement()->setInnerHTML( + "<form id=formid action='http://internal.test/bar.html'></form>"); + ASSERT_FALSE(local_frame->Loader().HasProvisionalNavigation()); + + FrameLoadRequest request(document, + ResourceRequest("http://internal.test/foo.html")); + local_frame->Navigate(request, WebFrameLoadType::kStandard); + ASSERT_TRUE(local_frame->Loader().HasProvisionalNavigation()); + + main_frame->ExecuteScript(WebScriptSource(WebString("formid.submit()"))); + EXPECT_FALSE(local_frame->Loader().HasProvisionalNavigation()); + + RunPendingTasks(); +} + } // namespace blink diff --git a/chromium/third_party/blink/renderer/core/exported/web_hit_test_result.cc b/chromium/third_party/blink/renderer/core/exported/web_hit_test_result.cc index a5b6c36bab2..371f23473e6 100644 --- a/chromium/third_party/blink/renderer/core/exported/web_hit_test_result.cc +++ b/chromium/third_party/blink/renderer/core/exported/web_hit_test_result.cc @@ -42,7 +42,7 @@ class WebHitTestResultPrivate final WebHitTestResultPrivate(const HitTestResult&); WebHitTestResultPrivate(const WebHitTestResultPrivate&); - void Trace(Visitor* visitor) { visitor->Trace(result_); } + void Trace(Visitor* visitor) const { visitor->Trace(result_); } const HitTestResult& Result() const { return result_; } private: diff --git a/chromium/third_party/blink/renderer/core/exported/web_input_method_controller_impl.cc b/chromium/third_party/blink/renderer/core/exported/web_input_method_controller_impl.cc index 93c945ace72..5b46ed3aaee 100644 --- a/chromium/third_party/blink/renderer/core/exported/web_input_method_controller_impl.cc +++ b/chromium/third_party/blink/renderer/core/exported/web_input_method_controller_impl.cc @@ -33,7 +33,7 @@ WebInputMethodControllerImpl::WebInputMethodControllerImpl( WebInputMethodControllerImpl::~WebInputMethodControllerImpl() = default; -void WebInputMethodControllerImpl::Trace(Visitor* visitor) { +void WebInputMethodControllerImpl::Trace(Visitor* visitor) const { visitor->Trace(web_frame_); } @@ -41,9 +41,20 @@ bool WebInputMethodControllerImpl::IsEditContextActive() const { return GetInputMethodController().GetActiveEditContext(); } +ui::mojom::VirtualKeyboardVisibilityRequest +WebInputMethodControllerImpl::GetLastVirtualKeyboardVisibilityRequest() const { + return GetInputMethodController().GetLastVirtualKeyboardVisibilityRequest(); +} + +void WebInputMethodControllerImpl::SetVirtualKeyboardVisibilityRequest( + ui::mojom::VirtualKeyboardVisibilityRequest vk_visibility_request) { + GetInputMethodController().SetVirtualKeyboardVisibilityRequest( + vk_visibility_request); +} + bool WebInputMethodControllerImpl::SetComposition( const WebString& text, - const WebVector<WebImeTextSpan>& ime_text_spans, + const WebVector<ui::ImeTextSpan>& ime_text_spans, const WebRange& replacement_range, int selection_start, int selection_end) { @@ -124,7 +135,7 @@ bool WebInputMethodControllerImpl::FinishComposingText( bool WebInputMethodControllerImpl::CommitText( const WebString& text, - const WebVector<WebImeTextSpan>& ime_text_spans, + const WebVector<ui::ImeTextSpan>& ime_text_spans, const WebRange& replacement_range, int relative_caret_position) { LocalFrame::NotifyUserActivation(GetFrame()); @@ -179,11 +190,11 @@ void WebInputMethodControllerImpl::GetLayoutBounds(WebRect* control_bounds, GetInputMethodController().GetLayoutBounds(control_bounds, selection_bounds); } -bool WebInputMethodControllerImpl::IsInputPanelPolicyManual() const { +bool WebInputMethodControllerImpl::IsVirtualKeyboardPolicyManual() const { if (IsEditContextActive()) { return GetInputMethodController() .GetActiveEditContext() - ->IsInputPanelPolicyManual(); + ->IsVirtualKeyboardPolicyManual(); } return false; // Default should always be automatic. } diff --git a/chromium/third_party/blink/renderer/core/exported/web_input_method_controller_impl.h b/chromium/third_party/blink/renderer/core/exported/web_input_method_controller_impl.h index afb2d962e6d..9d987fe745a 100644 --- a/chromium/third_party/blink/renderer/core/exported/web_input_method_controller_impl.h +++ b/chromium/third_party/blink/renderer/core/exported/web_input_method_controller_impl.h @@ -6,12 +6,15 @@ #define THIRD_PARTY_BLINK_RENDERER_CORE_EXPORTED_WEB_INPUT_METHOD_CONTROLLER_IMPL_H_ #include "base/macros.h" -#include "third_party/blink/public/web/web_ime_text_span.h" #include "third_party/blink/public/web/web_input_method_controller.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/platform/heap/handle.h" #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" +namespace ui { +struct ImeTextSpan; +} // namespace ui + namespace blink { class InputMethodController; @@ -31,12 +34,12 @@ class CORE_EXPORT WebInputMethodControllerImpl // WebInputMethodController overrides. bool SetComposition(const WebString& text, - const WebVector<WebImeTextSpan>& ime_text_spans, + const WebVector<ui::ImeTextSpan>& ime_text_spans, const WebRange& replacement_range, int selection_start, int selection_end) override; bool CommitText(const WebString& text, - const WebVector<WebImeTextSpan>& ime_text_spans, + const WebVector<ui::ImeTextSpan>& ime_text_spans, const WebRange& replacement_range, int relative_caret_position) override; bool FinishComposingText( @@ -51,10 +54,15 @@ class CORE_EXPORT WebInputMethodControllerImpl void GetLayoutBounds(WebRect* control_bounds, WebRect* selection_bounds) override; - bool IsInputPanelPolicyManual() const override; + bool IsVirtualKeyboardPolicyManual() const override; bool IsEditContextActive() const override; + ui::mojom::VirtualKeyboardVisibilityRequest + GetLastVirtualKeyboardVisibilityRequest() const override; + void SetVirtualKeyboardVisibilityRequest( + ui::mojom::VirtualKeyboardVisibilityRequest vk_visibility_request) + override; - void Trace(Visitor*); + void Trace(Visitor*) const; private: LocalFrame* GetFrame() const; diff --git a/chromium/third_party/blink/renderer/core/exported/web_navigation_params.cc b/chromium/third_party/blink/renderer/core/exported/web_navigation_params.cc index b7b31685fa0..8d64cd995ab 100644 --- a/chromium/third_party/blink/renderer/core/exported/web_navigation_params.cc +++ b/chromium/third_party/blink/renderer/core/exported/web_navigation_params.cc @@ -129,11 +129,12 @@ WebNavigationParams::PrefetchedSignedExchange::PrefetchedSignedExchange( const WebString& header_integrity, const WebURL& inner_url, const WebURLResponse& inner_response, - mojo::ScopedMessagePipeHandle loader_factory_handle) + CrossVariantMojoRemote<network::mojom::URLLoaderFactoryInterfaceBase> + loader_factory) : outer_url(outer_url), header_integrity(header_integrity), inner_url(inner_url), inner_response(inner_response), - loader_factory_handle(std::move(loader_factory_handle)) {} + loader_factory(std::move(loader_factory)) {} } // namespace blink diff --git a/chromium/third_party/blink/renderer/core/exported/web_page_popup_impl.cc b/chromium/third_party/blink/renderer/core/exported/web_page_popup_impl.cc index 2c6f9c8b977..efb3e76c258 100644 --- a/chromium/third_party/blink/renderer/core/exported/web_page_popup_impl.cc +++ b/chromium/third_party/blink/renderer/core/exported/web_page_popup_impl.cc @@ -34,6 +34,7 @@ #include "cc/animation/animation_host.h" #include "cc/layers/picture_layer.h" #include "cc/trees/ukm_manager.h" +#include "third_party/blink/public/mojom/input/input_handler.mojom-blink.h" #include "third_party/blink/public/platform/scheduler/web_render_widget_scheduling_state.h" #include "third_party/blink/public/platform/web_float_rect.h" #include "third_party/blink/public/web/web_view_client.h" @@ -70,6 +71,7 @@ #include "third_party/blink/renderer/platform/heap/handle.h" #include "third_party/blink/renderer/platform/heap/heap.h" #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h" +#include "third_party/blink/renderer/platform/instrumentation/use_counter.h" #include "third_party/blink/renderer/platform/keyboard_codes.h" #include "third_party/blink/renderer/platform/text/text_direction.h" #include "third_party/blink/renderer/platform/web_test_support.h" @@ -216,20 +218,17 @@ class PagePopupChromeClient final : public EmptyChromeClient { void SetToolTip(LocalFrame&, const String& tooltip_text, TextDirection dir) override { - if (popup_->WidgetClient()) { - popup_->WidgetClient()->SetToolTipText(tooltip_text, - ToBaseTextDirection(dir)); - } + popup_->widget_base_->SetToolTipText(tooltip_text, dir); } void InjectGestureScrollEvent(LocalFrame& local_frame, WebGestureDevice device, const gfx::Vector2dF& delta, - ScrollGranularity granularity, + ui::ScrollGranularity granularity, cc::ElementId scrollable_area_element_id, WebInputEvent::Type injected_type) override { - popup_->WidgetClient()->InjectGestureScrollEvent( - device, delta, granularity, scrollable_area_element_id, injected_type); + popup_->InjectGestureScrollEvent(device, delta, granularity, + scrollable_area_element_id, injected_type); } WebPagePopupImpl* popup_; @@ -314,15 +313,37 @@ void WebPagePopupImpl::Initialize(WebViewImpl* web_view, ProvideContextFeaturesTo(*page_, std::make_unique<PagePopupFeaturesClient>()); DEFINE_STATIC_LOCAL(Persistent<LocalFrameClient>, empty_local_frame_client, (MakeGarbageCollected<EmptyLocalFrameClient>())); + // Creating new WindowAgentFactory because page popup content is owned by the - // user agent and should be isolated from the main frame. + // user agent and should be isolated from the main frame. However, if we are a + // page popup in LayoutTests ensure we use the popup owner's frame for looking + // up the Agent so tests can possibly access the document via internals API. + WindowAgentFactory* window_agent_factory = nullptr; + if (WebTestSupport::IsRunningWebTest()) { + Document& owner_document = popup_client_->OwnerElement().GetDocument(); + window_agent_factory = &owner_document.GetFrame()->window_agent_factory(); + } + auto* frame = MakeGarbageCollected<LocalFrame>( empty_local_frame_client, *page_, /* FrameOwner* */ nullptr, base::UnguessableToken::Create(), - /* WindowAgentFactory* */ nullptr, + window_agent_factory, /* InterfaceRegistry* */ nullptr); frame->SetPagePopupOwner(popup_client_->OwnerElement()); frame->SetView(MakeGarbageCollected<LocalFrameView>(*frame)); + + if (WebTestSupport::IsRunningWebTest()) { + // In order for the shared WindowAgentFactory for tests to work correctly, + // we need to also copy settings used in WindowAgent selection over to the + // popup frame. + Settings* owner_settings = + popup_client_->OwnerElement().GetDocument().GetFrame()->GetSettings(); + frame->GetSettings()->SetWebSecurityEnabled( + owner_settings->GetWebSecurityEnabled()); + frame->GetSettings()->SetAllowUniversalAccessFromFileURLs( + owner_settings->GetAllowUniversalAccessFromFileURLs()); + } + frame->Init(); frame->View()->SetParentVisible(true); frame->View()->SetSelfVisible(true); @@ -368,6 +389,53 @@ void WebPagePopupImpl::SetCursor(const ui::Cursor& cursor) { widget_base_->SetCursor(cursor); } +bool WebPagePopupImpl::HandlingInputEvent() { + return widget_base_->input_handler().handling_input_event(); +} + +void WebPagePopupImpl::SetHandlingInputEvent(bool handling) { + widget_base_->input_handler().set_handling_input_event(handling); +} + +void WebPagePopupImpl::ProcessInputEventSynchronously( + const WebCoalescedInputEvent& event, + HandledEventCallback callback) { + widget_base_->input_handler().HandleInputEvent(event, std::move(callback)); +} + +void WebPagePopupImpl::UpdateTextInputState() { + widget_base_->UpdateTextInputState(); +} + +void WebPagePopupImpl::UpdateCompositionInfo() { + widget_base_->UpdateCompositionInfo(/*immediate_request=*/false); +} + +void WebPagePopupImpl::UpdateSelectionBounds() { + widget_base_->UpdateSelectionBounds(); +} + +void WebPagePopupImpl::ShowVirtualKeyboard() { + widget_base_->ShowVirtualKeyboard(); +} + +void WebPagePopupImpl::ForceTextInputStateUpdate() { + widget_base_->ForceTextInputStateUpdate(); +} + +void WebPagePopupImpl::RequestCompositionUpdates(bool immediate_request, + bool monitor_updates) { + widget_base_->RequestCompositionUpdates(immediate_request, monitor_updates); +} + +void WebPagePopupImpl::SetFocus(bool focus) { + widget_base_->SetFocus(focus); +} + +bool WebPagePopupImpl::HasFocus() { + return widget_base_->has_focus(); +} + void WebPagePopupImpl::SetCompositorVisible(bool visible) { widget_base_->SetCompositorVisible(visible); } @@ -413,6 +481,21 @@ AXObject* WebPagePopupImpl::RootAXObject() { } void WebPagePopupImpl::SetWindowRect(const IntRect& rect_in_screen) { + if (!closing_) { + IntRect owner_window_rect_in_screen = OwnerWindowRectInScreen(); + Document& document = popup_client_->OwnerElement().GetDocument(); + if (owner_window_rect_in_screen.Contains(rect_in_screen)) { + UseCounter::Count(document, + WebFeature::kPopupDoesNotExceedOwnerWindowBounds); + } else { + WebFeature feature = + document.GetFrame()->IsMainFrame() + ? WebFeature::kPopupExceedsOwnerWindowBounds + : WebFeature::kPopupExceedsOwnerWindowBoundsForIframe; + UseCounter::Count(document, feature); + } + } + WidgetClient()->SetWindowRect(rect_in_screen); } @@ -496,6 +579,45 @@ void WebPagePopupImpl::DispatchRafAlignedInput(base::TimeTicks frame_time) { WidgetClient()->DispatchRafAlignedInput(frame_time); } +bool WebPagePopupImpl::WillHandleGestureEvent(const WebGestureEvent& event) { + return WidgetClient()->WillHandleGestureEvent(event); +} + +bool WebPagePopupImpl::WillHandleMouseEvent(const WebMouseEvent& event) { + return WidgetClient()->WillHandleMouseEvent(event); +} + +void WebPagePopupImpl::ObserveGestureEventAndResult( + const WebGestureEvent& gesture_event, + const gfx::Vector2dF& unused_delta, + const cc::OverscrollBehavior& overscroll_behavior, + bool event_processed) { + WidgetClient()->DidHandleGestureScrollEvent( + gesture_event, unused_delta, overscroll_behavior, event_processed); +} + +void WebPagePopupImpl::QueueSyntheticEvent( + std::unique_ptr<blink::WebCoalescedInputEvent> event) { + WidgetClient()->QueueSyntheticEvent(std::move(event)); +} + +void WebPagePopupImpl::GetWidgetInputHandler( + mojo::PendingReceiver<mojom::blink::WidgetInputHandler> request, + mojo::PendingRemote<mojom::blink::WidgetInputHandlerHost> host) { + WidgetClient()->GetWidgetInputHandler(std::move(request), std::move(host)); +} + +bool WebPagePopupImpl::HasCurrentImeGuard( + bool request_to_show_virtual_keyboard) { + return WidgetClient()->HasCurrentImeGuard(request_to_show_virtual_keyboard); +} + +void WebPagePopupImpl::SendCompositionRangeChanged( + const gfx::Range& range, + const std::vector<gfx::Rect>& character_bounds) { + WidgetClient()->SendCompositionRangeChanged(range, character_bounds); +} + WebInputEventResult WebPagePopupImpl::HandleCharEvent( const WebKeyboardEvent& event) { if (suppress_next_keypress_event_) { @@ -509,12 +631,16 @@ WebInputEventResult WebPagePopupImpl::HandleGestureEvent( const WebGestureEvent& event) { if (closing_) return WebInputEventResult::kNotHandled; - if ((event.GetType() == WebInputEvent::Type::kGestureTap || - event.GetType() == WebInputEvent::Type::kGestureTapDown) && - !IsViewportPointInWindow(event.PositionInWidget().x(), - event.PositionInWidget().y())) { - Cancel(); - return WebInputEventResult::kNotHandled; + if (event.GetType() == WebInputEvent::Type::kGestureTap || + event.GetType() == WebInputEvent::Type::kGestureTapDown) { + if (!IsViewportPointInWindow(event.PositionInWidget().x(), + event.PositionInWidget().y())) { + Cancel(); + return WebInputEventResult::kNotHandled; + } + CheckScreenPointInOwnerWindowAndCount( + event.PositionInScreen(), + WebFeature::kPopupGestureTapExceedsOwnerWindowBounds); } WebGestureEvent scaled_event = TransformWebGestureEvent(MainFrame().View(), event); @@ -524,18 +650,26 @@ WebInputEventResult WebPagePopupImpl::HandleGestureEvent( void WebPagePopupImpl::HandleMouseDown(LocalFrame& main_frame, const WebMouseEvent& event) { if (IsViewportPointInWindow(event.PositionInWidget().x(), - event.PositionInWidget().y())) + event.PositionInWidget().y())) { + CheckScreenPointInOwnerWindowAndCount( + event.PositionInScreen(), + WebFeature::kPopupMouseDownExceedsOwnerWindowBounds); PageWidgetEventHandler::HandleMouseDown(main_frame, event); - else + } else { Cancel(); + } } WebInputEventResult WebPagePopupImpl::HandleMouseWheel( LocalFrame& main_frame, const WebMouseWheelEvent& event) { if (IsViewportPointInWindow(event.PositionInWidget().x(), - event.PositionInWidget().y())) + event.PositionInWidget().y())) { + CheckScreenPointInOwnerWindowAndCount( + event.PositionInScreen(), + WebFeature::kPopupMouseWheelExceedsOwnerWindowBounds); return PageWidgetEventHandler::HandleMouseWheel(main_frame, event); + } Cancel(); return WebInputEventResult::kNotHandled; } @@ -569,6 +703,23 @@ bool WebPagePopupImpl::IsViewportPointInWindow(int x, int y) { .Contains(IntPoint(point_in_window.x, point_in_window.y)); } +void WebPagePopupImpl::CheckScreenPointInOwnerWindowAndCount( + const gfx::PointF& point_in_screen, + WebFeature feature) const { + if (closing_) + return; + + IntRect owner_window_rect = OwnerWindowRectInScreen(); + if (!owner_window_rect.Contains(point_in_screen.x(), point_in_screen.y())) + UseCounter::Count(popup_client_->OwnerElement().GetDocument(), feature); +} + +IntRect WebPagePopupImpl::OwnerWindowRectInScreen() const { + LocalFrameView* view = popup_client_->OwnerElement().GetDocument().View(); + IntRect frame_rect = view->FrameRect(); + return view->FrameToScreen(frame_rect); +} + WebInputEventResult WebPagePopupImpl::DispatchBufferedTouchEvents() { if (closing_) return WebInputEventResult::kNotHandled; @@ -583,12 +734,13 @@ WebInputEventResult WebPagePopupImpl::HandleInputEvent( return PageWidgetDelegate::HandleInputEvent(*this, event, &MainFrame()); } -void WebPagePopupImpl::SetFocus(bool enable) { +void WebPagePopupImpl::FocusChanged(bool enable) { if (!page_) return; if (enable) page_->GetFocusController().SetActive(true); page_->GetFocusController().SetFocused(enable); + WidgetClient()->FocusChanged(enable); } WebURL WebPagePopupImpl::GetURLForDebugTrace() { @@ -657,7 +809,7 @@ void WebPagePopupImpl::ClosePopup() { // because web authors can't listen the events. EventDispatchForbiddenScope::AllowUserAgentEvents allow_events; - MainFrame().Loader().StopAllLoaders(); + MainFrame().Loader().StopAllLoaders(/*abort_client=*/true); PagePopupController::From(*page_)->ClearPagePopupClient(); DestroyPage(); } @@ -701,6 +853,16 @@ WebRect WebPagePopupImpl::WindowRectInScreen() const { return WidgetClient()->WindowRect(); } +void WebPagePopupImpl::InjectGestureScrollEvent( + WebGestureDevice device, + const gfx::Vector2dF& delta, + ScrollGranularity granularity, + cc::ElementId scrollable_area_element_id, + WebInputEvent::Type injected_type) { + widget_base_->input_handler().InjectGestureScrollEvent( + device, delta, granularity, scrollable_area_element_id, injected_type); +} + // WebPagePopup ---------------------------------------------------------------- WebPagePopup* WebPagePopup::Create( diff --git a/chromium/third_party/blink/renderer/core/exported/web_page_popup_impl.h b/chromium/third_party/blink/renderer/core/exported/web_page_popup_impl.h index 723cb08faba..1c33fbff637 100644 --- a/chromium/third_party/blink/renderer/core/exported/web_page_popup_impl.h +++ b/chromium/third_party/blink/renderer/core/exported/web_page_popup_impl.h @@ -36,6 +36,7 @@ #include "third_party/blink/public/platform/cross_variant_mojo_util.h" #include "third_party/blink/public/web/web_page_popup.h" #include "third_party/blink/renderer/core/core_export.h" +#include "third_party/blink/renderer/core/frame/web_feature_forward.h" #include "third_party/blink/renderer/core/page/page_popup.h" #include "third_party/blink/renderer/core/page/page_widget_delegate.h" #include "third_party/blink/renderer/platform/heap/persistent.h" @@ -120,6 +121,24 @@ class CORE_EXPORT WebPagePopupImpl final : public WebPagePopup, void RecordTimeToFirstActivePaint(base::TimeDelta duration) override; void SetSuppressFrameRequestsWorkaroundFor704763Only(bool) final; WebInputEventResult DispatchBufferedTouchEvents() override; + bool WillHandleGestureEvent(const WebGestureEvent& event) override; + bool WillHandleMouseEvent(const WebMouseEvent& event) override; + void ObserveGestureEventAndResult( + const WebGestureEvent& gesture_event, + const gfx::Vector2dF& unused_delta, + const cc::OverscrollBehavior& overscroll_behavior, + bool event_processed) override; + bool SupportsBufferedTouchEvents() override { return true; } + void QueueSyntheticEvent( + std::unique_ptr<blink::WebCoalescedInputEvent>) override; + void GetWidgetInputHandler( + mojo::PendingReceiver<mojom::blink::WidgetInputHandler> request, + mojo::PendingRemote<mojom::blink::WidgetInputHandlerHost> host) override; + bool HasCurrentImeGuard(bool request_to_show_virtual_keyboard) override; + void SendCompositionRangeChanged( + const gfx::Range& range, + const std::vector<gfx::Rect>& character_bounds) override; + void FocusChanged(bool enabled) override; // WebWidget implementation. // NOTE: The WebWidget may still be used after requesting the popup to be @@ -135,6 +154,7 @@ class CORE_EXPORT WebPagePopupImpl final : public WebPagePopup, base::OnceCallback<void()> cleanup_task) override; WebInputEventResult HandleInputEvent(const WebCoalescedInputEvent&) override; void SetFocus(bool) override; + bool HasFocus() override; WebURL GetURLForDebugTrace() override; WebHitTestResult HitTestResultAt(const gfx::PointF&) override { return {}; } cc::LayerTreeHost* InitializeCompositing( @@ -144,6 +164,17 @@ class CORE_EXPORT WebPagePopupImpl final : public WebPagePopup, scheduler::WebRenderWidgetSchedulingState* RendererWidgetSchedulingState() override; void SetCursor(const ui::Cursor& cursor) override; + bool HandlingInputEvent() override; + void SetHandlingInputEvent(bool handling) override; + void ProcessInputEventSynchronously(const WebCoalescedInputEvent&, + HandledEventCallback) override; + void UpdateTextInputState() override; + void ForceTextInputStateUpdate() override; + void UpdateCompositionInfo() override; + void UpdateSelectionBounds() override; + void ShowVirtualKeyboard() override; + void RequestCompositionUpdates(bool immediate_request, + bool monitor_updates) override; // PageWidgetEventHandler functions WebInputEventResult HandleCharEvent(const WebKeyboardEvent&) override; @@ -158,6 +189,9 @@ class CORE_EXPORT WebPagePopupImpl final : public WebPagePopup, Element* FocusedElement() const; bool IsViewportPointInWindow(int x, int y); + void CheckScreenPointInOwnerWindowAndCount(const gfx::PointF& point_in_screen, + WebFeature feature) const; + IntRect OwnerWindowRectInScreen() const; // PagePopup function AXObject* RootAXObject() override; @@ -174,6 +208,12 @@ class CORE_EXPORT WebPagePopupImpl final : public WebPagePopup, WebRect WindowRectInScreen() const; + void InjectGestureScrollEvent(WebGestureDevice device, + const gfx::Vector2dF& delta, + ui::ScrollGranularity granularity, + cc::ElementId scrollable_area_element_id, + WebInputEvent::Type injected_type); + WebPagePopupClient* web_page_popup_client_; WebViewImpl* web_view_; // WebPagePopupImpl wraps its own Page that renders the content in the popup. diff --git a/chromium/third_party/blink/renderer/core/exported/web_performance.cc b/chromium/third_party/blink/renderer/core/exported/web_performance.cc index e29242e7423..03e5fcc3196 100644 --- a/chromium/third_party/blink/renderer/core/exported/web_performance.cc +++ b/chromium/third_party/blink/renderer/core/exported/web_performance.cc @@ -69,6 +69,22 @@ base::TimeTicks WebPerformance::NavigationStartAsMonotonicTime() const { return private_->timing()->NavigationStartAsMonotonicTime(); } +WebPerformance::BackForwardCacheRestoreTimings +WebPerformance::BackForwardCacheRestore() const { + PerformanceTiming::BackForwardCacheRestoreTimings restore_timings = + private_->timing()->BackForwardCacheRestore(); + + WebVector<BackForwardCacheRestoreTiming> timings(restore_timings.size()); + for (size_t i = 0; i < restore_timings.size(); i++) { + timings[i].navigation_start = + MillisecondsToSeconds(restore_timings[i].navigation_start); + timings[i].first_paint = + MillisecondsToSeconds(restore_timings[i].first_paint); + timings[i].first_input_delay = restore_timings[i].first_input_delay; + } + return timings; +} + double WebPerformance::InputForNavigationStart() const { return MillisecondsToSeconds(private_->timing()->inputStart()); } @@ -191,6 +207,28 @@ uint64_t WebPerformance::LargestTextPaintSize() const { return private_->timing()->LargestTextPaintSize(); } +double WebPerformance::ExperimentalLargestImagePaint() const { + return MillisecondsToSeconds( + private_->timing()->ExperimentalLargestImagePaint()); +} + +uint64_t WebPerformance::ExperimentalLargestImagePaintSize() const { + return private_->timing()->ExperimentalLargestImagePaintSize(); +} + +double WebPerformance::ExperimentalLargestTextPaint() const { + return MillisecondsToSeconds( + private_->timing()->ExperimentalLargestTextPaint()); +} + +uint64_t WebPerformance::ExperimentalLargestTextPaintSize() const { + return private_->timing()->ExperimentalLargestTextPaintSize(); +} + +double WebPerformance::FirstEligibleToPaint() const { + return MillisecondsToSeconds(private_->timing()->FirstEligibleToPaint()); +} + double WebPerformance::FirstInputOrScrollNotifiedTimestamp() const { return MillisecondsToSeconds( private_->timing()->FirstInputOrScrollNotifiedTimestamp()); @@ -212,6 +250,19 @@ base::Optional<base::TimeDelta> WebPerformance::LongestInputTimestamp() const { return private_->timing()->LongestInputTimestamp(); } +base::Optional<base::TimeDelta> WebPerformance::FirstInputProcessingTime() + const { + return private_->timing()->FirstInputProcessingTime(); +} + +base::Optional<base::TimeDelta> WebPerformance::FirstScrollDelay() const { + return private_->timing()->FirstScrollDelay(); +} + +base::Optional<base::TimeDelta> WebPerformance::FirstScrollTimestamp() const { + return private_->timing()->FirstScrollTimestamp(); +} + double WebPerformance::ParseStart() const { return MillisecondsToSeconds(private_->timing()->ParseStart()); } @@ -243,6 +294,11 @@ double WebPerformance::ParseBlockedOnScriptExecutionFromDocumentWriteDuration() ->ParseBlockedOnScriptExecutionFromDocumentWriteDuration()); } +base::Optional<base::TimeTicks> WebPerformance::LastPortalActivatedPaint() + const { + return private_->timing()->LastPortalActivatedPaint(); +} + WebPerformance::WebPerformance(WindowPerformance* performance) : private_(performance) {} diff --git a/chromium/third_party/blink/renderer/core/exported/web_plugin_container_impl.cc b/chromium/third_party/blink/renderer/core/exported/web_plugin_container_impl.cc index 27ea627f185..146d8228c4b 100644 --- a/chromium/third_party/blink/renderer/core/exported/web_plugin_container_impl.cc +++ b/chromium/third_party/blink/renderer/core/exported/web_plugin_container_impl.cc @@ -490,14 +490,12 @@ void WebPluginContainerImpl::ReportGeometry() { } v8::Local<v8::Object> WebPluginContainerImpl::V8ObjectForElement() { - LocalFrame* frame = element_->GetDocument().GetFrame(); - if (!frame) - return v8::Local<v8::Object>(); - - if (!element_->GetDocument().CanExecuteScripts(kNotAboutToExecuteScript)) + ExecutionContext* context = element_->GetExecutionContext(); + if (!context || !context->CanExecuteScripts(kNotAboutToExecuteScript)) return v8::Local<v8::Object>(); - ScriptState* script_state = ToScriptStateForMainWorld(frame); + ScriptState* script_state = + ToScriptState(context, DOMWrapperWorld::MainWorld()); if (!script_state) return v8::Local<v8::Object>(); @@ -795,7 +793,7 @@ void WebPluginContainerImpl::SetFrameRect(const IntRect& rect) { PropagateFrameRects(); } -void WebPluginContainerImpl::Trace(Visitor* visitor) { +void WebPluginContainerImpl::Trace(Visitor* visitor) const { visitor->Trace(element_); ExecutionContextClient::Trace(visitor); } @@ -892,12 +890,6 @@ void WebPluginContainerImpl::HandleKeyboardEvent(KeyboardEvent& event) { return; } - // Give the client a chance to issue edit comamnds. - WebLocalFrameImpl* web_frame = - WebLocalFrameImpl::FromFrame(element_->GetDocument().GetFrame()); - if (web_plugin_->SupportsEditCommands()) - web_frame->Client()->HandleCurrentKeyboardEvent(); - ui::Cursor dummy_cursor; if (web_plugin_->HandleInputEvent( WebCoalescedInputEvent(web_event, ui::LatencyInfo()), diff --git a/chromium/third_party/blink/renderer/core/exported/web_plugin_container_impl.h b/chromium/third_party/blink/renderer/core/exported/web_plugin_container_impl.h index 8ef5dc8600d..91781374384 100644 --- a/chromium/third_party/blink/renderer/core/exported/web_plugin_container_impl.h +++ b/chromium/third_party/blink/renderer/core/exported/web_plugin_container_impl.h @@ -186,7 +186,7 @@ class CORE_EXPORT WebPluginContainerImpl final void DidFinishLoading(); void DidFailLoading(const ResourceError&); - void Trace(Visitor*) override; + void Trace(Visitor*) const override; // USING_PRE_FINALIZER does not allow for virtual dispatch from the finalizer // method. Here we call Dispose() which does the correct virtual dispatch. void PreFinalize() { Dispose(); } diff --git a/chromium/third_party/blink/renderer/core/exported/web_plugin_container_test.cc b/chromium/third_party/blink/renderer/core/exported/web_plugin_container_test.cc index 9fe809420be..871bb4a6454 100644 --- a/chromium/third_party/blink/renderer/core/exported/web_plugin_container_test.cc +++ b/chromium/third_party/blink/renderer/core/exported/web_plugin_container_test.cc @@ -1465,7 +1465,8 @@ TEST_F(WebPluginContainerTest, CompositedPluginCAP) { const auto* plugin = static_cast<const CompositedPlugin*>(container->Plugin()); - auto paint_controller = std::make_unique<PaintController>(); + auto paint_controller = + std::make_unique<PaintController>(PaintController::kTransient); paint_controller->UpdateCurrentPaintChunkProperties( nullptr, PropertyTreeState::Root()); GraphicsContext graphics_context(*paint_controller); diff --git a/chromium/third_party/blink/renderer/core/exported/web_remote_frame_impl.cc b/chromium/third_party/blink/renderer/core/exported/web_remote_frame_impl.cc index 733203da2de..053daa4b95d 100644 --- a/chromium/third_party/blink/renderer/core/exported/web_remote_frame_impl.cc +++ b/chromium/third_party/blink/renderer/core/exported/web_remote_frame_impl.cc @@ -78,6 +78,7 @@ WebRemoteFrame* WebRemoteFrame::CreateForPortal( frame_token, portal_element); } +// static WebRemoteFrameImpl* WebRemoteFrameImpl::CreateMainFrame( WebView* web_view, WebRemoteFrameClient* client, @@ -117,7 +118,8 @@ WebRemoteFrameImpl* WebRemoteFrameImpl::CreateForPortal( Element* element = portal_element; DCHECK(element->HasTagName(html_names::kPortalTag)); - DCHECK(RuntimeEnabledFeatures::PortalsEnabled(&element->GetDocument())); + DCHECK( + RuntimeEnabledFeatures::PortalsEnabled(element->GetExecutionContext())); HTMLPortalElement* portal = static_cast<HTMLPortalElement*>(element); LocalFrame* host_frame = portal->GetDocument().GetFrame(); frame->InitializeCoreFrame(*host_frame->GetPage(), portal, g_null_atom, @@ -128,7 +130,7 @@ WebRemoteFrameImpl* WebRemoteFrameImpl::CreateForPortal( WebRemoteFrameImpl::~WebRemoteFrameImpl() = default; -void WebRemoteFrameImpl::Trace(Visitor* visitor) { +void WebRemoteFrameImpl::Trace(Visitor* visitor) const { visitor->Trace(frame_client_); visitor->Trace(frame_); WebFrame::TraceFrames(visitor, this); @@ -329,12 +331,6 @@ void WebRemoteFrameImpl::UpdateUserActivationState( GetFrame()->UpdateUserActivationState(update_type); } -void WebRemoteFrameImpl::TransferUserActivationFrom( - blink::WebRemoteFrame* source_frame) { - GetFrame()->TransferUserActivationFrom( - To<WebRemoteFrameImpl>(source_frame)->GetFrame()); -} - void WebRemoteFrameImpl::SetHadStickyUserActivationBeforeNavigation( bool value) { GetFrame()->SetHadStickyUserActivationBeforeNavigation(value); diff --git a/chromium/third_party/blink/renderer/core/exported/web_remote_frame_impl.h b/chromium/third_party/blink/renderer/core/exported/web_remote_frame_impl.h index e4ad3dd92ca..e58c2ab9948 100644 --- a/chromium/third_party/blink/renderer/core/exported/web_remote_frame_impl.h +++ b/chromium/third_party/blink/renderer/core/exported/web_remote_frame_impl.h @@ -105,7 +105,6 @@ class CORE_EXPORT WebRemoteFrameImpl final bool IsIgnoredForHitTest() const override; void UpdateUserActivationState( mojom::blink::UserActivationUpdateType) override; - void TransferUserActivationFrom(blink::WebRemoteFrame* source_frame) override; void SetHadStickyUserActivationBeforeNavigation(bool value) override; v8::Local<v8::Object> GlobalProxy() const override; WebRect GetCompositingRect() override; @@ -120,7 +119,7 @@ class CORE_EXPORT WebRemoteFrameImpl final static WebRemoteFrameImpl* FromFrame(RemoteFrame&); - void Trace(Visitor*); + void Trace(Visitor*) const; private: friend class RemoteFrameClientImpl; diff --git a/chromium/third_party/blink/renderer/core/exported/web_savable_resources_test_support.cc b/chromium/third_party/blink/renderer/core/exported/web_savable_resources_test_support.cc new file mode 100644 index 00000000000..dfc5be299f1 --- /dev/null +++ b/chromium/third_party/blink/renderer/core/exported/web_savable_resources_test_support.cc @@ -0,0 +1,19 @@ +// Copyright (c) 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "third_party/blink/public/web/web_savable_resources_test_support.h" + +#include "third_party/blink/public/mojom/frame/frame.mojom-blink.h" +#include "third_party/blink/public/platform/web_string.h" +#include "third_party/blink/public/web/web_element.h" +#include "third_party/blink/renderer/core/frame/savable_resources.h" + +namespace blink { + +WebString GetSubResourceLinkFromElementForTesting(const WebElement& element) { + return WebString(SavableResources::GetSubResourceLinkFromElement( + static_cast<Element*>(element))); +} + +} // namespace blink diff --git a/chromium/third_party/blink/renderer/core/exported/web_settings_impl.cc b/chromium/third_party/blink/renderer/core/exported/web_settings_impl.cc index f11e51633f3..ed851b476b2 100644 --- a/chromium/third_party/blink/renderer/core/exported/web_settings_impl.cc +++ b/chromium/third_party/blink/renderer/core/exported/web_settings_impl.cc @@ -588,10 +588,6 @@ bool WebSettingsImpl::ShrinksViewportContentToFit() const { return settings_->GetShrinksViewportContentToFit(); } -void WebSettingsImpl::SetShouldRespectImageOrientation(bool enabled) { - settings_->SetShouldRespectImageOrientation(enabled); -} - void WebSettingsImpl::SetPictureInPictureEnabled(bool enabled) { settings_->SetPictureInPictureEnabled(enabled); } @@ -784,6 +780,10 @@ void WebSettingsImpl::SetNavigationControls( settings_->SetNavigationControls(navigation_controls); } +void WebSettingsImpl::SetAriaModalPrunesAXTree(bool enabled) { + settings_->SetAriaModalPrunesAXTree(enabled); +} + STATIC_ASSERT_ENUM(WebSettings::ImageAnimationPolicy::kAllowed, kImageAnimationPolicyAllowed); STATIC_ASSERT_ENUM(WebSettings::ImageAnimationPolicy::kAnimateOnce, diff --git a/chromium/third_party/blink/renderer/core/exported/web_settings_impl.h b/chromium/third_party/blink/renderer/core/exported/web_settings_impl.h index c3f38e93e45..2c94bd8a360 100644 --- a/chromium/third_party/blink/renderer/core/exported/web_settings_impl.h +++ b/chromium/third_party/blink/renderer/core/exported/web_settings_impl.h @@ -146,7 +146,6 @@ class CORE_EXPORT WebSettingsImpl final : public WebSettings { UScriptCode = USCRIPT_COMMON) override; void SetShouldPrintBackgrounds(bool) override; void SetShouldClearDocumentBackground(bool) override; - void SetShouldRespectImageOrientation(bool) override; void SetShowContextMenuOnMouseUp(bool) override; void SetShrinksViewportContentToFit(bool) override; void SetSmartInsertDeleteEnabled(bool) override; @@ -224,6 +223,8 @@ class CORE_EXPORT WebSettingsImpl final : public WebSettings { void SetPreferredColorScheme(PreferredColorScheme) override; void SetNavigationControls(NavigationControls) override; + void SetAriaModalPrunesAXTree(bool) override; + bool RenderVSyncNotificationEnabled() const { return render_v_sync_notification_enabled_; } diff --git a/chromium/third_party/blink/renderer/core/exported/web_shared_worker_impl.cc b/chromium/third_party/blink/renderer/core/exported/web_shared_worker_impl.cc index 9942e60d41f..dbd47258fc9 100644 --- a/chromium/third_party/blink/renderer/core/exported/web_shared_worker_impl.cc +++ b/chromium/third_party/blink/renderer/core/exported/web_shared_worker_impl.cc @@ -31,6 +31,8 @@ #include "third_party/blink/renderer/core/exported/web_shared_worker_impl.h" #include <memory> +#include <utility> + #include "base/memory/ptr_util.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "services/network/public/mojom/fetch_api.mojom-shared.h" @@ -39,7 +41,6 @@ #include "third_party/blink/public/mojom/loader/fetch_client_settings_object.mojom-blink.h" #include "third_party/blink/public/mojom/script/script_type.mojom-blink.h" #include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom-blink.h" -#include "third_party/blink/public/mojom/worker/worker_content_settings_proxy.mojom-blink.h" #include "third_party/blink/public/platform/modules/service_worker/web_service_worker_network_provider.h" #include "third_party/blink/public/platform/task_type.h" #include "third_party/blink/public/platform/web_content_settings_client.h" @@ -175,8 +176,10 @@ void WebSharedWorkerImpl::StartWorkerContext( const WebFetchClientSettingsObject& outside_fetch_client_settings_object, const base::UnguessableToken& appcache_host_id, const base::UnguessableToken& devtools_worker_token, - mojo::ScopedMessagePipeHandle content_settings_handle, - mojo::ScopedMessagePipeHandle browser_interface_broker, + CrossVariantMojoRemote< + mojom::blink::WorkerContentSettingsProxyInterfaceBase> content_settings, + CrossVariantMojoRemote<mojom::blink::BrowserInterfaceBrokerInterfaceBase> + browser_interface_broker, bool pause_worker_context_on_start) { DCHECK(IsMainThread()); CHECK(constructor_origin.Get()->CanAccessSharedWorkers()); @@ -233,17 +236,13 @@ void WebSharedWorkerImpl::StartWorkerContext( outside_settings_object->GetHttpsState(), MakeGarbageCollected<WorkerClients>(), std::make_unique<SharedWorkerContentSettingsProxy>( - mojo::PendingRemote<mojom::blink::WorkerContentSettingsProxy>( - std::move(content_settings_handle), 0u)), + std::move(content_settings)), base::nullopt /* response_address_space */, nullptr /* origin_trial_tokens */, devtools_worker_token, std::move(worker_settings), kV8CacheOptionsDefault, nullptr /* worklet_module_response_map */, - mojo::PendingRemote<mojom::blink::BrowserInterfaceBroker>( - std::move(browser_interface_broker), - mojom::blink::BrowserInterfaceBroker::Version_), - BeginFrameProviderParams(), nullptr /* parent_feature_policy */, - base::UnguessableToken()); + std::move(browser_interface_broker), BeginFrameProviderParams(), + nullptr /* parent_feature_policy */, base::UnguessableToken()); reporting_proxy_ = MakeGarbageCollected<SharedWorkerReportingProxy>( this, ParentExecutionContextTaskRunners::Create()); @@ -293,8 +292,8 @@ void WebSharedWorkerImpl::StartWorkerContext( } // We are now ready to inspect worker thread. - client_->WorkerReadyForInspection(devtools_agent_remote.PassPipe(), - devtools_agent_host_receiver.PassPipe()); + client_->WorkerReadyForInspection(std::move(devtools_agent_remote), + std::move(devtools_agent_host_receiver)); } void WebSharedWorkerImpl::TerminateWorkerContext() { diff --git a/chromium/third_party/blink/renderer/core/exported/web_shared_worker_impl.h b/chromium/third_party/blink/renderer/core/exported/web_shared_worker_impl.h index 98374fb9031..2a9de264ba1 100644 --- a/chromium/third_party/blink/renderer/core/exported/web_shared_worker_impl.h +++ b/chromium/third_party/blink/renderer/core/exported/web_shared_worker_impl.h @@ -40,8 +40,10 @@ #include "services/network/public/mojom/content_security_policy.mojom-blink-forward.h" #include "services/network/public/mojom/fetch_api.mojom-shared.h" #include "services/network/public/mojom/ip_address_space.mojom-blink-forward.h" +#include "third_party/blink/public/mojom/browser_interface_broker.mojom-blink.h" #include "third_party/blink/public/mojom/script/script_type.mojom-blink.h" #include "third_party/blink/public/mojom/user_agent/user_agent_metadata.mojom-blink.h" +#include "third_party/blink/public/mojom/worker/worker_content_settings_proxy.mojom-blink.h" #include "third_party/blink/public/platform/web_fetch_client_settings_object.h" #include "third_party/blink/public/web/web_shared_worker_client.h" #include "third_party/blink/renderer/core/core_export.h" @@ -84,8 +86,11 @@ class CORE_EXPORT WebSharedWorkerImpl final : public WebSharedWorker { const WebFetchClientSettingsObject& outside_fetch_client_settings_object, const base::UnguessableToken& appcache_host_id, const base::UnguessableToken& devtools_worker_token, - mojo::ScopedMessagePipeHandle content_settings_handle, - mojo::ScopedMessagePipeHandle browser_interface_broker, + CrossVariantMojoRemote< + mojom::blink::WorkerContentSettingsProxyInterfaceBase> + ontent_settings, + CrossVariantMojoRemote<mojom::blink::BrowserInterfaceBrokerInterfaceBase> + browser_interface_broker, bool pause_worker_context_on_start) override; void Connect(MessagePortChannel) override; void TerminateWorkerContext() override; diff --git a/chromium/third_party/blink/renderer/core/exported/web_view_impl.cc b/chromium/third_party/blink/renderer/core/exported/web_view_impl.cc index ebebe2f3b21..27adaed62fe 100644 --- a/chromium/third_party/blink/renderer/core/exported/web_view_impl.cc +++ b/chromium/third_party/blink/renderer/core/exported/web_view_impl.cc @@ -140,6 +140,7 @@ #include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" #include "third_party/blink/renderer/core/paint/first_meaningful_paint_detector.h" #include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h" +#include "third_party/blink/renderer/core/paint/paint_timing.h" #include "third_party/blink/renderer/core/paint/paint_timing_detector.h" #include "third_party/blink/renderer/core/probe/core_probes.h" #include "third_party/blink/renderer/core/scroll/scrollbar_theme.h" @@ -489,7 +490,7 @@ WebInputEventResult WebViewImpl::HandleGestureEvent( } } event_result = WebInputEventResult::kHandledSystem; - MainFrameImpl()->FrameWidgetImpl()->Client()->DidHandleGestureEvent( + MainFrameImpl()->FrameWidgetImpl()->DidHandleGestureEvent( event, event_cancelled); return event_result; case WebInputEvent::Type::kGestureScrollBegin: @@ -504,7 +505,7 @@ WebInputEventResult WebViewImpl::HandleGestureEvent( ->GetFrame() ->GetEventHandler() .HandleGestureScrollEvent(scaled_event); - MainFrameImpl()->FrameWidgetImpl()->Client()->DidHandleGestureEvent( + MainFrameImpl()->FrameWidgetImpl()->DidHandleGestureEvent( event, event_cancelled); return event_result; default: @@ -617,8 +618,8 @@ WebInputEventResult WebViewImpl::HandleGestureEvent( } default: { NOTREACHED(); } } - MainFrameImpl()->FrameWidgetImpl()->Client()->DidHandleGestureEvent( - event, event_cancelled); + MainFrameImpl()->FrameWidgetImpl()->DidHandleGestureEvent(event, + event_cancelled); return event_result; } @@ -1592,27 +1593,27 @@ void WebViewImpl::UpdateLifecycle(WebLifecycleUpdate requested_update, if (LocalFrameView* view = MainFrameImpl()->GetFrameView()) { LocalFrame* frame = MainFrameImpl()->GetFrame(); - WebWidgetClient* client = - WebLocalFrameImpl::FromFrame(frame)->FrameWidgetImpl()->Client(); + WebFrameWidgetBase* frame_widget = + WebLocalFrameImpl::FromFrame(frame)->LocalRootFrameWidget(); if (should_dispatch_first_visually_non_empty_layout_ && view->IsVisuallyNonEmpty()) { should_dispatch_first_visually_non_empty_layout_ = false; // TODO(esprehn): Move users of this callback to something // better, the heuristic for "visually non-empty" is bad. - client->DidMeaningfulLayout(WebMeaningfulLayout::kVisuallyNonEmpty); + frame_widget->DidMeaningfulLayout(WebMeaningfulLayout::kVisuallyNonEmpty); } if (should_dispatch_first_layout_after_finished_parsing_ && frame->GetDocument()->HasFinishedParsing()) { should_dispatch_first_layout_after_finished_parsing_ = false; - client->DidMeaningfulLayout(WebMeaningfulLayout::kFinishedParsing); + frame_widget->DidMeaningfulLayout(WebMeaningfulLayout::kFinishedParsing); } if (should_dispatch_first_layout_after_finished_loading_ && frame->GetDocument()->IsLoadCompleted()) { should_dispatch_first_layout_after_finished_loading_ = false; - client->DidMeaningfulLayout(WebMeaningfulLayout::kFinishedLoading); + frame_widget->DidMeaningfulLayout(WebMeaningfulLayout::kFinishedLoading); } } } @@ -1937,26 +1938,6 @@ bool WebViewImpl::SelectionBounds(WebRect& anchor_web, return true; } -void WebViewImpl::DidAcquirePointerLock() { - if (MainFrameImpl()) - MainFrameImpl()->FrameWidget()->DidAcquirePointerLock(); -} - -void WebViewImpl::DidNotAcquirePointerLock() { - if (MainFrameImpl()) - MainFrameImpl()->FrameWidget()->DidNotAcquirePointerLock(); -} - -void WebViewImpl::DidLosePointerLock() { - // Make sure that the main frame wasn't swapped-out when the pointer lock is - // lost. There's a race that can happen when a pointer lock is requested, but - // the browser swaps out the main frame while the pointer lock request is in - // progress. This won't be needed once the main frame is refactored to not use - // the WebViewImpl as its WebWidget. - if (MainFrameImpl()) - MainFrameImpl()->FrameWidget()->DidLosePointerLock(); -} - // WebView -------------------------------------------------------------------- WebSettingsImpl* WebViewImpl::SettingsImpl() { @@ -2024,6 +2005,16 @@ void WebViewImpl::DidAttachLocalMainFrame() { } } +void WebViewImpl::DidAttachRemoteMainFrame() { + DCHECK(!MainFrameImpl()); + + RemoteFrame* remote_frame = DynamicTo<RemoteFrame>(GetPage()->MainFrame()); + DCHECK(remote_frame); + + remote_frame->GetRemoteAssociatedInterfaces()->GetInterface( + remote_main_frame_host_remote_.BindNewEndpointAndPassReceiver()); +} + void WebViewImpl::DidDetachLocalMainFrame() { // The WebWidgetClient that generated the |scoped_defer_main_frame_update_| // for a local main frame is going away. @@ -2031,6 +2022,10 @@ void WebViewImpl::DidDetachLocalMainFrame() { local_main_frame_host_remote_.reset(); } +void WebViewImpl::DidDetachRemoteMainFrame() { + remote_main_frame_host_remote_.reset(); +} + WebLocalFrame* WebViewImpl::FocusedFrame() { Frame* frame = FocusedCoreFrame(); // TODO(yabinh): focusedCoreFrame() should always return a local frame, and @@ -2323,20 +2318,6 @@ double WebViewImpl::SetZoomLevel(double zoom_level) { return zoom_level_; } -float WebViewImpl::TextZoomFactor() { - return MainFrameImpl()->GetFrame()->TextZoomFactor(); -} - -float WebViewImpl::SetTextZoomFactor(float text_zoom_factor) { - LocalFrame* frame = MainFrameImpl()->GetFrame(); - if (frame->GetWebPluginContainer()) - return 1; - - frame->SetTextZoomFactor(text_zoom_factor); - - return text_zoom_factor; -} - float WebViewImpl::PageScaleFactor() const { if (!GetPage()) return 1; @@ -2402,16 +2383,45 @@ void WebViewImpl::SetZoomFactorForDeviceScaleFactor( void WebViewImpl::SetPageLifecycleState( mojom::blink::PageLifecycleStatePtr state, + base::Optional<base::TimeTicks> navigation_start, SetPageLifecycleStateCallback callback) { Page* page = GetPage(); if (!page) return; - if (state->visibility != lifecycle_state_->visibility) { - SetVisibilityState(state->visibility, /*is_initial_state =*/false); - } - if (state->is_frozen != lifecycle_state_->is_frozen) { - Scheduler()->SetPageFrozen(state->is_frozen); + bool storing_in_bfcache = state->is_in_back_forward_cache && + !lifecycle_state_->is_in_back_forward_cache; + bool restoring_from_bfcache = !state->is_in_back_forward_cache && + lifecycle_state_->is_in_back_forward_cache; + bool hiding_page = + (state->visibility != mojom::blink::PageVisibilityState::kVisible) && + (lifecycle_state_->visibility == + mojom::blink::PageVisibilityState::kVisible); + bool showing_page = + (state->visibility == mojom::blink::PageVisibilityState::kVisible) && + (lifecycle_state_->visibility != + mojom::blink::PageVisibilityState::kVisible); + bool freezing_page = state->is_frozen && !lifecycle_state_->is_frozen; + bool resuming_page = !state->is_frozen && lifecycle_state_->is_frozen; + + if (hiding_page) { + SetVisibilityState(state->visibility, /*is_initial_state=*/false); + } + if (storing_in_bfcache) + DispatchPagehide(); + if (freezing_page) + Scheduler()->SetPageFrozen(true); + if (storing_in_bfcache) + HookBackForwardCacheEviction(true); + if (restoring_from_bfcache) + HookBackForwardCacheEviction(false); + if (resuming_page) + Scheduler()->SetPageFrozen(false); + if (restoring_from_bfcache) + DispatchPageshow(navigation_start.value()); + if (showing_page) { + SetVisibilityState(mojom::blink::PageVisibilityState::kVisible, + /*is_initial_state=*/false); } lifecycle_state_ = std::move(state); @@ -2419,6 +2429,60 @@ void WebViewImpl::SetPageLifecycleState( std::move(callback).Run(); } +void WebViewImpl::DispatchPagehide() { + for (Frame* frame = GetPage()->MainFrame(); frame; + frame = frame->Tree().TraverseNext()) { + if (frame->DomWindow() && frame->DomWindow()->IsLocalDOMWindow()) { + frame->DomWindow()->ToLocalDOMWindow()->DispatchPagehideEvent( + PageTransitionEventPersistence::kPageTransitionEventPersisted); + } + } +} + +void WebViewImpl::DispatchPageshow(base::TimeTicks navigation_start) { + for (Frame* frame = GetPage()->MainFrame(); frame; + frame = frame->Tree().TraverseNext()) { + auto* local_frame = DynamicTo<LocalFrame>(frame); + // Record the metics. + if (local_frame && local_frame->View()) { + Document* document = local_frame->GetDocument(); + if (document) { + PaintTiming::From(*document).OnRestoredFromBackForwardCache(); + InteractiveDetector::From(*document)->OnRestoredFromBackForwardCache(); + } + DocumentLoader* loader = local_frame->Loader().GetDocumentLoader(); + if (loader) { + loader->GetTiming().MarkBackForwardCacheRestoreNavigationStart( + navigation_start); + } + } + if (frame->DomWindow() && frame->DomWindow()->IsLocalDOMWindow()) { + frame->DomWindow()->ToLocalDOMWindow()->DispatchPersistedPageshowEvent( + navigation_start); + if (frame->IsMainFrame()) { + UMA_HISTOGRAM_BOOLEAN( + "BackForwardCache.MainFrameHasPageshowListenersOnRestore", + frame->DomWindow()->ToLocalDOMWindow()->HasEventListeners( + event_type_names::kPageshow)); + } + } + } +} + +void WebViewImpl::HookBackForwardCacheEviction(bool hook) { + DCHECK(GetPage()); + for (Frame* frame = GetPage()->MainFrame(); frame; + frame = frame->Tree().TraverseNext()) { + auto* local_frame = DynamicTo<LocalFrame>(frame); + if (!local_frame) + continue; + if (hook) + local_frame->HookBackForwardCacheEviction(); + else + local_frame->RemoveBackForwardCacheEviction(); + } +} + void WebViewImpl::EnableAutoResizeMode(const WebSize& min_size, const WebSize& max_size) { should_auto_resize_ = true; @@ -2685,6 +2749,16 @@ void WebViewImpl::EnablePreferredSizeChangedMode() { UpdatePreferredSize(); } +void WebViewImpl::Focus() { + if (GetPage()->MainFrame()->IsLocalFrame()) { + DCHECK(local_main_frame_host_remote_); + local_main_frame_host_remote_->FocusPage(); + } else { + DCHECK(remote_main_frame_host_remote_); + remote_main_frame_host_remote_->FocusPage(); + } +} + float WebViewImpl::DefaultMinimumPageScaleFactor() const { return GetPageScaleConstraintsSet().DefaultConstraints().minimum_scale; } @@ -2833,15 +2907,6 @@ void WebViewImpl::PerformCustomContextMenuAction(unsigned action) { } } -void WebViewImpl::ShowContextMenu(WebMenuSourceType source_type) { - if (!MainFrameImpl()) - return; - - // If MainFrameImpl() is non-null, then FrameWidget() will also be non-null. - DCHECK(MainFrameImpl()->FrameWidget()); - MainFrameImpl()->FrameWidget()->ShowContextMenu(source_type); -} - WebURL WebViewImpl::GetURLForDebugTrace() { WebFrame* main_frame = MainFrame(); if (main_frame->IsWebLocalFrame()) @@ -3349,64 +3414,6 @@ void WebViewImpl::SetPageFrozen(bool frozen) { Scheduler()->SetPageFrozen(frozen); } -void WebViewImpl::PutPageIntoBackForwardCache() { - DCHECK(GetPage()); - - SetVisibilityState(mojom::blink::PageVisibilityState::kHidden, - /*is_initial_state=*/false); - - for (Frame* frame = GetPage()->MainFrame(); frame; - frame = frame->Tree().TraverseNext()) { - if (frame->DomWindow() && frame->DomWindow()->IsLocalDOMWindow()) { - frame->DomWindow()->ToLocalDOMWindow()->DispatchPagehideEvent( - PageTransitionEventPersistence::kPageTransitionEventPersisted); - } - } - - // Freeze the page. - Scheduler()->SetPageFrozen(/*frozen =*/true); - // Hook eviction. - for (Frame* frame = GetPage()->MainFrame(); frame; - frame = frame->Tree().TraverseNext()) { - auto* local_frame = DynamicTo<LocalFrame>(frame); - if (!local_frame) - continue; - local_frame->HookBackForwardCacheEviction(); - } -} - -void WebViewImpl::RestorePageFromBackForwardCache( - base::TimeTicks navigation_start) { - DCHECK(GetPage()); - - // Unhook eviction. - for (Frame* frame = GetPage()->MainFrame(); frame; - frame = frame->Tree().TraverseNext()) { - auto* local_frame = DynamicTo<LocalFrame>(frame); - if (!local_frame) - continue; - local_frame->RemoveBackForwardCacheEviction(); - } - - // Resume the page. - Scheduler()->SetPageFrozen(/*frozen =*/false); - for (Frame* frame = GetPage()->MainFrame(); frame; - frame = frame->Tree().TraverseNext()) { - if (frame->DomWindow() && frame->DomWindow()->IsLocalDOMWindow()) { - frame->DomWindow()->ToLocalDOMWindow()->DispatchPersistedPageshowEvent( - navigation_start); - if (frame->IsMainFrame()) { - UMA_HISTOGRAM_BOOLEAN( - "BackForwardCache.MainFrameHasPageshowListenersOnRestore", - frame->DomWindow()->ToLocalDOMWindow()->HasEventListeners( - event_type_names::kPageshow)); - } - } - } - SetVisibilityState(mojom::blink::PageVisibilityState::kVisible, - /*is_initial_state=*/false); -} - WebFrameWidget* WebViewImpl::MainFrameWidget() { return web_widget_; } diff --git a/chromium/third_party/blink/renderer/core/exported/web_view_impl.h b/chromium/third_party/blink/renderer/core/exported/web_view_impl.h index ae5bf526b8a..e2124434e0d 100644 --- a/chromium/third_party/blink/renderer/core/exported/web_view_impl.h +++ b/chromium/third_party/blink/renderer/core/exported/web_view_impl.h @@ -125,6 +125,9 @@ class CORE_EXPORT WebViewImpl final : public WebView, // WebView methods: void DidAttachLocalMainFrame() override; + void DidDetachLocalMainFrame() override; + void DidAttachRemoteMainFrame() override; + void DidDetachRemoteMainFrame() override; void SetPrerendererClient(WebPrerendererClient*) override; WebSettings* GetSettings() override; WebString PageEncoding() const override; @@ -156,8 +159,6 @@ class CORE_EXPORT WebViewImpl final : public WebView, bool zoom_into_legible_scale) override; double ZoomLevel() override; double SetZoomLevel(double) override; - float TextZoomFactor() override; - float SetTextZoomFactor(float) override; float PageScaleFactor() const override; float MinimumPageScaleFactor() const override; float MaximumPageScaleFactor() const override; @@ -176,6 +177,7 @@ class CORE_EXPORT WebViewImpl final : public WebView, WebSize ContentsPreferredMinimumSize() override; void UpdatePreferredSize() override; void EnablePreferredSizeChangedMode() override; + void Focus() override; void SetDeviceScaleFactor(float) override; void SetZoomFactorForDeviceScaleFactor(float) override; float ZoomFactorForDeviceScaleFactor() override { @@ -197,9 +199,6 @@ class CORE_EXPORT WebViewImpl final : public WebView, WebPagePopupImpl* GetPagePopup() const override { return page_popup_.get(); } void AcceptLanguagesChanged() override; void SetPageFrozen(bool frozen) override; - void PutPageIntoBackForwardCache() override; - void RestorePageFromBackForwardCache( - base::TimeTicks navigation_start) override; WebFrameWidget* MainFrameWidget() override; void SetBaseBackgroundColor(SkColor) override; void SetInsidePortal(bool inside_portal) override; @@ -221,8 +220,13 @@ class CORE_EXPORT WebViewImpl final : public WebView, // mojom::blink::PageBroadcast method: void SetPageLifecycleState(mojom::blink::PageLifecycleStatePtr state, + base::Optional<base::TimeTicks> navigation_start, SetPageLifecycleStateCallback callback) override; + void DispatchPagehide(); + void DispatchPageshow(base::TimeTicks navigation_start); + void HookBackForwardCacheEviction(bool hook); + float DefaultMinimumPageScaleFactor() const; float DefaultMaximumPageScaleFactor() const; float ClampPageScaleFactorToLimits(float) const; @@ -447,10 +451,6 @@ class CORE_EXPORT WebViewImpl final : public WebView, ViewData& AsView() { return as_view_; } const ViewData& AsView() const { return as_view_; } - // Called while the main LocalFrame is being detached. The MainFrameImpl() is - // still valid until after this method is called. - void DidDetachLocalMainFrame(); - // These are temporary methods to allow WebViewFrameWidget to delegate to // WebViewImpl. We expect to eventually move these out. void SetSuppressFrameRequestsWorkaroundFor704763Only(bool); @@ -475,10 +475,6 @@ class CORE_EXPORT WebViewImpl final : public WebView, void MouseCaptureLost(); void SetFocus(bool enable) override; bool SelectionBounds(WebRect& anchor, WebRect& focus) const; - void DidAcquirePointerLock(); - void DidNotAcquirePointerLock(); - void DidLosePointerLock(); - void ShowContextMenu(WebMenuSourceType); WebURL GetURLForDebugTrace(); void SetPageScaleFactorAndLocation(float scale, @@ -720,6 +716,11 @@ class CORE_EXPORT WebViewImpl final : public WebView, mojo::AssociatedRemote<mojom::blink::LocalMainFrameHost> local_main_frame_host_remote_; + // Handle to the remote main frame host. Only valid when the MainFrame is + // remote. + mojo::AssociatedRemote<mojom::blink::RemoteMainFrameHost> + remote_main_frame_host_remote_; + // Set when a measurement begins, reset when the measurement is taken. base::Optional<base::TimeTicks> update_layers_start_time_; diff --git a/chromium/third_party/blink/renderer/core/exported/web_view_test.cc b/chromium/third_party/blink/renderer/core/exported/web_view_test.cc index cd29a295327..cbd6c1b384f 100644 --- a/chromium/third_party/blink/renderer/core/exported/web_view_test.cc +++ b/chromium/third_party/blink/renderer/core/exported/web_view_test.cc @@ -54,12 +54,12 @@ #include "third_party/blink/public/common/input/web_input_event.h" #include "third_party/blink/public/common/input/web_keyboard_event.h" #include "third_party/blink/public/common/page/page_zoom.h" +#include "third_party/blink/public/common/page/web_drag_operation.h" #include "third_party/blink/public/mojom/frame/frame_owner_element_type.mojom-blink.h" #include "third_party/blink/public/mojom/frame/tree_scope_type.mojom-blink.h" #include "third_party/blink/public/mojom/input/focus_type.mojom-blink.h" #include "third_party/blink/public/mojom/manifest/display_mode.mojom-shared.h" #include "third_party/blink/public/platform/web_drag_data.h" -#include "third_party/blink/public/platform/web_drag_operation.h" #include "third_party/blink/public/platform/web_size.h" #include "third_party/blink/public/platform/web_url_loader_mock_factory.h" #include "third_party/blink/public/public_buildflags.h" @@ -213,40 +213,6 @@ class AutoResizeWebViewClient : public frame_test_helpers::TestWebViewClient { TestData test_data_; }; -class TapHandlingWebWidgetClient - : public frame_test_helpers::TestWebWidgetClient { - public: - // WebWidgetClient overrides. - void DidHandleGestureEvent(const WebGestureEvent& event, - bool event_cancelled) override { - if (event.GetType() == WebInputEvent::Type::kGestureTap) { - tap_x_ = event.PositionInWidget().x(); - tap_y_ = event.PositionInWidget().y(); - } else if (event.GetType() == WebInputEvent::Type::kGestureLongPress) { - longpress_x_ = event.PositionInWidget().x(); - longpress_y_ = event.PositionInWidget().y(); - } - } - - // Local methods - void Reset() { - tap_x_ = -1; - tap_y_ = -1; - longpress_x_ = -1; - longpress_y_ = -1; - } - int TapX() { return tap_x_; } - int TapY() { return tap_y_; } - int LongpressX() { return longpress_x_; } - int LongpressY() { return longpress_y_; } - - private: - int tap_x_; - int tap_y_; - int longpress_x_; - int longpress_y_; -}; - class WebViewTest : public testing::Test { public: WebViewTest() : base_url_("http://www.test.com/") {} @@ -624,6 +590,19 @@ TEST_F(WebViewTest, SetBaseBackgroundColorWithColorScheme) { web_view->SetBaseBackgroundColor(SK_ColorBLUE); EXPECT_EQ(Color::kBlack, frame_view->BaseBackgroundColor()); + color_scheme_helper.SetForcedColors(*(web_view->GetPage()), + ForcedColors::kActive); + UpdateAllLifecyclePhases(); + + Color system_background_color = LayoutTheme::GetTheme().SystemColor( + CSSValueID::kCanvas, WebColorScheme::kLight); + EXPECT_EQ(system_background_color, frame_view->BaseBackgroundColor()); + + color_scheme_helper.SetForcedColors(*(web_view->GetPage()), + ForcedColors::kNone); + UpdateAllLifecyclePhases(); + EXPECT_EQ(Color::kBlack, frame_view->BaseBackgroundColor()); + color_scheme_helper.SetPreferredColorScheme(PreferredColorScheme::kLight); UpdateAllLifecyclePhases(); EXPECT_EQ(Color(0, 0, 255), frame_view->BaseBackgroundColor()); @@ -1186,7 +1165,7 @@ TEST_F(WebViewTest, FinishComposingTextDoesNotAssert) { // The test requires non-empty composition. std::string composition_text("hello"); - WebVector<WebImeTextSpan> empty_ime_text_spans; + WebVector<ui::ImeTextSpan> empty_ime_text_spans; active_input_method_controller->SetComposition( WebString::FromUTF8(composition_text.c_str()), empty_ime_text_spans, WebRange(), 5, 5); @@ -1243,7 +1222,7 @@ TEST_F(WebViewTest, FinishComposingTextCursorPositionChange) { web_view->MainFrameImpl() ->FrameWidget() ->GetActiveWebInputMethodController(); - WebVector<WebImeTextSpan> empty_ime_text_spans; + WebVector<ui::ImeTextSpan> empty_ime_text_spans; active_input_method_controller->SetComposition( WebString::FromUTF8(composition_text.c_str()), empty_ime_text_spans, WebRange(), 3, 3); @@ -1292,7 +1271,7 @@ TEST_F(WebViewTest, SetCompositionForNewCaretPositions) { ->FrameWidget() ->GetActiveWebInputMethodController(); - WebVector<WebImeTextSpan> empty_ime_text_spans; + WebVector<ui::ImeTextSpan> empty_ime_text_spans; active_input_method_controller->CommitText("hello", empty_ime_text_spans, WebRange(), 0); @@ -1408,7 +1387,7 @@ TEST_F(WebViewTest, SetCompositionWithEmptyText) { ->FrameWidget() ->GetActiveWebInputMethodController(); - WebVector<WebImeTextSpan> empty_ime_text_spans; + WebVector<ui::ImeTextSpan> empty_ime_text_spans; active_input_method_controller->CommitText("hello", empty_ime_text_spans, WebRange(), 0); @@ -1449,7 +1428,7 @@ TEST_F(WebViewTest, CommitTextForNewCaretPositions) { ->FrameWidget() ->GetActiveWebInputMethodController(); - WebVector<WebImeTextSpan> empty_ime_text_spans; + WebVector<ui::ImeTextSpan> empty_ime_text_spans; // Caret is on the left of composing text. active_input_method_controller->CommitText("ab", empty_ime_text_spans, @@ -1522,7 +1501,7 @@ TEST_F(WebViewTest, CommitTextWhileComposing) { ->FrameWidget() ->GetActiveWebInputMethodController(); - WebVector<WebImeTextSpan> empty_ime_text_spans; + WebVector<ui::ImeTextSpan> empty_ime_text_spans; active_input_method_controller->SetComposition( WebString::FromUTF8("abc"), empty_ime_text_spans, WebRange(), 0, 0); WebTextInputInfo info = active_input_method_controller->TextInputInfo(); @@ -1623,7 +1602,7 @@ TEST_F(WebViewTest, InsertNewLinePlacementAfterFinishComposingText) { base_url_ + "text_area_populated.html"); web_view->MainFrameImpl()->GetFrame()->SetInitialFocus(false); - WebVector<WebImeTextSpan> empty_ime_text_spans; + WebVector<ui::ImeTextSpan> empty_ime_text_spans; WebLocalFrameImpl* frame = web_view->MainFrameImpl(); WebInputMethodController* active_input_method_controller = @@ -1725,11 +1704,11 @@ TEST_F(WebViewTest, SetCompositionFromExistingText) { WebViewImpl* web_view = web_view_helper_.InitializeAndLoad( base_url_ + "input_field_populated.html"); web_view->MainFrameImpl()->GetFrame()->SetInitialFocus(false); - WebVector<WebImeTextSpan> ime_text_spans(static_cast<size_t>(1)); + WebVector<ui::ImeTextSpan> ime_text_spans(static_cast<size_t>(1)); ime_text_spans[0] = - WebImeTextSpan(WebImeTextSpan::Type::kComposition, 0, 4, - ui::mojom::ImeTextSpanThickness::kThin, - ui::mojom::ImeTextSpanUnderlineStyle::kSolid, 0, 0); + ui::ImeTextSpan(ui::ImeTextSpan::Type::kComposition, 0, 4, + ui::ImeTextSpan::Thickness::kThin, + ui::ImeTextSpan::UnderlineStyle::kSolid, 0, 0); WebLocalFrameImpl* frame = web_view->MainFrameImpl(); WebInputMethodController* active_input_method_controller = frame->GetInputMethodController(); @@ -1740,7 +1719,7 @@ TEST_F(WebViewTest, SetCompositionFromExistingText) { EXPECT_EQ(10, info.selection_end); EXPECT_EQ(8, info.composition_start); EXPECT_EQ(12, info.composition_end); - WebVector<WebImeTextSpan> empty_ime_text_spans; + WebVector<ui::ImeTextSpan> empty_ime_text_spans; frame->SetCompositionFromExistingText(0, 0, empty_ime_text_spans); info = active_input_method_controller->TextInputInfo(); EXPECT_EQ(4, info.selection_start); @@ -1754,17 +1733,17 @@ TEST_F(WebViewTest, SetCompositionFromExistingTextInTextArea) { WebViewImpl* web_view = web_view_helper_.InitializeAndLoad( base_url_ + "text_area_populated.html"); web_view->MainFrameImpl()->GetFrame()->SetInitialFocus(false); - WebVector<WebImeTextSpan> ime_text_spans(static_cast<size_t>(1)); + WebVector<ui::ImeTextSpan> ime_text_spans(static_cast<size_t>(1)); ime_text_spans[0] = - WebImeTextSpan(WebImeTextSpan::Type::kComposition, 0, 4, - ui::mojom::ImeTextSpanThickness::kThin, - ui::mojom::ImeTextSpanUnderlineStyle::kSolid, 0, 0); + ui::ImeTextSpan(ui::ImeTextSpan::Type::kComposition, 0, 4, + ui::ImeTextSpan::Thickness::kThin, + ui::ImeTextSpan::UnderlineStyle::kSolid, 0, 0); WebLocalFrameImpl* frame = web_view->MainFrameImpl(); WebInputMethodController* active_input_method_controller = frame->FrameWidget()->GetActiveWebInputMethodController(); frame->SetEditableSelectionOffsets(27, 27); std::string new_line_text("\n"); - WebVector<WebImeTextSpan> empty_ime_text_spans; + WebVector<ui::ImeTextSpan> empty_ime_text_spans; active_input_method_controller->CommitText( WebString::FromUTF8(new_line_text.c_str()), empty_ime_text_spans, WebRange(), 0); @@ -1797,11 +1776,11 @@ TEST_F(WebViewTest, SetCompositionFromExistingTextInRichText) { WebViewImpl* web_view = web_view_helper_.InitializeAndLoad( base_url_ + "content_editable_rich_text.html"); web_view->MainFrameImpl()->GetFrame()->SetInitialFocus(false); - WebVector<WebImeTextSpan> ime_text_spans(static_cast<size_t>(1)); + WebVector<ui::ImeTextSpan> ime_text_spans(static_cast<size_t>(1)); ime_text_spans[0] = - WebImeTextSpan(WebImeTextSpan::Type::kComposition, 0, 4, - ui::mojom::ImeTextSpanThickness::kThin, - ui::mojom::ImeTextSpanUnderlineStyle::kSolid, 0, 0); + ui::ImeTextSpan(ui::ImeTextSpan::Type::kComposition, 0, 4, + ui::ImeTextSpan::Thickness::kThin, + ui::ImeTextSpan::UnderlineStyle::kSolid, 0, 0); WebLocalFrameImpl* frame = web_view->MainFrameImpl(); frame->SetEditableSelectionOffsets(1, 1); WebDocument document = web_view->MainFrameImpl()->GetDocument(); @@ -1818,7 +1797,7 @@ TEST_F(WebViewTest, SetEditableSelectionOffsetsKeepsComposition) { std::string composition_text_first("hello "); std::string composition_text_second("world"); - WebVector<WebImeTextSpan> empty_ime_text_spans; + WebVector<ui::ImeTextSpan> empty_ime_text_spans; WebInputMethodController* active_input_method_controller = web_view->MainFrameImpl() ->FrameWidget() @@ -2630,8 +2609,6 @@ TEST_F(WebViewTest, PrintWithXHRInFlight) { static void DragAndDropURL(WebViewImpl* web_view, const std::string& url) { WebDragData drag_data; - drag_data.Initialize(); - WebDragData::Item item; item.storage_type = WebDragData::Item::kStorageTypeString; item.string_type = "text/uri-list"; @@ -2729,33 +2706,6 @@ ExternalDateTimeChooser* WebViewTest::GetExternalDateTimeChooser( .GetExternalDateTimeChooserForTesting(); } -TEST_F(WebViewTest, ClientTapHandling) { - TapHandlingWebWidgetClient client; - WebView* web_view = web_view_helper_.InitializeAndLoad("about:blank", nullptr, - nullptr, &client); - WebGestureEvent event(WebInputEvent::Type::kGestureTap, - WebInputEvent::kNoModifiers, - WebInputEvent::GetStaticTimeStampForTests(), - WebGestureDevice::kTouchscreen); - event.SetPositionInWidget(gfx::PointF(3, 8)); - web_view->MainFrameWidget()->HandleInputEvent( - WebCoalescedInputEvent(event, ui::LatencyInfo())); - RunPendingTasks(); - EXPECT_EQ(3, client.TapX()); - EXPECT_EQ(8, client.TapY()); - client.Reset(); - event.SetType(WebInputEvent::Type::kGestureLongPress); - event.SetPositionInWidget(gfx::PointF(25, 7)); - web_view->MainFrameWidget()->HandleInputEvent( - WebCoalescedInputEvent(event, ui::LatencyInfo())); - RunPendingTasks(); - EXPECT_EQ(25, client.LongpressX()); - EXPECT_EQ(7, client.LongpressY()); - - // Explicitly reset to break dependency on locally scoped client. - web_view_helper_.Reset(); -} - TEST_F(WebViewTest, ClientTapHandlingNullWebViewClient) { // Note: this test doesn't use WebViewHelper since WebViewHelper creates an // internal WebViewClient on demand if the supplied WebViewClient is null. @@ -3092,7 +3042,7 @@ TEST_F(WebViewTest, FinishComposingTextDoesNotDismissHandles) { WebInputMethodController* active_input_method_controller = frame->FrameWidget()->GetActiveWebInputMethodController(); EXPECT_TRUE(TapElementById(WebInputEvent::Type::kGestureTap, target)); - WebVector<WebImeTextSpan> empty_ime_text_spans; + WebVector<ui::ImeTextSpan> empty_ime_text_spans; frame->SetEditableSelectionOffsets(8, 8); EXPECT_TRUE(active_input_method_controller->SetComposition( "12345", empty_ime_text_spans, WebRange(), 8, 13)); @@ -3530,7 +3480,7 @@ TEST_F(WebViewTest, LosingFocusDoesNotTriggerAutofillTextChange) { web_view->MainFrameImpl()->GetFrame()->SetInitialFocus(false); // Set up a composition that needs to be committed. - WebVector<WebImeTextSpan> empty_ime_text_spans; + WebVector<ui::ImeTextSpan> empty_ime_text_spans; frame->SetEditableSelectionOffsets(4, 10); frame->SetCompositionFromExistingText(8, 12, empty_ime_text_spans); WebTextInputInfo info = frame->GetInputMethodController()->TextInputInfo(); @@ -3574,7 +3524,7 @@ TEST_F(WebViewTest, CompositionNotCancelledByBackspace) { // Test both input elements. for (int i = 0; i < 2; ++i) { // Select composition and do sanity check. - WebVector<WebImeTextSpan> empty_ime_text_spans; + WebVector<ui::ImeTextSpan> empty_ime_text_spans; frame->SetEditableSelectionOffsets(6, 6); WebInputMethodController* active_input_method_controller = frame->FrameWidget()->GetActiveWebInputMethodController(); @@ -3628,7 +3578,7 @@ TEST_F(WebViewTest, FinishComposingTextDoesntTriggerAutofillTextChange) { // Set up a composition that needs to be committed. std::string composition_text("testingtext"); - WebVector<WebImeTextSpan> empty_ime_text_spans; + WebVector<ui::ImeTextSpan> empty_ime_text_spans; active_input_method_controller->SetComposition( WebString::FromUTF8(composition_text.c_str()), empty_ime_text_spans, WebRange(), 0, composition_text.length()); @@ -3661,7 +3611,7 @@ TEST_F(WebViewTest, frame->SetAutofillClient(&client); web_view->MainFrameImpl()->GetFrame()->SetInitialFocus(false); - WebVector<WebImeTextSpan> empty_ime_text_spans; + WebVector<ui::ImeTextSpan> empty_ime_text_spans; client.ClearChangeCounts(); frame->SetCompositionFromExistingText(8, 12, empty_ime_text_spans); @@ -3697,7 +3647,7 @@ class ViewCreatingWebViewClient : public frame_test_helpers::TestWebViewClient { } // WebWidgetClient methods - void DidFocus(WebLocalFrame*) override { did_focus_called_ = true; } + void DidFocus() override { did_focus_called_ = true; } bool DidFocusCalled() const { return did_focus_called_; } WebView* CreatedWebView() const { return web_view_helper_.GetWebView(); } @@ -4109,6 +4059,7 @@ class FakeFrameWidgetHost : public mojom::blink::FrameWidgetHost { void AutoscrollStart(const gfx::PointF& position) override {} void AutoscrollFling(const gfx::Vector2dF& position) override {} void AutoscrollEnd() override {} + void DidFirstVisuallyNonEmptyPaint() override {} private: mojo::AssociatedReceiver<mojom::blink::FrameWidgetHost> @@ -4329,6 +4280,7 @@ TEST_F(WebViewTest, SetHasTouchEventHandlers) { // Free the webView before the TouchEventHandlerWebViewClient gets freed. web_view_helper_.Reset(); + web_view_impl->Close(); } // This test checks that deleting nodes which have only non-JS-registered touch @@ -4485,7 +4437,7 @@ TEST_F(WebViewTest, CompositionIsUserGesture) { EXPECT_TRUE( frame->FrameWidget()->GetActiveWebInputMethodController()->SetComposition( WebString::FromUTF8(std::string("hello").c_str()), - WebVector<WebImeTextSpan>(), WebRange(), 3, 3)); + WebVector<ui::ImeTextSpan>(), WebRange(), 3, 3)); EXPECT_TRUE(frame->HasTransientUserActivation()); EXPECT_EQ(1, client.TextChanges()); EXPECT_TRUE(frame->HasMarkedText()); @@ -5016,7 +4968,7 @@ TEST_F(WebViewTest, PasswordFieldEditingIsUserGesture) { frame->SetAutofillClient(&client); web_view->MainFrameImpl()->GetFrame()->SetInitialFocus(false); - WebVector<WebImeTextSpan> empty_ime_text_spans; + WebVector<ui::ImeTextSpan> empty_ime_text_spans; EXPECT_EQ(0, client.TextChanges()); EXPECT_TRUE( |