summaryrefslogtreecommitdiff
path: root/Applications/Browser
diff options
context:
space:
mode:
authorLinus Groh <mail@linusgroh.de>2020-04-24 13:06:17 +0100
committerAndreas Kling <kling@serenityos.org>2020-04-24 14:34:11 +0200
commit896decd4d5c078162bdcbab1f6bf092c62d62fa7 (patch)
tree420692c307b2c4ea714f0e58cc495dc7d0eda8d0 /Applications/Browser
parent061205b3b3f5209c1c7a715cf68f61f2e91f161d (diff)
downloadserenity-896decd4d5c078162bdcbab1f6bf092c62d62fa7.zip
Browser: Open links with target="_blank" in new tab
Diffstat (limited to 'Applications/Browser')
-rw-r--r--Applications/Browser/Tab.cpp13
-rw-r--r--Applications/Browser/Tab.h1
-rw-r--r--Applications/Browser/main.cpp35
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();
}