From 5ff66ccb560c1c8a55c76dd4d9883c5b6370f314 Mon Sep 17 00:00:00 2001 From: kipp Date: Mon, 1 Jun 1998 20:55:10 +0000 Subject: [PATCH] Support nsILinkHandler::OnOverLink git-svn-id: svn://10.0.0.236/trunk@2845 18797224-902f-48f8-a5cc-f745e15eee43 --- .../layout/generic/nsHTMLContainerFrame.cpp | 41 +++++- mozilla/layout/generic/nsHTMLContainerFrame.h | 3 +- .../html/base/src/nsHTMLContainerFrame.cpp | 41 +++++- .../html/base/src/nsHTMLContainerFrame.h | 3 +- mozilla/layout/html/base/src/nsHTMLImage.cpp | 122 ++++++++++-------- 5 files changed, 147 insertions(+), 63 deletions(-) diff --git a/mozilla/layout/generic/nsHTMLContainerFrame.cpp b/mozilla/layout/generic/nsHTMLContainerFrame.cpp index 5f486f71043..b260f980dc9 100644 --- a/mozilla/layout/generic/nsHTMLContainerFrame.cpp +++ b/mozilla/layout/generic/nsHTMLContainerFrame.cpp @@ -81,7 +81,8 @@ NS_METHOD nsHTMLContainerFrame::Paint(nsIPresContext& aPresContext, void nsHTMLContainerFrame::TriggerLink(nsIPresContext& aPresContext, const nsString& aBase, const nsString& aURLSpec, - const nsString& aTargetSpec) + const nsString& aTargetSpec, + PRBool aClick) { nsILinkHandler* handler; if (NS_OK == aPresContext.GetLinkHandler(&handler)) { @@ -100,7 +101,12 @@ void nsHTMLContainerFrame::TriggerLink(nsIPresContext& aPresContext, } // Now pass on absolute url to the click handler - handler->OnLinkClick(this, absURLSpec, aTargetSpec); + if (aClick) { + handler->OnLinkClick(this, absURLSpec, aTargetSpec); + } + else { + handler->OnOverLink(this, absURLSpec, aTargetSpec); + } } } @@ -120,7 +126,7 @@ NS_METHOD nsHTMLContainerFrame::HandleEvent(nsIPresContext& aPresContext, nsAutoString base, href, target; mContent->GetAttribute("href", href); mContent->GetAttribute("target", target); - TriggerLink(aPresContext, base, href, target); + TriggerLink(aPresContext, base, href, target, PR_TRUE); aEventStatus = nsEventStatus_eConsumeNoDefault; } NS_IF_RELEASE(tag); @@ -131,6 +137,35 @@ NS_METHOD nsHTMLContainerFrame::HandleEvent(nsIPresContext& aPresContext, // XXX Bring up a contextual menu provided by the application break; + case NS_MOUSE_MOVE: + if (nsEventStatus_eIgnore == + nsContainerFrame::HandleEvent(aPresContext, aEvent, aEventStatus)) { + nsIAtom* tag = mContent->GetTag(); + if (tag == nsHTMLAtoms::a) { + nsAutoString base, href, target; + mContent->GetAttribute("href", href); + mContent->GetAttribute("target", target); + TriggerLink(aPresContext, base, href, target, PR_FALSE); + aEventStatus = nsEventStatus_eConsumeNoDefault; + } + NS_IF_RELEASE(tag); + } + break; + + // XXX this doesn't seem to do anything yet + case NS_MOUSE_EXIT: + if (nsEventStatus_eIgnore == + nsContainerFrame::HandleEvent(aPresContext, aEvent, aEventStatus)) { + nsIAtom* tag = mContent->GetTag(); + if (tag == nsHTMLAtoms::a) { + nsAutoString empty; + TriggerLink(aPresContext, empty, empty, empty, PR_FALSE); + aEventStatus = nsEventStatus_eConsumeNoDefault; + } + NS_IF_RELEASE(tag); + } + break; + default: nsContainerFrame::HandleEvent(aPresContext, aEvent, aEventStatus); break; diff --git a/mozilla/layout/generic/nsHTMLContainerFrame.h b/mozilla/layout/generic/nsHTMLContainerFrame.h index 6e644f77597..e68e03b5c45 100644 --- a/mozilla/layout/generic/nsHTMLContainerFrame.h +++ b/mozilla/layout/generic/nsHTMLContainerFrame.h @@ -59,7 +59,8 @@ protected: void TriggerLink(nsIPresContext& aPresContext, const nsString& aBase, const nsString& aURLSpec, - const nsString& aTargetSpec); + const nsString& aTargetSpec, + PRBool aClick); nsresult CreateFrameFor(nsIPresContext* aPresContext, nsIContent* aContent, diff --git a/mozilla/layout/html/base/src/nsHTMLContainerFrame.cpp b/mozilla/layout/html/base/src/nsHTMLContainerFrame.cpp index 5f486f71043..b260f980dc9 100644 --- a/mozilla/layout/html/base/src/nsHTMLContainerFrame.cpp +++ b/mozilla/layout/html/base/src/nsHTMLContainerFrame.cpp @@ -81,7 +81,8 @@ NS_METHOD nsHTMLContainerFrame::Paint(nsIPresContext& aPresContext, void nsHTMLContainerFrame::TriggerLink(nsIPresContext& aPresContext, const nsString& aBase, const nsString& aURLSpec, - const nsString& aTargetSpec) + const nsString& aTargetSpec, + PRBool aClick) { nsILinkHandler* handler; if (NS_OK == aPresContext.GetLinkHandler(&handler)) { @@ -100,7 +101,12 @@ void nsHTMLContainerFrame::TriggerLink(nsIPresContext& aPresContext, } // Now pass on absolute url to the click handler - handler->OnLinkClick(this, absURLSpec, aTargetSpec); + if (aClick) { + handler->OnLinkClick(this, absURLSpec, aTargetSpec); + } + else { + handler->OnOverLink(this, absURLSpec, aTargetSpec); + } } } @@ -120,7 +126,7 @@ NS_METHOD nsHTMLContainerFrame::HandleEvent(nsIPresContext& aPresContext, nsAutoString base, href, target; mContent->GetAttribute("href", href); mContent->GetAttribute("target", target); - TriggerLink(aPresContext, base, href, target); + TriggerLink(aPresContext, base, href, target, PR_TRUE); aEventStatus = nsEventStatus_eConsumeNoDefault; } NS_IF_RELEASE(tag); @@ -131,6 +137,35 @@ NS_METHOD nsHTMLContainerFrame::HandleEvent(nsIPresContext& aPresContext, // XXX Bring up a contextual menu provided by the application break; + case NS_MOUSE_MOVE: + if (nsEventStatus_eIgnore == + nsContainerFrame::HandleEvent(aPresContext, aEvent, aEventStatus)) { + nsIAtom* tag = mContent->GetTag(); + if (tag == nsHTMLAtoms::a) { + nsAutoString base, href, target; + mContent->GetAttribute("href", href); + mContent->GetAttribute("target", target); + TriggerLink(aPresContext, base, href, target, PR_FALSE); + aEventStatus = nsEventStatus_eConsumeNoDefault; + } + NS_IF_RELEASE(tag); + } + break; + + // XXX this doesn't seem to do anything yet + case NS_MOUSE_EXIT: + if (nsEventStatus_eIgnore == + nsContainerFrame::HandleEvent(aPresContext, aEvent, aEventStatus)) { + nsIAtom* tag = mContent->GetTag(); + if (tag == nsHTMLAtoms::a) { + nsAutoString empty; + TriggerLink(aPresContext, empty, empty, empty, PR_FALSE); + aEventStatus = nsEventStatus_eConsumeNoDefault; + } + NS_IF_RELEASE(tag); + } + break; + default: nsContainerFrame::HandleEvent(aPresContext, aEvent, aEventStatus); break; diff --git a/mozilla/layout/html/base/src/nsHTMLContainerFrame.h b/mozilla/layout/html/base/src/nsHTMLContainerFrame.h index 6e644f77597..e68e03b5c45 100644 --- a/mozilla/layout/html/base/src/nsHTMLContainerFrame.h +++ b/mozilla/layout/html/base/src/nsHTMLContainerFrame.h @@ -59,7 +59,8 @@ protected: void TriggerLink(nsIPresContext& aPresContext, const nsString& aBase, const nsString& aURLSpec, - const nsString& aTargetSpec); + const nsString& aTargetSpec, + PRBool aClick); nsresult CreateFrameFor(nsIPresContext* aPresContext, nsIContent* aContent, diff --git a/mozilla/layout/html/base/src/nsHTMLImage.cpp b/mozilla/layout/html/base/src/nsHTMLImage.cpp index 34484c1385b..04bf5c4a231 100644 --- a/mozilla/layout/html/base/src/nsHTMLImage.cpp +++ b/mozilla/layout/html/base/src/nsHTMLImage.cpp @@ -75,10 +75,12 @@ protected: nsIImageMap* GetImageMap(); nsHTMLImageLoader mImageLoader; + nsIImageMap* mImageMap; void TriggerLink(nsIPresContext& aPresContext, const nsString& aURLSpec, - const nsString& aTargetSpec); + const nsString& aTargetSpec, + PRBool aClick); }; class ImagePart : public nsHTMLTagContent { @@ -350,8 +352,11 @@ ImageFrame::~ImageFrame() NS_METHOD ImageFrame::DeleteFrame() { + NS_IF_RELEASE(mImageMap); + // Release image loader first so that it's refcnt can go to zero mImageLoader.DestroyLoader(); + return nsLeafFrame::DeleteFrame(); } @@ -419,44 +424,51 @@ ImageFrame::Paint(nsIPresContext& aPresContext, nsIImageMap* ImageFrame::GetImageMap() { - ImagePart* part = (ImagePart*)mContent; - if (nsnull == part->mUseMap) { - return nsnull; - } + if (nsnull == mImageMap) { + ImagePart* part = (ImagePart*)mContent; + if (nsnull == part->mUseMap) { + return nsnull; + } - nsIDocument* doc = mContent->GetDocument(); - if (nsnull == doc) { - return nsnull; - } + nsIDocument* doc = mContent->GetDocument(); + if (nsnull == doc) { + return nsnull; + } - nsAutoString mapName(*part->mUseMap); - if (mapName.First() == '#') { - mapName.Cut(0, 1); - } - nsIHTMLDocument* hdoc; - nsresult rv = doc->QueryInterface(kIHTMLDocumentIID, (void**)&hdoc); - NS_RELEASE(doc); - if (NS_OK == rv) { - nsIImageMap* map; - rv = hdoc->GetImageMap(mapName, &map); - NS_RELEASE(hdoc); + nsAutoString mapName(*part->mUseMap); + if (mapName.First() == '#') { + mapName.Cut(0, 1); + } + nsIHTMLDocument* hdoc; + nsresult rv = doc->QueryInterface(kIHTMLDocumentIID, (void**)&hdoc); + NS_RELEASE(doc); if (NS_OK == rv) { - return map; + nsIImageMap* map; + rv = hdoc->GetImageMap(mapName, &map); + NS_RELEASE(hdoc); + if (NS_OK == rv) { + mImageMap = map; + } } } - - return nsnull; + NS_IF_ADDREF(mImageMap); + return mImageMap; } void ImageFrame::TriggerLink(nsIPresContext& aPresContext, const nsString& aURLSpec, - const nsString& aTargetSpec) + const nsString& aTargetSpec, + PRBool aClick) { nsILinkHandler* handler; if (NS_OK == aPresContext.GetLinkHandler(&handler)) { - // Now pass on absolute url to the click handler - handler->OnLinkClick(this, aURLSpec, aTargetSpec); + if (aClick) { + handler->OnLinkClick(this, aURLSpec, aTargetSpec); + } + else { + handler->OnOverLink(this, aURLSpec, aTargetSpec); + } } } @@ -466,39 +478,40 @@ ImageFrame::HandleEvent(nsIPresContext& aPresContext, nsGUIEvent* aEvent, nsEventStatus& aEventStatus) { + nsIImageMap* map; aEventStatus = nsEventStatus_eIgnore; switch (aEvent->message) { case NS_MOUSE_LEFT_BUTTON_UP: - { - nsIImageMap* map = GetImageMap(); - if (nsnull != map) { - nsIURL* docURL = nsnull; - nsIDocument* doc = mContent->GetDocument(); - if (nsnull != doc) { - docURL = doc->GetDocumentURL(); - NS_RELEASE(doc); - } - - // Translate coordinates to pixels - float t2p = aPresContext.GetTwipsToPixels(); - nscoord x = nscoord(t2p * aEvent->point.x); - nscoord y = nscoord(t2p * aEvent->point.y); - - // Ask map if the x,y coordinates are in a clickable area - PRBool suppress; - nsAutoString absURL, target, altText; - nsresult r = map->IsInside(x, y, docURL, absURL, target, altText, - &suppress); - NS_IF_RELEASE(docURL); - NS_RELEASE(map); - if (NS_OK == r) { - // We hit a clickable area. Time to go somewhere... - TriggerLink(aPresContext, absURL, target); - aEventStatus = nsEventStatus_eConsumeNoDefault; - } - break; + case NS_MOUSE_MOVE: + map = GetImageMap(); + if (nsnull != map) { + nsIURL* docURL = nsnull; + nsIDocument* doc = mContent->GetDocument(); + if (nsnull != doc) { + docURL = doc->GetDocumentURL(); + NS_RELEASE(doc); } + + // Translate coordinates to pixels + float t2p = aPresContext.GetTwipsToPixels(); + nscoord x = nscoord(t2p * aEvent->point.x); + nscoord y = nscoord(t2p * aEvent->point.y); + + // Ask map if the x,y coordinates are in a clickable area + PRBool suppress; + nsAutoString absURL, target, altText; + nsresult r = map->IsInside(x, y, docURL, absURL, target, altText, + &suppress); + NS_IF_RELEASE(docURL); + NS_RELEASE(map); + if (NS_OK == r) { + // We hit a clickable area. Time to go somewhere... + TriggerLink(aPresContext, absURL, target, + aEvent->message == NS_MOUSE_LEFT_BUTTON_UP); + aEventStatus = nsEventStatus_eConsumeNoDefault; + } + break; } // FALL THROUGH @@ -506,7 +519,6 @@ ImageFrame::HandleEvent(nsIPresContext& aPresContext, // Let default event handler deal with it return nsLeafFrame::HandleEvent(aPresContext, aEvent, aEventStatus); } - return NS_OK; }