mirror of
				https://github.com/mozilla/gecko-dev.git
				synced 2025-11-04 02:09:05 +02:00 
			
		
		
		
	Generate helper function for C++ to perform operations on backing objects for each observable array attribute, - ElementAt: Get the item at that index. Throw error if fail to get the element. - ReplaceElementAt: Replace the item at the index, this will also trigger OnDelete and OnSet callback. Throw error if fail to replace the element. - AppendElement: Append one element to the end of the array, this will also trigger OnSet callback. Throw error if fail to append the element. - RemoveLastElement: Remove the element at the last index, this will also trigger OnDelete callback. Throw error if fail to remove the element. - Length: Get the number of the indexd value. Throw error if fail to get the length. Depends on D113728 Differential Revision: https://phabricator.services.mozilla.com/D113862
		
			
				
	
	
		
			225 lines
		
	
	
	
		
			8.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			225 lines
		
	
	
	
		
			8.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/* -*- 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/. */
 | 
						|
 | 
						|
#include "mozilla/dom/TestInterfaceObservableArray.h"
 | 
						|
#include "mozilla/dom/TestInterfaceObservableArrayBinding.h"
 | 
						|
#include "nsPIDOMWindow.h"
 | 
						|
#include "mozilla/dom/BindingUtils.h"
 | 
						|
 | 
						|
