void CompositorParent::ScheduleRenderOnCompositorThread() { CancelableTask *renderTask = NewRunnableMethod(this, &CompositorParent::ScheduleComposition); CompositorLoop()->PostTask(FROM_HERE, renderTask); }
void WebCache::closeIdleConnections() { base::Thread* thread = WebUrlLoaderClient::ioThread(); if (thread) thread->message_loop()->PostTask(FROM_HERE, NewRunnableMethod(this, &WebCache::closeIdleImpl)); }
void WebCoreProxy::startup() { coreThread->message_loop()->PostTask(FROM_HERE, NewRunnableMethod(this, &WebCoreProxy::asyncStartup)); }
void WebCoreProxy::pause() { coreThread->message_loop()->PostTask(FROM_HERE, NewRunnableMethod(this, &WebCoreProxy::asyncPause)); pauseRequestEvent.Wait(); }
void AudioOffloadPlayer::NotifyPositionChanged() { NS_DispatchToMainThread(NewRunnableMethod(mObserver, &MediaOmxCommonDecoder::NotifyOffloadPlayerPositionChanged)); }
// Called on the worker thread. bool BackgroundFileSaver::CheckCompletion() { nsresult rv; MOZ_ASSERT(!mAsyncCopyContext, "Should not be copying when checking completion conditions."); bool failed = true; { MutexAutoLock lock(mLock); if (mComplete) { return true; } // If an error occurred, we don't need to do the checks in this code block, // and the operation can be completed immediately with a failure code. if (NS_SUCCEEDED(mStatus)) { failed = false; // We did not incur in an error, so we must determine if we can stop now. // If the Finish method has not been called, we can just continue now. if (!mFinishRequested) { return false; } // We can only stop when all the operations requested by the control // thread have been processed. First, we check whether we have processed // the first SetTarget call, if any. Then, we check whether we have // processed any rename requested by subsequent SetTarget calls. if ((mInitialTarget && !mActualTarget) || (mRenamedTarget && mRenamedTarget != mActualTarget)) { return false; } // If we still have data to write to the output file, allow the copy // operation to resume. The Available getter may return an error if one // of the pipe's streams has been already closed. uint64_t available; rv = mPipeInputStream->Available(&available); if (NS_SUCCEEDED(rv) && available != 0) { return false; } } mComplete = true; } // Ensure we notify completion now that the operation finished. // Do a best-effort attempt to remove the file if required. if (failed && mActualTarget && !mActualTargetKeepPartial) { (void)mActualTarget->Remove(false); } // Finish computing the hash if (!failed && mDigestContext) { nsNSSShutDownPreventionLock lock; if (!isAlreadyShutDown()) { Digest d; rv = d.End(SEC_OID_SHA256, mDigestContext); if (NS_SUCCEEDED(rv)) { MutexAutoLock lock(mLock); mSha256 = nsDependentCSubstring(BitwiseCast<char*, unsigned char*>(d.get().data), d.get().len); } } } // Compute the signature of the binary. ExtractSignatureInfo doesn't do // anything on non-Windows platforms except return an empty nsIArray. if (!failed && mActualTarget) { nsString filePath; mActualTarget->GetTarget(filePath); nsresult rv = ExtractSignatureInfo(filePath); if (NS_FAILED(rv)) { LOG(("Unable to extract signature information [this = %p].", this)); } else { LOG(("Signature extraction success! [this = %p]", this)); } } // Post an event to notify that the operation completed. if (NS_FAILED(mControlThread->Dispatch(NewRunnableMethod(this, &BackgroundFileSaver::NotifySaveComplete), NS_DISPATCH_NORMAL))) { NS_WARNING("Unable to post completion event to the control thread."); } return true; }
void ImageContainerChild::DispatchStop() { GetMessageLoop()->PostTask(FROM_HERE, NewRunnableMethod(this, &ImageContainerChild::StopChildAndParent)); }
void AutoMounter::UpdateState() { MOZ_ASSERT(MessageLoop::current() == XRE_GetIOMessageLoop()); // If the following preconditions are met: // - UMS is available (i.e. compiled into the kernel) // - UMS is enabled // - AutoMounter is enabled // - USB cable is plugged in // then we will try to unmount and share // otherwise we will try to unshare and mount. if (VolumeManager::State() != VolumeManager::VOLUMES_READY) { // The volume manager isn't in a ready state, so there // isn't anything else that we can do. LOG("UpdateState: VolumeManager not ready yet"); return; } if (mResponseCallback->IsPending()) { // We only deal with one outstanding volume command at a time, // so we need to wait for it to finish. return; } bool umsAvail = false; bool umsEnabled = false; if (access(ICS_SYS_USB_FUNCTIONS, F_OK) == 0) { umsAvail = (access(ICS_SYS_UMS_DIRECTORY, F_OK) == 0); char functionsStr[60]; umsEnabled = umsAvail && ReadSysFile(ICS_SYS_USB_FUNCTIONS, functionsStr, sizeof(functionsStr)) && !!strstr(functionsStr, "mass_storage"); } else { umsAvail = ReadSysFile(GB_SYS_UMS_ENABLE, &umsEnabled); } bool usbCablePluggedIn = IsUsbCablePluggedIn(); bool enabled = (mMode == AUTOMOUNTER_ENABLE); if (mMode == AUTOMOUNTER_DISABLE_WHEN_UNPLUGGED) { enabled = usbCablePluggedIn; if (!usbCablePluggedIn) { mMode = AUTOMOUNTER_DISABLE; } } bool tryToShare = (umsAvail && umsEnabled && enabled && usbCablePluggedIn); LOG("UpdateState: umsAvail:%d umsEnabled:%d mode:%d usbCablePluggedIn:%d tryToShare:%d", umsAvail, umsEnabled, mMode, usbCablePluggedIn, tryToShare); VolumeArray::index_type volIndex; VolumeArray::size_type numVolumes = VolumeManager::NumVolumes(); for (volIndex = 0; volIndex < numVolumes; volIndex++) { RefPtr<Volume> vol = VolumeManager::GetVolume(volIndex); Volume::STATE volState = vol->State(); if (vol->State() == nsIVolume::STATE_MOUNTED) { LOG("UpdateState: Volume %s is %s and %s @ %s gen %d locked %d sharing %c", vol->NameStr(), vol->StateStr(), vol->MediaPresent() ? "inserted" : "missing", vol->MountPoint().get(), vol->MountGeneration(), (int)vol->IsMountLocked(), vol->CanBeShared() ? (vol->IsSharingEnabled() ? 'y' : 'n') : 'x'); } else { LOG("UpdateState: Volume %s is %s and %s", vol->NameStr(), vol->StateStr(), vol->MediaPresent() ? "inserted" : "missing"); } if (!vol->MediaPresent()) { // No media - nothing we can do continue; } if (tryToShare && vol->IsSharingEnabled()) { // We're going to try to unmount and share the volumes switch (volState) { case nsIVolume::STATE_MOUNTED: { if (vol->IsMountLocked()) { // The volume is currently locked, so leave it in the mounted // state. LOGW("UpdateState: Mounted volume %s is locked, not sharing", vol->NameStr()); break; } // Check to see if there are any open files on the volume and // don't initiate the unmount while there are open files. OpenFileFinder::Info fileInfo; OpenFileFinder fileFinder(vol->MountPoint()); if (fileFinder.First(&fileInfo)) { LOGW("The following files are open under '%s'", vol->MountPoint().get()); do { LOGW(" PID: %d file: '%s' app: '%s' comm: '%s' exe: '%s'\n", fileInfo.mPid, fileInfo.mFileName.get(), fileInfo.mAppName.get(), fileInfo.mComm.get(), fileInfo.mExe.get()); } while (fileFinder.Next(&fileInfo)); LOGW("UpdateState: Mounted volume %s has open files, not sharing", vol->NameStr()); // Check again in 5 seconds to see if the files are closed. Since // we're trying to share the volume, this implies that we're // plugged into the PC via USB and this in turn implies that the // battery is charging, so we don't need to be too concerned about // wasting battery here. MessageLoopForIO::current()-> PostDelayedTask(FROM_HERE, NewRunnableMethod(this, &AutoMounter::UpdateState), 5000); break; } // Volume is mounted, we need to unmount before // we can share. LOG("UpdateState: Unmounting %s", vol->NameStr()); vol->StartUnmount(mResponseCallback); return; // UpdateState will be called again when the Unmount command completes } case nsIVolume::STATE_IDLE: { // Volume is unmounted. We can go ahead and share. LOG("UpdateState: Sharing %s", vol->NameStr()); vol->StartShare(mResponseCallback); return; // UpdateState will be called again when the Share command completes } default: { // Not in a state that we can do anything about. break; } } } else { // We're going to try and unshare and remount the volumes switch (volState) { case nsIVolume::STATE_SHARED: { // Volume is shared. We can go ahead and unshare. LOG("UpdateState: Unsharing %s", vol->NameStr()); vol->StartUnshare(mResponseCallback); return; // UpdateState will be called again when the Unshare command completes } case nsIVolume::STATE_IDLE: { // Volume is unmounted, try to mount. LOG("UpdateState: Mounting %s", vol->NameStr()); vol->StartMount(mResponseCallback); return; // UpdateState will be called again when Mount command completes } default: { // Not in a state that we can do anything about. break; } } } } }
WebUrlLoaderClient::WebUrlLoaderClient(WebFrame* webFrame, WebCore::ResourceHandle* resourceHandle, const WebCore::ResourceRequest& resourceRequest) : m_webFrame(webFrame) , m_resourceHandle(resourceHandle) , m_isMainResource(false) , m_isMainFrame(false) , m_isCertMimeType(false) , m_cancelling(false) , m_sync(false) , m_finished(false) { m_webFrame->ref(); bool block = webFrame->blockNetworkLoads() && (resourceRequest.url().protocolIs("http") || resourceRequest.url().protocolIs("https")); WebResourceRequest webResourceRequest(resourceRequest, block); UrlInterceptResponse* intercept = webFrame->shouldInterceptRequest(resourceRequest.url().string()); if (intercept) { m_request = new WebRequest(this, webResourceRequest, intercept); return; } m_request = new WebRequest(this, webResourceRequest); // Set uploads before start is called on the request if (resourceRequest.httpBody() && !(webResourceRequest.method() == "GET" || webResourceRequest.method() == "HEAD")) { Vector<FormDataElement>::iterator iter; Vector<FormDataElement> elements = resourceRequest.httpBody()->elements(); for (iter = elements.begin(); iter != elements.end(); iter++) { FormDataElement element = *iter; switch (element.m_type) { case FormDataElement::data: if (!element.m_data.isEmpty()) { // WebKit sometimes gives up empty data to append. These aren't // necessary so we just optimize those out here. base::Thread* thread = ioThread(); if (thread) { Vector<char>* data = new Vector<char>(element.m_data); thread->message_loop()->PostTask(FROM_HERE, NewRunnableMethod(m_request.get(), &WebRequest::appendBytesToUpload, data)); } } break; case FormDataElement::encodedFile: { // Chromium check if it is a directory by checking // element.m_fileLength, that doesn't work in Android std::string filename = element.m_filename.utf8().data(); if (filename.size()) { // Change from a url string to a filename if (filename.find("file://") == 0) // Found at pos 0 filename.erase(0, 7); base::Thread* thread = ioThread(); if (thread) thread->message_loop()->PostTask(FROM_HERE, NewRunnableMethod(m_request.get(), &WebRequest::appendFileToUpload, filename)); } } break; #if ENABLE(BLOB) case FormDataElement::encodedBlob: ALOG_ASSERT(false, "Unexpected use of FormDataElement::encodedBlob"); break; #endif // ENABLE(BLOB) default: ALOG_ASSERT(false, "Unexpected default case in WebUrlLoaderClient.cpp"); break; } } } }
nsEventStatus GestureEventListener::HandleInputEvent(const InputData& aEvent) { if (aEvent.mInputType != MULTITOUCH_INPUT) { return nsEventStatus_eIgnore; } const MultiTouchInput& event = static_cast<const MultiTouchInput&>(aEvent); // Cache the current event since it may become the single or long tap that we // send. mLastTouchInput = event; switch (event.mType) { case MultiTouchInput::MULTITOUCH_START: case MultiTouchInput::MULTITOUCH_ENTER: { for (size_t i = 0; i < event.mTouches.Length(); i++) { bool foundAlreadyExistingTouch = false; for (size_t j = 0; j < mTouches.Length(); j++) { if (mTouches[j].mIdentifier == event.mTouches[i].mIdentifier) { foundAlreadyExistingTouch = true; break; } } // If we didn't find a touch in our list that matches this, then add it. if (!foundAlreadyExistingTouch) { mTouches.AppendElement(event.mTouches[i]); } } size_t length = mTouches.Length(); if (length == 1) { mTapStartTime = event.mTime; mTouchStartPosition = event.mTouches[0].mScreenPoint; if (mState == GESTURE_NONE) { mState = GESTURE_WAITING_SINGLE_TAP; mLongTapTimeoutTask = NewRunnableMethod(this, &GestureEventListener::TimeoutLongTap); mAsyncPanZoomController->PostDelayedTask( mLongTapTimeoutTask, Preferences::GetInt("ui.click_hold_context_menus.delay", 500)); } } else if (length == 2) { // Another finger has been added; it can't be a tap anymore. HandleTapCancel(event); } break; } case MultiTouchInput::MULTITOUCH_MOVE: { // If we move too much, bail out of the tap. ScreenIntPoint delta = event.mTouches[0].mScreenPoint - mTouchStartPosition; if (mTouches.Length() == 1 && NS_hypot(delta.x, delta.y) > APZCTreeManager::GetDPI() * mAsyncPanZoomController->GetTouchStartTolerance()) { HandleTapCancel(event); } size_t eventTouchesMatched = 0; for (size_t i = 0; i < mTouches.Length(); i++) { bool isTouchRemoved = true; for (size_t j = 0; j < event.mTouches.Length(); j++) { if (mTouches[i].mIdentifier == event.mTouches[j].mIdentifier) { eventTouchesMatched++; isTouchRemoved = false; mTouches[i] = event.mTouches[j]; } } if (isTouchRemoved) { // this touch point was lifted, so remove it from our list mTouches.RemoveElementAt(i); i--; } } NS_WARN_IF_FALSE(eventTouchesMatched == event.mTouches.Length(), "Touch moved, but not in list"); break; } case MultiTouchInput::MULTITOUCH_END: case MultiTouchInput::MULTITOUCH_LEAVE: { for (size_t i = 0; i < event.mTouches.Length(); i++) { bool foundAlreadyExistingTouch = false; for (size_t j = 0; j < mTouches.Length() && !foundAlreadyExistingTouch; j++) { if (event.mTouches[i].mIdentifier == mTouches[j].mIdentifier) { foundAlreadyExistingTouch = true; mTouches.RemoveElementAt(j); } } NS_WARN_IF_FALSE(foundAlreadyExistingTouch, "Touch ended, but not in list"); } if (mState == GESTURE_WAITING_DOUBLE_TAP) { CancelDoubleTapTimeoutTask(); if (mTapStartTime - mLastTapEndTime > MAX_TAP_TIME || event.mTime - mTapStartTime > MAX_TAP_TIME) { // Either the time between taps or the last tap took too long // confirm previous tap and handle current tap seperately TimeoutDoubleTap(); mState = GESTURE_WAITING_SINGLE_TAP; } else { // We were waiting for a double tap and it has arrived. HandleDoubleTap(event); mState = GESTURE_NONE; } } if (mState == GESTURE_WAITING_SINGLE_TAP && event.mTime - mTapStartTime > MAX_TAP_TIME) { // Extended taps are immediately dispatched as single taps CancelLongTapTimeoutTask(); HandleSingleTapConfirmedEvent(event); mState = GESTURE_NONE; } else if (mState == GESTURE_WAITING_SINGLE_TAP) { CancelLongTapTimeoutTask(); HandleSingleTapUpEvent(event); // We were not waiting for anything but a single tap has happened that // may turn into a double tap. Wait a while and if it doesn't turn into // a double tap, send a single tap instead. mState = GESTURE_WAITING_DOUBLE_TAP; mDoubleTapTimeoutTask = NewRunnableMethod(this, &GestureEventListener::TimeoutDoubleTap); mAsyncPanZoomController->PostDelayedTask( mDoubleTapTimeoutTask, MAX_TAP_TIME); } mLastTapEndTime = event.mTime; if (!mTouches.Length()) { mSpanChange = 0.0f; } break; } case MultiTouchInput::MULTITOUCH_CANCEL: // This gets called if there's a touch that has to bail for weird reasons // like pinching and then moving away from the window that the pinch was // started in without letting go of the screen. HandlePinchGestureEvent(event, true); break; } return HandlePinchGestureEvent(event, false); }
void SocketStreamHandlePrivate::close() { base::Thread* thread = WebUrlLoaderClient::ioThread(); if (thread) thread->message_loop()->PostTask(FROM_HERE, NewRunnableMethod(m_sockhost.get(), &SocketStreamHost::Close)); }
void ProcessLink::Open(mozilla::ipc::Transport* aTransport, MessageLoop *aIOLoop, Side aSide) { NS_PRECONDITION(aTransport, "need transport layer"); // FIXME need to check for valid channel mTransport = aTransport; // FIXME figure out whether we're in parent or child, grab IO loop // appropriately bool needOpen = true; if(aIOLoop) { // We're a child or using the new arguments. Either way, we // need an open. needOpen = true; mChan->mSide = (aSide == UnknownSide) ? ChildSide : aSide; } else { NS_PRECONDITION(aSide == UnknownSide, "expected default side arg"); // parent mChan->mSide = ParentSide; needOpen = false; aIOLoop = XRE_GetIOMessageLoop(); } mIOLoop = aIOLoop; NS_ASSERTION(mIOLoop, "need an IO loop"); NS_ASSERTION(mChan->mWorkerLoop, "need a worker loop"); { MonitorAutoLock lock(*mChan->mMonitor); if (needOpen) { // Transport::Connect() has not been called. Call it so // we start polling our pipe and processing outgoing // messages. mIOLoop->PostTask( FROM_HERE, NewRunnableMethod(this, &ProcessLink::OnChannelOpened)); } else { // Transport::Connect() has already been called. Take // over the channel from the previous listener and process // any queued messages. mIOLoop->PostTask( FROM_HERE, NewRunnableMethod(this, &ProcessLink::OnTakeConnectedChannel)); } #ifdef MOZ_NUWA_PROCESS if (IsNuwaProcess() && Preferences::GetBool("dom.ipc.processPrelaunch.testMode")) { // The pref value is turned on in a deadlock test against the Nuwa // process. The sleep here makes it easy to trigger the deadlock // that an IPC channel is still opening but the worker loop is // already frozen. sleep(5); } #endif // Should not wait here if something goes wrong with the channel. while (!mChan->Connected() && mChan->mChannelState != ChannelError) { mChan->mMonitor->Wait(); } } }
void VRManagerParent::ActorDestroy(ActorDestroyReason why) { UnregisterFromManager(); MessageLoop::current()->PostTask(NewRunnableMethod(this, &VRManagerParent::DeferredDestroy)); }
void VorbisDataDecoder::Drain() { MOZ_ASSERT(mCallback->OnReaderTaskQueue()); mTaskQueue->Dispatch(NewRunnableMethod(this, &VorbisDataDecoder::ProcessDrain)); }
void GMPProcessParent::Delete(nsCOMPtr<nsIRunnable> aCallback) { mDeletedCallback = aCallback; XRE_GetIOMessageLoop()->PostTask(FROM_HERE, NewRunnableMethod(this, &GMPProcessParent::DoDelete)); }