SVGZoomEvent::SVGZoomEvent(EventTarget* aOwner, nsPresContext* aPresContext, WidgetGUIEvent* aEvent) : UIEvent(aOwner, aPresContext, aEvent ? aEvent : new WidgetGUIEvent(false, NS_SVG_ZOOM, 0)) , mPreviousScale(0) , mNewScale(0) { if (aEvent) { mEventIsInternal = false; } else { mEventIsInternal = true; mEvent->eventStructType = NS_SVGZOOM_EVENT; mEvent->time = PR_Now(); } mEvent->mFlags.mCancelable = false; // We must store the "Previous" and "New" values before this event is // dispatched. Reading the values from the root 'svg' element after we've // been dispatched is not an option since event handler code may change // currentScale and currentTranslate in response to this event. nsIPresShell *presShell; if (mPresContext && (presShell = mPresContext->GetPresShell())) { nsIDocument *doc = presShell->GetDocument(); if (doc) { Element *rootElement = doc->GetRootElement(); if (rootElement) { // If the root element isn't an SVG 'svg' element // (e.g. if this event was created by calling createEvent on a // non-SVGDocument), then the "New" and "Previous" // properties will be left null which is probably what we want. if (rootElement->IsSVG(nsGkAtoms::svg)) { SVGSVGElement *SVGSVGElem = static_cast<SVGSVGElement*>(rootElement); mNewScale = SVGSVGElem->GetCurrentScale(); mPreviousScale = SVGSVGElem->GetPreviousScale(); const SVGPoint& translate = SVGSVGElem->GetCurrentTranslate(); mNewTranslate = new DOMSVGPoint(translate.GetX(), translate.GetY()); mNewTranslate->SetReadonly(true); const SVGPoint& prevTranslate = SVGSVGElem->GetPreviousTranslate(); mPreviousTranslate = new DOMSVGPoint(prevTranslate.GetX(), prevTranslate.GetY()); mPreviousTranslate->SetReadonly(true); } } } } }