2020-06-17 17:31:42 +02:00
/*
* Copyright ( c ) 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-08-17 16:20:47 +02:00
# include "OutOfProcessWebView.h"
2020-06-17 17:31:42 +02:00
# include "WebContentClient.h"
# include <AK/SharedBuffer.h>
# include <LibGUI/Painter.h>
2020-07-04 23:19:32 +02:00
# include <LibGUI/ScrollBar.h>
2020-07-06 23:32:12 +02:00
# include <LibGUI/Window.h>
2020-06-17 17:31:42 +02:00
# include <LibGfx/SystemTheme.h>
2020-08-24 15:33:18 +04:30
namespace Web {
2020-08-17 16:20:47 +02:00
OutOfProcessWebView : : OutOfProcessWebView ( )
2020-06-17 17:31:42 +02:00
{
2020-07-06 22:02:38 +02:00
set_should_hide_unnecessary_scrollbars ( true ) ;
2020-06-17 17:31:42 +02:00
m_client = WebContentClient : : construct ( * this ) ;
client ( ) . post_message ( Messages : : WebContentServer : : UpdateSystemTheme ( Gfx : : current_system_theme_buffer_id ( ) ) ) ;
}
2020-08-17 16:20:47 +02:00
OutOfProcessWebView : : ~ OutOfProcessWebView ( )
2020-06-17 17:31:42 +02:00
{
}
2020-08-17 16:20:47 +02:00
void OutOfProcessWebView : : load ( const URL & url )
2020-06-17 17:31:42 +02:00
{
2020-07-06 21:46:37 +02:00
m_url = url ;
2020-06-17 17:31:42 +02:00
client ( ) . post_message ( Messages : : WebContentServer : : LoadURL ( url ) ) ;
}
2020-08-17 16:20:47 +02:00
void OutOfProcessWebView : : paint_event ( GUI : : PaintEvent & event )
2020-06-17 17:31:42 +02:00
{
2020-07-05 12:45:56 +02:00
GUI : : ScrollableWidget : : paint_event ( event ) ;
2020-07-04 23:27:36 +02:00
2020-06-17 17:31:42 +02:00
GUI : : Painter painter ( * this ) ;
2020-07-04 23:27:36 +02:00
painter . add_clip_rect ( frame_inner_rect ( ) ) ;
2020-06-17 17:31:42 +02:00
painter . add_clip_rect ( event . rect ( ) ) ;
2020-07-04 23:27:36 +02:00
painter . translate ( frame_thickness ( ) , frame_thickness ( ) ) ;
2020-07-05 16:31:50 +02:00
ASSERT ( m_front_bitmap ) ;
painter . blit ( { 0 , 0 } , * m_front_bitmap , m_front_bitmap - > rect ( ) ) ;
2020-06-17 17:31:42 +02:00
}
2020-08-17 16:20:47 +02:00
void OutOfProcessWebView : : resize_event ( GUI : : ResizeEvent & event )
2020-06-17 17:31:42 +02:00
{
2020-07-05 12:45:56 +02:00
GUI : : ScrollableWidget : : resize_event ( event ) ;
2020-07-05 16:31:50 +02:00
m_front_bitmap = Gfx : : Bitmap : : create ( Gfx : : BitmapFormat : : RGB32 , available_size ( ) ) - > to_bitmap_backed_by_shared_buffer ( ) ;
m_front_bitmap - > shared_buffer ( ) - > share_with ( client ( ) . server_pid ( ) ) ;
m_back_bitmap = Gfx : : Bitmap : : create ( Gfx : : BitmapFormat : : RGB32 , available_size ( ) ) - > to_bitmap_backed_by_shared_buffer ( ) ;
m_back_bitmap - > shared_buffer ( ) - > share_with ( client ( ) . server_pid ( ) ) ;
client ( ) . post_message ( Messages : : WebContentServer : : SetViewportRect ( Gfx : : IntRect ( { horizontal_scrollbar ( ) . value ( ) , vertical_scrollbar ( ) . value ( ) } , available_size ( ) ) ) ) ;
2020-07-04 23:19:32 +02:00
request_repaint ( ) ;
2020-06-17 17:31:42 +02:00
}
2020-08-17 16:20:47 +02:00
void OutOfProcessWebView : : keydown_event ( GUI : : KeyEvent & event )
2020-08-03 19:58:59 +02:00
{
client ( ) . post_message ( Messages : : WebContentServer : : KeyDown ( event . key ( ) , event . modifiers ( ) , event . code_point ( ) ) ) ;
}
2020-08-17 16:20:47 +02:00
void OutOfProcessWebView : : mousedown_event ( GUI : : MouseEvent & event )
2020-06-17 18:05:08 +02:00
{
2020-07-04 23:23:36 +02:00
client ( ) . post_message ( Messages : : WebContentServer : : MouseDown ( to_content_position ( event . position ( ) ) , event . button ( ) , event . buttons ( ) , event . modifiers ( ) ) ) ;
2020-06-17 18:05:08 +02:00
}
2020-08-17 16:20:47 +02:00
void OutOfProcessWebView : : mouseup_event ( GUI : : MouseEvent & event )
2020-06-17 18:05:08 +02:00
{
2020-07-04 23:23:36 +02:00
client ( ) . post_message ( Messages : : WebContentServer : : MouseUp ( to_content_position ( event . position ( ) ) , event . button ( ) , event . buttons ( ) , event . modifiers ( ) ) ) ;
2020-06-17 18:05:08 +02:00
}
2020-08-17 16:20:47 +02:00
void OutOfProcessWebView : : mousemove_event ( GUI : : MouseEvent & event )
2020-06-17 18:05:08 +02:00
{
2020-07-04 23:23:36 +02:00
client ( ) . post_message ( Messages : : WebContentServer : : MouseMove ( to_content_position ( event . position ( ) ) , event . button ( ) , event . buttons ( ) , event . modifiers ( ) ) ) ;
2020-06-17 18:05:08 +02:00
}
2020-08-17 16:20:47 +02:00
void OutOfProcessWebView : : notify_server_did_paint ( Badge < WebContentClient > , i32 shbuf_id )
2020-06-17 17:31:42 +02:00
{
2020-07-05 16:31:50 +02:00
if ( m_back_bitmap - > shbuf_id ( ) = = shbuf_id ) {
swap ( m_back_bitmap , m_front_bitmap ) ;
2020-06-17 17:31:42 +02:00
update ( ) ;
2020-07-05 16:31:50 +02:00
}
2020-06-17 17:31:42 +02:00
}
2020-08-17 16:20:47 +02:00
void OutOfProcessWebView : : notify_server_did_invalidate_content_rect ( Badge < WebContentClient > , [[maybe_unused]] const Gfx : : IntRect & content_rect )
2020-06-17 18:00:18 +02:00
{
2020-07-04 23:19:12 +02:00
# ifdef DEBUG_SPAM
2020-08-27 00:34:59 +02:00
dbg ( ) < < " server did invalidate content_rect: " < < content_rect < < " , current front_shbuf_id= " < < m_front_bitmap - > shbuf_id ( ) < < " , current back_shbuf_id= " < < m_back_bitmap - > shbuf_id ( ) ;
2020-07-04 23:19:12 +02:00
# endif
2020-07-04 20:57:57 +02:00
request_repaint ( ) ;
}
2020-08-17 16:20:47 +02:00
void OutOfProcessWebView : : notify_server_did_change_selection ( Badge < WebContentClient > )
2020-07-04 20:57:57 +02:00
{
request_repaint ( ) ;
}
2020-08-17 16:20:47 +02:00
void OutOfProcessWebView : : notify_server_did_layout ( Badge < WebContentClient > , const Gfx : : IntSize & content_size )
2020-07-04 23:19:32 +02:00
{
set_content_size ( content_size ) ;
}
2020-08-17 16:20:47 +02:00
void OutOfProcessWebView : : notify_server_did_change_title ( Badge < WebContentClient > , const String & title )
2020-07-04 23:40:17 +02:00
{
if ( on_title_change )
on_title_change ( title ) ;
}
2020-08-17 16:20:47 +02:00
void OutOfProcessWebView : : notify_server_did_request_scroll_into_view ( Badge < WebContentClient > , const Gfx : : IntRect & rect )
2020-07-05 15:43:43 +02:00
{
scroll_into_view ( rect , true , true ) ;
}
2020-08-17 16:20:47 +02:00
void OutOfProcessWebView : : notify_server_did_hover_link ( Badge < WebContentClient > , const URL & url )
2020-07-05 16:59:20 +02:00
{
2020-09-11 14:28:05 +02:00
set_override_cursor ( Gfx : : StandardCursor : : Hand ) ;
2020-07-05 16:59:20 +02:00
if ( on_link_hover )
on_link_hover ( url ) ;
}
2020-08-17 16:20:47 +02:00
void OutOfProcessWebView : : notify_server_did_unhover_link ( Badge < WebContentClient > )
2020-07-05 16:59:20 +02:00
{
2020-09-11 14:28:05 +02:00
set_override_cursor ( Gfx : : StandardCursor : : None ) ;
2020-07-05 16:59:20 +02:00
if ( on_link_hover )
on_link_hover ( { } ) ;
}
2020-08-17 16:20:47 +02:00
void OutOfProcessWebView : : notify_server_did_click_link ( Badge < WebContentClient > , const URL & url , const String & target , unsigned int modifiers )
2020-07-06 20:01:46 +02:00
{
if ( on_link_click )
on_link_click ( url , target , modifiers ) ;
}
2020-08-17 16:20:47 +02:00
void OutOfProcessWebView : : notify_server_did_middle_click_link ( Badge < WebContentClient > , const URL & url , const String & target , unsigned int modifiers )
2020-07-06 20:01:46 +02:00
{
if ( on_link_middle_click )
on_link_middle_click ( url , target , modifiers ) ;
}
2020-08-17 16:20:47 +02:00
void OutOfProcessWebView : : notify_server_did_start_loading ( Badge < WebContentClient > , const URL & url )
2020-07-06 21:58:16 +02:00
{
if ( on_load_start )
on_load_start ( url ) ;
}
2020-08-17 16:20:47 +02:00
void OutOfProcessWebView : : notify_server_did_request_context_menu ( Badge < WebContentClient > , const Gfx : : IntPoint & content_position )
2020-07-07 12:24:29 +02:00
{
if ( on_context_menu_request )
on_context_menu_request ( screen_relative_rect ( ) . location ( ) . translated ( to_widget_position ( content_position ) ) ) ;
}
2020-08-17 16:20:47 +02:00
void OutOfProcessWebView : : notify_server_did_request_link_context_menu ( Badge < WebContentClient > , const Gfx : : IntPoint & content_position , const URL & url , const String & , unsigned )
2020-07-07 12:24:29 +02:00
{
if ( on_link_context_menu_request )
on_link_context_menu_request ( url , screen_relative_rect ( ) . location ( ) . translated ( to_widget_position ( content_position ) ) ) ;
}
2020-08-17 16:20:47 +02:00
void OutOfProcessWebView : : did_scroll ( )
2020-07-04 23:19:32 +02:00
{
2020-07-05 12:45:56 +02:00
client ( ) . post_message ( Messages : : WebContentServer : : SetViewportRect ( visible_content_rect ( ) ) ) ;
2020-07-04 23:19:32 +02:00
request_repaint ( ) ;
}
2020-08-17 16:20:47 +02:00
void OutOfProcessWebView : : request_repaint ( )
2020-07-04 20:57:57 +02:00
{
2020-07-05 16:31:50 +02:00
client ( ) . post_message ( Messages : : WebContentServer : : Paint ( m_back_bitmap - > rect ( ) . translated ( horizontal_scrollbar ( ) . value ( ) , vertical_scrollbar ( ) . value ( ) ) , m_back_bitmap - > shbuf_id ( ) ) ) ;
2020-06-17 18:00:18 +02:00
}
2020-08-17 16:20:47 +02:00
WebContentClient & OutOfProcessWebView : : client ( )
2020-06-17 17:31:42 +02:00
{
return * m_client ;
}
2020-08-24 15:33:18 +04:30
}