فهرست منبع

Browser: Open links with target="_blank" in new tab

Linus Groh 5 سال پیش
والد
کامیت
896decd4d5
3فایلهای تغییر یافته به همراه28 افزوده شده و 21 حذف شده
  1. 9 4
      Applications/Browser/Tab.cpp
  2. 1 0
      Applications/Browser/Tab.h
  3. 18 17
      Applications/Browser/main.cpp

+ 9 - 4
Applications/Browser/Tab.cpp

@@ -133,11 +133,16 @@ Tab::Tab()
         update_bookmark_button(url.to_string());
         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 {
         } 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);
         }
         }
     };
     };
 
 

+ 1 - 0
Applications/Browser/Tab.h

@@ -44,6 +44,7 @@ public:
     void did_become_active();
     void did_become_active();
 
 
     Function<void(String)> on_title_change;
     Function<void(String)> on_title_change;
+    Function<void(URL&)> on_tab_open_request;
     Function<void(Tab&)> on_tab_close_request;
     Function<void(Tab&)> on_tab_close_request;
 
 
     const String& title() const { return m_title; }
     const String& title() const { return m_title; }

+ 18 - 17
Applications/Browser/main.cpp

@@ -24,9 +24,9 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
  */
 
 
-#include "WindowActions.h"
 #include "InspectorWidget.h"
 #include "InspectorWidget.h"
 #include "Tab.h"
 #include "Tab.h"
+#include "WindowActions.h"
 #include <LibCore/File.h>
 #include <LibCore/File.h>
 #include <LibGUI/Application.h>
 #include <LibGUI/Application.h>
 #include <LibGUI/BoxLayout.h>
 #include <LibGUI/BoxLayout.h>
@@ -75,6 +75,8 @@ int main(int argc, char** argv)
 
 
     auto window = GUI::Window::construct();
     auto window = GUI::Window::construct();
     window->set_rect(100, 100, 640, 480);
     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>();
     auto& widget = window->set_main_widget<GUI::Widget>();
     widget.set_fill_with_background_color(true);
     widget.set_fill_with_background_color(true);
@@ -91,7 +93,8 @@ int main(int argc, char** argv)
 
 
     Browser::WindowActions window_actions(*window);
     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");
         auto& new_tab = tab_widget.add_tab<Browser::Tab>("New tab");
 
 
         new_tab.on_title_change = [&](auto title) {
         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()));
                 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) {
         new_tab.on_tab_close_request = [&](auto& tab) {
             tab_widget.deferred_invoke([&](auto&) {
             tab_widget.deferred_invoke([&](auto&) {
                 tab_widget.remove_tab(tab);
                 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)
         if (activate)
             tab_widget.set_active_widget(&new_tab);
             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 = [&] {
     window_actions.on_create_new_tab = [&] {
-        create_new_tab();
+        create_new_tab(default_url, true);
     };
     };
 
 
     window_actions.on_next_tab = [&] {
     window_actions.on_next_tab = [&] {
@@ -139,7 +139,8 @@ int main(int argc, char** argv)
         tab_widget.activate_previous_tab();
         tab_widget.activate_previous_tab();
     };
     };
 
 
-    create_new_tab();
+    create_new_tab(default_url, true);
+    window->show();
 
 
     return app.exec();
     return app.exec();
 }
 }