gfx/layers/ipc/LayerTransactionChild.h
author Gijs Kruitbosch <gijskruitbosch@gmail.com>
Thu, 16 Jan 2020 17:41:25 +0000
changeset 571219 80536bfbcd6902b1cf9a5a1302735eb9fe7b0024
parent 527951 884f5dc55873c9345ee945cd6d5427e8ab398071
permissions -rw-r--r--
Bug 1609466 - offer 'open with' options even when Windows is clueless about the mimetype, r=bzbarsky a=RyanVM We currently fail to offer 'open with' options for application/zip mimetype .zip files, because out of the box, the Windows registry does not contain mimetype entries for application/zip. In fact, it contains comparatively few entries, and right now we bail out with an empty mime info object if we cannot find the server-provided mimetype in the registry (or cannot find an associated extension for that mimetype). Prior to the changes from bug 1597985, we would first try to find a handler based on the default extension for the mimetype, and used the file extension if that failed. The changes in this commit will cause us to fetch the default file extension for the mimetype, but continue with the provided extension if no mimetype information is available, restoring functionality in the case where Windows has no mimetype information. Differential Revision: https://phabricator.services.mozilla.com/D60139

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

#include <stdint.h>              // for uint32_t
#include "mozilla/Attributes.h"  // for override
#include "mozilla/ipc/ProtocolUtils.h"
#include "mozilla/layers/PLayerTransactionChild.h"
#include "mozilla/RefPtr.h"

namespace mozilla {

namespace layers {

class ShadowLayerForwarder;

class LayerTransactionChild : public PLayerTransactionChild {
 public:
  NS_INLINE_DECL_THREADSAFE_REFCOUNTING(LayerTransactionChild)
  /**
   * Clean this up, finishing with SendShutDown() which will cause __delete__
   * to be sent from the parent side.
   *
   * It is expected (checked with an assert) that all shadow layers
   * created by this have already been destroyed and
   * Send__delete__()d by the time this method is called.
   */
  void Destroy();

  bool IPCOpen() const { return mIPCOpen && !mDestroyed; }
  bool IsDestroyed() const { return mDestroyed; }

  void SetForwarder(ShadowLayerForwarder* aForwarder) {
    mForwarder = aForwarder;
  }

  LayersId GetId() const { return mId; }

  void MarkDestroyed() { mDestroyed = true; }

 protected:
  explicit LayerTransactionChild(const LayersId& aId)
      : mForwarder(nullptr), mIPCOpen(false), mDestroyed(false), mId(aId) {}
  virtual ~LayerTransactionChild() = default;

  void ActorDestroy(ActorDestroyReason why) override;

  void AddIPDLReference() {
    MOZ_ASSERT(mIPCOpen == false);
    mIPCOpen = true;
    AddRef();
  }
  void ReleaseIPDLReference() {
    MOZ_ASSERT(mIPCOpen == true);
    mIPCOpen = false;
    Release();
  }
  friend class CompositorBridgeChild;

  ShadowLayerForwarder* mForwarder;
  bool mIPCOpen;
  bool mDestroyed;
  LayersId mId;
};

}  // namespace layers
}  // namespace mozilla

#endif  // MOZILLA_LAYERS_LAYERTRANSACTIONCHILD_H