Skip to content

Commit

Permalink
fix: problem with mac permissions (#218)
Browse files Browse the repository at this point in the history
  • Loading branch information
AndreyBelym committed Dec 14, 2021
1 parent 8b30f64 commit 33df52e
Show file tree
Hide file tree
Showing 8 changed files with 90 additions and 58 deletions.
Binary file not shown.
Binary file added bin/mac/main
Binary file not shown.
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
"dmd-plugin-async": "^0.1.1",
"eslint-plugin-no-only-tests": "^2.4.0",
"express": "^4.17.1",
"fs-extra": "^10.0.0",
"gulp": "^4.0.2",
"gulp-chmod": "^1.3.0",
"gulp-eslint": "^6.0.0",
Expand Down
14 changes: 11 additions & 3 deletions src/binaries.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,16 @@
import { join } from 'path';
import { homedir } from 'os';
import OS from 'os-family';
import { toAbsPath } from 'read-file-relative';
import { platform } from 'linux-platform-info';
import { name as packageName } from '../package.json';


const MAC_APP_NAME = 'TestCafe Browser Tools.app';
const MAC_BINARY_PATH = binary => join(__dirname, `../bin/mac/${MAC_APP_NAME}/Contents/MacOS/${binary}`);
const HIDDEN_DIR_PREFIX = '.';
const MAC_APP_NAME = 'TestCafe Browser Tools.app';
const MAC_APP_DIR = join(homedir(), HIDDEN_DIR_PREFIX + packageName, MAC_APP_NAME);
const MAC_APP_LOCAL_DIR = join(__dirname, `../bin/mac/${MAC_APP_NAME}`);
const MAC_BINARY_PATH = binary => join(MAC_APP_DIR, `Contents/MacOS/${binary}`);

var BINARIES = void 0;

Expand All @@ -23,7 +28,10 @@ if (OS.win) {
}
else if (OS.mac) {
BINARIES = {
app: MAC_BINARY_PATH('testcafe-browser-tools'),
app: MAC_BINARY_PATH(packageName),
appDir: MAC_APP_DIR,
appLocalDir: MAC_APP_LOCAL_DIR,
main: toAbsPath('../bin/mac/main'),
open: 'open',
findWindow: 'find-window',
getWindowSize: 'get-window-size',
Expand Down
4 changes: 3 additions & 1 deletion src/natives/app/mac/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,6 @@ clean:
rm "${DEST}/testcafe-browser-tools" || true
build:
mkdir "${DEST}" || true
clang -o "${DEST}/testcafe-browser-tools" -framework Cocoa -framework ScriptingBridge -framework AppKit ../../*/{mac,any}/obj/*.o testcafe-browser-tools.m
clang -o "${DEST}/testcafe-browser-tools" testcafe-browser-tools.m
clang -o "${DEST}/../../../main" -framework Cocoa -framework ScriptingBridge -framework AppKit ../../*/{mac,any}/obj/*.o main.m

66 changes: 66 additions & 0 deletions src/natives/app/mac/main.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
//
// testcafe-browser-tools.m
// Dispatch browser manipulation commands
//

#include <fcntl.h>
#import <Cocoa/Cocoa.h>

typedef int command (int argc, const char * argv[]);

int bringToFront (int argc, const char * argv[]);
int closeWindow (int argc, const char * argv[]);
int findWindow (int argc, const char * argv[]);
int generateThumbnail (int argc, const char * argv[]);
int getWindowBounds (int argc, const char * argv[]);
int getWindowMaxBounds (int argc, const char * argv[]);
int getWindowSize (int argc, const char * argv[]);
int openWindow (int argc, const char * argv[]);
int resize (int argc, const char * argv[]);
int screenshot (int argc, const char * argv[]);
int setWindowBounds (int argc, const char * argv[]);

int main (int argc, const char * argv[]) {
int fd = open(argv[1], O_WRONLY);

if (fd != -1)
dup2(fd, STDOUT_FILENO);

@autoreleasepool {
id commands = @{
@"bring-to-front": [NSValue valueWithPointer: &bringToFront],
@"close": [NSValue valueWithPointer: &closeWindow],
@"find-window": [NSValue valueWithPointer: &findWindow],
@"generate-thumbnail": [NSValue valueWithPointer: &generateThumbnail],
@"get-window-bounds": [NSValue valueWithPointer: &getWindowBounds],
@"get-window-max-bounds": [NSValue valueWithPointer: &getWindowMaxBounds],
@"get-window-size": [NSValue valueWithPointer: &getWindowSize],
@"open": [NSValue valueWithPointer: &openWindow],
@"resize": [NSValue valueWithPointer: &resize],
@"screenshot": [NSValue valueWithPointer: &screenshot],
@"set-window-bounds": [NSValue valueWithPointer: &setWindowBounds],

};

id commandName = [NSString stringWithUTF8String:argv[2]];

id item = commands[commandName];

if (item == nil)
return 1;

command *commandPointer = (command *)[item pointerValue];

int exitCode = (*commandPointer)(argc - 2, argv + 2);

printf("\nExit code: %d\n", exitCode);

if (fd != -1) {
fsync(fd);
close(fd);
}
}

return 0;
}

55 changes: 2 additions & 53 deletions src/natives/app/mac/testcafe-browser-tools.m
Original file line number Diff line number Diff line change
Expand Up @@ -3,63 +3,12 @@
// Dispatch browser manipulation commands
//

#include <fcntl.h>
#include <unistd.h>
#import <Cocoa/Cocoa.h>

typedef int command (int argc, const char * argv[]);

int bringToFront (int argc, const char * argv[]);
int closeWindow (int argc, const char * argv[]);
int findWindow (int argc, const char * argv[]);
int generateThumbnail (int argc, const char * argv[]);
int getWindowBounds (int argc, const char * argv[]);
int getWindowMaxBounds (int argc, const char * argv[]);
int getWindowSize (int argc, const char * argv[]);
int openWindow (int argc, const char * argv[]);
int resize (int argc, const char * argv[]);
int screenshot (int argc, const char * argv[]);
int setWindowBounds (int argc, const char * argv[]);

int main (int argc, const char * argv[]) {
int fd = open(argv[1], O_WRONLY);

if (fd != -1)
dup2(fd, STDOUT_FILENO);

@autoreleasepool {
id commands = @{
@"bring-to-front": [NSValue valueWithPointer: &bringToFront],
@"close": [NSValue valueWithPointer: &closeWindow],
@"find-window": [NSValue valueWithPointer: &findWindow],
@"generate-thumbnail": [NSValue valueWithPointer: &generateThumbnail],
@"get-window-bounds": [NSValue valueWithPointer: &getWindowBounds],
@"get-window-max-bounds": [NSValue valueWithPointer: &getWindowMaxBounds],
@"get-window-size": [NSValue valueWithPointer: &getWindowSize],
@"open": [NSValue valueWithPointer: &openWindow],
@"resize": [NSValue valueWithPointer: &resize],
@"screenshot": [NSValue valueWithPointer: &screenshot],
@"set-window-bounds": [NSValue valueWithPointer: &setWindowBounds],

};

id commandName = [NSString stringWithUTF8String:argv[2]];

id item = commands[commandName];

if (item == nil)
return 1;

command *commandPointer = (command *)[item pointerValue];

int exitCode = (*commandPointer)(argc - 2, argv + 2);

printf("\nExit code: %d\n", exitCode);

if (fd != -1) {
fsync(fd);
close(fd);
}
}
execv(argv[1], argv + 1);

return 0;
}
Expand Down
8 changes: 7 additions & 1 deletion src/utils/exec.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import os from 'os';
import path from 'path';
import del from 'del';
import execa from 'execa';
import { ensureDir, pathExists, copy } from 'fs-extra';
import OS from 'os-family';
import nanoid from 'nanoid';
import promisify from './promisify';
Expand Down Expand Up @@ -62,7 +63,7 @@ function readPipe (pipePath) {

function spawnApp (pipePath, binaryPath, args) {
return new Promise((resolve, reject) => {
const child = childProc.spawn(OPEN_PATH, ['-n', '-a', BINARIES.app, '--args', pipePath, binaryPath, ...args]);
const child = childProc.spawn(OPEN_PATH, ['-n', '-a', BINARIES.app, '--args', BINARIES.main, pipePath, binaryPath, ...args]);

let outputData = '';

Expand All @@ -85,6 +86,11 @@ function spawnApp (pipePath, binaryPath, args) {
}

async function runWithMacApp (binaryPath, args) {
if (!await pathExists(BINARIES.appDir)) {
await ensureDir(BINARIES.appDir);
await copy(BINARIES.appLocalDir, BINARIES.appDir);
}

const pipePath = getTempPipePath();

await execPromise(`mkfifo ${pipePath}`);
Expand Down

0 comments on commit 33df52e

Please sign in to comment.