Finished all the wiring necessary for favicon support. Send the

NAVIGATION_REQUESTED notification again from the FrameLoaderClient, this way
we can try to fetch the icon even earlier.

git-svn-id: http://svn.haiku-os.org/webpositive/webkit/trunk@259 94f232f2-1747-11df-bad5-a5bfde151594
This commit is contained in:
stippi
2012-07-03 15:30:48 +02:00
committed by Alexandre Deckner
parent 10d5754b92
commit 6063974734
3 changed files with 91 additions and 12 deletions
+2 -1
View File
@@ -321,6 +321,7 @@ BrowserWindow::MessageReceived(BMessage* message)
BString url; BString url;
if (message->FindString("url", &url) != B_OK) if (message->FindString("url", &url) != B_OK)
url = fURLTextControl->Text(); url = fURLTextControl->Text();
fTabManager->SetTabIcon(CurrentWebView(), NULL);
CurrentWebView()->LoadURL(url.String()); CurrentWebView()->LoadURL(url.String());
break; break;
} }
@@ -703,7 +704,7 @@ BrowserWindow::TitleChanged(const BString& title, BWebView* view)
void void
BrowserWindow::IconReceived(const BBitmap* icon, BWebView* view) BrowserWindow::IconReceived(const BBitmap* icon, BWebView* view)
{ {
printf("BrowserWindow::IconReceived(%p, %p)\n", icon, view); fTabManager->SetTabIcon(view, icon);
} }
+81 -10
View File
@@ -31,6 +31,7 @@
#include "WebView.h" #include "WebView.h"
#include <Application.h> #include <Application.h>
#include <AbstractLayoutItem.h> #include <AbstractLayoutItem.h>
#include <Bitmap.h>
#include <Button.h> #include <Button.h>
#include <CardLayout.h> #include <CardLayout.h>
#include <ControlLook.h> #include <ControlLook.h>
@@ -146,6 +147,7 @@ public:
void AddTab(const char* label, int32 index = -1); void AddTab(const char* label, int32 index = -1);
void AddTab(TabView* tab, int32 index = -1); void AddTab(TabView* tab, int32 index = -1);
TabView* RemoveTab(int32 index); TabView* RemoveTab(int32 index);
TabView* TabAt(int32 index) const;
int32 IndexOf(TabView* tab) const; int32 IndexOf(TabView* tab) const;
@@ -382,6 +384,17 @@ TabContainerView::RemoveTab(int32 index)
} }
TabView*
TabContainerView::TabAt(int32 index) const
{
TabLayoutItem* item = dynamic_cast<TabLayoutItem*>(
GroupLayout()->ItemAt(index));
if (item)
return item->Parent();
return NULL;
}
int32 int32
TabContainerView::IndexOf(TabView* tab) const TabContainerView::IndexOf(TabView* tab) const
{ {
@@ -738,6 +751,7 @@ private:
class WebTabView : public TabView { class WebTabView : public TabView {
public: public:
WebTabView(TabManagerController* controller); WebTabView(TabManagerController* controller);
~WebTabView();
virtual BSize MaxSize(); virtual BSize MaxSize();
@@ -749,12 +763,15 @@ public:
virtual void MouseMoved(BPoint where, uint32 transit, virtual void MouseMoved(BPoint where, uint32 transit,
const BMessage* dragMessage); const BMessage* dragMessage);
void SetIcon(const BBitmap* icon);
private: private:
void _DrawCloseButton(BView* owner, BRect& frame, const BRect& updateRect, void _DrawCloseButton(BView* owner, BRect& frame, const BRect& updateRect,
bool isFirst, bool isLast, bool isFront); bool isFirst, bool isLast, bool isFront);
BRect _CloseRectFrame(BRect frame) const; BRect _CloseRectFrame(BRect frame) const;
private: private:
BBitmap* fIcon;
TabManagerController* fController; TabManagerController* fController;
bool fOverCloseRect; bool fOverCloseRect;
bool fClicked; bool fClicked;
@@ -764,6 +781,7 @@ private:
WebTabView::WebTabView(TabManagerController* controller) WebTabView::WebTabView(TabManagerController* controller)
: :
TabView(), TabView(),
fIcon(NULL),
fController(controller), fController(controller),
fOverCloseRect(false), fOverCloseRect(false),
fClicked(false) fClicked(false)
@@ -771,11 +789,21 @@ WebTabView::WebTabView(TabManagerController* controller)
} }
WebTabView::~WebTabView()
{
delete fIcon;
}
BSize BSize
WebTabView::MaxSize() WebTabView::MaxSize()
{ {
// Account for close button. // Account for icon.
BSize size(TabView::MaxSize()); BSize size(TabView::MaxSize());
size.height = max_c(size.height, 16 + 8);
if (fIcon)
size.width += 16 + 8;
// Account for close button.
size.width += size.height; size.width += size.height;
return size; return size;
} }
@@ -788,6 +816,19 @@ WebTabView::DrawContents(BView* owner, BRect frame, const BRect& updateRect,
if (fController->CloseButtonsAvailable()) if (fController->CloseButtonsAvailable())
_DrawCloseButton(owner, frame, updateRect, isFirst, isLast, isFront); _DrawCloseButton(owner, frame, updateRect, isFirst, isLast, isFront);
if (fIcon) {
BRect iconBounds(0, 0, 15, 15);
// clip to icon bounds, if they are smaller
if (iconBounds.Contains(fIcon->Bounds()))
iconBounds = fIcon->Bounds();
BPoint iconPos(frame.left + 4,
frame.top + (frame.Height() - iconBounds.Height()) / 2);
iconBounds.OffsetTo(iconPos);
owner->SetDrawingMode(B_OP_OVER);
owner->DrawBitmap(fIcon, fIcon->Bounds(), iconBounds);
frame.left = frame.left + 16 + 8;
}
TabView::DrawContents(owner, frame, updateRect, isFirst, isLast, isFront); TabView::DrawContents(owner, frame, updateRect, isFirst, isLast, isFront);
} }
@@ -843,6 +884,18 @@ WebTabView::MouseMoved(BPoint where, uint32 transit,
} }
void
WebTabView::SetIcon(const BBitmap* icon)
{
delete fIcon;
if (icon)
fIcon = new BBitmap(icon);
else
fIcon = NULL;
LayoutItem()->InvalidateLayout();
}
BRect BRect
WebTabView::_CloseRectFrame(BRect frame) const WebTabView::_CloseRectFrame(BRect frame) const
{ {
@@ -1181,16 +1234,11 @@ TabManager::SelectTab(int32 tabIndex)
void void
TabManager::SelectTab(BView* containedView) TabManager::SelectTab(const BView* containedView)
{ {
int32 count = fCardLayout->CountItems(); int32 tabIndex = _TabIndexForContainedView(containedView);
for (int32 i = 0; i < count; i++) { if (tabIndex > 0)
BLayoutItem* item = fCardLayout->ItemAt(i); SelectTab(tabIndex);
if (item->View() == containedView) {
SelectTab(i);
break;
}
}
} }
@@ -1252,6 +1300,16 @@ TabManager::SetTabLabel(int32 tabIndex, const char* label)
} }
void
TabManager::SetTabIcon(const BView* containedView, const BBitmap* icon)
{
WebTabView* tab = dynamic_cast<WebTabView*>(fTabContainerView->TabAt(
_TabIndexForContainedView(containedView)));
if (tab)
tab->SetIcon(icon);
}
void void
TabManager::SetCloseButtonsAvailable(bool available) TabManager::SetCloseButtonsAvailable(bool available)
{ {
@@ -1261,3 +1319,16 @@ TabManager::SetCloseButtonsAvailable(bool available)
fTabContainerView->Invalidate(); fTabContainerView->Invalidate();
} }
int32
TabManager::_TabIndexForContainedView(const BView* containedView) const
{
int32 count = fCardLayout->CountItems();
for (int32 i = 0; i < count; i++) {
BLayoutItem* item = fCardLayout->ItemAt(i);
if (item->View() == containedView)
return i;
}
return -1;
}
+8 -1
View File
@@ -36,6 +36,7 @@ enum {
CLOSE_TAB = 'cltb' CLOSE_TAB = 'cltb'
}; };
class BBitmap;
class BCardLayout; class BCardLayout;
class BGroupView; class BGroupView;
class BMenu; class BMenu;
@@ -61,7 +62,7 @@ public:
BView* ViewForTab(int32 tabIndex) const; BView* ViewForTab(int32 tabIndex) const;
void SelectTab(int32 tabIndex); void SelectTab(int32 tabIndex);
void SelectTab(BView* containedView); void SelectTab(const BView* containedView);
int32 SelectedTabIndex() const; int32 SelectedTabIndex() const;
void CloseTab(int32 tabIndex); void CloseTab(int32 tabIndex);
@@ -71,8 +72,14 @@ public:
int32 CountTabs() const; int32 CountTabs() const;
void SetTabLabel(int32 tabIndex, const char* label); void SetTabLabel(int32 tabIndex, const char* label);
void SetTabIcon(const BView* containedView,
const BBitmap* icon);
void SetCloseButtonsAvailable(bool available); void SetCloseButtonsAvailable(bool available);
private:
int32 _TabIndexForContainedView(
const BView* containedView) const;
private: private:
#if INTEGRATE_MENU_INTO_TAB_BAR #if INTEGRATE_MENU_INTO_TAB_BAR
BMenu* fMenu; BMenu* fMenu;