void ImageDocument::UpdateSizeFromLayout() { // Pull an updated size from the content frame to account for any size // change due to CSS properties like |image-orientation|. Element* contentElement = mImageContent->AsElement(); if (!contentElement) { return; } nsIFrame* contentFrame = contentElement->GetPrimaryFrame(Flush_Frames); if (!contentFrame) { return; } nsIntSize oldSize(mImageWidth, mImageHeight); IntrinsicSize newSize = contentFrame->GetIntrinsicSize(); if (newSize.width.GetUnit() == eStyleUnit_Coord) { mImageWidth = nsPresContext::AppUnitsToFloatCSSPixels(newSize.width.GetCoordValue()); } if (newSize.height.GetUnit() == eStyleUnit_Coord) { mImageHeight = nsPresContext::AppUnitsToFloatCSSPixels(newSize.height.GetCoordValue()); } // Ensure that our information about overflow is up-to-date if needed. if (mImageWidth != oldSize.width || mImageHeight != oldSize.height) { CheckOverflowing(false); } }
NS_IMETHODIMP ImageDocument::HandleEvent(nsIDOMEvent* aEvent) { nsAutoString eventType; aEvent->GetType(eventType); if (eventType.EqualsLiteral("resize")) { CheckOverflowing(false); } else if (eventType.EqualsLiteral("click") && mClickResizingEnabled) { ResetZoomLevel(); mShouldResize = true; if (mImageIsResized) { int32_t x = 0, y = 0; nsCOMPtr<nsIDOMMouseEvent> event(do_QueryInterface(aEvent)); if (event) { event->GetClientX(&x); event->GetClientY(&y); int32_t left = 0, top = 0; nsCOMPtr<nsIDOMHTMLElement> htmlElement = do_QueryInterface(mImageContent); htmlElement->GetOffsetLeft(&left); htmlElement->GetOffsetTop(&top); x -= left; y -= top; } mShouldResize = false; RestoreImageTo(x, y); } else if (mImageIsOverflowing) { ShrinkToFit(); } } return NS_OK; }