#include "Tab.h" #include "UI.h" #include #include #define INSPECTOR_DRAG_HANDLE_HEIGHT 10 Tab::Tab(UI* ui, uint64_t id, uint32_t width, uint32_t height, int x, int y) : ui_(ui), id_(id), container_width_(width), container_height_(height) { overlay_ = Overlay::Create(ui->window_, width, height, x, y); view()->set_view_listener(this); view()->set_load_listener(this); } Tab::~Tab() { view()->set_view_listener(nullptr); view()->set_load_listener(nullptr); } void Tab::Show() { overlay_->Show(); overlay_->Focus(); if (inspector_overlay_) inspector_overlay_->Show(); } void Tab::Hide() { overlay_->Hide(); overlay_->Unfocus(); if (inspector_overlay_) inspector_overlay_->Hide(); } void Tab::ToggleInspector() { if (!inspector_overlay_) { view()->CreateLocalInspectorView(); } else { if (inspector_overlay_->is_hidden()) { inspector_overlay_->Show(); } else { inspector_overlay_->Hide(); } } // Force resize to update layout } bool Tab::IsInspectorShowing() const { if (!inspector_overlay_) return false; return !inspector_overlay_->is_hidden(); } IntRect Tab::GetInspectorResizeDragHandle() const { if (!IsInspectorShowing()) return IntRect::MakeEmpty(); int drag_handle_height_px = (uint32_t)std::round(INSPECTOR_DRAG_HANDLE_HEIGHT * ui_->window()->scale()); // This drag handle should span the width of the UI and be centered vertically at the boundary between // the page overlay and inspector overlay. int drag_handle_x = (int)inspector_overlay_->x(); int drag_handle_y = (int)inspector_overlay_->y() - drag_handle_height_px / 2; return { drag_handle_x, drag_handle_y, drag_handle_x + (int)inspector_overlay_->width(), drag_handle_y + drag_handle_height_px }; } int Tab::GetInspectorHeight() const { if (inspector_overlay_) return inspector_overlay_->height(); return 0; } void Tab::SetInspectorHeight(int height) { if (height > 2) { inspector_overlay_->Resize(inspector_overlay_->width(), height); // Trigger a resize to perform re-layout / re-size of content overlay Resize(container_width_, container_height_); } } void Tab::Resize(uint32_t width, uint32_t height) { container_width_ = width; container_height_ = height; uint32_t content_height = container_height_; if (inspector_overlay_ && !inspector_overlay_->is_hidden()) { content_height -= inspector_overlay_->height(); } if (content_height < 1) content_height = 1; overlay_->Resize(container_width_, content_height); if (inspector_overlay_ && !inspector_overlay_->is_hidden()) { inspector_overlay_->MoveTo(0, overlay_->y() + overlay_->height()); inspector_overlay_->Resize(container_width_, inspector_overlay_->height()); } } void Tab::OnChangeTitle(View* caller, const String& title) { ui_->UpdateTabTitle(id_, title); } void Tab::OnChangeURL(View* caller, const String& url) { ui_->UpdateTabURL(id_, url); } void Tab::OnChangeTooltip(View* caller, const String& tooltip) {} void Tab::OnChangeCursor(View* caller, Cursor cursor) { if (id_ == ui_->active_tab_id_) ui_->SetCursor(cursor); } void Tab::OnAddConsoleMessage(View* caller, const ConsoleMessage& msg) { } RefPtr Tab::OnCreateChildView(ultralight::View* caller, const String& opener_url, const String& target_url, bool is_popup, const IntRect& popup_rect) { return ui_->CreateNewTabForChildView(target_url); } RefPtr Tab::OnCreateInspectorView(ultralight::View* caller, bool is_local, const String& inspected_url) { if (inspector_overlay_) return nullptr; inspector_overlay_ = Overlay::Create(ui_->window_, container_width_, container_height_ / 2, 0, 0); // Force resize to update layout Resize(container_width_, container_height_); inspector_overlay_->Show(); return inspector_overlay_->view(); } void Tab::OnBeginLoading(View* caller, uint64_t frame_id, bool is_main_frame, const String& url) { ui_->UpdateTabNavigation(id_, caller->is_loading(), caller->CanGoBack(), caller->CanGoForward()); } void Tab::OnFinishLoading(View* caller, uint64_t frame_id, bool is_main_frame, const String& url) { ui_->UpdateTabNavigation(id_, caller->is_loading(), caller->CanGoBack(), caller->CanGoForward()); } void Tab::OnFailLoading(View* caller, uint64_t frame_id, bool is_main_frame, const String& url, const String& description, const String& error_domain, int error_code) { if (is_main_frame) { char error_code_str[16]; sprintf(error_code_str,"%d", error_code); String html_string = ""; html_string += "

A Network Error was Encountered

"; html_string += "
"; html_string += "
URL
" + url + "
"; html_string += "
Description
" + description + "
"; html_string += "
Error Domain
" + error_domain + "
"; html_string += "
Error Code
" + String(error_code_str) + "
"; html_string += "
"; view()->LoadHTML(html_string); } } void Tab::OnUpdateHistory(View* caller) { ui_->UpdateTabNavigation(id_, caller->is_loading(), caller->CanGoBack(), caller->CanGoForward()); }