diff -r 000000000000 -r 6474c204b198 layout/generic/nsImageMap.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/layout/generic/nsImageMap.h Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,91 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* code for HTML client-side image maps */ + +#ifndef nsImageMap_h +#define nsImageMap_h + +#include "nsCOMPtr.h" +#include "nsCoord.h" +#include "nsTArray.h" +#include "nsStubMutationObserver.h" +#include "nsIDOMEventListener.h" + +class Area; +class nsRenderingContext; +class nsImageFrame; +class nsIFrame; +class nsIContent; +struct nsRect; + +class nsImageMap : public nsStubMutationObserver, + public nsIDOMEventListener +{ +public: + nsImageMap(); + + nsresult Init(nsImageFrame* aImageFrame, nsIContent* aMap); + + /** + * Return the first area element (in content order) for the given aX,aY pixel + * coordinate or nullptr if the coordinate is outside all areas. + */ + nsIContent* GetArea(nscoord aX, nscoord aY) const; + + /** + * Return area elements count associated with the image map. + */ + uint32_t AreaCount() const { return mAreas.Length(); } + + /** + * Return area element at the given index. + */ + nsIContent* GetAreaAt(uint32_t aIndex) const; + + void Draw(nsIFrame* aFrame, nsRenderingContext& aRC); + + /** + * Called just before the nsImageFrame releases us. + * Used to break the cycle caused by the DOM listener. + */ + void Destroy(); + + // nsISupports + NS_DECL_ISUPPORTS + + // nsIMutationObserver + NS_DECL_NSIMUTATIONOBSERVER_ATTRIBUTECHANGED + NS_DECL_NSIMUTATIONOBSERVER_CONTENTAPPENDED + NS_DECL_NSIMUTATIONOBSERVER_CONTENTINSERTED + NS_DECL_NSIMUTATIONOBSERVER_CONTENTREMOVED + NS_DECL_NSIMUTATIONOBSERVER_PARENTCHAINCHANGED + + //nsIDOMEventListener + NS_DECL_NSIDOMEVENTLISTENER + + nsresult GetBoundsForAreaContent(nsIContent *aContent, + nsRect& aBounds); + +protected: + virtual ~nsImageMap(); + + void FreeAreas(); + + nsresult UpdateAreas(); + nsresult SearchForAreas(nsIContent* aParent, bool& aFoundArea, + bool& aFoundAnchor); + + nsresult AddArea(nsIContent* aArea); + + void MaybeUpdateAreas(nsIContent *aContent); + + nsImageFrame* mImageFrame; // the frame that owns us + nsCOMPtr mMap; + nsAutoTArray mAreas; // almost always has some entries + bool mContainsBlockContents; +}; + +#endif /* nsImageMap_h */