Home | History | Annotate | Download | only in accessibility
      1 // Copyright (c) 2012 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 #import <Cocoa/Cocoa.h>
      6 
      7 #import "content/browser/accessibility/browser_accessibility_mac.h"
      8 
      9 #import "content/browser/accessibility/browser_accessibility_cocoa.h"
     10 #include "content/browser/accessibility/browser_accessibility_manager_mac.h"
     11 
     12 namespace content {
     13 
     14 // Static.
     15 BrowserAccessibility* BrowserAccessibility::Create() {
     16   return new BrowserAccessibilityMac();
     17 }
     18 
     19 BrowserAccessibilityMac::BrowserAccessibilityMac()
     20     : browser_accessibility_cocoa_(NULL) {
     21 }
     22 
     23 void BrowserAccessibilityMac::OnDataChanged() {
     24   BrowserAccessibility::OnDataChanged();
     25 
     26   if (browser_accessibility_cocoa_) {
     27     [browser_accessibility_cocoa_ childrenChanged];
     28     return;
     29   }
     30 
     31   // We take ownership of the cocoa obj here.
     32   browser_accessibility_cocoa_ = [[BrowserAccessibilityCocoa alloc]
     33       initWithObject:this];
     34 }
     35 
     36 void BrowserAccessibilityMac::NativeReleaseReference() {
     37   // Detach this object from |browser_accessibility_cocoa_| so it
     38   // no longer has a pointer to this object.
     39   [browser_accessibility_cocoa_ detach];
     40   // Now, release it - but at this point, other processes may have a
     41   // reference to the cocoa object.
     42   [browser_accessibility_cocoa_ release];
     43   // Finally, it's safe to delete this since we've detached.
     44   delete this;
     45 }
     46 
     47 bool BrowserAccessibilityMac::IsNative() const {
     48   return true;
     49 }
     50 
     51 void BrowserAccessibilityMac::RecreateNativeObject() {
     52   if (!browser_accessibility_cocoa_)
     53     return;
     54 
     55   // Preserve the children so that recreating the native object doesn't
     56   // end up recreating the whole subtree.
     57   base::scoped_nsobject<NSMutableArray> children;
     58   [browser_accessibility_cocoa_ swapChildren:&children];
     59   [browser_accessibility_cocoa_ detach];
     60   [browser_accessibility_cocoa_ release];
     61   browser_accessibility_cocoa_ = [[BrowserAccessibilityCocoa alloc]
     62       initWithObject:this];
     63   [browser_accessibility_cocoa_ swapChildren:&children];
     64 }
     65 
     66 BrowserAccessibilityCocoa* BrowserAccessibility::ToBrowserAccessibilityCocoa() {
     67   return static_cast<BrowserAccessibilityMac*>(this)->
     68       native_view();
     69 }
     70 
     71 }  // namespace content
     72