Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit a189b1b

Browse filesBrowse files
committed
make litebrowser multithreaded
1 parent 8aa1975 commit a189b1b
Copy full SHA for a189b1b
Expand file treeCollapse file tree

17 files changed

+1404
-475
lines changed

‎CMakeLists.txt

Copy file name to clipboardExpand all lines: CMakeLists.txt
+11-3Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,17 @@ set(LITEBROWSER_PATH src)
1818
set(LITEHTML_PATH litehtml)
1919
set(CONTAINER_PATH ${LITEHTML_PATH}/containers/linux)
2020

21-
pkg_check_modules(LB_LIBS REQUIRED fontconfig gdkmm-3.0 gtkmm-3.0 libcurl cairo pango pangocairo)
21+
pkg_check_modules(LB_LIBS REQUIRED gdkmm-3.0 gtkmm-3.0 libcurl cairo pango pangocairo)
2222

2323
set(SOURCE ${LITEBROWSER_PATH}/main.cpp
2424
${LITEBROWSER_PATH}/html_widget.cpp
2525
${CONTAINER_PATH}/container_linux.cpp
2626
${LITEBROWSER_PATH}/browser_wnd.cpp
2727
${LITEBROWSER_PATH}/web_history.cpp
2828
${CONTAINER_PATH}/cairo_borders.cpp
29+
${LITEBROWSER_PATH}/http_request.cpp
30+
${LITEBROWSER_PATH}/web_page.cpp
31+
${LITEBROWSER_PATH}/http_requests_pool.cpp
2932
)
3033

3134
set(HEADERS ${LITEBROWSER_PATH}/browser_wnd.h
@@ -34,15 +37,20 @@ set(HEADERS ${LITEBROWSER_PATH}/browser_wnd.h
3437
${CONTAINER_PATH}/container_linux.h
3538
${CONTAINER_PATH}/cairo_borders.h
3639
${LITEBROWSER_PATH}/web_history.h
37-
)
40+
${LITEBROWSER_PATH}/http_request.h
41+
${LITEBROWSER_PATH}/web_page.h
42+
${LITEBROWSER_PATH}/html_host.h
43+
${LITEBROWSER_PATH}/http_requests_pool.h
44+
${LITEBROWSER_PATH}/html_dumper.h
45+
)
3846

3947
option(LITEHTML_BUILD_TESTING "enable testing for litehtml" OFF)
4048
add_subdirectory(${LITEHTML_PATH})
4149

4250
# additional warnings
4351
add_compile_options(-Wall -Wextra -Wpedantic)
4452

45-
add_executable(${PROJECT_NAME} ${SOURCE} ${HEADERS} src/http_loader.h src/http_loader.cpp)
53+
add_executable(${PROJECT_NAME} ${SOURCE} ${HEADERS})
4654
include_directories(${PROJECT_NAME} ${LITEHTML_PATH}/include ${LB_LIBS_INCLUDE_DIRS})
4755
target_link_options(${PROJECT_NAME} PRIVATE ${LB_LIBS_LDFLAGS})
4856
target_link_libraries(${PROJECT_NAME} litehtml ${LB_LIBS_LIBRARIES})

‎src/browser_wnd.cpp

Copy file name to clipboardExpand all lines: src/browser_wnd.cpp
+77-86Lines changed: 77 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,17 @@ struct
99
const char* url;
1010
} g_bookmarks[] =
1111
{
12+
{"Alexei Navalny (Wiki)", "https://en.wikipedia.org/wiki/Alexei_Navalny?useskin=vector"},
1213
{"litehtml Web Site", "http://www.litehtml.com/"},
1314
{"True Launch Bar", "http://www.truelaunchbar.com/"},
1415
{"Tordex", "http://www.tordex.com/"},
1516
{"Obama (Wiki)", "https://en.wikipedia.org/wiki/Barack_Obama?useskin=vector"},
16-
{"Elizabeth II", "https://en.wikipedia.org/wiki/Elizabeth_II?useskin=vector"},
17-
{"std::vector", "https://en.cppreference.com/w/cpp/container/vector"},
17+
{"Elizabeth II (Wiki)", "https://en.wikipedia.org/wiki/Elizabeth_II?useskin=vector"},
18+
{"std::vector", "https://en.cppreference.com/w/cpp/container/vector"},
1819
};
1920

