Skip to content

Commit 10471c8

Browse files
authored
Merge pull request #54 from lynnswap:codex/bugfix/externalviewservice-ax-warning
fix(proxy): suppress benign ExternalViewService AX warning
2 parents 3b584ca + d3b6902 commit 10471c8

2 files changed

Lines changed: 84 additions & 0 deletions

File tree

Sources/ProxyFeatureXcode/XcodePermissionDialogAutoApprover.swift

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,27 @@ package enum XcodePermissionDialogAXError: Error, CustomStringConvertible {
329329
}
330330
}
331331

332+
package enum XcodePermissionDialogAXFailureClassifier {
333+
private static let externalViewServiceBundleIdentifier = "com.apple.dt.ExternalViewService"
334+
private static let windowsAttribute = kAXWindowsAttribute as String
335+
336+
package static func isBenignOpenWindowsFailure(
337+
_ error: Error,
338+
processBundleIdentifier: String?
339+
) -> Bool {
340+
guard processBundleIdentifier == externalViewServiceBundleIdentifier else {
341+
return false
342+
}
343+
guard let error = error as? XcodePermissionDialogAXError else {
344+
return false
345+
}
346+
guard case .copyAttributeFailed(let attribute, let axError) = error else {
347+
return false
348+
}
349+
return attribute == windowsAttribute && axError == .cannotComplete
350+
}
351+
}
352+
332353
package struct LiveXcodePermissionDialogAXClient: XcodePermissionDialogAXAccessing {
333354
private let maxDescendantCount = 128
334355

@@ -728,10 +749,24 @@ package final class XcodePermissionDialogAutoApprover: @unchecked Sendable {
728749
let nowUptimeNanoseconds = DispatchTime.now().uptimeNanoseconds
729750

730751
for processID in processIDs {
752+
let processBundleIdentifier = NSRunningApplication(processIdentifier: processID)?.bundleIdentifier
731753
let windows: [XcodePermissionDialogAXWindow]
732754
do {
733755
windows = try dependencies.axClient.openWindows(for: processID)
734756
} catch {
757+
if XcodePermissionDialogAXFailureClassifier.isBenignOpenWindowsFailure(
758+
error,
759+
processBundleIdentifier: processBundleIdentifier
760+
) {
761+
dependencies.logger.debug(
762+
"Ignoring benign AX window inspection failure for ExternalViewService.",
763+
metadata: [
764+
"pid": "\(processID)",
765+
"error": "\(error)",
766+
]
767+
)
768+
continue
769+
}
735770
dependencies.logger.warning(
736771
"Failed to inspect AX windows for a running Xcode-related process.",
737772
metadata: [

Tests/ProxyIntegrationTests/XcodePermissionDialogAutoApproverTests.swift

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import ApplicationServices
12
import Foundation
23
import Testing
34

@@ -224,6 +225,54 @@ struct XcodePermissionDialogAutoApproverTests {
224225
#expect(decision == nil)
225226
}
226227

228+
@Test func openWindowsFailureClassifierTreatsExternalViewServiceAXWindowsCannotCompleteAsBenign() {
229+
let isBenign = XcodePermissionDialogAXFailureClassifier.isBenignOpenWindowsFailure(
230+
XcodePermissionDialogAXError.copyAttributeFailed(
231+
attribute: kAXWindowsAttribute as String,
232+
error: .cannotComplete
233+
),
234+
processBundleIdentifier: "com.apple.dt.ExternalViewService"
235+
)
236+
237+
#expect(isBenign)
238+
}
239+
240+
@Test func openWindowsFailureClassifierRejectsXcodeAXWindowsCannotComplete() {
241+
let isBenign = XcodePermissionDialogAXFailureClassifier.isBenignOpenWindowsFailure(
242+
XcodePermissionDialogAXError.copyAttributeFailed(
243+
attribute: kAXWindowsAttribute as String,
244+
error: .cannotComplete
245+
),
246+
processBundleIdentifier: "com.apple.dt.Xcode"
247+
)
248+
249+
#expect(isBenign == false)
250+
}
251+
252+
@Test func openWindowsFailureClassifierRejectsExternalViewServiceForDifferentAttribute() {
253+
let isBenign = XcodePermissionDialogAXFailureClassifier.isBenignOpenWindowsFailure(
254+
XcodePermissionDialogAXError.copyAttributeFailed(
255+
attribute: kAXTitleAttribute as String,
256+
error: .cannotComplete
257+
),
258+
processBundleIdentifier: "com.apple.dt.ExternalViewService"
259+
)
260+
261+
#expect(isBenign == false)
262+
}
263+
264+
@Test func openWindowsFailureClassifierRejectsExternalViewServiceForDifferentAXError() {
265+
let isBenign = XcodePermissionDialogAXFailureClassifier.isBenignOpenWindowsFailure(
266+
XcodePermissionDialogAXError.copyAttributeFailed(
267+
attribute: kAXWindowsAttribute as String,
268+
error: .attributeUnsupported
269+
),
270+
processBundleIdentifier: "com.apple.dt.ExternalViewService"
271+
)
272+
273+
#expect(isBenign == false)
274+
}
275+
227276
@Test func defaultAgentPathCandidatesIncludeRawAndResolvedExecutablePaths() throws {
228277
let fileManager = FileManager.default
229278
let temporaryDirectory = fileManager.temporaryDirectory

0 commit comments

Comments
 (0)