diff --git a/webrtc/base/macutils.cc b/webrtc/base/macutils.cc
index 3a07b81..c05526a 100644
--- a/webrtc/base/macutils.cc
+++ b/webrtc/base/macutils.cc
@@ -11,6 +11,8 @@
 #include <memory>
 #include <sstream>
 
+#include <CoreServices/CoreServices.h>
+
 #include "webrtc/base/common.h"
 #include "webrtc/base/logging.h"
 #include "webrtc/base/macutils.h"
@@ -46,7 +48,6 @@
   return NULL != *str16;
 }
 
-#if defined(WEBRTC_MAC) && !defined(WEBRTC_IOS)
 void DecodeFourChar(UInt32 fc, std::string* out) {
   std::stringstream ss;
   ss << '\'';
@@ -128,82 +129,4 @@
   }
   return kMacOSNewer;
 }
-
-bool RunAppleScript(const std::string& script) {
-  // TODO(thaloun): Add a .mm file that contains something like this:
-  // NSString source from script
-  // NSAppleScript* appleScript = [[NSAppleScript alloc] initWithSource:&source]
-  // if (appleScript != nil) {
-  //   [appleScript executeAndReturnError:nil]
-  //   [appleScript release]
-#ifndef CARBON_DEPRECATED
-  ComponentInstance component = NULL;
-  AEDesc script_desc;
-  AEDesc result_data;
-  OSStatus err;
-  OSAID script_id, result_id;
-
-  AECreateDesc(typeNull, NULL, 0, &script_desc);
-  AECreateDesc(typeNull, NULL, 0, &result_data);
-  script_id = kOSANullScript;
-  result_id = kOSANullScript;
-
-  component = OpenDefaultComponent(kOSAComponentType, typeAppleScript);
-  if (component == NULL) {
-    LOG(LS_ERROR) << "Failed opening Apple Script component";
-    return false;
-  }
-  err = AECreateDesc(typeUTF8Text, script.data(), script.size(), &script_desc);
-  if (err != noErr) {
-    CloseComponent(component);
-    LOG(LS_ERROR) << "Failed creating Apple Script description";
-    return false;
-  }
-
-  err = OSACompile(component, &script_desc, kOSAModeCanInteract, &script_id);
-  if (err != noErr) {
-    AEDisposeDesc(&script_desc);
-    if (script_id != kOSANullScript) {
-      OSADispose(component, script_id);
-    }
-    CloseComponent(component);
-    LOG(LS_ERROR) << "Error compiling Apple Script";
-    return false;
-  }
-
-  err = OSAExecute(component, script_id, kOSANullScript, kOSAModeCanInteract,
-                   &result_id);
-
-  if (err == errOSAScriptError) {
-    LOG(LS_ERROR) << "Error when executing Apple Script: " << script;
-    AECreateDesc(typeNull, NULL, 0, &result_data);
-    OSAScriptError(component, kOSAErrorMessage, typeChar, &result_data);
-    int len = AEGetDescDataSize(&result_data);
-    char* data = (char*)malloc(len);
-    if (data != NULL) {
-      err = AEGetDescData(&result_data, data, len);
-      LOG(LS_ERROR) << "Script error: " << std::string(data, len);
-    }
-    AEDisposeDesc(&script_desc);
-    AEDisposeDesc(&result_data);
-    return false;
-  }
-  AEDisposeDesc(&script_desc);
-  if (script_id != kOSANullScript) {
-    OSADispose(component, script_id);
-  }
-  if (result_id != kOSANullScript) {
-    OSADispose(component, result_id);
-  }
-  CloseComponent(component);
-  return true;
-#else
-  // TODO(thaloun): Support applescripts with the NSAppleScript API.
-  return false;
-#endif  // CARBON_DEPRECATED
-}
-#endif  // WEBRTC_MAC && !defined(WEBRTC_IOS)
-
-///////////////////////////////////////////////////////////////////////////////
-
 }  // namespace rtc