20-
browser_window::browser_window() :
21+
browser_window::browser_window(const std::string& url) :
22+
m_prev_state(0),
2123
m_html(this),
2224

2325
m_tools_render1("Single Render"),
@@ -50,6 +52,16 @@ browser_window::browser_window() :
5052
m_forward_button.signal_clicked().connect( sigc::mem_fun(*this, &browser_window::on_forward_clicked) );
5153
m_forward_button.set_image_from_icon_name("go-next-symbolic", Gtk::ICON_SIZE_BUTTON);
5254

55+
m_header.pack_start(m_stop_reload_button);
56+
m_stop_reload_button.show();
57+
m_stop_reload_button.signal_clicked().connect( sigc::mem_fun(*this, &browser_window::on_stop_reload_clicked) );
58+
m_stop_reload_button.set_image_from_icon_name("view-refresh-symbolic", Gtk::ICON_SIZE_BUTTON);
59+
60+
m_header.pack_start(m_home_button);
61+
m_home_button.show();
62+
m_home_button.signal_clicked().connect( sigc::mem_fun(*this, &browser_window::on_home_clicked) );
63+
m_home_button.set_image_from_icon_name("go-home-symbolic", Gtk::ICON_SIZE_BUTTON);
64+
5365
m_header.set_custom_title(m_address_bar);
5466
m_address_bar.set_hexpand_set(true);
5567
m_address_bar.set_hexpand();
@@ -70,7 +82,7 @@ browser_window::browser_window() :
7082
m_menu_bookmarks.append(m_menu_items.back());
7183
m_menu_items.back().signal_activate().connect(
7284
sigc::bind(
73-
sigc::mem_fun(*this, &browser_window::open_url),
85+
sigc::mem_fun(m_html, &html_widget::open_url),
7486
litehtml::string(url.url)));
7587
}
7688
m_menu_bookmarks.show_all();
@@ -138,7 +150,15 @@ browser_window::browser_window() :
138150
m_scrolled_wnd.add(m_html);
139151
m_html.show();
140152

153+
signal_delete_event().connect(sigc::mem_fun(m_html, &html_widget::on_close), false);
154+
141155
set_default_size(1280, 720);
156+
157+
if(!url.empty())
158+
{
159+
m_html.open_url(url);
160+
}
161+
142162
update_buttons();
143163
}
144164

@@ -150,7 +170,7 @@ browser_window::~browser_window()
150170
void browser_window::on_go_clicked()
151171
{
152172
litehtml::string url = m_address_bar.get_text();
153-
open_url(url);
173+
m_html.open_url(url);
154174
}
155175

156176
bool browser_window::on_address_key_press(GdkEventKey* event)
@@ -165,97 +185,51 @@ bool browser_window::on_address_key_press(GdkEventKey* event)
165185
return false;
166186
}
167187

168-
void browser_window::open_url(const litehtml::string &url)
169-
{
170-
std::string hash;
171-
std::string s_url = url;
172-
173-
m_address_bar.set_text(url);
174-
175-
std::string::size_type hash_pos = s_url.find_first_of(L'#');
176-
if(hash_pos != std::wstring::npos)
177-
{
178-
hash = s_url.substr(hash_pos + 1);
179-
s_url.erase(hash_pos);
180-
}
181-
182-
bool open_hash_only = false;
183-
bool reload = false;
184-
185-
auto current_url = m_history.current();
186-
hash_pos = current_url.find_first_of(L'#');
187-
if(hash_pos != std::wstring::npos)
188-
{
189-
current_url.erase(hash_pos);
190-
}
191-
192-
if(!current_url.empty())
193-
{
194-
if(m_history.current() != url)
195-
{
196-
if (current_url == s_url)
197-
{
198-
open_hash_only = true;
199-
}
200-
} else
201-
{
202-
reload = true;
203-
}
204-
}
205-
if(!open_hash_only)
206-
{
207-
m_html.open_page(url, hash);
208-
} else
209-
{
210-
m_html.show_hash(hash);
211-
}
212-
if(!reload)
213-
{
214-
m_history.url_opened(url);
215-
}
216-
update_buttons();
217-
}
218-
219-
void browser_window::set_url(const litehtml::string &url)
220-
{
221-
m_address_bar.set_text(url);
222-
}
223-
224188
void browser_window::on_forward_clicked()
225189
{
226-
std::string url;
227-
if(m_history.forward(url))
228-
{
229-
open_url(url);
230-
}
190+
m_html.go_forward();
231191
}
232192

