| /* |
| * Copyright 2014 Google Inc. |
| * |
| * Licensed 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 com.google.gwt.core.client.impl; |
| |
| import static com.google.gwt.core.client.impl.StackTraceExamples.TYPE_ERROR; |
| |
| import com.google.gwt.core.client.impl.StackTraceCreator.CollectorLegacy; |
| import com.google.gwt.core.client.impl.StackTraceCreator.CollectorModern; |
| import com.google.gwt.junit.DoNotRunWith; |
| import com.google.gwt.junit.Platform; |
| |
| /** |
| * Tests {@link StackTraceCreator} in the native mode. |
| */ |
| @DoNotRunWith(Platform.Devel) |
| public class StackTraceNativeTest extends StackTraceTestBase { |
| |
| @Override |
| public String getModuleName() { |
| return "com.google.gwt.core.StackTraceNative"; |
| } |
| |
| @Override |
| protected String[] getTraceJava() { |
| // First two frames are optional as they are automatically stripped by EDGE. |
| return new String[] { |
| "?" + Impl.getNameOf("@java.lang.Throwable::new(Ljava/lang/String;)"), |
| "?" + Impl.getNameOf("@java.lang.Exception::new(Ljava/lang/String;)"), |
| Impl.getNameOf("@com.google.gwt.core.client.impl.StackTraceExamples::throwException2(*)"), |
| Impl.getNameOf("@com.google.gwt.core.client.impl.StackTraceExamples::throwException1(*)"), |
| Impl.getNameOf("@com.google.gwt.core.client.impl.StackTraceExamples::getLiveException(*)"), |
| Impl.getNameOf("@com.google.gwt.core.client.impl.StackTraceTestBase::testTraceJava()"), |
| }; |
| } |
| |
| @Override |
| protected String[] getTraceRecursion() { |
| // First two frames are optional as they are automatically stripped by EDGE. |
| final String[] expectedModern = { |
| "?" + Impl.getNameOf("@java.lang.Throwable::new(Ljava/lang/String;)"), |
| "?" + Impl.getNameOf("@java.lang.Exception::new(Ljava/lang/String;)"), |
| Impl.getNameOf("@com.google.gwt.core.client.impl.StackTraceExamples::throwException2(*)"), |
| Impl.getNameOf("@com.google.gwt.core.client.impl.StackTraceExamples::throwException1(*)"), |
| Impl.getNameOf("@com.google.gwt.core.client.impl.StackTraceExamples::throwRecursive(*)"), |
| Impl.getNameOf("@com.google.gwt.core.client.impl.StackTraceExamples::throwRecursive(*)"), |
| Impl.getNameOf("@com.google.gwt.core.client.impl.StackTraceExamples::throwRecursive(*)"), |
| Impl.getNameOf("@com.google.gwt.core.client.impl.StackTraceExamples::throwException2(*)"), |
| Impl.getNameOf("@com.google.gwt.core.client.impl.StackTraceExamples::throwException1(*)"), |
| Impl.getNameOf("@com.google.gwt.core.client.impl.StackTraceExamples::getLiveException(*)"), |
| Impl.getNameOf("@com.google.gwt.core.client.impl.StackTraceTestBase::testTraceRecursion()"), |
| }; |
| |
| final String[] expectedLegacy = { |
| Impl.getNameOf("@java.lang.Throwable::new(Ljava/lang/String;)"), |
| Impl.getNameOf("@java.lang.Exception::new(Ljava/lang/String;)"), |
| Impl.getNameOf("@com.google.gwt.core.client.impl.StackTraceExamples::throwException2(*)"), |
| Impl.getNameOf("@com.google.gwt.core.client.impl.StackTraceExamples::throwException1(*)"), |
| Impl.getNameOf("@com.google.gwt.core.client.impl.StackTraceExamples::throwRecursive(*)"), |
| }; |
| |
| return isLegacyCollector() ? expectedLegacy : expectedModern; |
| } |
| |
| @Override |
| protected String[] getTraceJse(Object thrown) { |
| String[] nativeMethodNames = StackTraceExamples.getNativeMethodNames(); |
| final String[] full = { |
| nativeMethodNames[0], |
| nativeMethodNames[1], |
| Impl.getNameOf("@com.google.gwt.core.client.impl.StackTraceExamples::throwJse(*)"), |
| Impl.getNameOf("@com.google.gwt.core.client.impl.StackTraceExamples::throwException2(*)"), |
| Impl.getNameOf("@com.google.gwt.core.client.impl.StackTraceExamples::throwException1(*)"), |
| Impl.getNameOf("@com.google.gwt.core.client.impl.StackTraceExamples::getLiveException(*)"), |
| Impl.getNameOf("@com.google.gwt.core.client.impl.StackTraceTestBase::assertJse(*)"), |
| }; |
| |
| final String[] limited_wrap = { |
| Impl.getNameOf("@com.google.gwt.lang.Exceptions::toJava(*)"), |
| Impl.getNameOf("@com.google.gwt.core.client.impl.StackTraceExamples::getLiveException(*)"), |
| Impl.getNameOf("@com.google.gwt.core.client.impl.StackTraceTestBase::assertJse(*)"), |
| }; |
| |
| final String[] limited_fillInStackTrace = { |
| Impl.getNameOf("@java.lang.Throwable::fillInStackTrace()"), |
| Impl.getNameOf("@com.google.gwt.core.client.impl.StackTraceExamples::getLiveException(*)"), |
| Impl.getNameOf("@com.google.gwt.core.client.impl.StackTraceTestBase::assertJse(*)"), |
| }; |
| |
| // For legacy browsers and non-error javascript exceptions (e.g. throw "string"), we can only |
| // construct stack trace from the catch block and below. |
| return isLegacyCollector() |
| ? limited_wrap : (thrown != TYPE_ERROR ? limited_fillInStackTrace : full); |
| } |
| |
| // TODO(goktug): new Error().stack is broken for htmlunit: |
| // https://sourceforge.net/p/htmlunit/bugs/1606/ |
| @DoNotRunWith(Platform.HtmlUnitBug) |
| public void testCollectorType() { |
| if (isIE8() || isSafari5()) { |
| assertTrue(isLegacyCollector()); |
| } else { |
| assertTrue(isModernCollector()); |
| } |
| } |
| |
| private static boolean isLegacyCollector() { |
| return StackTraceCreator.collector instanceof CollectorLegacy; |
| } |
| |
| private static boolean isModernCollector() { |
| return StackTraceCreator.collector instanceof CollectorModern; |
| } |
| |
| private static native boolean isIE8() /*-{ |
| return navigator.userAgent.toLowerCase().indexOf('msie') != -1 && $doc.documentMode == 8; |
| }-*/; |
| |
| private static native boolean isSafari5() /*-{ |
| return navigator.userAgent.match(' Safari/') && !navigator.userAgent.match(' Chrom') |
| && !!navigator.userAgent.match(' Version/5.'); |
| }-*/; |
| } |