storage/mozStorageAsyncStatementParams.cpp
author Samael Wang <freesamael@gmail.com>
Fri, 11 Aug 2017 14:49:09 +0800
changeset 413793 1f8a03070122f8c5fa92ebe76478dcd0b2b1a357
parent 413106 df5b4f5fe775d341647f85abcf9a0ca0aa573a67
child 450616 4bcb64fd8fa1aae1bdb7a2a019a283eacb7af4ca
permissions -rw-r--r--
Bug 1375833 - Part 2: Set mHistoryID to aSHEntry->DocshellID() in both reload and history navigation. r=smaug The root cause of bug 1326845 is that reloading would apply frame history entries without setting new child docshells' mHistoryID to the entrys' DocshellID. So SHistory can not find corresponding entries for subframes in a consequent GoBack(), and cause history navigation being broken (it would return NS_ERROR_FAILURE). MozReview-Commit-ID: 6syGYkoP1eZ

/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
 * vim: sw=2 ts=2 et lcs=trail\:.,tab\:>~ :
 * 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 "nsJSUtils.h"
#include "nsMemory.h"
#include "nsString.h"

#include "jsapi.h"

#include "mozilla/dom/MozStorageAsyncStatementParamsBinding.h"
#include "mozStoragePrivateHelpers.h"

namespace mozilla {
namespace storage {

////////////////////////////////////////////////////////////////////////////////
//// AsyncStatementParams

NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(AsyncStatementParams, mWindow)

NS_INTERFACE_TABLE_HEAD(AsyncStatementParams)
  NS_WRAPPERCACHE_INTERFACE_TABLE_ENTRY
  NS_INTERFACE_TABLE(AsyncStatementParams, nsISupports)
  NS_INTERFACE_TABLE_TO_MAP_SEGUE_CYCLE_COLLECTION(AsyncStatementParams)
NS_INTERFACE_MAP_END

NS_IMPL_CYCLE_COLLECTING_ADDREF(AsyncStatementParams)
NS_IMPL_CYCLE_COLLECTING_RELEASE(AsyncStatementParams)

AsyncStatementParams::AsyncStatementParams(nsPIDOMWindowInner* aWindow, AsyncStatement *aStatement)
: mWindow(aWindow),
  mStatement(aStatement)
{
  NS_ASSERTION(mStatement != nullptr, "mStatement is null");
}

JSObject*
AsyncStatementParams::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
{
  return dom::MozStorageAsyncStatementParamsBinding::Wrap(aCx, this, aGivenProto);
}

void
AsyncStatementParams::NamedGetter(JSContext* aCx,
                                  const nsAString& aName,
                                  bool& aFound,
                                  JS::MutableHandle<JS::Value> aResult,
                                  mozilla::ErrorResult& aRv)
{
  if (!mStatement) {
    aRv.Throw(NS_ERROR_NOT_INITIALIZED);
    return;
  }

  // Unfortunately there's no API that lets us return the parameter value.
  aFound = false;
}

void
AsyncStatementParams::NamedSetter(JSContext* aCx,
                                  const nsAString& aName,
                                  JS::Handle<JS::Value> aValue,
                                  mozilla::ErrorResult& aRv)
{
  if (!mStatement) {
    aRv.Throw(NS_ERROR_NOT_INITIALIZED);
    return;
  }

  NS_ConvertUTF16toUTF8 name(aName);

  nsCOMPtr<nsIVariant> variant(convertJSValToVariant(aCx, aValue));
  if (!variant) {
    aRv.Throw(NS_ERROR_UNEXPECTED);
    return;
  }

  aRv = mStatement->BindByName(name, variant);
}

void
AsyncStatementParams::GetSupportedNames(nsTArray<nsString>& aNames)
{
  // We don't know how many params there are, so we can't implement this for
  // AsyncStatementParams.
}

void
AsyncStatementParams::IndexedGetter(JSContext* aCx,
                                    uint32_t aIndex,
                                    bool& aFound,
                                    JS::MutableHandle<JS::Value> aResult,
                                    mozilla::ErrorResult& aRv)
{
  if (!mStatement) {
    aRv.Throw(NS_ERROR_NOT_INITIALIZED);
    return;
  }

  // Unfortunately there's no API that lets us return the parameter value.
  aFound = false;
}

void
AsyncStatementParams::IndexedSetter(JSContext* aCx,
                                    uint32_t aIndex,
                                    JS::Handle<JS::Value> aValue,
                                    mozilla::ErrorResult& aRv)
{
  if (!mStatement) {
    aRv.Throw(NS_ERROR_NOT_INITIALIZED);
    return;
  }

  nsCOMPtr<nsIVariant> variant(convertJSValToVariant(aCx, aValue));
  if (!variant) {
    aRv.Throw(NS_ERROR_UNEXPECTED);
    return;
  }

  aRv = mStatement->BindByIndex(aIndex, variant);
}

} // namespace storage
} // namespace mozilla