233193
void browser_window::on_back_clicked()
234194
{
235-
std::string url;
236-
if(m_history.back(url))
237-
{
238-
open_url(url);
239-
}
195+
m_html.go_back();
240196
}
241197

242198
void browser_window::update_buttons()
243199
{
244-
std::string url;
245-
if(m_history.back(url))
246-
{
247-
m_back_button.set_state(Gtk::STATE_NORMAL);
248-
} else
249-
{
250-
m_back_button.set_state(Gtk::STATE_INSENSITIVE);
251-
}
252-
if(m_history.forward(url))
253-
{
254-
m_forward_button.set_state(Gtk::STATE_NORMAL);
255-
} else
256-
{
257-
m_forward_button.set_state(Gtk::STATE_INSENSITIVE);
258-
}
200+
uint32_t state = m_html.get_state();
201+
202+
if((m_prev_state & page_state_has_back) != (state & page_state_has_back))
203+
{
204+
if (state & page_state_has_back)
205+
{
206+
m_back_button.set_state(Gtk::STATE_NORMAL);
207+
} else
208+
{
209+
m_back_button.set_state(Gtk::STATE_INSENSITIVE);
210+
}
211+
}
212+
if((m_prev_state & page_state_has_forward) != (state & page_state_has_forward))
213+
{
214+
if (state & page_state_has_forward)
215+
{
216+
m_forward_button.set_state(Gtk::STATE_NORMAL);
217+
} else
218+
{
219+
m_forward_button.set_state(Gtk::STATE_INSENSITIVE);
220+
}
221+
}
222+
if((m_prev_state & page_state_downloading) != (state & page_state_downloading))
223+
{
224+
if (state & page_state_downloading)
225+
{
226+
m_stop_reload_button.set_image_from_icon_name("process-stop-symbolic");
227+
} else
228+
{
229+
m_stop_reload_button.set_image_from_icon_name("view-refresh-symbolic");
230+
}
231+
}
232+
m_prev_state = state;
259233
}
260234

261235
void browser_window::on_render_measure(int number)
@@ -292,3 +266,20 @@ void browser_window::on_dump()
292266
{
293267
m_html.dump("/tmp/litehtml-dump.txt");
294268
}
269+
270+
void browser_window::on_stop_reload_clicked()
271+
{
272+
uint32_t state = m_html.get_state();
273+
if(state & page_state_downloading)
274+
{
275+
m_html.stop_download();
276+
} else
277+
{
278+
m_html.reload();
279+
}
280+
}
281+
282+
void browser_window::on_home_clicked()
283+
{
284+
m_html.open_url("http://www.litehtml.com/");
285+
}

‎src/browser_wnd.h

