Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(437)

Side by Side Diff: Source/core/html/ImageDocument.cpp

Issue 262053005: Allow zoom/restore in a zoomed document. It is a regression from an earlier fix. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2006, 2007, 2008, 2010 Apple Inc. All rights reserved. 2 * Copyright (C) 2006, 2007, 2008, 2010 Apple Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 1. Redistributions of source code must retain the above copyright 7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright 9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after
225 225
226 LayoutSize imageSize = m_imageElement->cachedImage()->imageSizeForRenderer(m _imageElement->renderer(), pageZoomFactor(this)); 226 LayoutSize imageSize = m_imageElement->cachedImage()->imageSizeForRenderer(m _imageElement->renderer(), pageZoomFactor(this));
227 LayoutSize windowSize = LayoutSize(view->width(), view->height()); 227 LayoutSize windowSize = LayoutSize(view->width(), view->height());
228 228
229 float widthScale = windowSize.width().toFloat() / imageSize.width().toFloat( ); 229 float widthScale = windowSize.width().toFloat() / imageSize.width().toFloat( );
230 float heightScale = windowSize.height().toFloat() / imageSize.height().toFlo at(); 230 float heightScale = windowSize.height().toFloat() / imageSize.height().toFlo at();
231 231
232 return min(widthScale, heightScale); 232 return min(widthScale, heightScale);
233 } 233 }
234 234
235 void ImageDocument::resizeImageToFit() 235 void ImageDocument::resizeImageToFit(bool resizeZoomedDocument)
236 { 236 {
237 if (!m_imageElement || m_imageElement->document() != this || pageZoomFactor( this) > 1) 237 if (!m_imageElement || m_imageElement->document() != this || (pageZoomFactor (this) > 1 && !resizeZoomedDocument))
238 return; 238 return;
239 239
240 LayoutSize imageSize = m_imageElement->cachedImage()->imageSizeForRenderer(m _imageElement->renderer(), pageZoomFactor(this)); 240 LayoutSize imageSize = m_imageElement->cachedImage()->imageSizeForRenderer(m _imageElement->renderer(), pageZoomFactor(this));
241 241
242 float scale = this->scale(); 242 float scale = this->scale();
243 m_imageElement->setWidth(static_cast<int>(imageSize.width() * scale)); 243 m_imageElement->setWidth(static_cast<int>(imageSize.width() * scale));
244 m_imageElement->setHeight(static_cast<int>(imageSize.height() * scale)); 244 m_imageElement->setHeight(static_cast<int>(imageSize.height() * scale));
245 245
246 m_imageElement->setInlineStyleProperty(CSSPropertyCursor, CSSValueWebkitZoom In); 246 m_imageElement->setInlineStyleProperty(CSSPropertyCursor, CSSValueWebkitZoom In);
247 } 247 }
248 248
249 void ImageDocument::imageClicked(int x, int y) 249 void ImageDocument::imageClicked(int x, int y)
250 { 250 {
251 if (!m_imageSizeIsKnown || imageFitsInWindow()) 251 if (!m_imageSizeIsKnown || imageFitsInWindow())
252 return; 252 return;
253 253
254 m_shouldShrinkImage = !m_shouldShrinkImage; 254 m_shouldShrinkImage = !m_shouldShrinkImage;
255 255
256 if (m_shouldShrinkImage) 256 if (m_shouldShrinkImage)
257 windowSizeChanged(); 257 windowSizeChanged(true);
258 else { 258 else {
259 restoreImageSize(); 259 restoreImageSize(true);
260 260
261 updateLayout(); 261 updateLayout();
262 262
263 float scale = this->scale(); 263 float scale = this->scale();
264 264
265 int scrollX = static_cast<int>(x / scale - (float)frame()->view()->width () / 2); 265 int scrollX = static_cast<int>(x / scale - (float)frame()->view()->width () / 2);
266 int scrollY = static_cast<int>(y / scale - (float)frame()->view()->heigh t() / 2); 266 int scrollY = static_cast<int>(y / scale - (float)frame()->view()->heigh t() / 2);
267 267
268 frame()->view()->setScrollPosition(IntPoint(scrollX, scrollY)); 268 frame()->view()->setScrollPosition(IntPoint(scrollX, scrollY));
269 } 269 }
270 } 270 }
271 271
272 void ImageDocument::imageUpdated() 272 void ImageDocument::imageUpdated()
273 { 273 {
274 ASSERT(m_imageElement); 274 ASSERT(m_imageElement);
275 275
276 if (m_imageSizeIsKnown) 276 if (m_imageSizeIsKnown)
277 return; 277 return;
278 278
279 if (m_imageElement->cachedImage()->imageSizeForRenderer(m_imageElement->rend erer(), pageZoomFactor(this)).isEmpty()) 279 if (m_imageElement->cachedImage()->imageSizeForRenderer(m_imageElement->rend erer(), pageZoomFactor(this)).isEmpty())
280 return; 280 return;
281 281
282 m_imageSizeIsKnown = true; 282 m_imageSizeIsKnown = true;
283 283
284 if (shouldShrinkToFit()) { 284 if (shouldShrinkToFit()) {
285 // Force resizing of the image 285 // Force resizing of the image
286 windowSizeChanged(); 286 windowSizeChanged(false);
287 } 287 }
288 } 288 }
289 289
290 void ImageDocument::restoreImageSize() 290 void ImageDocument::restoreImageSize(bool restoreZoomedDocument)
291 { 291 {
292 if (!m_imageElement || !m_imageSizeIsKnown || m_imageElement->document() != this || pageZoomFactor(this) < 1) 292 if (!m_imageElement || !m_imageSizeIsKnown || m_imageElement->document() != this || (pageZoomFactor(this) < 1 && !restoreZoomedDocument))
293 return; 293 return;
294 294
295 LayoutSize imageSize = m_imageElement->cachedImage()->imageSizeForRenderer(m _imageElement->renderer(), 1.0f); 295 LayoutSize imageSize = m_imageElement->cachedImage()->imageSizeForRenderer(m _imageElement->renderer(), 1.0f);
296 m_imageElement->setWidth(imageSize.width()); 296 m_imageElement->setWidth(imageSize.width());
297 m_imageElement->setHeight(imageSize.height()); 297 m_imageElement->setHeight(imageSize.height());
298 298
299 if (imageFitsInWindow()) 299 if (imageFitsInWindow())
300 m_imageElement->removeInlineStyleProperty(CSSPropertyCursor); 300 m_imageElement->removeInlineStyleProperty(CSSPropertyCursor);
301 else 301 else
302 m_imageElement->setInlineStyleProperty(CSSPropertyCursor, CSSValueWebkit ZoomOut); 302 m_imageElement->setInlineStyleProperty(CSSPropertyCursor, CSSValueWebkit ZoomOut);
303 303
304 m_didShrinkImage = false; 304 m_didShrinkImage = false;
305 } 305 }
306 306
307 bool ImageDocument::imageFitsInWindow() const 307 bool ImageDocument::imageFitsInWindow() const
308 { 308 {
309 if (!m_imageElement || m_imageElement->document() != this) 309 if (!m_imageElement || m_imageElement->document() != this)
310 return true; 310 return true;
311 311
312 FrameView* view = frame()->view(); 312 FrameView* view = frame()->view();
313 if (!view) 313 if (!view)
314 return true; 314 return true;
315 315
316 LayoutSize imageSize = m_imageElement->cachedImage()->imageSizeForRenderer(m _imageElement->renderer(), pageZoomFactor(this)); 316 LayoutSize imageSize = m_imageElement->cachedImage()->imageSizeForRenderer(m _imageElement->renderer(), pageZoomFactor(this));
317 LayoutSize windowSize = LayoutSize(view->width(), view->height()); 317 LayoutSize windowSize = LayoutSize(view->width(), view->height());
318 318
319 return imageSize.width() <= windowSize.width() && imageSize.height() <= wind owSize.height(); 319 return imageSize.width() <= windowSize.width() && imageSize.height() <= wind owSize.height();
320 } 320 }
321 321
322 void ImageDocument::windowSizeChanged() 322 void ImageDocument::windowSizeChanged(bool resizeZoomedDocument)
323 { 323 {
324 if (!m_imageElement || !m_imageSizeIsKnown || m_imageElement->document() != this) 324 if (!m_imageElement || !m_imageSizeIsKnown || m_imageElement->document() != this)
325 return; 325 return;
326 326
327 bool fitsInWindow = imageFitsInWindow(); 327 bool fitsInWindow = imageFitsInWindow();
328 328
329 // If the image has been explicitly zoomed in, restore the cursor if the ima ge fits 329 // If the image has been explicitly zoomed in, restore the cursor if the ima ge fits
330 // and set it to a zoom out cursor if the image doesn't fit 330 // and set it to a zoom out cursor if the image doesn't fit
331 if (!m_shouldShrinkImage) { 331 if (!m_shouldShrinkImage) {
332 if (fitsInWindow) 332 if (fitsInWindow)
333 m_imageElement->removeInlineStyleProperty(CSSPropertyCursor); 333 m_imageElement->removeInlineStyleProperty(CSSPropertyCursor);
334 else 334 else
335 m_imageElement->setInlineStyleProperty(CSSPropertyCursor, CSSValueWe bkitZoomOut); 335 m_imageElement->setInlineStyleProperty(CSSPropertyCursor, CSSValueWe bkitZoomOut);
336 return; 336 return;
337 } 337 }
338 338
339 if (m_didShrinkImage) { 339 if (m_didShrinkImage) {
340 // If the window has been resized so that the image fits, restore the im age size 340 // If the window has been resized so that the image fits, restore the im age size
341 // otherwise update the restored image size. 341 // otherwise update the restored image size.
342 if (fitsInWindow) 342 if (fitsInWindow)
343 restoreImageSize(); 343 restoreImageSize(resizeZoomedDocument);
344 else 344 else
345 resizeImageToFit(); 345 resizeImageToFit(resizeZoomedDocument);
346 } else { 346 } else {
347 // If the image isn't resized but needs to be, then resize it. 347 // If the image isn't resized but needs to be, then resize it.
348 if (!fitsInWindow) { 348 if (!fitsInWindow) {
349 resizeImageToFit(); 349 resizeImageToFit(resizeZoomedDocument);
350 m_didShrinkImage = true; 350 m_didShrinkImage = true;
351 } 351 }
352 } 352 }
353 } 353 }
354 354
355 ImageResource* ImageDocument::cachedImage() 355 ImageResource* ImageDocument::cachedImage()
356 { 356 {
357 if (!m_imageElement) 357 if (!m_imageElement)
358 createDocumentStructure(); 358 createDocumentStructure();
359 359
360 return m_imageElement->cachedImage(); 360 return m_imageElement->cachedImage();
361 } 361 }
362 362
363 bool ImageDocument::shouldShrinkToFit() const 363 bool ImageDocument::shouldShrinkToFit() const
364 { 364 {
365 return frame()->settings()->shrinksStandaloneImagesToFit() && frame()->isMai nFrame(); 365 return frame()->settings()->shrinksStandaloneImagesToFit() && frame()->isMai nFrame();
366 } 366 }
367 367
368 void ImageDocument::dispose() 368 void ImageDocument::dispose()
369 { 369 {
370 m_imageElement = nullptr; 370 m_imageElement = nullptr;
371 HTMLDocument::dispose(); 371 HTMLDocument::dispose();
372 } 372 }
373 373
374 // -------- 374 // --------
375 375
376 void ImageEventListener::handleEvent(ExecutionContext*, Event* event) 376 void ImageEventListener::handleEvent(ExecutionContext*, Event* event)
377 { 377 {
378 if (event->type() == EventTypeNames::resize) 378 if (event->type() == EventTypeNames::resize)
379 m_doc->windowSizeChanged(); 379 m_doc->windowSizeChanged(false);
380 else if (event->type() == EventTypeNames::click && event->isMouseEvent()) { 380 else if (event->type() == EventTypeNames::click && event->isMouseEvent()) {
381 MouseEvent* mouseEvent = toMouseEvent(event); 381 MouseEvent* mouseEvent = toMouseEvent(event);
382 m_doc->imageClicked(mouseEvent->x(), mouseEvent->y()); 382 m_doc->imageClicked(mouseEvent->x(), mouseEvent->y());
383 } 383 }
384 } 384 }
385 385
386 bool ImageEventListener::operator==(const EventListener& listener) 386 bool ImageEventListener::operator==(const EventListener& listener)
387 { 387 {
388 if (const ImageEventListener* imageEventListener = ImageEventListener::cast( &listener)) 388 if (const ImageEventListener* imageEventListener = ImageEventListener::cast( &listener))
389 return m_doc == imageEventListener->m_doc; 389 return m_doc == imageEventListener->m_doc;
390 return false; 390 return false;
391 } 391 }
392 392
393 } 393 }
OLDNEW
« Source/core/html/ImageDocument.h ('K') | « Source/core/html/ImageDocument.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698