#include "BrowserFrame.h" #include "handlers/CurlHttpHandler.h" #include "handlers/CurlHttpsHandler.h" BrowserFrame::BrowserFrame(wxWindow *parent) : wxBrowserBase(parent) { wxCommandEvent event; event.SetString("https://www.google.com"); this->OnNewTab(event); } BrowserFrame::~BrowserFrame() { webViews.clear(); } void BrowserFrame::OnPageClose(wxAuiNotebookEvent &event) { event.Skip(); } void BrowserFrame::OnPageClosed(wxAuiNotebookEvent &event) { // get the closed tab index int closed = event.GetSelection(); // remove the tab from the map this->webViewtabMap.erase(closed); // remove the webview from the map this->webViews.erase(this->webViewtabMap[closed]); if (this->currentWebView == this->webViewtabMap[closed]) { this->currentWebView = nullptr; } if (this->webViewtabMap.size() == 0) { wxCommandEvent event = wxCommandEvent(); event.SetString("https://www.google.com"); this->OnNewTab(event); } event.Skip(); } void BrowserFrame::OnPageChanging(wxAuiNotebookEvent &event) { event.Skip(); } void BrowserFrame::OnPageChanged(wxAuiNotebookEvent &event) { event.Skip(); } void BrowserFrame::OnUrlEnter(wxCommandEvent &event) { wxString url = m_urlbar->GetValue(); if (!url.StartsWith("http://") && !url.StartsWith("https://")) { wxRegEx domainRegex("^([a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}$"); url = domainRegex.Matches(url) ? "https://" + url : "https://www.google.com/search?q=" + url; this->m_urlbar->SetValue(url); } if (this->currentWebView) { url.Prepend("p"); this->currentWebView->LoadURL(url); } } void BrowserFrame::OnNewTab(wxCommandEvent &event) { wxPanel *panel = new wxPanel(m_auinotebook1); wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL); wxString url = "https://www.google.com"; if (!event.GetString().IsEmpty()) { url = event.GetString(); } wxWebView *webView = wxWebView::New(panel, wxID_ANY, url); webView->RegisterHandler( wxSharedPtr(new CurlHttpHandler())); webView->RegisterHandler( wxSharedPtr(new CurlHttpsHandler())); sizer->Add(webView, 1, wxEXPAND); panel->SetSizer(sizer); m_auinotebook1->AddPage(panel, "New Tab", true); m_auinotebook1->SetSelection(m_auinotebook1->GetPageCount() - 1); this->m_urlbar->SetValue(url); this->currentWebView = webView; this->webViews[webView] = std::make_shared( webView, std::bind(&BrowserFrame::WebViewHandlerCallback, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); this->webViewtabMap[m_auinotebook1->GetPageCount() - 1] = webView; } void BrowserFrame::OnReload(wxCommandEvent &event) { if (this->currentWebView) { this->currentWebView->Reload(); } } void BrowserFrame::OnBack(wxCommandEvent &event) { if (this->currentWebView) { this->currentWebView->GoBack(); } } void BrowserFrame::OnForward(wxCommandEvent &event) { if (this->currentWebView) { this->currentWebView->GoForward(); } } void BrowserFrame::OnHome(wxCommandEvent &event) { if (this->currentWebView) { this->currentWebView->LoadURL("https://www.google.com"); } } void BrowserFrame::m_urlbarOnSetFocus(wxFocusEvent &event) { this->m_urlbar->SetSelection(0, this->m_urlbar->GetValue().size()); } void BrowserFrame::m_urlbarOnLeftUp(wxMouseEvent &event) { this->m_urlbar->SetSelection(0, this->m_urlbar->GetValue().size()); } size_t BrowserFrame::GetTabIndex(wxWebView *webView) { for (auto &pair : this->webViewtabMap) { if (pair.second == webView) { return pair.first; } } return wxNOT_FOUND; } void BrowserFrame::ChangeTabIndex(wxWebView *webView, int index) { auto it = this->webViewtabMap.find(index); if (it != this->webViewtabMap.end()) { this->webViewtabMap[index] = webView; this->webViewtabMap.erase(it); } } void BrowserFrame::WebViewHandlerCallback(WebViewHandler::CallbackType type, const wxString data, WebViewHandler *handler) { switch (type) { case WebViewHandler::CallbackType::OnTitleChanged: { const auto index = this->GetTabIndex(handler->GetwebView()); if (index == wxNOT_FOUND) { return; } wxString title = data; if (data.size() > 50) { title = data.substr(0, 50) + "..."; this->m_auinotebook1->SetPageToolTip(index, data); } this->m_auinotebook1->SetPageText(index, data); } break; case WebViewHandler::CallbackType::OnNavigated: this->m_urlbar->SetValue(data); break; case WebViewHandler::CallbackType::OnNewWindow: { wxCommandEvent event = wxCommandEvent(); event.SetString(data); this->OnNewTab(event); } break; default: break; } }