js/src/util/CompleteFile.h
author James Teh <jteh@mozilla.com>
Wed, 01 Feb 2023 05:02:01 +0000
changeset 651150 dd0fdd1daa69783be36acd5c50544f3694eaa8f9
parent 518950 e4d136fe97331f4f66b78ecb8f725948a7b7e845
permissions -rw-r--r--
Bug 1813980: Check IsDoc before Parent in RemoteAccessibleBase::ApplyCrossDocOffset. r=morgan We call this function on every ancestor when calculating bounds. RemoteParent() currently requires a hash lookup, so it's more efficient to early return for !IsDoc() first. This is a micro-optimisation, but it might have some impact given that we call this on every ancestor, especially when hit testing, where we call Bounds() a lot. As a bit of drive-by cleanup, use RemoteParent() rather than calling Parent() and IsRemote/AsRemote(). Differential Revision: https://phabricator.services.mozilla.com/D168346

/* -*- 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 util_CompleteFile_h
#define util_CompleteFile_h

#include "mozilla/Assertions.h"  // MOZ_ASSERT

#include <stdint.h>  // uint8_t
#include <stdio.h>   // fclose, FILE, stdin

#include "jstypes.h"         // JS_PUBLIC_API
#include "js/AllocPolicy.h"  // js::TempAllocPolicy
#include "js/Vector.h"       // js::Vector

struct JS_PUBLIC_API JSContext;

namespace js {

using FileContents = Vector<uint8_t, 8, TempAllocPolicy>;

extern bool ReadCompleteFile(JSContext* cx, FILE* fp, FileContents& buffer);

class AutoFile {
  FILE* fp_ = nullptr;

 public:
  AutoFile() = default;

  ~AutoFile() {
    if (fp_ && fp_ != stdin) {
      fclose(fp_);
    }
  }

  FILE* fp() const { return fp_; }

  bool open(JSContext* cx, const char* filename);

  bool readAll(JSContext* cx, FileContents& buffer) {
    MOZ_ASSERT(fp_);
    return ReadCompleteFile(cx, fp_, buffer);
  }
};

}  // namespace js

#endif /* util_CompleteFile_h */