NS_IMETHODIMP UploadEventListener::HandleEvent(nsIDOMEvent* aEvent) { nsString type; if (NS_FAILED(aEvent->GetType(type))) { STUMBLER_ERR("Failed to get event type"); WriteStumbleOnThread::UploadEnded(false); return NS_ERROR_FAILURE; } if (type.EqualsLiteral("load")) { STUMBLER_DBG("Got load Event\n"); } else if (type.EqualsLiteral("error") && mXHR) { STUMBLER_ERR("Upload Error"); } else { STUMBLER_DBG("Receive %s Event", NS_ConvertUTF16toUTF8(type).get()); } uint32_t statusCode = 0; bool doDelete = false; if (!mXHR) { return NS_OK; } nsresult rv = mXHR->GetStatus(&statusCode); if (NS_SUCCEEDED(rv)) { STUMBLER_DBG("statuscode %d \n", statusCode); } if (200 == statusCode || 400 == statusCode) { doDelete = true; } WriteStumbleOnThread::UploadEnded(doDelete); nsCOMPtr<EventTarget> target(do_QueryInterface(mXHR)); const char* const sEventStrings[] = { // nsIXMLHttpRequestEventTarget event types "abort", "error", "load", "timeout" }; for (uint32_t index = 0; index < MOZ_ARRAY_LENGTH(sEventStrings); index++) { nsAutoString eventType = NS_ConvertASCIItoUTF16(sEventStrings[index]); rv = target->RemoveEventListener(eventType, this, false); } mXHR = nullptr; return NS_OK; }
NS_IMETHODIMP WriteStumbleOnThread::Run() { MOZ_ASSERT(!NS_IsMainThread()); bool b = sIsAlreadyRunning.exchange(true); if (b) { return NS_OK; } STUMBLER_DBG("In WriteStumbleOnThread\n"); UploadFileStatus status = GetUploadFileStatus(); if (UploadFileStatus::NoFile != status) { if (UploadFileStatus::ExistsAndReadyToUpload == status) { Upload(); } } else { Partition partition = GetWritePosition(); if (partition == Partition::Unknown) { STUMBLER_ERR("GetWritePosition failed, skip once"); } else { WriteJSON(partition); } } sIsAlreadyRunning = false; return NS_OK; }