Copy file name to clipboardExpand all lines: src/browser_wnd.h
+13-7Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,35 +8,42 @@
88
class browser_window : public Gtk::Window
99
{
1010
public:
11-
browser_window();
11+
browser_window(const std::string& url);
1212
virtual ~browser_window();
1313

14-
void open_url(const litehtml::string& url);
15-
void set_url(const litehtml::string& url);
14+
void update_buttons();
15+
void set_address(const std::string& text)
16+
{
17+
m_address_bar.set_text(text);
18+
}
1619

1720
Gtk::ScrolledWindow* get_scrolled() { return &m_scrolled_wnd; }
1821

1922
private:
2023
void on_go_clicked();
21-
void on_forward_clicked();
24+
void on_forward_clicked();
25+
void on_stop_reload_clicked();
26+
void on_home_clicked();
2227
void on_back_clicked();
2328
void on_render_measure(int number);
2429
void on_draw_measure(int number);
2530
bool on_address_key_press(GdkEventKey* event);
2631
void on_dump();
2732

2833
protected:
34+
uint32_t m_prev_state;
2935
html_widget m_html;
3036
Gtk::Entry m_address_bar;
3137
Gtk::Button m_go_button;
3238
Gtk::Button m_forward_button;
33-
Gtk::Button m_back_button;
39+
Gtk::Button m_back_button;
40+
Gtk::Button m_stop_reload_button;
41+
Gtk::Button m_home_button;
3442
Gtk::MenuButton m_bookmarks_button;
3543
Gtk::MenuButton m_tools_button;
3644
Gtk::VBox m_vbox;
3745
Gtk::HeaderBar m_header;
3846
Gtk::ScrolledWindow m_scrolled_wnd;
39-
web_history m_history;
4047

4148
Gtk::Menu m_menu_bookmarks;
4249
std::vector<Gtk::MenuItem> m_menu_items;
@@ -52,6 +59,5 @@ class browser_window : public Gtk::Window
5259

5360
std::unique_ptr<Gtk::MessageDialog> m_pDialog;
5461

55-
void update_buttons();
5662
};
5763

‎src/globals.h

Copy file name to clipboardExpand all lines: src/globals.h
-4Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,7 @@
2020
#include <gtkmm/application.h>
2121
#include <gtkmm/window.h>
2222
#include "../litehtml/include/litehtml.h"
23-
#include <ft2build.h>
24-
#include FT_FREETYPE_H
25-
#include <fontconfig/fontconfig.h>
2623
#include <cairo-ft.h>
2724
#include <gdk/gdk.h>
2825
#include <cairomm/context.h>
2926
#include <curl/curl.h>
30-
#include <Poco/URI.h>

‎src/html_dumper.h

Copy file name to clipboard
+63Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
#ifndef LITEBROWSER_HTML_DUMPER_H
2+
#define LITEBROWSER_HTML_DUMPER_H
3+
4+
#include <litehtml.h>
5+
#include <fstream>
6+
7+
#define BUFF_SIZE (10 * 1024)
8+
9+
class html_dumper : public litehtml::dumper
10+
{
11+
std::ofstream m_cout;
12+
int indent;
13+
std::list<std::tuple<int, std::string>> m_node_text;
14+
private:
15+
void print_indent(int size)
16+
{
17+
m_cout << litehtml::string(size, '\t');
18+
}
19+
20+
public:
21+
explicit html_dumper(const litehtml::string& file_name) : m_cout(file_name), indent(0)
22+
{
23+
24+
}
25+
26+
void begin_node(const litehtml::string &descr) override
27+
{
28+
m_node_text.emplace_back(indent, "#" + descr);
29+
indent++;
30+
}
31+
32+
void end_node() override
33+
{
34+
indent--;
35+
}
36+
37+
void begin_attrs_group(const litehtml::string &/*descr*/) override
38+
{
39+
}
40+
41+
void end_attrs_group() override
42+
{
43+
}
44+
45+
void add_attr(const litehtml::string &name, const litehtml::string &value) override
46+
{
47+
if(name == "display" || name == "float")
48+
{
49+
std::get<1>(m_node_text.back()) += " " + name + "[" + value + "]";
50+
}
51+
}
52+
53+
void print()
54+
{
55+
for(const auto& data : m_node_text)
56+
{
57+
print_indent(std::get<0>(data));
58+
m_cout << std::get<1>(data) << std::endl;
59+
}
60+
}
61+
};
62+
63+
#endif //LITEBROWSER_HTML_DUMPER_H

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.