//////////////////////////////////////////////////////////////////////////////// // // Licensed to the Apache Software Foundation (ASF) under one or more // contributor license agreements. See the NOTICE file distributed with // this work for additional information regarding copyright ownership. // The ASF licenses this file to You under the Apache License, Version 2.0 // (the "License"); you may not use this file except in compliance with // the License. You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // //////////////////////////////////////////////////////////////////////////////// package { import flash.display.DisplayObject; import flash.utils.*; import flash.net.*; import flash.events.*; import flash.display.*; import flash.desktop.NativeApplication; import flash.geom.Matrix; import flash.geom.Point; import flash.filesystem.File; [Mixin] /** * Apollo doesn't return anything useable from the loaderInfo.url: * it looks like this: app-context://my.swf * The received url in a test, which is looks like "../Properties/baselines/my.png" * won't load. Apparently, the "../" is offensive. To get the fully qualified path, * we need the Apollo File class. That's what this Mixin supplies. * Also, Apollo like soft exits, and won't re-launch after a kill (java's destroy process). * so exit by calling the window's close method. */ public class ApolloFilePath { public static var _root:DisplayObject; public static function init(root:DisplayObject):void { UnitTester.isApollo = true; CompareBitmap.adjustPath = apolloAdjust; /// the exit method has to be gentler for apollo, too UnitTester.exitWhenDone = true; UnitTester.exit = apolloExit; _root=root; } /** * gets the url from CompareBitmap; * creates fully qualified path using flash File class. */ public static function apolloAdjust(url:String):String { var swf:String = _root.loaderInfo.url; var f:File = new File (swf); // clean it up: var myPattern:RegExp = /\\/g; var path:String; if( UnitTester.cv.os == DeviceNames.ANDROID ){ // AIR for Android returns empty string for nativePath (on purpose). Use url instead. // See https://zerowing.corp.adobe.com/display/airlinux/Resource+Mapping. path = f.url; }else{ path = f.nativePath; path = path.replace (":", "|"); } path = path.replace (myPattern, "/"); // yank off the swfs directory, which we're in path = path.substr (0, path.lastIndexOf ("/")-1); path = path.substr (0, path.lastIndexOf ("/")); if (url.indexOf ("../")==0) url = url.substring (2); if (url.indexOf ("/..")==0) { url = url.substring (3); path = path.substr (0, path.lastIndexOf ("/")); } /// create the final url path = path + url; if( UnitTester.cv.os == DeviceNames.ANDROID ){ // AIR for Android needs it to start with app:/, so just return at this point. return path; }else{ return "file:///" + path; } } /** * call the native window close method */ public static function apolloExit(): void { /// hack around an issue that apollo seems to hang when it exits /// with a socket still open. Arbitrary sleep isn't attractive /// but we never received a response from Runner after sending /// ScriptDone setTimeout (real_apolloExit, 1500); } public static function real_apolloExit(): void { // Call the more general exit trace ("Doing an apollo exit"); NativeApplication.nativeApplication.exit(1); } } }