diff --git a/Ladybird/AppKit/Application/ApplicationDelegate.h b/Ladybird/AppKit/Application/ApplicationDelegate.h index 4320cdeec1..a743b2a995 100644 --- a/Ladybird/AppKit/Application/ApplicationDelegate.h +++ b/Ladybird/AppKit/Application/ApplicationDelegate.h @@ -28,6 +28,11 @@ fromTab:(nullable Tab*)tab activateTab:(Web::HTML::ActivateTab)activate_tab; +- (nonnull TabController*)createNewTab:(StringView)html + url:(URL const&)url + fromTab:(nullable Tab*)tab + activateTab:(Web::HTML::ActivateTab)activate_tab; + - (void)removeTab:(nonnull TabController*)controller; - (Browser::CookieJar&)cookieJar; diff --git a/Ladybird/AppKit/Application/ApplicationDelegate.mm b/Ladybird/AppKit/Application/ApplicationDelegate.mm index 8d137f1c05..d8f4071b61 100644 --- a/Ladybird/AppKit/Application/ApplicationDelegate.mm +++ b/Ladybird/AppKit/Application/ApplicationDelegate.mm @@ -86,19 +86,20 @@ fromTab:(Tab*)tab activateTab:(Web::HTML::ActivateTab)activate_tab { - auto* controller = [[TabController alloc] init:url.value_or(m_new_tab_page_url)]; - [controller showWindow:nil]; + auto* controller = [self createNewTab:activate_tab fromTab:tab]; + [controller loadURL:url.value_or(m_new_tab_page_url)]; - if (tab) { - [[tab tabGroup] addWindow:controller.window]; + return controller; +} - // FIXME: Can we create the tabbed window above without it becoming active in the first place? - if (activate_tab == Web::HTML::ActivateTab::No) { - [tab orderFront:nil]; - } - } +- (nonnull TabController*)createNewTab:(StringView)html + url:(URL const&)url + fromTab:(nullable Tab*)tab + activateTab:(Web::HTML::ActivateTab)activate_tab +{ + auto* controller = [self createNewTab:activate_tab fromTab:tab]; + [controller loadHTML:html url:url]; - [self.managed_tabs addObject:controller]; return controller; } @@ -124,6 +125,25 @@ #pragma mark - Private methods +- (nonnull TabController*)createNewTab:(Web::HTML::ActivateTab)activate_tab + fromTab:(nullable Tab*)tab +{ + auto* controller = [[TabController alloc] init]; + [controller showWindow:nil]; + + if (tab) { + [[tab tabGroup] addWindow:controller.window]; + + // FIXME: Can we create the tabbed window above without it becoming active in the first place? + if (activate_tab == Web::HTML::ActivateTab::No) { + [tab orderFront:nil]; + } + } + + [self.managed_tabs addObject:controller]; + return controller; +} + - (void)closeCurrentTab:(id)sender { auto* current_window = [NSApp keyWindow]; diff --git a/Ladybird/AppKit/UI/LadybirdWebView.h b/Ladybird/AppKit/UI/LadybirdWebView.h index 5242fc400b..2bb3416a99 100644 --- a/Ladybird/AppKit/UI/LadybirdWebView.h +++ b/Ladybird/AppKit/UI/LadybirdWebView.h @@ -13,7 +13,8 @@ @interface LadybirdWebView : NSClipView -- (void)load:(URL const&)url; +- (void)loadURL:(URL const&)url; +- (void)loadHTML:(StringView)html url:(URL const&)url; - (void)handleResize; - (void)handleScroll; diff --git a/Ladybird/AppKit/UI/LadybirdWebView.mm b/Ladybird/AppKit/UI/LadybirdWebView.mm index 37cd8a9755..a0708d2fad 100644 --- a/Ladybird/AppKit/UI/LadybirdWebView.mm +++ b/Ladybird/AppKit/UI/LadybirdWebView.mm @@ -100,11 +100,16 @@ struct HideCursor { #pragma mark - Public methods -- (void)load:(URL const&)url +- (void)loadURL:(URL const&)url { m_web_view_bridge->load(url); } +- (void)loadHTML:(StringView)html url:(URL const&)url +{ + m_web_view_bridge->load_html(html, url); +} + - (void)handleResize { [self updateViewportRect:Ladybird::WebViewBridge::ForResize::Yes]; @@ -364,7 +369,7 @@ struct HideCursor { fromTab:[self tab] activateTab:Web::HTML::ActivateTab::Yes]; } else { - [[self tabController] load:url]; + [[self tabController] loadURL:url]; } }; diff --git a/Ladybird/AppKit/UI/TabController.h b/Ladybird/AppKit/UI/TabController.h index dc0f2c9f34..582178b6e8 100644 --- a/Ladybird/AppKit/UI/TabController.h +++ b/Ladybird/AppKit/UI/TabController.h @@ -13,9 +13,10 @@ @interface TabController : NSWindowController -- (instancetype)init:(URL)url; +- (instancetype)init; -- (void)load:(URL const&)url; +- (void)loadURL:(URL const&)url; +- (void)loadHTML:(StringView)html url:(URL const&)url; - (void)onLoadStart:(URL const&)url isRedirect:(BOOL)isRedirect; - (void)onTitleChange:(DeprecatedString const&)title; diff --git a/Ladybird/AppKit/UI/TabController.mm b/Ladybird/AppKit/UI/TabController.mm index b79aa6e774..2b475fb1aa 100644 --- a/Ladybird/AppKit/UI/TabController.mm +++ b/Ladybird/AppKit/UI/TabController.mm @@ -32,7 +32,6 @@ enum class IsHistoryNavigation { @interface TabController () { - URL m_url; DeprecatedString m_title; Browser::History m_history; @@ -63,7 +62,7 @@ enum class IsHistoryNavigation { @synthesize new_tab_toolbar_item = _new_tab_toolbar_item; @synthesize tab_overview_toolbar_item = _tab_overview_toolbar_item; -- (instancetype)init:(URL)url +- (instancetype)init { if (self = [super init]) { self.toolbar = [[NSToolbar alloc] initWithIdentifier:TOOLBAR_IDENTIFIER]; @@ -72,7 +71,6 @@ enum class IsHistoryNavigation { [self.toolbar setAllowsUserCustomization:NO]; [self.toolbar setSizeMode:NSToolbarSizeModeRegular]; - m_url = move(url); m_is_history_navigation = IsHistoryNavigation::No; } @@ -81,9 +79,14 @@ enum class IsHistoryNavigation { #pragma mark - Public methods -- (void)load:(URL const&)url +- (void)loadURL:(URL const&)url { - [[self tab].web_view load:url]; + [[self tab].web_view loadURL:url]; +} + +- (void)loadHTML:(StringView)html url:(URL const&)url +{ + [[self tab].web_view loadHTML:html url:url]; } - (void)onLoadStart:(URL const&)url isRedirect:(BOOL)isRedirect @@ -121,7 +124,7 @@ enum class IsHistoryNavigation { m_history.go_back(); auto url = m_history.current().url; - [self load:url]; + [self loadURL:url]; } - (void)navigateForward:(id)sender @@ -134,7 +137,7 @@ enum class IsHistoryNavigation { m_history.go_forward(); auto url = m_history.current().url; - [self load:url]; + [self loadURL:url]; } - (void)reload:(id)sender @@ -146,7 +149,7 @@ enum class IsHistoryNavigation { m_is_history_navigation = IsHistoryNavigation::Yes; auto url = m_history.current().url; - [self load:url]; + [self loadURL:url]; } - (void)clearHistory @@ -312,8 +315,6 @@ enum class IsHistoryNavigation { - (IBAction)showWindow:(id)sender { self.window = [[Tab alloc] init]; - [self load:m_url]; - [self.window setDelegate:self]; [self.window setToolbar:self.toolbar]; @@ -397,7 +398,7 @@ enum class IsHistoryNavigation { auto* url_string = [[text_view textStorage] string]; auto url = Ladybird::sanitize_url(url_string); - [self load:url]; + [self loadURL:url]; [self.window makeFirstResponder:nil]; return YES; diff --git a/Ladybird/Qt/BrowserWindow.cpp b/Ladybird/Qt/BrowserWindow.cpp index 5a8b437e73..8cbc857b50 100644 --- a/Ladybird/Qt/BrowserWindow.cpp +++ b/Ladybird/Qt/BrowserWindow.cpp @@ -429,6 +429,20 @@ void BrowserWindow::debug_request(DeprecatedString const& request, DeprecatedStr } Tab& BrowserWindow::new_tab(QString const& url, Web::HTML::ActivateTab activate_tab) +{ + auto& tab = create_new_tab(activate_tab); + tab.navigate(url); + return tab; +} + +Tab& BrowserWindow::new_tab(StringView html, URL const& url, Web::HTML::ActivateTab activate_tab) +{ + auto& tab = create_new_tab(activate_tab); + tab.load_html(html, url); + return tab; +} + +Tab& BrowserWindow::create_new_tab(Web::HTML::ActivateTab activate_tab) { auto tab = make(this, m_webdriver_content_ipc_path, m_enable_callgrind_profiling, m_use_lagom_networking); auto tab_ptr = tab.ptr(); @@ -500,9 +514,6 @@ Tab& BrowserWindow::new_tab(QString const& url, Web::HTML::ActivateTab activate_ }; tab_ptr->focus_location_editor(); - - tab_ptr->navigate(url); - return *tab_ptr; } diff --git a/Ladybird/Qt/BrowserWindow.h b/Ladybird/Qt/BrowserWindow.h index 981a64b231..cd0e43bcad 100644 --- a/Ladybird/Qt/BrowserWindow.h +++ b/Ladybird/Qt/BrowserWindow.h @@ -73,6 +73,7 @@ public slots: void tab_title_changed(int index, QString const&); void tab_favicon_changed(int index, QIcon const& icon); Tab& new_tab(QString const&, Web::HTML::ActivateTab); + Tab& new_tab(StringView html, URL const& url, Web::HTML::ActivateTab); void activate_tab(int index); void close_tab(int index); void close_current_tab(); @@ -98,6 +99,8 @@ private: virtual void wheelEvent(QWheelEvent*) override; virtual void closeEvent(QCloseEvent*) override; + Tab& create_new_tab(Web::HTML::ActivateTab activate_tab); + void debug_request(DeprecatedString const& request, DeprecatedString const& argument = ""); void set_current_tab(Tab* tab); diff --git a/Ladybird/Qt/Tab.cpp b/Ladybird/Qt/Tab.cpp index babb00aad1..83538c99fb 100644 --- a/Ladybird/Qt/Tab.cpp +++ b/Ladybird/Qt/Tab.cpp @@ -566,6 +566,11 @@ void Tab::navigate(QString url_qstring) view().load(url_string); } +void Tab::load_html(StringView html, URL const& url) +{ + view().load_html(html, url); +} + void Tab::back() { if (!m_history.can_go_back()) diff --git a/Ladybird/Qt/Tab.h b/Ladybird/Qt/Tab.h index a66fe65205..539791ac91 100644 --- a/Ladybird/Qt/Tab.h +++ b/Ladybird/Qt/Tab.h @@ -34,6 +34,8 @@ public: WebContentView& view() { return *m_view; } void navigate(QString); + void load_html(StringView, URL const&); + void back(); void forward(); void reload();