namespace mozilla::dom {
 | 
						|
 | 
						|
NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(TestInterfaceObservableArray, mParent,
 | 
						|
                                      mSetBooleanCallback,
 | 
						|
                                      mDeleteBooleanCallback,
 | 
						|
                                      mSetObjectCallback, mDeleteObjectCallback,
 | 
						|
                                      mSetInterfaceCallback,
 | 
						|
                                      mDeleteInterfaceCallback)
 | 
						|
 | 
						|
NS_IMPL_CYCLE_COLLECTING_ADDREF(TestInterfaceObservableArray)
 | 
						|
NS_IMPL_CYCLE_COLLECTING_RELEASE(TestInterfaceObservableArray)
 | 
						|
 | 
						|
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(TestInterfaceObservableArray)
 | 
						|
  NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
 | 
						|
  NS_INTERFACE_MAP_ENTRY(nsISupports)
 | 
						|
NS_INTERFACE_MAP_END
 | 
						|
 | 
						|
TestInterfaceObservableArray::TestInterfaceObservableArray(
 | 
						|
    nsPIDOMWindowInner* aParent, const ObservableArrayCallbacks& aCallbacks)
 | 
						|
    : mParent(aParent) {
 | 
						|
  if (aCallbacks.mSetBooleanCallback.WasPassed()) {
 | 
						|
    mSetBooleanCallback = &aCallbacks.mSetBooleanCallback.Value();
 | 
						|
  }
 | 
						|
  if (aCallbacks.mDeleteBooleanCallback.WasPassed()) {
 | 
						|
    mDeleteBooleanCallback = &aCallbacks.mDeleteBooleanCallback.Value();
 | 
						|
  }
 | 
						|
  if (aCallbacks.mSetObjectCallback.WasPassed()) {
 | 
						|
    mSetObjectCallback = &aCallbacks.mSetObjectCallback.Value();
 | 
						|
  }
 | 
						|
  if (aCallbacks.mDeleteObjectCallback.WasPassed()) {
 | 
						|
    mDeleteObjectCallback = &aCallbacks.mDeleteObjectCallback.Value();
 | 
						|
  }
 | 
						|
  if (aCallbacks.mSetInterfaceCallback.WasPassed()) {
 | 
						|
    mSetInterfaceCallback = &aCallbacks.mSetInterfaceCallback.Value();
 | 
						|
  }
 | 
						|
  if (aCallbacks.mDeleteInterfaceCallback.WasPassed()) {
 | 
						|
    mDeleteInterfaceCallback = &aCallbacks.mDeleteInterfaceCallback.Value();
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
// static
 | 
						|
already_AddRefed<TestInterfaceObservableArray>
 | 
						|
TestInterfaceObservableArray::Constructor(
 | 
						|
    const GlobalObject& aGlobal, const ObservableArrayCallbacks& aCallbacks,
 | 
						|
    ErrorResult& aRv) {
 | 
						|
  nsCOMPtr<nsPIDOMWindowInner> window =
 | 
						|
      do_QueryInterface(aGlobal.GetAsSupports());
 | 
						|
  if (!window) {
 | 
						|
    aRv.Throw(NS_ERROR_FAILURE);
 | 
						|
    return nullptr;
 | 
						|
  }
 | 
						|
 | 
						|
  RefPtr<TestInterfaceObservableArray> r =
 | 
						|
      new TestInterfaceObservableArray(window, aCallbacks);
 | 
						|
  return r.forget();
 | 
						|
}
 | 
						|
 | 
						|
JSObject* TestInterfaceObservableArray::WrapObject(
 | 
						|
    JSContext* aCx, JS::Handle<JSObject*> aGivenProto) {
 | 
						|
  return TestInterfaceObservableArray_Binding::Wrap(aCx, this, aGivenProto);
 | 
						|
}
 | 
						|
 | 
						|
nsPIDOMWindowInner* TestInterfaceObservableArray::GetParentObject() const {
 | 
						|
  return mParent;
 | 
						|
}
 | 
						|
 | 
						|
void TestInterfaceObservableArray::OnSetObservableArrayObject(
 | 
						|
    JSContext* aCx, JS::Handle<JSObject*> aValue, uint32_t aIndex,
 | 
						|
    ErrorResult& aRv) {
 | 
						|
  if (mSetObjectCallback) {
 | 
						|
    MOZ_KnownLive(mSetObjectCallback)
 | 
						|
        ->Call(aValue, aIndex, aRv, "OnSetObservableArrayObject",
 | 
						|
               CallbackFunction::eRethrowExceptions);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
void TestInterfaceObservableArray::OnDeleteObservableArrayObject(
 | 
						|
    JSContext* aCx, JS::Handle<JSObject*> aValue, uint32_t aIndex,
 | 
						|
    ErrorResult& aRv) {
 | 
						|
  if (mDeleteObjectCallback) {
 | 
						|
    MOZ_KnownLive(mDeleteObjectCallback)
 | 
						|
        ->Call(aValue, aIndex, aRv, "OnDeleteObservableArrayObject",
 | 
						|
               CallbackFunction::eRethrowExceptions);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
void TestInterfaceObservableArray::OnSetObservableArrayBoolean(
 | 
						|
    bool aValue, uint32_t aIndex, ErrorResult& aRv) {
 | 
						|
  if (mSetBooleanCallback) {
 | 
						|
    MOZ_KnownLive(mSetBooleanCallback)
 | 
						|
        ->Call(aValue, aIndex, aRv, "OnSetObservableArrayBoolean",
 | 
						|
               CallbackFunction::eRethrowExceptions);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
void TestInterfaceObservableArray::OnDeleteObservableArrayBoolean(
 | 
						|
    bool aValue, uint32_t aIndex, ErrorResult& aRv) {
 | 
						|
  if (mDeleteBooleanCallback) {
 | 
						|
    MOZ_KnownLive(mDeleteBooleanCallback)
 | 
						|
        ->Call(aValue, aIndex, aRv, "OnDeleteObservableArrayBoolean",
 | 
						|
               CallbackFunction::eRethrowExceptions);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
void TestInterfaceObservableArray::OnSetObservableArrayInterface(
 | 
						|
    TestInterfaceObservableArray* aValue, uint32_t aIndex, ErrorResult& aRv) {
 | 
						|
  if (mSetInterfaceCallback && aValue) {
 | 
						|
    MOZ_KnownLive(mSetInterfaceCallback)
 | 
						|
        ->Call(*aValue, aIndex, aRv, "OnSetObservableArrayInterface",
 | 
						|
               CallbackFunction::eRethrowExceptions);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
void TestInterfaceObservableArray::OnDeleteObservableArrayInterface(
 | 
						|
    TestInterfaceObservableArray* aValue, uint32_t aIndex, ErrorResult& aRv) {
 | 
						|
  if (mDeleteInterfaceCallback && aValue) {
 | 
						|
    MOZ_KnownLive(mDeleteInterfaceCallback)
 | 
						|
        ->Call(*aValue, aIndex, aRv, "OnDeleteObservableArrayInterface",
 | 
						|
               CallbackFunction::eRethrowExceptions);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
bool TestInterfaceObservableArray::BooleanElementAtInternal(uint32_t aIndex,
 | 
						|
                                                            ErrorResult& aRv) {
 | 
						|
  return TestInterfaceObservableArray_Binding::ObservableArrayBooleanHelpers::
 | 
						|
      ElementAt(this, aIndex, aRv);
 | 
						|
}
 | 
						|
 | 
						|
void TestInterfaceObservableArray::ObjectElementAtInternal(
 | 
						|
    JSContext* aCx, uint32_t aIndex, JS::MutableHandle<JSObject*> aValue,
 | 
						|
    ErrorResult& aRv) {
 | 
						|
  TestInterfaceObservableArray_Binding::ObservableArrayObjectHelpers::ElementAt(
 | 
						|
      this, aCx, aIndex, aValue, aRv);
 | 
						|
}
 | 
						|
 | 
						|
already_AddRefed<TestInterfaceObservableArray>
 | 
						|
TestInterfaceObservableArray::InterfaceElementAtInternal(uint32_t aIndex,
 | 
						|
                                                         ErrorResult& aRv) {
 | 
						|
  return TestInterfaceObservableArray_Binding::ObservableArrayInterfaceHelpers::
 | 
						|
      ElementAt(this, aIndex, aRv);
 | 
						|
}
 | 
						|
 | 
						|
void TestInterfaceObservableArray::BooleanReplaceElementAtInternal(
 | 
						|
    uint32_t aIndex, bool aValue, ErrorResult& aRv) {
 | 
						|
  TestInterfaceObservableArray_Binding::ObservableArrayBooleanHelpers::
 | 
						|
      ReplaceElementAt(this, aIndex, aValue, aRv);
 | 
						|
}
 | 
						|
 | 
						|
void TestInterfaceObservableArray::ObjectReplaceElementAtInternal(
 | 
						|
    JSContext* aCx, uint32_t aIndex, JS::Handle<JSObject*> aValue,
 | 
						|
    ErrorResult& aRv) {
 | 
						|
  TestInterfaceObservableArray_Binding::ObservableArrayObjectHelpers::
 | 
						|
      ReplaceElementAt(this, aIndex, aValue, aRv);
 | 
						|
}
 | 
						|
 | 
						|
void TestInterfaceObservableArray::InterfaceReplaceElementAtInternal(
 | 
						|
    uint32_t aIndex, TestInterfaceObservableArray& aValue, ErrorResult& aRv) {
 | 
						|
  TestInterfaceObservableArray_Binding::ObservableArrayInterfaceHelpers::
 | 
						|
      ReplaceElementAt(this, aIndex, aValue, aRv);
 | 
						|
}
 | 
						|
 | 
						|
void TestInterfaceObservableArray::BooleanAppendElementInternal(
 | 
						|
    bool aValue, ErrorResult& aRv) {
 | 
						|
  TestInterfaceObservableArray_Binding::ObservableArrayBooleanHelpers::
 | 
						|
      AppendElement(this, aValue, aRv);
 | 
						|
}
 | 
						|
 | 
						|
void TestInterfaceObservableArray::ObjectAppendElementInternal(
 | 
						|
    JSContext* aCx, JS::Handle<JSObject*> aValue, ErrorResult& aRv) {
 | 
						|
  TestInterfaceObservableArray_Binding::ObservableArrayObjectHelpers::
 | 
						|
      AppendElement(this, aValue, aRv);
 | 
						|
}
 | 
						|
 | 
						|
void TestInterfaceObservableArray::InterfaceAppendElementInternal(
 | 
						|
    TestInterfaceObservableArray& aValue, ErrorResult& aRv) {
 | 
						|
  TestInterfaceObservableArray_Binding::ObservableArrayInterfaceHelpers::
 | 
						|
      AppendElement(this, aValue, aRv);
 | 
						|
}
 | 
						|
 | 
						|
void TestInterfaceObservableArray::BooleanRemoveLastElementInternal(
 | 
						|
    ErrorResult& aRv) {
 | 
						|
  TestInterfaceObservableArray_Binding::ObservableArrayBooleanHelpers::
 | 
						|
      RemoveLastElement(this, aRv);
 | 
						|
}
 | 
						|
 | 
						|
void TestInterfaceObservableArray::ObjectRemoveLastElementInternal(
 | 
						|
    ErrorResult& aRv) {
 | 
						|
  TestInterfaceObservableArray_Binding::ObservableArrayObjectHelpers::
 | 
						|
      RemoveLastElement(this, aRv);
 | 
						|
}
 | 
						|
 | 
						|
void TestInterfaceObservableArray::InterfaceRemoveLastElementInternal(
 | 
						|
    ErrorResult& aRv) {
 | 
						|
  TestInterfaceObservableArray_Binding::ObservableArrayInterfaceHelpers::
 | 
						|
      RemoveLastElement(this, aRv);
 | 
						|
}
 | 
						|
 | 
						|
uint32_t TestInterfaceObservableArray::BooleanLengthInternal(ErrorResult& aRv) {
 | 
						|
  return TestInterfaceObservableArray_Binding::ObservableArrayBooleanHelpers::
 | 
						|
      Length(this, aRv);
 | 
						|
}
 | 
						|
 | 
						|
uint32_t TestInterfaceObservableArray::ObjectLengthInternal(ErrorResult& aRv) {
 | 
						|
  return TestInterfaceObservableArray_Binding::ObservableArrayObjectHelpers::
 | 
						|
      Length(this, aRv);
 | 
						|
}
 | 
						|
 | 
						|
uint32_t TestInterfaceObservableArray::InterfaceLengthInternal(
 | 
						|
    ErrorResult& aRv) {
 | 
						|
  return TestInterfaceObservableArray_Binding::ObservableArrayInterfaceHelpers::
 | 
						|
      Length(this, aRv);
 | 
						|
}
 | 
						|
 | 
						|
}  // namespace mozilla::dom
 |