bool ScreenManagerParent::RecvScreenForBrowser(const TabId& aTabId, ScreenDetails* aRetVal, bool* aSuccess) { *aSuccess = false; #ifdef MOZ_VALGRIND // Zero this so that Valgrind doesn't complain when we send it to another // process. memset(aRetVal, 0, sizeof(ScreenDetails)); #endif // Find the mWidget associated with the tabparent, and then return // the nsIScreen it's on. ContentParent* cp = static_cast<ContentParent*>(this->Manager()); ContentProcessManager* cpm = ContentProcessManager::GetSingleton(); nsRefPtr<TabParent> tabParent = cpm->GetTopLevelTabParentByProcessAndTabId(cp->ChildID(), aTabId); if(!tabParent){ return false; } nsCOMPtr<nsIWidget> widget = tabParent->GetWidget(); nsCOMPtr<nsIScreen> screen; if (widget) { if (widget->GetNativeData(NS_NATIVE_WINDOW)) { mScreenMgr->ScreenForNativeWidget(widget->GetNativeData(NS_NATIVE_WINDOW), getter_AddRefs(screen)); } } else { nsresult rv = mScreenMgr->GetPrimaryScreen(getter_AddRefs(screen)); if (NS_WARN_IF(NS_FAILED(rv))) { return true; } } NS_ENSURE_TRUE(screen, true); ScreenDetails details; if (!ExtractScreenDetails(screen, details)) { return true; } *aRetVal = details; *aSuccess = true; return true; }
void FilePickerParent::SendFilesOrDirectories( const nsTArray<BlobImplOrString>& aData) { ContentParent* parent = TabParent::GetFrom(Manager())->Manager(); if (mMode == nsIFilePicker::modeGetFolder) { MOZ_ASSERT(aData.Length() <= 1); if (aData.IsEmpty()) { Unused << Send__delete__(this, void_t(), mResult); return; } MOZ_ASSERT(aData[0].mType == BlobImplOrString::eDirectoryPath); // Let's inform the security singleton about the given access of this tab on // this directory path. RefPtr<FileSystemSecurity> fss = FileSystemSecurity::GetOrCreate(); fss->GrantAccessToContentProcess(parent->ChildID(), aData[0].mDirectoryPath); InputDirectory input; input.directoryPath() = aData[0].mDirectoryPath; Unused << Send__delete__(this, input, mResult); return; } InfallibleTArray<IPCBlob> ipcBlobs; for (unsigned i = 0; i < aData.Length(); i++) { IPCBlob ipcBlob; MOZ_ASSERT(aData[i].mType == BlobImplOrString::eBlobImpl); nsresult rv = IPCBlobUtils::Serialize(aData[i].mBlobImpl, parent, ipcBlob); if (NS_WARN_IF(NS_FAILED(rv))) { break; } ipcBlobs.AppendElement(ipcBlob); } InputBlobs inblobs; inblobs.blobs().SwapElements(ipcBlobs); Unused << Send__delete__(this, inblobs, mResult); }