@@ -24,7 +24,9 @@ use std::cell::{Cell, RefCell};
24
24
use std:: ops:: Deref ;
25
25
use std:: rc:: Rc ;
26
26
27
+ use glib:: ToVariant ;
27
28
use gtk:: { Inhibit , WidgetExt } ;
29
+ use libc:: getpid;
28
30
use url:: Url ;
29
31
use webkit2:: { self , CookiePersistentStorage , FindController , FindOptions , WebContext , WebViewExt , FIND_OPTIONS_BACKWARDS , FIND_OPTIONS_CASE_INSENSITIVE , FIND_OPTIONS_WRAP_AROUND } ;
30
32
use xdg:: BaseDirectories ;
@@ -33,10 +35,19 @@ use app::APP_NAME;
33
35
34
36
const SCROLL_LINE_VERTICAL : i32 = 40 ;
35
37
38
+ dbus_interface ! ( "com.titanium.client" , interface MessageServer {
39
+ fn get_scroll_percentage( ) -> i64 ;
40
+ fn scroll_bottom( ) ;
41
+ fn scroll_by( pixels: i64 ) ;
42
+ fn scroll_top( ) ;
43
+ } ) ;
44
+
45
+
36
46
/// Webkit-based view.
37
47
pub struct WebView {
38
48
find_controller : FindController ,
39
- scrolled_callback : RefCell < Option < Rc < Box < Fn ( u8 ) > > > > ,
49
+ message_server : MessageServer ,
50
+ scrolled_callback : RefCell < Option < Rc < Box < Fn ( i64 ) > > > > ,
40
51
search_backwards : Cell < bool > ,
41
52
view : webkit2:: WebView ,
42
53
}
@@ -46,6 +57,13 @@ impl WebView {
46
57
pub fn new ( ) -> Rc < Self > {
47
58
let context = WebContext :: get_default ( ) . unwrap ( ) ;
48
59
context. set_web_extensions_directory ( "/usr/local/lib/titanium/web-extensions" ) ;
60
+
61
+ let pid = unsafe { getpid ( ) } ;
62
+ let bus_name = format ! ( "com.titanium.process{}" , pid) ;
63
+ let message_server = MessageServer :: new ( & bus_name) ;
64
+
65
+ context. set_web_extensions_initialization_user_data ( & bus_name. to_variant ( ) ) ;
66
+
49
67
let view = webkit2:: WebView :: new_with_context ( & context) ;
50
68
51
69
let find_controller = view. get_find_controller ( ) . unwrap ( ) ;
@@ -59,6 +77,7 @@ impl WebView {
59
77
let webview =
60
78
Rc :: new ( WebView {
61
79
find_controller : find_controller,
80
+ message_server : message_server,
62
81
scrolled_callback : RefCell :: new ( None ) ,
63
82
search_backwards : Cell :: new ( false ) ,
64
83
view : view,
@@ -78,27 +97,22 @@ impl WebView {
78
97
79
98
/// Clear the selection.
80
99
pub fn clear_selection ( & self ) {
100
+ // TODO: write this in the web extension.
81
101
self . run_javascript ( "window.getSelection().empty();" ) ;
82
102
}
83
103
84
104
/// Connect the scrolled event.
85
- pub fn connect_scrolled < F : Fn ( u8 ) + ' static > ( & self , callback : F ) {
105
+ pub fn connect_scrolled < F : Fn ( i64 ) + ' static > ( & self , callback : F ) {
86
106
* self . scrolled_callback . borrow_mut ( ) = Some ( Rc :: new ( Box :: new ( callback) ) ) ;
87
107
}
88
108
89
109
/// Emit the scrolled event.
90
110
pub fn emit_scrolled_event ( & self ) {
91
111
if let Some ( ref callback) = * self . scrolled_callback . borrow ( ) {
92
112
let callback = callback. clone ( ) ;
93
- self . run_javascript_with_callback ( "window.scrollY / (document.body.scrollHeight - window.innerHeight)" , move |result| {
94
- if let Ok ( result) = result {
95
- let context = result. get_global_context ( ) . unwrap ( ) ;
96
- let value = result. get_value ( ) . unwrap ( ) ;
97
- if let Some ( number) = value. to_number ( & context) {
98
- callback ( ( number * 100.0 ) . round ( ) as u8 ) ;
99
- }
100
- }
101
- } ) ;
113
+ if let Ok ( scroll_percentage) = self . message_server . get_scroll_percentage ( ) {
114
+ callback ( scroll_percentage) ;
115
+ }
102
116
}
103
117
}
104
118
@@ -121,12 +135,12 @@ impl WebView {
121
135
122
136
/// Scroll by the specified number of pixels.
123
137
fn scroll ( & self , pixels : i32 ) {
124
- self . run_javascript ( & format ! ( "window.scrollBy(0, {});" , pixels ) ) ;
138
+ self . message_server . scroll_by ( pixels as i64 ) . ok ( ) ;
125
139
}
126
140
127
141
/// Scroll to the bottom of the page.
128
142
pub fn scroll_bottom ( & self ) {
129
- self . run_javascript ( "window.scrollTo(0, document.body.clientHeight);" ) ;
143
+ self . message_server . scroll_bottom ( ) . ok ( ) ;
130
144
}
131
145
132
146
/// Scroll down by one line.
@@ -148,7 +162,7 @@ impl WebView {
148
162
149
163
/// Scroll to the top of the page.
150
164
pub fn scroll_top ( & self ) {
151
- self . run_javascript ( "window.scrollTo(0, 0);" ) ;
165
+ self . message_server . scroll_top ( ) . ok ( ) ;
152
166
}
153
167
154
168
/// Scroll up by one line.
0 commit comments