Home | History | Annotate | Download | only in cocoa
      1 // Copyright 2014 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "ui/base/cocoa/remote_layer_api.h"
      6 
      7 #include "base/command_line.h"
      8 #include "ui/base/ui_base_switches.h"
      9 
     10 #include <objc/runtime.h>
     11 
     12 namespace ui {
     13 
     14 bool RemoteLayerAPISupported() {
     15   bool enabled_at_command_line =
     16       CommandLine::ForCurrentProcess()->HasSwitch(
     17           switches::kEnableRemoteCoreAnimation);
     18   if (!enabled_at_command_line)
     19     return false;
     20 
     21   // Verify the GPU process interfaces are present.
     22   static Class caContextClass = NSClassFromString(@"CAContext");
     23   if (!caContextClass)
     24     return false;
     25 
     26   // Note that because the contextId and layer properties are dynamic,
     27   // instancesRespondToSelector will return NO for them.
     28   static bool caContextClassValid =
     29       [caContextClass respondsToSelector:
     30           @selector(contextWithCGSConnection:options:)] &&
     31       class_getProperty(caContextClass, "contextId") &&
     32       class_getProperty(caContextClass, "layer");
     33   if (!caContextClassValid)
     34     return false;
     35 
     36   // Verify the browser process interfaces are present.
     37   static Class caLayerHostClass = NSClassFromString(@"CALayerHost");
     38   if (!caLayerHostClass)
     39     return false;
     40 
     41   static bool caLayerHostClassValid =
     42       [caLayerHostClass instancesRespondToSelector:@selector(contextId)] &&
     43       [caLayerHostClass instancesRespondToSelector:@selector(setContextId:)];
     44   if (!caLayerHostClassValid)
     45     return false;
     46 
     47   // If everything is there, we should be able to use the API.
     48   return true;
     49 }
     50 
     51 }  // namespace
     52 
     53