DXR will be turned off on Tuesday, December 29th. It will redirect to Searchfox.
See the announcement on Discourse.

DXR is a code search and navigation tool aimed at making sense of large projects. It supports full-text and regex searches as well as structural queries.

Implementation

Mercurial (c68fe15a81fc)

VCS Links

Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* 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/. */
#ifndef mozilla_dom_ImageDocument_h
#ifndef mozilla_dom_ImageDocument_h
#define mozilla_dom_ImageDocument_h

#include "mozilla/Attributes.h"
#include "imgINotificationObserver.h"
#include "MediaDocument.h"
#include "MediaDocument.h"
#include "nsIDOMEventListener.h"

namespace mozilla {
namespace dom {


class HTMLImageElement;

class ImageDocument final : public MediaDocument,
                            public imgINotificationObserver,
                            public nsIDOMEventListener {
                            public nsIDOMEventListener {
 public:
  ImageDocument();

  NS_DECL_ISUPPORTS_INHERITED


  enum MediaDocumentKind MediaDocumentKind() const override {
    return MediaDocumentKind::Image;
  }

  nsresult Init() override;

  nsresult StartDocumentLoad(const char* aCommand, nsIChannel* aChannel,
  nsresult StartDocumentLoad(const char* aCommand, nsIChannel* aChannel,
                             nsILoadGroup* aLoadGroup, nsISupports* aContainer,
                             nsIStreamListener** aDocListener,
                             bool aReset = true,
                             nsIContentSink* aSink = nullptr) override;


  void SetScriptGlobalObject(nsIScriptGlobalObject*) override;
  void Destroy() override;
  void OnPageShow(bool aPersisted, EventTarget* aDispatchStartTarget,
                  bool aOnlySystemGroup = false) override;


  NS_DECL_IMGINOTIFICATIONOBSERVER

  // nsIDOMEventListener
  NS_DECL_NSIDOMEVENTLISTENER


  NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(ImageDocument, MediaDocument)

  friend class ImageListener;

  void DefaultCheckOverflowing();
  void DefaultCheckOverflowing();

  // WebIDL API
  JSObject* WrapNode(JSContext*, JS::Handle<JSObject*> aGivenProto) override;

  bool ImageIsOverflowing() const {
  bool ImageIsOverflowing() const {
    return ImageIsOverflowingHorizontally() || ImageIsOverflowingVertically();
  }

  bool ImageIsOverflowingVertically() const {
  bool ImageIsOverflowingVertically() const {
    return mImageHeight > mVisibleHeight;
  }

  bool ImageIsOverflowingHorizontally() const {
  bool ImageIsOverflowingHorizontally() const {
    return mImageWidth > mVisibleWidth;
  }

  bool ImageIsResized() const { return mImageIsResized; }
  // ShrinkToFit is called from xpidl methods and we don't have a good
  // ShrinkToFit is called from xpidl methods and we don't have a good
  // way to mark those MOZ_CAN_RUN_SCRIPT yet.
  MOZ_CAN_RUN_SCRIPT_BOUNDARY void ShrinkToFit();
  void RestoreImage();

  void NotifyPossibleTitleChange(bool aBoundTitleElement) override;
  void NotifyPossibleTitleChange(bool aBoundTitleElement) override;

 protected:
  virtual ~ImageDocument();

  nsresult CreateSyntheticDocument() override;
  nsresult CreateSyntheticDocument() override;

  nsresult CheckOverflowing(bool changeState);

  void UpdateTitleAndCharset();


  void ScrollImageTo(int32_t aX, int32_t aY);

  float GetRatio() {
  float GetRatio() {
    return std::min(mVisibleWidth / mImageWidth, mVisibleHeight / mImageHeight);
    return std::min(mVisibleWidth / mImageWidth, mVisibleHeight / mImageHeight);
  }

  void ResetZoomLevel();
  void ResetZoomLevel();
  float GetZoomLevel();
  float GetResolution();

  void UpdateSizeFromLayout();


  enum eModeClasses {
    eNone,
    eShrinkToFit,
    eOverflowingVertical,  // And maybe horizontal too.
    eOverflowingHorizontalOnly
    eOverflowingHorizontalOnly
  };
  void SetModeClass(eModeClasses mode);

  void OnSizeAvailable(imgIRequest* aRequest, imgIContainer* aImage);
  void OnLoadComplete(imgIRequest* aRequest, nsresult aStatus);
  void OnLoadComplete(imgIRequest* aRequest, nsresult aStatus);
  void OnHasTransparency();

  RefPtr<HTMLImageElement> mImageContent;


  float mVisibleWidth;
  float mVisibleHeight;
  int32_t mImageWidth;
  int32_t mImageHeight;


  // mImageIsResized is true if the image is currently resized
  bool mImageIsResized;
  // mShouldResize is true if the image should be resized when it doesn't fit
  // mImageIsResized cannot be true when this is false, but mImageIsResized
  // can be false when this is true
  // can be false when this is true
  bool mShouldResize;
  bool mFirstResize;
  // mObservingImageLoader is true while the observer is set.
  bool mObservingImageLoader;
  bool mTitleUpdateInProgress;
  bool mTitleUpdateInProgress;
  bool mHasCustomTitle;

  float mOriginalZoomLevel;
  float mOriginalResolution;
};
};

}  // namespace dom
}  // namespace mozilla

#endif /* mozilla_dom_ImageDocument_h */
#endif /* mozilla_dom_ImageDocument_h */