diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog
index d6e7c0e..87e2283 100644
--- a/Source/WebCore/ChangeLog
+++ b/Source/WebCore/ChangeLog
@@ -1,3 +1,51 @@
+2011-08-17  Emil A Eklund  <eae@chromium.org>
+
+        Switch html/* to to new layout types
+        https://bugs.webkit.org/show_bug.cgi?id=66347
+
+        Reviewed by Eric Seidel.
+
+        Convert HTML* and shadow element to new layout abstraction as a part of
+        the ongoing conversion work.
+
+        No new tests, no new functionality.
+
+        * html/HTMLAreaElement.cpp:
+        (WebCore::HTMLAreaElement::invalidateCachedRegion):
+        (WebCore::HTMLAreaElement::mapMouseEvent):
+        (WebCore::HTMLAreaElement::computePath):
+        (WebCore::HTMLAreaElement::computeRect):
+        (WebCore::HTMLAreaElement::getRegion):
+        * html/HTMLAreaElement.h:
+        * html/HTMLCanvasElement.cpp:
+        (WebCore::HTMLCanvasElement::paint):
+        * html/HTMLCanvasElement.h:
+        * html/HTMLMapElement.cpp:
+        (WebCore::HTMLMapElement::mapMouseEvent):
+        * html/HTMLMapElement.h:
+        * html/ImageDocument.cpp:
+        (WebCore::ImageDocumentParser::finish):
+        (WebCore::ImageDocument::scale):
+        (WebCore::ImageDocument::resizeImageToFit):
+        (WebCore::ImageDocument::imageFitsInWindow):
+        * html/ValidationMessage.cpp:
+        (WebCore::adjustBubblePosition):
+        * html/canvas/CanvasRenderingContext2D.cpp:
+        (WebCore::size):
+        (WebCore::CanvasRenderingContext2D::drawImage):
+        * html/shadow/MediaControlElements.cpp:
+        (WebCore::MediaControlPanelElement::startDrag):
+        (WebCore::MediaControlPanelElement::continueDrag):
+        (WebCore::MediaControlPanelElement::setPosition):
+        (WebCore::MediaControlPanelElement::defaultEventHandler):
+        * html/shadow/MediaControlElements.h:
+        * html/shadow/SliderThumbElement.cpp:
+        (WebCore::SliderThumbElement::dragFrom):
+        (WebCore::SliderThumbElement::setPositionFromPoint):
+        * html/shadow/SliderThumbElement.h:
+        * rendering/RenderImage.cpp:
+        (WebCore::RenderImage::nodeAtPoint):
+
 2011-08-17  David Grogan  <dgrogan@chromium.org>
 
         Change references to leveldb.gyp to leveldatabase.gyp as part of the
diff --git a/Source/WebCore/html/HTMLAreaElement.cpp b/Source/WebCore/html/HTMLAreaElement.cpp
index fbacea5..c2e8d6e 100644
--- a/Source/WebCore/html/HTMLAreaElement.cpp
+++ b/Source/WebCore/html/HTMLAreaElement.cpp
@@ -75,17 +75,17 @@
 
 void HTMLAreaElement::invalidateCachedRegion()
 {
-    m_lastSize = IntSize(-1, -1);
+    m_lastSize = LayoutSize(-1, -1);
 }
 
-bool HTMLAreaElement::mapMouseEvent(int x, int y, const IntSize& size, HitTestResult& result)
+bool HTMLAreaElement::mapMouseEvent(LayoutPoint location, const LayoutSize& size, HitTestResult& result)
 {
     if (m_lastSize != size) {
         m_region = adoptPtr(new Path(getRegion(size)));
         m_lastSize = size;
     }
 
-    if (!m_region->contains(IntPoint(x, y)))
+    if (!m_region->contains(location))
         return false;
     
     result.setInnerNode(this);
@@ -102,7 +102,7 @@
     FloatPoint absPos = obj->localToAbsolute();
 
     // Default should default to the size of the containing object.
-    IntSize size = m_lastSize;
+    LayoutSize size = m_lastSize;
     if (m_shape == Default)
         size = obj->absoluteOutlineBounds().size();
     
@@ -118,18 +118,18 @@
     return p;
 }
     
-IntRect HTMLAreaElement::computeRect(RenderObject* obj) const
+LayoutRect HTMLAreaElement::computeRect(RenderObject* obj) const
 {
-    return enclosingIntRect(computePath(obj).boundingRect());
+    return enclosingLayoutRect(computePath(obj).boundingRect());
 }
 
-Path HTMLAreaElement::getRegion(const IntSize& size) const
+Path HTMLAreaElement::getRegion(const LayoutSize& size) const
 {
     if (!m_coords && m_shape != Default)
         return Path();
 
-    int width = size.width();
-    int height = size.height();
+    LayoutUnit width = size.width();
+    LayoutUnit height = size.height();
 
     // If element omits the shape attribute, select shape based on number of coordinates.
     Shape shape = m_shape;
diff --git a/Source/WebCore/html/HTMLAreaElement.h b/Source/WebCore/html/HTMLAreaElement.h
index 8ad1cbc..c43ba6d 100644
--- a/Source/WebCore/html/HTMLAreaElement.h
+++ b/Source/WebCore/html/HTMLAreaElement.h
@@ -24,7 +24,7 @@
 #define HTMLAreaElement_h
 
 #include "HTMLAnchorElement.h"
-#include "IntSize.h"
+#include "LayoutTypes.h"
 #include <wtf/OwnArrayPtr.h>
 
 namespace WebCore {
@@ -39,9 +39,9 @@
 
     bool isDefault() const { return m_shape == Default; }
 
-    bool mapMouseEvent(int x, int y, const IntSize&, HitTestResult&);
+    bool mapMouseEvent(LayoutPoint location, const LayoutSize&, HitTestResult&);
 
-    IntRect computeRect(RenderObject*) const;
+    LayoutRect computeRect(RenderObject*) const;
     Path computePath(RenderObject*) const;
 
     // The parent map's image.
@@ -60,13 +60,13 @@
     virtual void setFocus(bool);
     
     enum Shape { Default, Poly, Rect, Circle, Unknown };
-    Path getRegion(const IntSize&) const;
+    Path getRegion(const LayoutSize&) const;
     void invalidateCachedRegion();
 
     OwnPtr<Path> m_region;
     OwnArrayPtr<Length> m_coords;
     int m_coordsLen;
-    IntSize m_lastSize;
+    LayoutSize m_lastSize;
     Shape m_shape;
 };
 
diff --git a/Source/WebCore/html/HTMLCanvasElement.cpp b/Source/WebCore/html/HTMLCanvasElement.cpp
index 2a7ad1d..1a0cb21 100644
--- a/Source/WebCore/html/HTMLCanvasElement.cpp
+++ b/Source/WebCore/html/HTMLCanvasElement.cpp
@@ -264,7 +264,7 @@
         (*it)->canvasResized(this);
 }
 
-void HTMLCanvasElement::paint(GraphicsContext* context, const IntRect& r, bool useLowQualityScale)
+void HTMLCanvasElement::paint(GraphicsContext* context, const LayoutRect& r, bool useLowQualityScale)
 {
     // Clear the dirty rect
     m_dirtyRect = FloatRect();
diff --git a/Source/WebCore/html/HTMLCanvasElement.h b/Source/WebCore/html/HTMLCanvasElement.h
index acf6186..f265f42 100644
--- a/Source/WebCore/html/HTMLCanvasElement.h
+++ b/Source/WebCore/html/HTMLCanvasElement.h
@@ -97,7 +97,7 @@
     // Used for rendering
     void didDraw(const FloatRect&);
 
-    void paint(GraphicsContext*, const IntRect&, bool useLowQualityScale = false);
+    void paint(GraphicsContext*, const LayoutRect&, bool useLowQualityScale = false);
 
     GraphicsContext* drawingContext() const;
     GraphicsContext* existingDrawingContext() const;
diff --git a/Source/WebCore/html/HTMLMapElement.cpp b/Source/WebCore/html/HTMLMapElement.cpp
index f83bdc4..e944dad 100644
--- a/Source/WebCore/html/HTMLMapElement.cpp
+++ b/Source/WebCore/html/HTMLMapElement.cpp
@@ -58,7 +58,7 @@
 {
 }
 
-bool HTMLMapElement::mapMouseEvent(int x, int y, const IntSize& size, HitTestResult& result)
+bool HTMLMapElement::mapMouseEvent(LayoutPoint location, const LayoutSize& size, HitTestResult& result)
 {
     HTMLAreaElement* defaultArea = 0;
     Node *node = this;
@@ -68,7 +68,7 @@
             if (areaElt->isDefault()) {
                 if (!defaultArea)
                     defaultArea = areaElt;
-            } else if (areaElt->mapMouseEvent(x, y, size, result))
+            } else if (areaElt->mapMouseEvent(location, size, result))
                 return true;
         }
     }
diff --git a/Source/WebCore/html/HTMLMapElement.h b/Source/WebCore/html/HTMLMapElement.h
index 8e356b4..3006766 100644
--- a/Source/WebCore/html/HTMLMapElement.h
+++ b/Source/WebCore/html/HTMLMapElement.h
@@ -27,7 +27,6 @@
 
 namespace WebCore {
 
-class IntSize;
 class HitTestResult;
 class HTMLImageElement;
     
@@ -39,7 +38,7 @@
 
     const AtomicString& getName() const { return m_name; }
 
-    bool mapMouseEvent(int x, int y, const IntSize&, HitTestResult&);
+    bool mapMouseEvent(LayoutPoint location, const LayoutSize&, HitTestResult&);
     
     HTMLImageElement* imageElement();
     PassRefPtr<HTMLCollection> areas();
diff --git a/Source/WebCore/html/ImageDocument.cpp b/Source/WebCore/html/ImageDocument.cpp
index 8f4b5e9..ddcb03f 100644
--- a/Source/WebCore/html/ImageDocument.cpp
+++ b/Source/WebCore/html/ImageDocument.cpp
@@ -155,7 +155,7 @@
 
         // Report the natural image size in the page title, regardless of zoom
         // level.
-        IntSize size = cachedImage->imageSize(1.0f);
+        LayoutSize size = cachedImage->imageSize(1.0f);
         if (size.width()) {
             // Compute the title, we use the decoded filename of the resource, falling
             // back on the (decoded) hostname if there is no path.
@@ -235,8 +235,8 @@
     if (!view)
         return 1;
 
-    IntSize imageSize = m_imageElement->cachedImage()->imageSize(pageZoomFactor(this));
-    IntSize windowSize = IntSize(view->width(), view->height());
+    LayoutSize imageSize = m_imageElement->cachedImage()->imageSize(pageZoomFactor(this));
+    LayoutSize windowSize = IntSize(view->width(), view->height());
     
     float widthScale = (float)windowSize.width() / imageSize.width();
     float heightScale = (float)windowSize.height() / imageSize.height();
@@ -249,7 +249,7 @@
     if (!m_imageElement)
         return;
 
-    IntSize imageSize = m_imageElement->cachedImage()->imageSize(pageZoomFactor(this));
+    LayoutSize imageSize = m_imageElement->cachedImage()->imageSize(pageZoomFactor(this));
 
     float scale = this->scale();
     m_imageElement->setWidth(static_cast<int>(imageSize.width() * scale));
@@ -326,8 +326,8 @@
     if (!view)
         return true;
 
-    IntSize imageSize = m_imageElement->cachedImage()->imageSize(pageZoomFactor(this));
-    IntSize windowSize = IntSize(view->width(), view->height());
+    LayoutSize imageSize = m_imageElement->cachedImage()->imageSize(pageZoomFactor(this));
+    LayoutSize windowSize = LayoutSize(view->width(), view->height());
     
     return imageSize.width() <= windowSize.width() && imageSize.height() <= windowSize.height();    
 }
diff --git a/Source/WebCore/html/ValidationMessage.cpp b/Source/WebCore/html/ValidationMessage.cpp
index de57136..0d1f174 100644
--- a/Source/WebCore/html/ValidationMessage.cpp
+++ b/Source/WebCore/html/ValidationMessage.cpp
@@ -106,7 +106,7 @@
     }
 }
 
-static void adjustBubblePosition(const IntRect& hostRect, HTMLElement* bubble)
+static void adjustBubblePosition(const LayoutRect& hostRect, HTMLElement* bubble)
 {
     ASSERT(bubble);
     if (hostRect.isEmpty())
diff --git a/Source/WebCore/html/canvas/CanvasRenderingContext2D.cpp b/Source/WebCore/html/canvas/CanvasRenderingContext2D.cpp
index 9054057..9d859c3 100644
--- a/Source/WebCore/html/canvas/CanvasRenderingContext2D.cpp
+++ b/Source/WebCore/html/canvas/CanvasRenderingContext2D.cpp
@@ -1185,7 +1185,7 @@
     c->setLegacyShadow(FloatSize(width, -height), state().m_shadowBlur, state().m_shadowColor, ColorSpaceDeviceRGB);
 }
 
-static IntSize size(HTMLImageElement* image)
+static LayoutSize size(HTMLImageElement* image)
 {
     if (CachedImage* cachedImage = image->cachedImage())
         return cachedImage->imageSize(1.0f); // FIXME: Not sure about this.
@@ -1215,7 +1215,7 @@
         ec = TYPE_MISMATCH_ERR;
         return;
     }
-    IntSize s = size(image);
+    LayoutSize s = size(image);
     drawImage(image, x, y, s.width(), s.height(), ec);
 }
 
@@ -1226,7 +1226,7 @@
         ec = TYPE_MISMATCH_ERR;
         return;
     }
-    IntSize s = size(image);
+    LayoutSize s = size(image);
     drawImage(image, FloatRect(0, 0, s.width(), s.height()), FloatRect(x, y, width, height), ec);
 }
 
diff --git a/Source/WebCore/html/shadow/MediaControlElements.cpp b/Source/WebCore/html/shadow/MediaControlElements.cpp
index 4a99ca3..cb95b1b 100644
--- a/Source/WebCore/html/shadow/MediaControlElements.cpp
+++ b/Source/WebCore/html/shadow/MediaControlElements.cpp
@@ -122,7 +122,7 @@
     return id;
 }
 
-void MediaControlPanelElement::startDrag(const IntPoint& eventLocation)
+void MediaControlPanelElement::startDrag(const LayoutPoint& eventLocation)
 {
     if (!m_canBeDragged)
         return;
@@ -146,12 +146,12 @@
     m_isBeingDragged = true;
 }
 
-void MediaControlPanelElement::continueDrag(const IntPoint& eventLocation)
+void MediaControlPanelElement::continueDrag(const LayoutPoint& eventLocation)
 {
     if (!m_isBeingDragged)
         return;
 
-    IntSize distanceDragged = eventLocation - m_dragStartEventLocation;
+    LayoutSize distanceDragged = eventLocation - m_dragStartEventLocation;
     setPosition(m_dragStartPosition + distanceDragged);
 }
 
@@ -169,7 +169,7 @@
     frame->eventHandler()->setCapturingMouseEventsNode(0);
 }
 
-void MediaControlPanelElement::setPosition(const IntPoint& position)
+void MediaControlPanelElement::setPosition(const LayoutPoint& position)
 {
     CSSMutableStyleDeclaration* style = getInlineStyleDecl();
 
@@ -199,7 +199,7 @@
     MediaControlElement::defaultEventHandler(event);
 
     if (event->isMouseEvent()) {
-        IntPoint location = static_cast<MouseEvent*>(event)->absoluteLocation();
+        LayoutPoint location = static_cast<MouseEvent*>(event)->absoluteLocation();
         if (event->type() == eventNames().mousedownEvent) {
             startDrag(location);
             event->setDefaultHandled();
diff --git a/Source/WebCore/html/shadow/MediaControlElements.h b/Source/WebCore/html/shadow/MediaControlElements.h
index 2128d66..0679183 100644
--- a/Source/WebCore/html/shadow/MediaControlElements.h
+++ b/Source/WebCore/html/shadow/MediaControlElements.h
@@ -108,16 +108,16 @@
     virtual const AtomicString& shadowPseudoId() const;
     virtual void defaultEventHandler(Event*);
 
-    void startDrag(const IntPoint& eventLocation);
-    void continueDrag(const IntPoint& eventLocation);
+    void startDrag(const LayoutPoint& eventLocation);
+    void continueDrag(const LayoutPoint& eventLocation);
     void endDrag();
 
-    void setPosition(const IntPoint&);
+    void setPosition(const LayoutPoint&);
 
     bool m_canBeDragged;
     bool m_isBeingDragged;
-    IntPoint m_dragStartPosition;
-    IntPoint m_dragStartEventLocation;
+    LayoutPoint m_dragStartPosition;
+    LayoutPoint m_dragStartEventLocation;
 };
 
 // ----------------------------
diff --git a/Source/WebCore/html/shadow/SliderThumbElement.cpp b/Source/WebCore/html/shadow/SliderThumbElement.cpp
index 3cd3535..5d178af 100644
--- a/Source/WebCore/html/shadow/SliderThumbElement.cpp
+++ b/Source/WebCore/html/shadow/SliderThumbElement.cpp
@@ -195,29 +195,29 @@
     return hostInput();
 }
 
-void SliderThumbElement::dragFrom(const IntPoint& point)
+void SliderThumbElement::dragFrom(const LayoutPoint& point)
 {
     setPositionFromPoint(point);
     startDragging();
 }
 
-void SliderThumbElement::setPositionFromPoint(const IntPoint& point)
+void SliderThumbElement::setPositionFromPoint(const LayoutPoint& point)
 {
     HTMLInputElement* input = hostInput();
 
     if (!input->renderer() || !renderer())
         return;
 
-    IntPoint offset = roundedIntPoint(input->renderer()->absoluteToLocal(point, false, true));
+    LayoutPoint offset = roundedLayoutPoint(input->renderer()->absoluteToLocal(point, false, true));
     bool isVertical = hasVerticalAppearance(input);
-    int trackSize;
-    int position;
-    int currentPosition;
+    LayoutUnit trackSize;
+    LayoutUnit position;
+    LayoutUnit currentPosition;
     // We need to calculate currentPosition from absolute points becaue the
     // renderer for this node is usually on a layer and renderBox()->x() and
     // y() are unusable.
-    IntPoint absoluteThumbOrigin = renderBox()->absoluteBoundingBoxRect().location();
-    IntPoint absoluteSliderContentOrigin = roundedIntPoint(input->renderer()->localToAbsolute());
+    LayoutPoint absoluteThumbOrigin = renderBox()->absoluteBoundingBoxRect().location();
+    LayoutPoint absoluteSliderContentOrigin = roundedLayoutPoint(input->renderer()->localToAbsolute());
     if (isVertical) {
         trackSize = input->renderBox()->contentHeight() - renderBox()->height();
         position = offset.y() - renderBox()->height() / 2;
@@ -227,7 +227,7 @@
         position = offset.x() - renderBox()->width() / 2;
         currentPosition = absoluteThumbOrigin.x() - absoluteSliderContentOrigin.x();
     }
-    position = max(0, min(position, trackSize));
+    position = max<LayoutUnit>(0, min(position, trackSize));
     if (position == currentPosition)
         return;
 
diff --git a/Source/WebCore/html/shadow/SliderThumbElement.h b/Source/WebCore/html/shadow/SliderThumbElement.h
index 4a7b046..e2d8b66 100644
--- a/Source/WebCore/html/shadow/SliderThumbElement.h
+++ b/Source/WebCore/html/shadow/SliderThumbElement.h
@@ -52,7 +52,7 @@
 
     void setPositionFromValue();
 
-    void dragFrom(const IntPoint&);
+    void dragFrom(const LayoutPoint&);
     virtual void defaultEventHandler(Event*);
     virtual void detach();
     virtual const AtomicString& shadowPseudoId() const;
@@ -67,7 +67,7 @@
     virtual Node* focusDelegate();
     void startDragging();
     void stopDragging();
-    void setPositionFromPoint(const IntPoint&);
+    void setPositionFromPoint(const LayoutPoint&);
 
     bool m_inDragMode;
 };
diff --git a/Source/WebCore/rendering/RenderImage.cpp b/Source/WebCore/rendering/RenderImage.cpp
index 04347d4..7022cda 100644
--- a/Source/WebCore/rendering/RenderImage.cpp
+++ b/Source/WebCore/rendering/RenderImage.cpp
@@ -437,10 +437,11 @@
     if (tempResult.innerNode() && node()) {
         if (HTMLMapElement* map = imageMap()) {
             IntRect contentBox = contentBoxRect();
-            float zoom = style()->effectiveZoom();
-            LayoutUnit mapX = roundedLayoutUnit((pointInContainer.x() - accumulatedOffset.x() - this->x() - contentBox.x()) / zoom);
-            LayoutUnit mapY = roundedLayoutUnit((pointInContainer.y() - accumulatedOffset.y() - this->y() - contentBox.y()) / zoom);
-            if (map->mapMouseEvent(mapX, mapY, contentBox.size(), tempResult))
+            float scaleFactor = 1 / style()->effectiveZoom();
+            LayoutPoint mapLocation(pointInContainer.x() - accumulatedOffset.x() - this->x() - contentBox.x(), pointInContainer.y() - accumulatedOffset.y() - this->y() - contentBox.y());
+            mapLocation.scale(scaleFactor, scaleFactor);
+            
+            if (map->mapMouseEvent(mapLocation, contentBox.size(), tempResult))
                 tempResult.setInnerNonSharedNode(node());
         }
     }
