| 
									
										
										
										
											2020-01-18 09:38:21 +01:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org> | 
					
						
							|  |  |  |  * All rights reserved. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Redistribution and use in source and binary forms, with or without | 
					
						
							|  |  |  |  * modification, are permitted provided that the following conditions are met: | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * 1. Redistributions of source code must retain the above copyright notice, this | 
					
						
							|  |  |  |  *    list of conditions and the following disclaimer. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * 2. Redistributions in binary form must reproduce the above copyright notice, | 
					
						
							|  |  |  |  *    this list of conditions and the following disclaimer in the documentation | 
					
						
							|  |  |  |  *    and/or other materials provided with the distribution. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | 
					
						
							|  |  |  |  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | 
					
						
							|  |  |  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 
					
						
							|  |  |  |  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE | 
					
						
							|  |  |  |  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | 
					
						
							|  |  |  |  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | 
					
						
							|  |  |  |  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | 
					
						
							|  |  |  |  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | 
					
						
							|  |  |  |  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 
					
						
							|  |  |  |  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2020-05-28 20:40:53 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-25 12:44:22 +03:00
										 |  |  | #pragma once
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-05 10:16:27 +02:00
										 |  |  | #include <AK/URL.h>
 | 
					
						
							| 
									
										
										
										
											2020-02-06 20:33:02 +01:00
										 |  |  | #include <LibGUI/ScrollableWidget.h>
 | 
					
						
							| 
									
										
										
										
											2020-03-07 10:32:51 +01:00
										 |  |  | #include <LibWeb/DOM/Document.h>
 | 
					
						
							| 
									
										
										
										
											2020-06-08 20:31:49 +02:00
										 |  |  | #include <LibWeb/Page.h>
 | 
					
						
							| 
									
										
										
										
											2019-09-25 12:44:22 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-07 10:27:02 +01:00
										 |  |  | namespace Web { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-08 20:31:49 +02:00
										 |  |  | class PageView final | 
					
						
							|  |  |  |     : public GUI::ScrollableWidget | 
					
						
							|  |  |  |     , public PageClient { | 
					
						
							| 
									
										
										
										
											2020-06-07 14:40:38 +02:00
										 |  |  |     C_OBJECT(PageView); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-25 12:44:22 +03:00
										 |  |  | public: | 
					
						
							| 
									
										
										
										
											2020-05-28 18:21:22 +02:00
										 |  |  |     virtual ~PageView() override; | 
					
						
							| 
									
										
										
										
											2019-09-25 12:44:22 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-21 21:37:07 +02:00
										 |  |  |     void load_html(const StringView&, const URL&); | 
					
						
							| 
									
										
										
										
											2020-06-06 13:02:44 +02:00
										 |  |  |     void load_empty_document(); | 
					
						
							| 
									
										
										
										
											2020-05-27 21:57:30 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-20 10:36:14 +02:00
										 |  |  |     Document* document(); | 
					
						
							|  |  |  |     const Document* document() const; | 
					
						
							| 
									
										
										
										
											2020-06-06 13:02:44 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-25 12:44:22 +03:00
										 |  |  |     void set_document(Document*); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-13 12:34:25 +02:00
										 |  |  |     const LayoutDocument* layout_root() const; | 
					
						
							|  |  |  |     LayoutDocument* layout_root(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-05 10:16:27 +02:00
										 |  |  |     void reload(); | 
					
						
							| 
									
										
										
										
											2020-06-06 13:02:44 +02:00
										 |  |  |     bool load(const URL&); | 
					
						
							| 
									
										
										
										
											2019-10-05 10:16:27 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     URL url() const; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-12 15:02:53 +02:00
										 |  |  |     void set_should_show_line_box_borders(bool value) { m_should_show_line_box_borders = value; } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-27 14:21:58 -06:00
										 |  |  |     Function<void(const Gfx::IntPoint& screen_position)> on_context_menu_request; | 
					
						
							| 
									
										
										
										
											2020-07-06 19:41:10 +02:00
										 |  |  |     Function<void(const URL&, const String& target, unsigned modifiers)> on_link_click; | 
					
						
							| 
									
										
										
										
											2020-07-06 20:00:56 +02:00
										 |  |  |     Function<void(const URL&, const Gfx::IntPoint& screen_position)> on_link_context_menu_request; | 
					
						
							| 
									
										
										
										
											2020-07-06 19:41:10 +02:00
										 |  |  |     Function<void(const URL&)> on_link_middle_click; | 
					
						
							| 
									
										
										
										
											2020-07-05 17:02:44 +02:00
										 |  |  |     Function<void(const URL&)> on_link_hover; | 
					
						
							| 
									
										
										
										
											2019-09-29 16:24:57 +02:00
										 |  |  |     Function<void(const String&)> on_title_change; | 
					
						
							| 
									
										
										
										
											2019-10-05 10:16:27 +02:00
										 |  |  |     Function<void(const URL&)> on_load_start; | 
					
						
							| 
									
										
										
										
											2020-04-24 22:26:53 +02:00
										 |  |  |     Function<void(const Gfx::Bitmap&)> on_favicon_change; | 
					
						
							| 
									
										
										
										
											2020-05-10 21:03:37 +02:00
										 |  |  |     Function<void(const URL&)> on_url_drop; | 
					
						
							| 
									
										
										
										
											2020-05-23 13:03:13 -04:00
										 |  |  |     Function<void(Document*)> on_set_document; | 
					
						
							| 
									
										
										
										
											2019-09-29 12:04:02 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-17 21:36:22 +02:00
										 |  |  |     virtual bool accepts_focus() const override { return true; } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-03 20:54:53 +02:00
										 |  |  |     GUI::Action& select_all_action() { return *m_select_all_action; } | 
					
						
							| 
									
										
										
										
											2020-07-03 20:35:19 +02:00
										 |  |  |     GUI::Action& copy_action() { return *m_copy_action; } | 
					
						
							| 
									
										
										
										
											2020-07-03 20:54:53 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-03 20:35:19 +02:00
										 |  |  |     String selected_text() const; | 
					
						
							| 
									
										
										
										
											2020-07-03 20:54:53 +02:00
										 |  |  |     void select_all(); | 
					
						
							| 
									
										
										
										
											2020-07-03 20:35:19 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-08 20:31:49 +02:00
										 |  |  | private: | 
					
						
							| 
									
										
										
										
											2020-05-28 18:21:22 +02:00
										 |  |  |     PageView(); | 
					
						
							| 
									
										
										
										
											2019-09-25 12:44:22 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-08 20:31:49 +02:00
										 |  |  |     Page& page() { return *m_page; } | 
					
						
							|  |  |  |     const Page& page() const { return *m_page; } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-02 15:07:41 +01:00
										 |  |  |     virtual void resize_event(GUI::ResizeEvent&) override; | 
					
						
							|  |  |  |     virtual void paint_event(GUI::PaintEvent&) override; | 
					
						
							|  |  |  |     virtual void mousemove_event(GUI::MouseEvent&) override; | 
					
						
							|  |  |  |     virtual void mousedown_event(GUI::MouseEvent&) override; | 
					
						
							|  |  |  |     virtual void mouseup_event(GUI::MouseEvent&) override; | 
					
						
							|  |  |  |     virtual void keydown_event(GUI::KeyEvent&) override; | 
					
						
							| 
									
										
										
										
											2020-05-10 21:03:37 +02:00
										 |  |  |     virtual void drop_event(GUI::DropEvent&) override; | 
					
						
							| 
									
										
										
										
											2019-09-25 12:44:22 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-18 20:54:23 +01:00
										 |  |  |     virtual void did_scroll() override; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-08 20:31:49 +02:00
										 |  |  |     // ^Web::PageClient
 | 
					
						
							| 
									
										
										
										
											2020-06-17 20:26:59 +02:00
										 |  |  |     virtual Gfx::Palette palette() const override { return GUI::ScrollableWidget::palette(); } | 
					
						
							| 
									
										
										
										
											2020-06-08 20:31:49 +02:00
										 |  |  |     virtual void page_did_change_title(const String&) override; | 
					
						
							|  |  |  |     virtual void page_did_set_document_in_main_frame(Document*) override; | 
					
						
							|  |  |  |     virtual void page_did_start_loading(const URL&) override; | 
					
						
							|  |  |  |     virtual void page_did_change_selection() override; | 
					
						
							|  |  |  |     virtual void page_did_request_cursor_change(GUI::StandardCursor) override; | 
					
						
							| 
									
										
										
										
											2020-06-27 14:21:58 -06:00
										 |  |  |     virtual void page_did_request_context_menu(const Gfx::IntPoint&) override; | 
					
						
							| 
									
										
										
										
											2020-07-06 20:00:56 +02:00
										 |  |  |     virtual void page_did_request_link_context_menu(const Gfx::IntPoint&, const URL&, const String& target, unsigned modifiers) override; | 
					
						
							| 
									
										
										
										
											2020-07-06 19:41:10 +02:00
										 |  |  |     virtual void page_did_click_link(const URL&, const String& target, unsigned modifiers) override; | 
					
						
							|  |  |  |     virtual void page_did_middle_click_link(const URL&, const String& target, unsigned modifiers) override; | 
					
						
							| 
									
										
										
										
											2020-06-10 10:57:59 +02:00
										 |  |  |     virtual void page_did_enter_tooltip_area(const Gfx::IntPoint&, const String&) override; | 
					
						
							| 
									
										
										
										
											2020-06-08 20:31:49 +02:00
										 |  |  |     virtual void page_did_leave_tooltip_area() override; | 
					
						
							|  |  |  |     virtual void page_did_hover_link(const URL&) override; | 
					
						
							|  |  |  |     virtual void page_did_unhover_link() override; | 
					
						
							| 
									
										
										
										
											2020-06-10 10:57:59 +02:00
										 |  |  |     virtual void page_did_invalidate(const Gfx::IntRect&) override; | 
					
						
							| 
									
										
										
										
											2020-06-08 21:35:31 +02:00
										 |  |  |     virtual void page_did_change_favicon(const Gfx::Bitmap&) override; | 
					
						
							| 
									
										
										
										
											2020-06-23 18:02:08 +02:00
										 |  |  |     virtual void page_did_layout() override; | 
					
						
							| 
									
										
										
										
											2020-07-05 14:50:38 +02:00
										 |  |  |     virtual void page_did_request_scroll_into_view(const Gfx::IntRect&) override; | 
					
						
							| 
									
										
										
										
											2020-05-27 21:57:30 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-25 12:44:22 +03:00
										 |  |  |     void layout_and_sync_size(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-12 15:02:53 +02:00
										 |  |  |     bool m_should_show_line_box_borders { false }; | 
					
						
							| 
									
										
										
										
											2020-06-08 20:31:49 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     NonnullOwnPtr<Page> m_page; | 
					
						
							| 
									
										
										
										
											2020-07-03 20:35:19 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     RefPtr<GUI::Action> m_copy_action; | 
					
						
							| 
									
										
										
										
											2020-07-03 20:54:53 +02:00
										 |  |  |     RefPtr<GUI::Action> m_select_all_action; | 
					
						
							| 
									
										
										
										
											2019-09-25 12:44:22 +03:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2020-03-07 10:27:02 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | } |