diff options
author | Linus Groh <mail@linusgroh.de> | 2020-04-24 13:06:17 +0100 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2020-04-24 14:34:11 +0200 |
commit | 896decd4d5c078162bdcbab1f6bf092c62d62fa7 (patch) | |
tree | 420692c307b2c4ea714f0e58cc495dc7d0eda8d0 /Applications | |
parent | 061205b3b3f5209c1c7a715cf68f61f2e91f161d (diff) | |
download | serenity-896decd4d5c078162bdcbab1f6bf092c62d62fa7.zip |
Browser: Open links with target="_blank" in new tab
Diffstat (limited to 'Applications')
-rw-r--r-- | Applications/Browser/Tab.cpp | 13 | ||||
-rw-r--r-- | Applications/Browser/Tab.h | 1 | ||||
-rw-r--r-- | Applications/Browser/main.cpp | 35 |
3 files changed, 28 insertions, 21 deletions
diff --git a/Applications/Browser/Tab.cpp b/Applications/Browser/Tab.cpp index daaba4a027..c9320c2c60 100644 --- a/Applications/Browser/Tab.cpp +++ b/Applications/Browser/Tab.cpp @@ -133,11 +133,16 @@ Tab::Tab() update_bookmark_button(url.to_string()); }; - m_html_widget->on_link_click = [this](auto& url, auto&) { - if (url.starts_with("#")) { - m_html_widget->scroll_to_anchor(url.substring_view(1, url.length() - 1)); + m_html_widget->on_link_click = [this](auto& href, auto& target) { + if (href.starts_with("#")) { + auto anchor = href.substring_view(1, href.length() - 1); + m_html_widget->scroll_to_anchor(anchor); } else { - m_html_widget->load(m_html_widget->document()->complete_url(url)); + auto url = m_html_widget->document()->complete_url(href); + if (target == "_blank") + on_tab_open_request(url); + else + m_html_widget->load(url); } }; diff --git a/Applications/Browser/Tab.h b/Applications/Browser/Tab.h index 7c74c40560..3d910827e4 100644 --- a/Applications/Browser/Tab.h +++ b/Applications/Browser/Tab.h @@ -44,6 +44,7 @@ public: void did_become_active(); Function<void(String)> on_title_change; + Function<void(URL&)> on_tab_open_request; Function<void(Tab&)> on_tab_close_request; const String& title() const { return m_title; } diff --git a/Applications/Browser/main.cpp b/Applications/Browser/main.cpp index 6bc9f1b907..4c8f1e1892 100644 --- a/Applications/Browser/main.cpp +++ b/Applications/Browser/main.cpp @@ -24,9 +24,9 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "WindowActions.h" #include "InspectorWidget.h" #include "Tab.h" +#include "WindowActions.h" #include <LibCore/File.h> #include <LibGUI/Application.h> #include <LibGUI/BoxLayout.h> @@ -75,6 +75,8 @@ int main(int argc, char** argv) auto window = GUI::Window::construct(); window->set_rect(100, 100, 640, 480); + window->set_icon(Gfx::Bitmap::load_from_file("/res/icons/16x16/filetype-html.png")); + window->set_title("Browser"); auto& widget = window->set_main_widget<GUI::Widget>(); widget.set_fill_with_background_color(true); @@ -91,7 +93,8 @@ int main(int argc, char** argv) Browser::WindowActions window_actions(*window); - auto create_new_tab = [&](bool activate = true) { + Function<void(URL url, bool activate)> create_new_tab; + create_new_tab = [&](auto url, auto activate) { auto& new_tab = tab_widget.add_tab<Browser::Tab>("New tab"); new_tab.on_title_change = [&](auto title) { @@ -100,6 +103,10 @@ int main(int argc, char** argv) window->set_title(String::format("%s - Browser", title.characters())); }; + new_tab.on_tab_open_request = [&](auto& url) { + create_new_tab(url, true); + }; + new_tab.on_tab_close_request = [&](auto& tab) { tab_widget.deferred_invoke([&](auto&) { tab_widget.remove_tab(tab); @@ -108,27 +115,20 @@ int main(int argc, char** argv) }); }; - window->set_icon(Gfx::Bitmap::load_from_file("/res/icons/16x16/filetype-html.png")); - - window->set_title("Browser"); - window->show(); + new_tab.load(url); - URL url_to_load = home_url; - - if (app.args().size() >= 1) { - url_to_load = URL::create_with_url_or_path(app.args()[0]); - } - - new_tab.load(url_to_load); - - dbg() << "Added new tab " << &new_tab << ", loading " << url_to_load; + dbg() << "Added new tab " << &new_tab << ", loading " << url; if (activate) tab_widget.set_active_widget(&new_tab); }; + URL default_url = home_url; + if (app.args().size() >= 1) + default_url = URL::create_with_url_or_path(app.args()[0]); + window_actions.on_create_new_tab = [&] { - create_new_tab(); + create_new_tab(default_url, true); }; window_actions.on_next_tab = [&] { @@ -139,7 +139,8 @@ int main(int argc, char** argv) tab_widget.activate_previous_tab(); }; - create_new_tab(); + create_new_tab(default_url, true); + window->show(); return app.exec(); } |