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;
}