Re-tag releases/2.5@11495 as 2.5.0 GA
git-svn-id: https://google-web-toolkit.googlecode.com/svn/tags/2.5.0@11502 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/build-tools/ant-gwt/build.xml b/build-tools/ant-gwt/build.xml
new file mode 100644
index 0000000..bec9154
--- /dev/null
+++ b/build-tools/ant-gwt/build.xml
@@ -0,0 +1,55 @@
+<project name="ant-gwt" default="build" basedir=".">
+ <property name="gwt.root" location="../.." />
+ <property name="project.tail" value="build-tools/ant-gwt" />
+ <import file="${gwt.root}/common.ant.xml" />
+
+ <property name="gwt.junit.testcase.antgwt.includes" value="**/*Test.class" />
+ <property name="gwt.junit.testcase.antgwt.excludes" value="" />
+
+ <target name="compile" description="Compiles this project">
+ <mkdir dir="${javac.out}" />
+ <gwt.javac>
+ <classpath>
+ <pathelement location="${gwt.tools.lib}/apache/ant-1.6.5.jar" />
+ </classpath>
+ </gwt.javac>
+ </target>
+
+ <target name="compile.tests" depends="build, compile.emma.if.enabled" description="Compiles the test code for this project">
+ <mkdir dir="${javac.junit.out}" />
+ <gwt.javac srcdir="test" destdir="${javac.junit.out}">
+ <classpath>
+ <pathelement location="${javac.out}" />
+ <pathelement location="${gwt.tools.lib}/junit/junit-4.8.2.jar" />
+ </classpath>
+ </gwt.javac>
+ </target>
+
+ <target name="build" depends="compile" description="Packages this project into a jar">
+ <mkdir dir="${gwt.build.lib}" />
+ <!-- we can't use the gwt.jar macro, as it needs the gwt-ant.jar being packaged here -->
+ <jar destfile="${gwt.build.lib}/${ant.project.name}.jar" duplicate="fail" filesonly="true"
+ index="true" update="true">
+ <fileset dir="${javac.out}" />
+ <fileset dir="src" />
+ </jar>
+ </target>
+
+ <target name="test" depends="build, compile.tests" description="Run unit tests for this project.">
+ <fileset id="tests.antgwt" dir="${javac.junit.out}" includes="${gwt.junit.testcase.antgwt.includes}" excludes="${gwt.junit.testcase.antgwt.excludes}" />
+ <gwt.junit test.name="ant-gwt" test.out="${junit.out}"
+ test.cases="tests.antgwt" />
+ </target>
+
+ <target name="checkstyle" description="Static analysis of source">
+ <gwt.checkstyle>
+ <fileset dir="src" />
+ </gwt.checkstyle>
+ </target>
+
+ <target name="clean" description="Cleans this project's intermediate and output files">
+ <delete dir="${project.build}" />
+ <delete file="${project.lib}" />
+ </target>
+
+</project>
diff --git a/build_tools/ant_gwt/src/com/google/gwt/ant/taskdefs/CommandRunner.java b/build-tools/ant-gwt/src/com/google/gwt/ant/taskdefs/CommandRunner.java
similarity index 100%
rename from build_tools/ant_gwt/src/com/google/gwt/ant/taskdefs/CommandRunner.java
rename to build-tools/ant-gwt/src/com/google/gwt/ant/taskdefs/CommandRunner.java
diff --git a/build_tools/ant_gwt/src/com/google/gwt/ant/taskdefs/LatestTimeJar.java b/build-tools/ant-gwt/src/com/google/gwt/ant/taskdefs/LatestTimeJar.java
similarity index 100%
rename from build_tools/ant_gwt/src/com/google/gwt/ant/taskdefs/LatestTimeJar.java
rename to build-tools/ant-gwt/src/com/google/gwt/ant/taskdefs/LatestTimeJar.java
diff --git a/build_tools/ant_gwt/src/com/google/gwt/ant/taskdefs/SvnInfo.java b/build-tools/ant-gwt/src/com/google/gwt/ant/taskdefs/SvnInfo.java
similarity index 100%
rename from build_tools/ant_gwt/src/com/google/gwt/ant/taskdefs/SvnInfo.java
rename to build-tools/ant-gwt/src/com/google/gwt/ant/taskdefs/SvnInfo.java
diff --git a/build_tools/ant_gwt/src/com/google/gwt/ant/taskdefs/TarCat.java b/build-tools/ant-gwt/src/com/google/gwt/ant/taskdefs/TarCat.java
similarity index 100%
rename from build_tools/ant_gwt/src/com/google/gwt/ant/taskdefs/TarCat.java
rename to build-tools/ant-gwt/src/com/google/gwt/ant/taskdefs/TarCat.java
diff --git a/build_tools/ant_gwt/src/com/google/gwt/ant/taskdefs/Timer.java b/build-tools/ant-gwt/src/com/google/gwt/ant/taskdefs/Timer.java
similarity index 100%
rename from build_tools/ant_gwt/src/com/google/gwt/ant/taskdefs/Timer.java
rename to build-tools/ant-gwt/src/com/google/gwt/ant/taskdefs/Timer.java
diff --git a/build_tools/ant_gwt/test/com/google/gwt/ant/taskdefs/CommandRunnerTest.java b/build-tools/ant-gwt/test/com/google/gwt/ant/taskdefs/CommandRunnerTest.java
similarity index 100%
rename from build_tools/ant_gwt/test/com/google/gwt/ant/taskdefs/CommandRunnerTest.java
rename to build-tools/ant-gwt/test/com/google/gwt/ant/taskdefs/CommandRunnerTest.java
diff --git a/build_tools/ant_gwt/test/com/google/gwt/ant/taskdefs/SvnInfoTest.java b/build-tools/ant-gwt/test/com/google/gwt/ant/taskdefs/SvnInfoTest.java
similarity index 100%
rename from build_tools/ant_gwt/test/com/google/gwt/ant/taskdefs/SvnInfoTest.java
rename to build-tools/ant-gwt/test/com/google/gwt/ant/taskdefs/SvnInfoTest.java
diff --git a/build-tools/build.xml b/build-tools/build.xml
new file mode 100644
index 0000000..f81b120
--- /dev/null
+++ b/build-tools/build.xml
@@ -0,0 +1,40 @@
+<project name="buildtools" default="build" basedir=".">
+ <property name="gwt.root" location=".." />
+ <property name="project.tail" value="build-tools" />
+ <import file="${gwt.root}/common.ant.xml" />
+
+ <!-- "build" is the default when subprojects are directly targetted -->
+ <property name="target" value="build" />
+
+ <target name="ant-gwt" description="Builds GWT specific Ant extensions">
+ <gwt.ant dir="ant-gwt" />
+ </target>
+
+ <target name="customchecks" description="Build the checkstyle extensions">
+ <gwt.ant dir="customchecks" />
+ </target>
+
+ <target name="doctool" description="Build the doctool">
+ <gwt.ant dir="doctool" />
+ </target>
+
+ <target name="-do" depends="ant-gwt, customchecks, doctool" description="Run all subprojects"/>
+
+ <target name="build" description="Builds GWT">
+ <antcall target="-do">
+ <param name="target" value="build" />
+ </antcall>
+ </target>
+
+ <target name="checkstyle" depends="build" description="Static analysis of GWT source">
+ <antcall target="-do">
+ <param name="target" value="checkstyle" />
+ </antcall>
+ </target>
+
+ <target name="test" depends="build" description="Test GWT">
+ <antcall target="-do">
+ <param name="target" value="test" />
+ </antcall>
+ </target>
+</project>
diff --git a/build-tools/customchecks/build.xml b/build-tools/customchecks/build.xml
new file mode 100644
index 0000000..f929b2d
--- /dev/null
+++ b/build-tools/customchecks/build.xml
@@ -0,0 +1,32 @@
+<project name="customchecks" default="build" basedir=".">
+ <property name="gwt.root" location="../.." />
+ <property name="project.tail" value="build-tools/customchecks" />
+ <import file="${gwt.root}/common.ant.xml" />
+
+ <target name="compile" description="Compiles this project">
+ <mkdir dir="${javac.out}" />
+ <gwt.javac>
+ <classpath>
+ <pathelement location="${gwt.tools.antlib}/checkstyle-all-4.2.jar" />
+ </classpath>
+ </gwt.javac>
+ </target>
+
+ <target name="build" depends="compile" description="Packages this project into a jar">
+ <mkdir dir="${gwt.build.lib}" />
+ <gwt.jar>
+ <fileset dir="src" />
+ <fileset dir="${javac.out}" />
+ </gwt.jar>
+ </target>
+
+ <target name="checkstyle">
+ <!-- NOTE: This project doesn't have the checkstyle rule since it participates in bootstrapping. -->
+ </target>
+
+ <target name="clean" description="Cleans this project's intermediate and output files">
+ <delete dir="${project.build}" />
+ <delete file="${project.lib}" />
+ </target>
+
+</project>
diff --git a/build-tools/customchecks/src/com/google/gwt/checkstyle/CustomRegexpHeaderCheck.java b/build-tools/customchecks/src/com/google/gwt/checkstyle/CustomRegexpHeaderCheck.java
new file mode 100644
index 0000000..f08a2bd
--- /dev/null
+++ b/build-tools/customchecks/src/com/google/gwt/checkstyle/CustomRegexpHeaderCheck.java
@@ -0,0 +1,215 @@
+/*
+ * Copyright 2011 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.
+ */
+// //////////////////////////////////////////////////////////////////////////////
+// checkstyle: Checks Java source code for adherence to a set of rules.
+// Copyright (C) 2001-2005 Oliver Burn
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+// //////////////////////////////////////////////////////////////////////////////
+package com.google.gwt.checkstyle;
+
+import com.puppycrawl.tools.checkstyle.checks.header.RegexpHeaderCheck;
+import com.puppycrawl.tools.checkstyle.api.DetailAST;
+import com.puppycrawl.tools.checkstyle.api.Utils;
+
+import org.apache.commons.beanutils.ConversionException;
+
+import java.util.Arrays;
+import java.util.regex.Pattern;
+import java.util.regex.PatternSyntaxException;
+
+/**
+ * Custom version of {@link RegexpHeaderCheck} that has hooks for a custom log handler (see
+ * {@link CustomLogHandler}).
+ * <p>
+ * This is an exact copy of {@link RegexpHeaderCheck} with three exceptions:
+ * <ol>
+ * <li>{@link CustomLogHandler} has been added for custom log callbacks.</li>
+ * <li>{@link #doChecks(CustomLogHandler)} has been added for custom checks. This method is an exact
+ * copy of {@link RegexpHeaderCheck#beginTree(DetailAST)} except all log calls have been replaced
+ * with a call to a custom log handler.</li>
+ * <li>{@link #beginTree(DetailAST)} has been refactored to call
+ * {@link #doChecks(CustomLogHandler)}.
+ * </ol>
+ */
+public class CustomRegexpHeaderCheck extends RegexpHeaderCheck {
+ /**
+ * Custom log handler callback.
+ */
+ abstract static class CustomLogHandler {
+ abstract void log(int aLine, String aKey);
+
+ abstract void log(int aLine, String aKey, Object aObject);
+ }
+
+ // empty array to avoid instantiations.
+ private static final int[] EMPTY_INT_ARRAY = new int[0];
+
+ // the header lines to repeat (0 or more) in the check, sorted.
+ private int[] mMultiLines = EMPTY_INT_ARRAY;
+
+ // the compiled regular expressions
+ private Pattern[] mHeaderRegexps;
+
+ /**
+ * {@inheritDoc}
+ */
+ public void beginTree(DetailAST aRootAST) {
+ doChecks(new CustomLogHandler() {
+ @Override
+ void log(int aLine, String aKey) {
+ CustomRegexpHeaderCheck.this.log(aLine, aKey);
+ }
+ @Override
+ void log(int aLine, String aKey, Object aObject) {
+ CustomRegexpHeaderCheck.this.log(aLine, aKey, aObject);
+ }
+ });
+ }
+
+ /**
+ * Check the current file using the same method as {@link RegexpHeaderCheck#beginTree(DetailAST)}
+ * but pass all logging calls through a custom log handler (@see {@link CustomLogHandler}).
+ *
+ * @param logHandler the custom log handler, or <code>null</code> to suppress logging.
+ */
+ public void doChecks(CustomLogHandler logHandler) {
+ // With the exception of the logging hooks, the following is copied from
+ // RegexpHeaderCheck.beginTree().
+
+ final int headerSize = getHeaderLines().length;
+ final int fileSize = getLines().length;
+
+ if (headerSize - mMultiLines.length > fileSize) {
+ if (logHandler != null) {
+ logHandler.log(1, "gwtheader.missing", null);
+ }
+ } else {
+ int headerLineNo = 0;
+ int i;
+ for (i = 0; (headerLineNo < headerSize) && (i < fileSize); i++) {
+ boolean isMatch = isMatch(i, headerLineNo);
+ while (!isMatch && isMultiLine(headerLineNo)) {
+ headerLineNo++;
+ isMatch = (headerLineNo == headerSize) || isMatch(i, headerLineNo);
+ }
+ if (!isMatch) {
+ if (logHandler != null) {
+ logHandler.log(i + 1, "gwtheader.mismatch", getHeaderLines()[headerLineNo]);
+ }
+ break; // stop checking
+ }
+ if (!isMultiLine(headerLineNo)) {
+ headerLineNo++;
+ }
+ }
+ if (i == fileSize) {
+ // if file finished, but we have at least one non-multi-line
+ // header isn't completed
+ for (; headerLineNo < headerSize; headerLineNo++) {
+ if (!isMultiLine(headerLineNo)) {
+ if (logHandler != null) {
+ logHandler.log(1, "gwtheader.missing");
+ }
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void setHeader(String aHeader) {
+ super.setHeader(aHeader);
+ initHeaderRegexps();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void setHeaderFile(String aFileName) throws ConversionException {
+ super.setHeaderFile(aFileName);
+ initHeaderRegexps();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void setMultiLines(int[] aList) {
+ if ((aList == null) || (aList.length == 0)) {
+ mMultiLines = EMPTY_INT_ARRAY;
+ return;
+ }
+
+ mMultiLines = new int[aList.length];
+ System.arraycopy(aList, 0, mMultiLines, 0, aList.length);
+ Arrays.sort(mMultiLines);
+ }
+
+ /**
+ * Initializes {@link #mHeaderRegexps} from {@link AbstractHeaderCheck#getHeaderLines()}.
+ */
+ private void initHeaderRegexps() {
+ final String[] headerLines = getHeaderLines();
+ if (headerLines != null) {
+ mHeaderRegexps = new Pattern[headerLines.length];
+ for (int i = 0; i < headerLines.length; i++) {
+ try {
+ // todo: Not sure if chache in Utils is still necessary
+ mHeaderRegexps[i] = Utils.getPattern(headerLines[i]);
+ } catch (final PatternSyntaxException ex) {
+ throw new ConversionException("line " + i + " in header specification"
+ + " is not a regular expression");
+ }
+ }
+ }
+ }
+
+ /**
+ * Checks if a code line matches the required header line.
+ *
+ * @param aLineNo the line number to check against the header
+ * @param aHeaderLineNo the header line number.
+ * @return true if and only if the line matches the required header line.
+ */
+ private boolean isMatch(int aLineNo, int aHeaderLineNo) {
+ final String line = getLines()[aLineNo];
+ return mHeaderRegexps[aHeaderLineNo].matcher(line).find();
+ }
+
+ /**
+ * @param aLineNo a line number
+ * @return if <code>aLineNo</code> is one of the repeat header lines.
+ */
+ private boolean isMultiLine(int aLineNo) {
+ return (Arrays.binarySearch(mMultiLines, aLineNo + 1) >= 0);
+ }
+}
\ No newline at end of file
diff --git a/build-tools/customchecks/src/com/google/gwt/checkstyle/FieldCheck.java b/build-tools/customchecks/src/com/google/gwt/checkstyle/FieldCheck.java
new file mode 100644
index 0000000..4044209
--- /dev/null
+++ b/build-tools/customchecks/src/com/google/gwt/checkstyle/FieldCheck.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2006 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.checkstyle;
+
+import com.puppycrawl.tools.checkstyle.api.DetailAST;
+import com.puppycrawl.tools.checkstyle.api.TokenTypes;
+import com.puppycrawl.tools.checkstyle.checks.naming.MemberNameCheck;
+
+/**
+ * Override MemberNameCheck to correctly use match rather than find.
+ */
+public class FieldCheck extends MemberNameCheck {
+ public FieldCheck() {
+ // Specifically stopping fields such as fMainWnd from being allowed.
+ setFormat("([a-eg-z]|(f[a-z0-9]))[a-zA-Z0-9]*");
+ }
+
+ public void visitToken(DetailAST aAST) {
+ if (mustCheckName(aAST)) {
+ final DetailAST nameAST = aAST.findFirstToken(TokenTypes.IDENT);
+ if (!getRegexp().matcher(nameAST.getText()).matches()) {
+ log(
+ nameAST.getLineNo(),
+ nameAST.getText()
+ + ": Field names must start with [a-z], may not start with f[A-Z], and should not contain '_''s.");
+ }
+ }
+ }
+}
diff --git a/build-tools/customchecks/src/com/google/gwt/checkstyle/GwtHeaderCheck.java b/build-tools/customchecks/src/com/google/gwt/checkstyle/GwtHeaderCheck.java
new file mode 100644
index 0000000..0457136
--- /dev/null
+++ b/build-tools/customchecks/src/com/google/gwt/checkstyle/GwtHeaderCheck.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright 2011 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.checkstyle;
+
+import com.google.gwt.checkstyle.CustomRegexpHeaderCheck.CustomLogHandler;
+
+import com.puppycrawl.tools.checkstyle.api.Check;
+import com.puppycrawl.tools.checkstyle.api.DetailAST;
+
+/**
+ * Checks the header against one of two header options, to support GWT's 80 and 100 column headers.
+ * <p>
+ * To use, set <code><property name="header" value="[regular expression]" /></code> and
+ * <code><property name="headerAlt" value="[alternate regular expression]" /></code>
+ */
+public class GwtHeaderCheck extends Check {
+ private CustomRegexpHeaderCheck regexpChecker = new CustomRegexpHeaderCheck();
+ private CustomRegexpHeaderCheck regexpCheckerAlt = new CustomRegexpHeaderCheck();
+
+ public void beginTree(DetailAST aRootAST) {
+ final boolean[] passedChecks = new boolean[]{true};
+ regexpChecker.setFileContents(this.getFileContents());
+ regexpChecker.doChecks(new CustomLogHandler() {
+ @Override
+ void log(int aLine, String aKey) {
+ passedChecks[0] = false;
+ }
+
+ @Override
+ void log(int aLine, String aKey, Object aObject) {
+ passedChecks[0] = false;
+ }
+ });
+ if (passedChecks[0]) {
+ // regexpChecker passed, no need to run alternate checker
+ return;
+ }
+
+ regexpCheckerAlt.setFileContents(this.getFileContents());
+ regexpCheckerAlt.doChecks(new CustomLogHandler() {
+ @Override
+ void log(int aLine, String aKey) {
+ GwtHeaderCheck.this.log(aLine, aKey);
+ }
+
+ @Override
+ void log(int aLine, String aKey, Object aObject) {
+ GwtHeaderCheck.this.log(aLine, aKey, aObject);
+ }
+ });
+ }
+
+ @Override
+ public int[] getDefaultTokens() {
+ return new int[0];
+ }
+
+ /**
+ * Set the header to check against. Individual lines in the header must be separated by '\n'
+ * characters.
+ *
+ * @param aHeader header content to check against.
+ */
+ public void setHeader(String aHeader) {
+ regexpChecker.setHeader(aHeader);
+ }
+
+ /**
+ * Set the alternate header to check against. Individual lines in the header must be separated by
+ * '\n' characters.
+ *
+ * @param aHeader header content to check against.
+ */
+ public void setHeaderAlt(String aHeader) {
+ regexpCheckerAlt.setHeader(aHeader);
+ }
+}
\ No newline at end of file
diff --git a/build-tools/customchecks/src/com/google/gwt/checkstyle/OrderCheck.java b/build-tools/customchecks/src/com/google/gwt/checkstyle/OrderCheck.java
new file mode 100644
index 0000000..5e69331
--- /dev/null
+++ b/build-tools/customchecks/src/com/google/gwt/checkstyle/OrderCheck.java
@@ -0,0 +1,215 @@
+// CHECKSTYLE_OFF:Must use GNU license for code based on checkstyle
+// /////////////////////////////////////////////////////////////////////////////
+// checkstyle: Checks Java source code for adherence to a set of rules.
+// Copyright (C) 2001-2005 Oliver Burn
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+// //////////////////////////////////////////////////////////////////////////////
+// CHECKSTYLE_ON
+
+// This class is based upon the
+// com.puppycrawl.tools.checkstyle.checks.coding.DeclarationOrderCheck
+
+package com.google.gwt.checkstyle;
+
+import com.puppycrawl.tools.checkstyle.api.Check;
+import com.puppycrawl.tools.checkstyle.api.DetailAST;
+import com.puppycrawl.tools.checkstyle.api.Scope;
+import com.puppycrawl.tools.checkstyle.api.ScopeUtils;
+import com.puppycrawl.tools.checkstyle.api.TokenTypes;
+
+import java.util.Stack;
+
+/**
+ * Checks that the parts of a class or interface declaration appear in the order
+ * specified by the 'Making GWT better' style guide.
+ */
+
+public class OrderCheck extends Check {
+ /**
+ * Encapsulate the state in each class scope in order to handle inner classes.
+ */
+ private static class ScopeState {
+ /**
+ * Current state.
+ */
+ private int state = State.TYPE;
+
+ /**
+ * Current access modifier for state.
+ */
+ private Scope visibility = Scope.PUBLIC;
+ }
+
+ /**
+ * Ordered category states for code elements.
+ */
+ private static class State {
+ private static final int TYPE = 0;
+ private static final int STATIC_FIELDS = 1;
+ private static final int STATIC_INITS = 2;
+ private static final int STATIC_METHODS = 3;
+ private static final int INSTANCE_FIELDS = 4;
+ private static final int INSTANCE_INITS = 5;
+ private static final int CONSTRUCTORS = 6;
+ private static final int INSTANCE_METHODS = 7;
+ }
+
+ /**
+ * List of Declaration States. This is necessary due to inner classes that
+ * have their own state.
+ */
+ private final Stack<ScopeState> classScopes = new Stack<ScopeState>();
+
+ /**
+ * Previous method name, used for alphabetical ordering.
+ */
+ private String previousMethodName;
+
+ public int[] getDefaultTokens() {
+ return new int[] {
+ TokenTypes.CTOR_DEF, TokenTypes.METHOD_DEF, TokenTypes.MODIFIERS,
+ TokenTypes.STATIC_INIT, TokenTypes.INSTANCE_INIT, TokenTypes.OBJBLOCK};
+ }
+
+ public void leaveToken(DetailAST aAST) {
+ switch (aAST.getType()) {
+ case TokenTypes.OBJBLOCK:
+ classScopes.pop();
+ previousMethodName = null;
+ break;
+ case TokenTypes.METHOD_DEF:
+ // If the previous method was in the same class, with the same
+ // modifiers, check that it is alphabetically before the current
+ // method.
+ String methodName = aAST.findFirstToken(TokenTypes.IDENT).getText();
+ if (previousMethodName != null
+ && (previousMethodName.compareToIgnoreCase(methodName)) > 0) {
+ log(aAST, methodName + " is not alphabetical.");
+ }
+ previousMethodName = methodName;
+ break;
+ default:
+ }
+ }
+
+ public void visitToken(DetailAST aAST) {
+ try {
+ int parentType = 0;
+ if (aAST.getParent() != null) {
+ parentType = aAST.getParent().getType();
+ }
+ switch (aAST.getType()) {
+ case TokenTypes.OBJBLOCK:
+ classScopes.push(new ScopeState());
+ previousMethodName = null;
+ break;
+
+ case TokenTypes.CTOR_DEF:
+ if (parentType != TokenTypes.OBJBLOCK) {
+ return;
+ }
+ checkState(aAST, State.CONSTRUCTORS, "Constructor");
+ break;
+
+ case TokenTypes.MODIFIERS:
+ if (parentType == TokenTypes.VARIABLE_DEF) {
+ checkVariable(aAST);
+ }
+ if (parentType == TokenTypes.METHOD_DEF) {
+ checkMethod(aAST);
+ }
+ break;
+ case TokenTypes.STATIC_INIT: {
+ checkState(aAST, State.STATIC_INITS, "Static initializer");
+ break;
+ }
+ case TokenTypes.INSTANCE_INIT: {
+ checkState(aAST, State.INSTANCE_INITS, "Instance initializer");
+ }
+ break;
+ default:
+ }
+ } catch (Throwable t) {
+ // CheckStyle swallows errors in general, we want OrderCheck errors to be
+ // visible.
+ t.printStackTrace();
+ throw new RuntimeException("Exception/Error in OrderCheck", t);
+ }
+ }
+
+ /**
+ * Check the modifiers of a method for order conflicts.
+ */
+ private void checkMethod(DetailAST aAST) {
+ if (aAST.getParent().getParent().getType() != TokenTypes.OBJBLOCK) {
+ return;
+ }
+ if (aAST.findFirstToken(TokenTypes.LITERAL_STATIC) != null) {
+ if (checkState(aAST, State.STATIC_METHODS, "Static method")) {
+ previousMethodName = null;
+ }
+ } else {
+ if (checkState(aAST, State.INSTANCE_METHODS, "Instance method")) {
+ previousMethodName = null;
+ }
+ }
+ }
+
+ /**
+ * Checks the category and visibility of declarations.
+ *
+ * @return whether the state or visibility modifiers have changed
+ */
+ private boolean checkState(DetailAST aAST, int curState, String type) {
+ ScopeState scope = classScopes.peek();
+ if (scope.state > curState) {
+ log(aAST, type + " in wrong order.");
+ // Wrong type implies at least a temporary state switch.
+ return true;
+ } else if (scope.state == curState) {
+ final Scope curVisibility = ScopeUtils.getScopeFromMods(aAST);
+ if (scope.visibility.compareTo(curVisibility) > 0) {
+ log(aAST, curVisibility.getName() + " " + type
+ + " should not occur after " + scope.visibility.getName() + " "
+ + type);
+ return false;
+ } else if (scope.visibility != curVisibility) {
+ scope.visibility = curVisibility;
+ return true;
+ } else {
+ return false;
+ }
+ } else {
+ scope.state = curState;
+ scope.visibility = Scope.PUBLIC;
+ return true;
+ }
+ }
+
+ /**
+ * Check the modifiers of a variable for order conflicts.
+ */
+ private void checkVariable(DetailAST aAST) {
+ if (aAST.getParent().getParent().getType() != TokenTypes.OBJBLOCK) {
+ return;
+ }
+ if (aAST.findFirstToken(TokenTypes.LITERAL_STATIC) != null) {
+ checkState(aAST, State.STATIC_FIELDS, "Static field");
+ } else {
+ checkState(aAST, State.INSTANCE_FIELDS, "Instance field");
+ }
+ }
+}
\ No newline at end of file
diff --git a/build-tools/customchecks/src/com/google/gwt/checkstyle/messages.properties b/build-tools/customchecks/src/com/google/gwt/checkstyle/messages.properties
new file mode 100644
index 0000000..149391c
--- /dev/null
+++ b/build-tools/customchecks/src/com/google/gwt/checkstyle/messages.properties
@@ -0,0 +1,2 @@
+gwtheader.missing=Missing a header - not enough lines in file.
+gwtheader.mismatch=Line does not match expected header line of ''{0}''.
\ No newline at end of file
diff --git a/build-tools/doctool/build.xml b/build-tools/doctool/build.xml
new file mode 100644
index 0000000..bc9cbbd
--- /dev/null
+++ b/build-tools/doctool/build.xml
@@ -0,0 +1,36 @@
+<project name="doctool" default="build" basedir=".">
+ <property name="gwt.root" location="../.." />
+ <property name="project.tail" value="build-tools/doctool" />
+ <import file="${gwt.root}/common.ant.xml" />
+
+ <property.ensure name="java.tools.path" location="${java.home}/../lib/tools.jar" unless="build.host.ismac" message="Cannot find ${java.home}/../lib/tools.jar; please use a JDK when building doc rather than a JRE." />
+
+ <target name="compile" description="Compiles this project">
+ <mkdir dir="${javac.out}" />
+ <gwt.javac>
+ <classpath>
+ <pathelement location="${java.tools.path}" />
+ </classpath>
+ </gwt.javac>
+ </target>
+
+ <target name="build" depends="compile" description="Packages this project into a jar">
+ <mkdir dir="${gwt.build.lib}" />
+ <gwt.jar>
+ <fileset dir="src" />
+ <fileset dir="${javac.out}" />
+ </gwt.jar>
+ </target>
+
+ <target name="checkstyle" description="Static analysis of source">
+ <gwt.checkstyle>
+ <fileset dir="src" />
+ </gwt.checkstyle>
+ </target>
+
+ <target name="clean" description="Cleans this project's intermediate and output files">
+ <delete dir="${project.build}" />
+ <delete file="${project.lib}" />
+ </target>
+
+</project>
diff --git a/build_tools/doctool/src/booklet.xsd b/build-tools/doctool/src/booklet.xsd
similarity index 100%
rename from build_tools/doctool/src/booklet.xsd
rename to build-tools/doctool/src/booklet.xsd
diff --git a/build_tools/doctool/src/com/google/doctool/Booklet.java b/build-tools/doctool/src/com/google/doctool/Booklet.java
similarity index 100%
rename from build_tools/doctool/src/com/google/doctool/Booklet.java
rename to build-tools/doctool/src/com/google/doctool/Booklet.java
diff --git a/build_tools/doctool/src/com/google/doctool/DocTool.java b/build-tools/doctool/src/com/google/doctool/DocTool.java
similarity index 100%
rename from build_tools/doctool/src/com/google/doctool/DocTool.java
rename to build-tools/doctool/src/com/google/doctool/DocTool.java
diff --git a/build_tools/doctool/src/com/google/doctool/DocToolFactory.java b/build-tools/doctool/src/com/google/doctool/DocToolFactory.java
similarity index 100%
rename from build_tools/doctool/src/com/google/doctool/DocToolFactory.java
rename to build-tools/doctool/src/com/google/doctool/DocToolFactory.java
diff --git a/build_tools/doctool/src/com/google/doctool/JreDocTool.java b/build-tools/doctool/src/com/google/doctool/JreDocTool.java
similarity index 100%
rename from build_tools/doctool/src/com/google/doctool/JreDocTool.java
rename to build-tools/doctool/src/com/google/doctool/JreDocTool.java
diff --git a/build_tools/doctool/src/com/google/doctool/JreDocToolFactory.java b/build-tools/doctool/src/com/google/doctool/JreDocToolFactory.java
similarity index 100%
rename from build_tools/doctool/src/com/google/doctool/JreDocToolFactory.java
rename to build-tools/doctool/src/com/google/doctool/JreDocToolFactory.java
diff --git a/build_tools/doctool/src/com/google/doctool/LinkResolver.java b/build-tools/doctool/src/com/google/doctool/LinkResolver.java
similarity index 100%
rename from build_tools/doctool/src/com/google/doctool/LinkResolver.java
rename to build-tools/doctool/src/com/google/doctool/LinkResolver.java
diff --git a/build_tools/doctool/src/com/google/doctool/ResourceIncluder.java b/build-tools/doctool/src/com/google/doctool/ResourceIncluder.java
similarity index 100%
rename from build_tools/doctool/src/com/google/doctool/ResourceIncluder.java
rename to build-tools/doctool/src/com/google/doctool/ResourceIncluder.java
diff --git a/build_tools/doctool/src/com/google/doctool/SplitterJoiner.java b/build-tools/doctool/src/com/google/doctool/SplitterJoiner.java
similarity index 100%
rename from build_tools/doctool/src/com/google/doctool/SplitterJoiner.java
rename to build-tools/doctool/src/com/google/doctool/SplitterJoiner.java
diff --git a/build_tools/doctool/src/com/google/doctool/custom/ExampleTaglet.java b/build-tools/doctool/src/com/google/doctool/custom/ExampleTaglet.java
similarity index 100%
rename from build_tools/doctool/src/com/google/doctool/custom/ExampleTaglet.java
rename to build-tools/doctool/src/com/google/doctool/custom/ExampleTaglet.java
diff --git a/build_tools/doctool/src/com/google/doctool/custom/EztDoclet.java b/build-tools/doctool/src/com/google/doctool/custom/EztDoclet.java
similarity index 100%
rename from build_tools/doctool/src/com/google/doctool/custom/EztDoclet.java
rename to build-tools/doctool/src/com/google/doctool/custom/EztDoclet.java
diff --git a/build_tools/doctool/src/com/google/doctool/custom/FindPackages.java b/build-tools/doctool/src/com/google/doctool/custom/FindPackages.java
similarity index 100%
rename from build_tools/doctool/src/com/google/doctool/custom/FindPackages.java
rename to build-tools/doctool/src/com/google/doctool/custom/FindPackages.java
diff --git a/build_tools/doctool/src/com/google/doctool/custom/GWTJavaDoclet.java b/build-tools/doctool/src/com/google/doctool/custom/GWTJavaDoclet.java
similarity index 100%
rename from build_tools/doctool/src/com/google/doctool/custom/GWTJavaDoclet.java
rename to build-tools/doctool/src/com/google/doctool/custom/GWTJavaDoclet.java
diff --git a/build_tools/doctool/src/com/google/doctool/custom/IncludeTaglet.java b/build-tools/doctool/src/com/google/doctool/custom/IncludeTaglet.java
similarity index 100%
rename from build_tools/doctool/src/com/google/doctool/custom/IncludeTaglet.java
rename to build-tools/doctool/src/com/google/doctool/custom/IncludeTaglet.java
diff --git a/build_tools/doctool/src/com/google/doctool/custom/TipTaglet.java b/build-tools/doctool/src/com/google/doctool/custom/TipTaglet.java
similarity index 100%
rename from build_tools/doctool/src/com/google/doctool/custom/TipTaglet.java
rename to build-tools/doctool/src/com/google/doctool/custom/TipTaglet.java
diff --git a/build_tools/doctool/src/doc-topics.xslt b/build-tools/doctool/src/doc-topics.xslt
similarity index 100%
rename from build_tools/doctool/src/doc-topics.xslt
rename to build-tools/doctool/src/doc-topics.xslt
diff --git a/build_tools/doctool/src/doc.css b/build-tools/doctool/src/doc.css
similarity index 100%
rename from build_tools/doctool/src/doc.css
rename to build-tools/doctool/src/doc.css
diff --git a/build_tools/doctool/src/java-topics.xslt b/build-tools/doctool/src/java-topics.xslt
similarity index 100%
rename from build_tools/doctool/src/java-topics.xslt
rename to build-tools/doctool/src/java-topics.xslt
diff --git a/build_tools/doctool/src/javascript-topics.xslt b/build-tools/doctool/src/javascript-topics.xslt
similarity index 100%
rename from build_tools/doctool/src/javascript-topics.xslt
rename to build-tools/doctool/src/javascript-topics.xslt
diff --git a/build_tools/doctool/src/topics-hhc.xslt b/build-tools/doctool/src/topics-hhc.xslt
similarity index 100%
rename from build_tools/doctool/src/topics-hhc.xslt
rename to build-tools/doctool/src/topics-hhc.xslt
diff --git a/build_tools/doctool/src/topics-hhk.xslt b/build-tools/doctool/src/topics-hhk.xslt
similarity index 100%
rename from build_tools/doctool/src/topics-hhk.xslt
rename to build-tools/doctool/src/topics-hhk.xslt
diff --git a/build_tools/doctool/src/topics-hhp.xslt b/build-tools/doctool/src/topics-hhp.xslt
similarity index 100%
rename from build_tools/doctool/src/topics-hhp.xslt
rename to build-tools/doctool/src/topics-hhp.xslt
diff --git a/build_tools/doctool/src/topics-htmls.xslt b/build-tools/doctool/src/topics-htmls.xslt
similarity index 100%
rename from build_tools/doctool/src/topics-htmls.xslt
rename to build-tools/doctool/src/topics-htmls.xslt
diff --git a/build_tools/doctool/src/topics-index.xslt b/build-tools/doctool/src/topics-index.xslt
similarity index 100%
rename from build_tools/doctool/src/topics-index.xslt
rename to build-tools/doctool/src/topics-index.xslt
diff --git a/build_tools/doctool/src/topics-toc.xslt b/build-tools/doctool/src/topics-toc.xslt
similarity index 100%
rename from build_tools/doctool/src/topics-toc.xslt
rename to build-tools/doctool/src/topics-toc.xslt
diff --git a/build_tools/doctool/src/topics.xsd b/build-tools/doctool/src/topics.xsd
similarity index 100%
rename from build_tools/doctool/src/topics.xsd
rename to build-tools/doctool/src/topics.xsd
diff --git a/build_tools/drtool/BuildGlobalTOC.py b/build-tools/drtool/BuildGlobalTOC.py
old mode 100755
new mode 100644
similarity index 100%
rename from build_tools/drtool/BuildGlobalTOC.py
rename to build-tools/drtool/BuildGlobalTOC.py
diff --git a/build_tools/drtool/TOCNode.py b/build-tools/drtool/TOCNode.py
old mode 100755
new mode 100644
similarity index 100%
rename from build_tools/drtool/TOCNode.py
rename to build-tools/drtool/TOCNode.py
diff --git a/build_tools/drtool/drtool.py b/build-tools/drtool/drtool.py
similarity index 100%
rename from build_tools/drtool/drtool.py
rename to build-tools/drtool/drtool.py
diff --git a/build.xml b/build.xml
index 57903e6..37d6f9c 100755
--- a/build.xml
+++ b/build.xml
@@ -107,7 +107,7 @@
</target>
<target name="buildtools" description="[subdir] Build (or runs ${target} if set) the build tools">
- <gwt.ant dir="build_tools" />
+ <gwt.ant dir="build-tools" />
</target>
<target name="build" description="[action] Builds GWT, including samples, but without distro packaging">
@@ -128,8 +128,6 @@
<call-subproject subproject="user" subtarget="checkstyle" />
<call-subproject subproject="requestfactory" subtarget="checkstyle" />
<call-subproject subproject="servlet" subtarget="checkstyle" />
- <!-- servlet needed for tools/benchmark-viewer -->
- <call-subproject subproject="servlet" subtarget="build" />
<call-subproject subproject="tools" subtarget="checkstyle" />
<call-subproject subproject="samples" subtarget="checkstyle" />
</target>
@@ -160,7 +158,7 @@
<path id="emma.classpath.src">
<pathelement location="${gwt.root}/user/src" />
<pathelement location="${gwt.root}/dev/**/src/com/google" />
- <pathelement location="${gwt.root}/build_tools/**/src/com/google" />
+ <pathelement location="${gwt.root}/build-tools/**/src/com/google" />
<pathelement location="${gwt.root}/tools/**/src/com/google" />
</path>
diff --git a/build_tools/ant_gwt/build.xml b/build_tools/ant_gwt/build.xml
deleted file mode 100644
index cf6d29a..0000000
--- a/build_tools/ant_gwt/build.xml
+++ /dev/null
@@ -1,55 +0,0 @@
-<project name="ant-gwt" default="build" basedir=".">
- <property name="gwt.root" location="../.." />
- <property name="project.tail" value="build_tools/ant_gwt" />
- <import file="${gwt.root}/common.ant.xml" />
-
- <property name="gwt.junit.testcase.antgwt.includes" value="**/*Test.class" />
- <property name="gwt.junit.testcase.antgwt.excludes" value="" />
-
- <target name="compile" description="Compiles this project">
- <mkdir dir="${javac.out}" />
- <gwt.javac>
- <classpath>
- <pathelement location="${gwt.tools.lib}/apache/ant-1.6.5.jar" />
- </classpath>
- </gwt.javac>
- </target>
-
- <target name="compile.tests" depends="build, compile.emma.if.enabled" description="Compiles the test code for this project">
- <mkdir dir="${javac.junit.out}" />
- <gwt.javac srcdir="test" destdir="${javac.junit.out}" includeantruntime="true">
- <classpath>
- <pathelement location="${javac.out}" />
- <pathelement location="${gwt.tools.lib}/junit/junit-4.8.2.jar" />
- </classpath>
- </gwt.javac>
- </target>
-
- <target name="build" depends="compile" description="Packages this project into a jar">
- <mkdir dir="${gwt.build.lib}" />
- <!-- we can't use the gwt.jar macro, as it needs the gwt-ant.jar being packaged here -->
- <jar destfile="${gwt.build.lib}/${ant.project.name}.jar" duplicate="fail" filesonly="true"
- index="true" update="true">
- <fileset dir="${javac.out}" />
- <fileset dir="src" />
- </jar>
- </target>
-
- <target name="test" depends="build, compile.tests" description="Run unit tests for this project.">
- <fileset id="tests.antgwt" dir="${javac.junit.out}" includes="${gwt.junit.testcase.antgwt.includes}" excludes="${gwt.junit.testcase.antgwt.excludes}" />
- <gwt.junit test.name="ant-gwt" test.out="${junit.out}"
- test.cases="tests.antgwt" />
- </target>
-
- <target name="checkstyle" description="Static analysis of source">
- <gwt.checkstyle>
- <fileset dir="src" />
- </gwt.checkstyle>
- </target>
-
- <target name="clean" description="Cleans this project's intermediate and output files">
- <delete dir="${project.build}" />
- <delete file="${project.lib}" />
- </target>
-
-</project>
diff --git a/build_tools/build.xml b/build_tools/build.xml
deleted file mode 100644
index a1f6576..0000000
--- a/build_tools/build.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<project name="buildtools" default="build" basedir=".">
- <property name="gwt.root" location=".." />
- <property name="project.tail" value="build_tools" />
- <import file="${gwt.root}/common.ant.xml" />
-
- <!-- "build" is the default when subprojects are directly targetted -->
- <property name="target" value="build" />
-
- <target name="ant_gwt" description="Builds GWT specific Ant extensions">
- <gwt.ant dir="ant_gwt" />
- </target>
-
- <target name="doctool" description="Build the doctool">
- <gwt.ant dir="doctool" />
- </target>
-
- <target name="-do" depends="ant_gwt, doctool" description="Run all subprojects"/>
-
- <target name="build" description="Builds GWT">
- <antcall target="-do">
- <param name="target" value="build" />
- </antcall>
- </target>
-
- <target name="checkstyle" depends="build" description="Static analysis of GWT source">
- <antcall target="-do">
- <param name="target" value="checkstyle" />
- </antcall>
- </target>
-
- <target name="test" depends="build" description="Test GWT">
- <antcall target="-do">
- <param name="target" value="test" />
- </antcall>
- </target>
-</project>
diff --git a/build_tools/doctool/build.xml b/build_tools/doctool/build.xml
deleted file mode 100644
index c8d5d79..0000000
--- a/build_tools/doctool/build.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<project name="doctool" default="build" basedir=".">
- <property name="gwt.root" location="../.." />
- <property name="project.tail" value="build_tools/doctool" />
- <import file="${gwt.root}/common.ant.xml" />
-
- <property.ensure name="java.tools.path" location="${java.home}/../lib/tools.jar" unless="build.host.ismac" message="Cannot find ${java.home}/../lib/tools.jar; please use a JDK when building doc rather than a JRE." />
-
- <target name="compile" description="Compiles this project">
- <mkdir dir="${javac.out}" />
- <gwt.javac>
- <classpath>
- <pathelement location="${java.tools.path}" />
- </classpath>
- </gwt.javac>
- </target>
-
- <target name="build" depends="compile" description="Packages this project into a jar">
- <mkdir dir="${gwt.build.lib}" />
- <gwt.jar>
- <fileset dir="src" />
- <fileset dir="${javac.out}" />
- </gwt.jar>
- </target>
-
- <target name="checkstyle" description="Static analysis of source">
- <gwt.checkstyle>
- <fileset dir="src" />
- </gwt.checkstyle>
- </target>
-
- <target name="clean" description="Cleans this project's intermediate and output files">
- <delete dir="${project.build}" />
- <delete file="${project.lib}" />
- </target>
-
-</project>
diff --git a/common.ant.xml b/common.ant.xml
index dbb7514..2608186 100755
--- a/common.ant.xml
+++ b/common.ant.xml
@@ -337,7 +337,7 @@
<attribute name="outputdirectory" default="${project.build}"/>
<element name="sourcepath" implicit="yes" optional="true" />
<sequential>
- <taskdef resource="checkstyletask.properties" classpath="${gwt.tools.antlib}/checkstyle-all-4.2.jar" />
+ <taskdef resource="checkstyletask.properties" classpath="${gwt.tools.antlib}/checkstyle-all-4.2.jar;${gwt.build.lib}/gwt-customchecks.jar" />
<mkdir dir="@{outputdirectory}"/>
<checkstyle config="${gwt.root}/eclipse/settings/code-style/gwt-checkstyle.xml" maxErrors="0" failOnViolation="false" failureProperty="gwt.checkstyle.failed">
<formatter type="xml" toFile="@{outputdirectory}/checkstyle_log.xml"/>
@@ -352,7 +352,7 @@
<attribute name="outputdirectory" default="${project.build}"/>
<element name="sourcepath" implicit="yes" optional="true" />
<sequential>
- <taskdef resource="checkstyletask.properties" classpath="${gwt.tools.antlib}/checkstyle-all-4.2.jar" />
+ <taskdef resource="checkstyletask.properties" classpath="${gwt.tools.antlib}/checkstyle-all-4.2.jar;${gwt.build.lib}/gwt-customchecks.jar" />
<mkdir dir="@{outputdirectory}"/>
<checkstyle config="${gwt.root}/eclipse/settings/code-style/gwt-checkstyle-tests.xml" maxErrors="0" failOnViolation="false" failureProperty="gwt.checkstyle-tests.failed">
<formatter type="xml" toFile="@{outputdirectory}/checkstyle_tests_log.xml"/>
diff --git a/dev/build.xml b/dev/build.xml
index 6b10f1c..0ea5528 100755
--- a/dev/build.xml
+++ b/dev/build.xml
@@ -34,6 +34,7 @@
excludes="**/super/**">
<classpath>
<pathelement location="${javac.out}" />
+ <pathelement location="${gwt.tools.lib}/tomcat/servlet-api-2.5.jar" />
<pathelement location="${gwt.tools.lib}/junit/junit-4.8.2.jar" />
<pathelement location="${gwt.tools.lib}/jfreechart/jfreechart-1.0.3.jar" />
<pathelement location="${gwt.tools.lib}/selenium/selenium-java-client-driver.jar" />
@@ -60,15 +61,35 @@
<include name="guava/guava-10.0.1/guava-10.0.1-rebased.jar" />
<include name="jscomp/r1649/compiler-rebased.jar" />
<include name="jetty/jetty-6.1.11.jar" />
- <include name="icu4j/50.1.1/icu4j.jar" />
+ <include name="icu4j/4.4.2/icu4j.jar" />
<include name="protobuf/protobuf-2.2.0/protobuf-java-rebased-2.2.0.jar" />
- <!-- dependencies needed for JSP support in DevMode: BEGIN -->
+ <include name="tomcat/ant-launcher-1.6.5.jar" />
+ <include name="tomcat/catalina-1.0.jar" />
+ <include name="tomcat/catalina-optional-1.0.jar" />
+ <include name="tomcat/commons-beanutils-1.6.jar" />
+ <include name="tomcat/commons-collections-3.1.jar" />
+ <include name="tomcat/commons-digester-1.5.jar" />
<include name="tomcat/commons-el-1.0.jar" />
+ <include name="tomcat/commons-logging-1.0.jar" />
+ <include name="tomcat/commons-modeler-1.1.jar" />
+ <include name="tomcat/jakarta-regexp-1.3.jar" />
<include name="tomcat/jasper-compiler-1.0.jar" />
<include name="tomcat/jasper-runtime-1.0.jar" />
<include name="tomcat/jsp-api-2.0.jar" />
- <!-- dependencies needed for JSP support in DevMode: END -->
- <include name="apache/commons/commons-collections-3.2.1.jar" />
+ <include name="tomcat/mx4j-jmx-1.1.jar" />
+ <include name="tomcat/naming-common-1.0.jar" />
+ <include name="tomcat/naming-factory-1.0.jar" />
+ <include name="tomcat/naming-java-1.0.jar" />
+ <include name="tomcat/naming-resources-1.0.jar" />
+ <include name="tomcat/servlet-api-2.5.jar" />
+ <include name="tomcat/servlet-api-2.4.jar" />
+ <include name="tomcat/servlets-common-1.0.jar" />
+ <include name="tomcat/servlets-default-1.0.jar" />
+ <include name="tomcat/servlets-invoker-1.0.jar" />
+ <include name="tomcat/tomcat-coyote-1.0.jar" />
+ <include name="tomcat/tomcat-http11-1.0.jar" />
+ <include name="tomcat/tomcat-jk2-2.1.jar" />
+ <include name="tomcat/tomcat-util-5.1.jar" />
<!-- htmlunit dependencies not already included: BEGIN -->
<include name="apache/http/httpclient-4.1.2.jar" />
<include name="apache/http/httpcore-4.1.2.jar" />
@@ -77,7 +98,6 @@
<include name="apache/commons/commons-codec-1.3.jar" />
<include name="apache/commons/commons-io-1.4.jar" />
<include name="apache/commons/commons-lang-2.6.jar" />
- <include name="apache/commons/commons-logging-1.1.1.jar" />
<include name="cssparser/cssparser-0.9.5.jar" />
<include name="htmlunit/htmlunit-2.9/htmlunit-v2.9.jar" />
<include name="htmlunit/htmlunit-2.9/htmlunit-core-js-v2.9.jar" />
@@ -109,15 +129,35 @@
<zipfileset src="${gwt.tools.lib}/guava/guava-10.0.1/guava-10.0.1-rebased.jar" />
<zipfileset src="${gwt.tools.lib}/jscomp/r1649/compiler-rebased.jar" />
<zipfileset src="${gwt.tools.lib}/jetty/jetty-6.1.11.jar" />
- <zipfileset src="${gwt.tools.lib}/icu4j/50.1.1/icu4j.jar" />
+ <zipfileset src="${gwt.tools.lib}/icu4j/4.4.2/icu4j.jar" />
<zipfileset src="${gwt.tools.lib}/protobuf/protobuf-2.2.0/protobuf-java-rebased-2.2.0.jar" />
- <!-- dependencies needed for JSP support in DevMode: BEGIN -->
+ <zipfileset src="${gwt.tools.lib}/tomcat/ant-launcher-1.6.5.jar" />
+ <zipfileset src="${gwt.tools.lib}/tomcat/catalina-1.0.jar" />
+ <zipfileset src="${gwt.tools.lib}/tomcat/catalina-optional-1.0.jar" />
+ <zipfileset src="${gwt.tools.lib}/tomcat/commons-beanutils-1.6.jar" />
+ <zipfileset src="${gwt.tools.lib}/tomcat/commons-collections-3.1.jar" />
+ <zipfileset src="${gwt.tools.lib}/tomcat/commons-digester-1.5.jar" />
<zipfileset src="${gwt.tools.lib}/tomcat/commons-el-1.0.jar" />
+ <zipfileset src="${gwt.tools.lib}/tomcat/commons-logging-1.0.jar" />
+ <zipfileset src="${gwt.tools.lib}/tomcat/commons-modeler-1.1.jar" />
+ <zipfileset src="${gwt.tools.lib}/tomcat/jakarta-regexp-1.3.jar" />
<zipfileset src="${gwt.tools.lib}/tomcat/jasper-compiler-1.0.jar" />
<zipfileset src="${gwt.tools.lib}/tomcat/jasper-runtime-1.0.jar" />
<zipfileset src="${gwt.tools.lib}/tomcat/jsp-api-2.0.jar" />
- <!-- dependencies needed for JSP support in DevMode: END -->
- <zipfileset src="${gwt.tools.lib}/apache/commons/commons-collections-3.2.1.jar" />
+ <zipfileset src="${gwt.tools.lib}/tomcat/mx4j-jmx-1.1.jar" />
+ <zipfileset src="${gwt.tools.lib}/tomcat/naming-common-1.0.jar" />
+ <zipfileset src="${gwt.tools.lib}/tomcat/naming-factory-1.0.jar" />
+ <zipfileset src="${gwt.tools.lib}/tomcat/naming-java-1.0.jar" />
+ <zipfileset src="${gwt.tools.lib}/tomcat/naming-resources-1.0.jar" />
+ <zipfileset src="${gwt.tools.lib}/tomcat/servlet-api-2.5.jar" />
+ <zipfileset src="${gwt.tools.lib}/tomcat/servlet-api-2.4.jar" />
+ <zipfileset src="${gwt.tools.lib}/tomcat/servlets-common-1.0.jar" />
+ <zipfileset src="${gwt.tools.lib}/tomcat/servlets-default-1.0.jar" />
+ <zipfileset src="${gwt.tools.lib}/tomcat/servlets-invoker-1.0.jar" />
+ <zipfileset src="${gwt.tools.lib}/tomcat/tomcat-coyote-1.0.jar" />
+ <zipfileset src="${gwt.tools.lib}/tomcat/tomcat-http11-1.0.jar" />
+ <zipfileset src="${gwt.tools.lib}/tomcat/tomcat-jk2-2.1.jar" />
+ <zipfileset src="${gwt.tools.lib}/tomcat/tomcat-util-5.1.jar" />
<!-- htmlunit dependencies not already included: BEGIN -->
<zipfileset src="${gwt.tools.lib}/apache/http/httpclient-4.1.2.jar" />
<zipfileset src="${gwt.tools.lib}/apache/http/httpcore-4.1.2.jar" />
@@ -126,7 +166,6 @@
<zipfileset src="${gwt.tools.lib}/apache/commons/commons-codec-1.3.jar" />
<zipfileset src="${gwt.tools.lib}/apache/commons/commons-io-1.4.jar" />
<zipfileset src="${gwt.tools.lib}/apache/commons/commons-lang-2.6.jar" />
- <zipfileset src="${gwt.tools.lib}/apache/commons/commons-logging-1.1.1.jar" />
<zipfileset src="${gwt.tools.lib}/cssparser/cssparser-0.9.5.jar" />
<zipfileset src="${gwt.tools.lib}/htmlunit/htmlunit-2.9/htmlunit-2.9.jar" />
<zipfileset src="${gwt.tools.lib}/htmlunit/htmlunit-2.9/htmlunit-core-js-2.9.jar" />
@@ -181,7 +220,7 @@
<classpath>
<pathelement location="${gwt.tools.lib}/apache/ant-1.6.5.jar" />
<pathelement location="${gwt.tools.lib}/eclipse/jdt-3.4.2_r894.jar" />
- <pathelement location="${gwt.tools.lib}/apache/commons/commons-collections-3.2.1.jar" />
+ <pathelement location="${gwt.tools.lib}/tomcat/commons-collections-3.1.jar" />
<pathelement location="${gwt.tools.lib}/guava/guava-10.0.1/guava-10.0.1-rebased.jar" />
<pathelement location="${gwt.tools.lib}/jscomp/r1649/compiler-rebased.jar" />
</classpath>
diff --git a/dev/codeserver/build.xml b/dev/codeserver/build.xml
index 52af07f..f2c1e8d 100755
--- a/dev/codeserver/build.xml
+++ b/dev/codeserver/build.xml
@@ -22,8 +22,8 @@
<include name="**/*.java"/>
</fileset>
</copy>
- <replace dir="${src}" token="com.google.gwt.thirdparty.org.mortbay."
- value="org.mortbay."/>
+ <replace dir="${src}" token="com.google.gwt.thirdparty.org.mortbay.jetty"
+ value="org.mortbay.jetty"/>
</target>
<target name="compile" depends="preprocess">
@@ -41,7 +41,6 @@
<fileset dir="${javac.out}"/>
<fileset dir="java">
<include name="**/*.html"/>
- <include name="**/*.ico"/>
<include name="**/*.js"/>
</fileset>
diff --git a/dev/codeserver/java/com/google/gwt/dev/codeserver/CodeServer.java b/dev/codeserver/java/com/google/gwt/dev/codeserver/CodeServer.java
index 1d826e6..6419d86 100644
--- a/dev/codeserver/java/com/google/gwt/dev/codeserver/CodeServer.java
+++ b/dev/codeserver/java/com/google/gwt/dev/codeserver/CodeServer.java
@@ -23,6 +23,7 @@
import java.io.File;
import java.io.IOException;
+import java.net.InetAddress;
/**
* <p>This class contains the {@link #main main method} that starts the code server for
@@ -83,8 +84,8 @@
AppSpace appSpace = AppSpace.create(new File(workDir, moduleName));
Recompiler recompiler = new Recompiler(appSpace, moduleName,
- options.getSourcePath(), options.getPreferredHost() + ":" + options.getPort(), logger);
- modules.addModuleState(new ModuleState(recompiler, logger, options.getNoPrecompile()));
+ options.getSourcePath(), logger);
+ modules.addModuleState(new ModuleState(recompiler, logger));
}
SourceHandler sourceHandler = new SourceHandler(modules, logger);
diff --git a/dev/codeserver/java/com/google/gwt/dev/codeserver/ModuleState.java b/dev/codeserver/java/com/google/gwt/dev/codeserver/ModuleState.java
index 32a907e..2d46607 100644
--- a/dev/codeserver/java/com/google/gwt/dev/codeserver/ModuleState.java
+++ b/dev/codeserver/java/com/google/gwt/dev/codeserver/ModuleState.java
@@ -42,22 +42,16 @@
private final Recompiler recompiler;
private final TreeLogger logger;
- ModuleState(Recompiler recompiler, TreeLogger logger, boolean noPrecompile)
+ ModuleState(Recompiler recompiler, TreeLogger logger)
throws UnableToCompleteException {
this.recompiler = recompiler;
this.logger = logger;
- CompileDir compileDir;
- if (noPrecompile) {
- compileDir = recompiler.noCompile();
- } else {
- Map<String, String> defaultProps = new HashMap<String, String>();
- defaultProps.put("user.agent", "safari");
- defaultProps.put("locale", "en");
- defaultProps.put("compiler.useSourceMaps", "true");
- compileDir = recompiler.compile(defaultProps);
- }
- current.set(compileDir);
+ Map<String, String> defaultProps = new HashMap<String, String>();
+ defaultProps.put("user.agent", "safari");
+ defaultProps.put("locale", "en");
+ defaultProps.put("compiler.useSourceMaps", "true");
+ current.set(recompiler.compile(defaultProps));
}
/**
diff --git a/dev/codeserver/java/com/google/gwt/dev/codeserver/Options.java b/dev/codeserver/java/com/google/gwt/dev/codeserver/Options.java
index 758f645..2924e44 100644
--- a/dev/codeserver/java/com/google/gwt/dev/codeserver/Options.java
+++ b/dev/codeserver/java/com/google/gwt/dev/codeserver/Options.java
@@ -20,7 +20,6 @@
import com.google.gwt.util.tools.ArgHandler;
import com.google.gwt.util.tools.ArgHandlerDir;
import com.google.gwt.util.tools.ArgHandlerExtra;
-import com.google.gwt.util.tools.ArgHandlerFlag;
import com.google.gwt.util.tools.ArgHandlerInt;
import com.google.gwt.util.tools.ArgHandlerString;
@@ -36,7 +35,6 @@
* <p>These flags are EXPERIMENTAL and subject to change.</p>
*/
public class Options {
- private boolean noPrecompile = false;
private File workDir;
private List<String> moduleNames = new ArrayList<String>();
private final List<File> sourcePath = new ArrayList<File>();
@@ -68,13 +66,6 @@
}
/**
- * Whether the codeServer should start without precompiling modules.
- */
- boolean getNoPrecompile() {
- return noPrecompile;
- }
-
- /**
* The IP address where the code server should listen.
*/
String getBindAddress() {
@@ -102,7 +93,6 @@
private class ArgProcessor extends ArgProcessorBase {
public ArgProcessor() {
- registerHandler(new NoPrecompileFlag());
registerHandler(new BindAddressFlag());
registerHandler(new PortFlag());
registerHandler(new WorkDirFlag());
@@ -117,25 +107,6 @@
}
- public class NoPrecompileFlag extends ArgHandlerFlag {
-
- @Override
- public String getTag() {
- return "-noprecompile";
- }
-
- @Override
- public String getPurpose() {
- return "Disables pre-compilation of modules.";
- }
-
- @Override
- public boolean setFlag() {
- noPrecompile = true;
- return true;
- }
- }
-
private class BindAddressFlag extends ArgHandlerString {
@Override
diff --git a/dev/codeserver/java/com/google/gwt/dev/codeserver/PageUtil.java b/dev/codeserver/java/com/google/gwt/dev/codeserver/PageUtil.java
index 8b653d6..3076afa 100644
--- a/dev/codeserver/java/com/google/gwt/dev/codeserver/PageUtil.java
+++ b/dev/codeserver/java/com/google/gwt/dev/codeserver/PageUtil.java
@@ -20,11 +20,8 @@
import com.google.gwt.dev.json.JsonObject;
import java.io.BufferedInputStream;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
-import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
@@ -128,7 +125,7 @@
/**
* Copies in to out and closes in when done.
*/
- static void copyStream(InputStream in, OutputStream out) throws IOException {
+ private static void copyStream(InputStream in, OutputStream out) throws IOException {
try {
byte[] buffer = new byte[8 * 1024];
while (true) {
@@ -142,27 +139,4 @@
in.close();
}
}
-
- /**
- * Reads a resource into a String.
- */
- static String loadResource(Class<?> base, String path) throws IOException {
- InputStream resourceInputStream = base.getResourceAsStream(path);
- if (resourceInputStream == null) {
- throw new IOException("Resource " + path + " not found.");
- }
- ByteArrayOutputStream resourceBaos = new ByteArrayOutputStream();
- copyStream(resourceInputStream, resourceBaos);
- return resourceBaos.toString("UTF-8");
- }
-
- /**
- * Writes a String to a file.
- */
- static void writeFile(String path, String content) throws IOException {
- InputStream in = new ByteArrayInputStream(content.getBytes("UTF-8"));
- OutputStream out = new FileOutputStream(path);
- PageUtil.copyStream(in, out);
- }
-
}
diff --git a/dev/codeserver/java/com/google/gwt/dev/codeserver/Recompiler.java b/dev/codeserver/java/com/google/gwt/dev/codeserver/Recompiler.java
index f6c8b4a..73cd65c 100644
--- a/dev/codeserver/java/com/google/gwt/dev/codeserver/Recompiler.java
+++ b/dev/codeserver/java/com/google/gwt/dev/codeserver/Recompiler.java
@@ -38,7 +38,6 @@
import java.io.File;
import java.io.IOException;
-import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicReference;
@@ -51,7 +50,6 @@
private final String originalModuleName;
private final List<File> sourcePath;
private final TreeLogger logger;
- private String serverPrefix;
private int compilesDone = 0;
// after renaming
@@ -62,12 +60,11 @@
new AtomicReference<ResourceLoader>();
Recompiler(AppSpace appSpace, String moduleName, List<File> sourcePath,
- String serverPrefix, TreeLogger logger) {
+ TreeLogger logger) {
this.appSpace = appSpace;
this.originalModuleName = moduleName;
this.sourcePath = sourcePath;
this.logger = logger;
- this.serverPrefix = serverPrefix;
}
synchronized CompileDir compile(Map<String, String> bindingProperties)
@@ -101,39 +98,6 @@
return compileDir;
}
- synchronized CompileDir noCompile() throws UnableToCompleteException {
- long startTime = System.currentTimeMillis();
- CompileDir compileDir = makeCompileDir(++compilesDone);
- TreeLogger compileLogger = makeCompileLogger(compileDir);
-
- ModuleDef module = loadModule(compileLogger, new HashMap<String, String>());
- String newModuleName = module.getName(); // includes any rename.
- moduleName.set(newModuleName);
-
- lastBuild.set(compileDir);
-
- try {
- // Prepare directory.
- File outputDir = new File(
- compileDir.getWarDir().getCanonicalPath() + "/" + getModuleName());
- if (!outputDir.exists()) {
- outputDir.mkdir();
- }
-
- // Creates a "module_name.nocache.js" that just forces a recompile.
- String moduleScript = PageUtil.loadResource(Recompiler.class, "nomodule.nocache.js");
- moduleScript = moduleScript.replace("__MODULE_NAME__", getModuleName());
- PageUtil.writeFile(outputDir.getCanonicalPath() + "/" + getModuleName() + ".nocache.js",
- moduleScript);
-
- } catch (IOException e) {
- compileLogger.log(TreeLogger.Type.ERROR, "Error creating uncompiled module.", e);
- }
- long elapsedTime = System.currentTimeMillis() - startTime;
- compileLogger.log(TreeLogger.Type.INFO, "Module setup completed in " + elapsedTime + " ms");
- return compileDir;
- }
-
/**
* Returns the log from the last compile. (It may be a failed build.)
*/
@@ -173,7 +137,7 @@
ResourceLoader resources = ResourceLoaders.forClassLoader(Thread.currentThread());
resources = ResourceLoaders.forPathAndFallback(sourcePath, resources);
this.resourceLoader.set(resources);
-
+
ModuleDef moduleDef =
ModuleDefLoader.loadFromResources(logger, originalModuleName, resources, true);
@@ -211,10 +175,6 @@
// override computeScriptBase.js to enable the "Compile" button
overrideConfig(moduleDef, "computeScriptBaseJs",
"com/google/gwt/dev/codeserver/computeScriptBase.js");
- // Fix bug with SDM and Chrome 24+ where //@ sourceURL directives cause X-SourceMap header to be ignored
- // Frustratingly, Chrome won't canonicalize a relative URL
- overrideConfig(moduleDef, "includeSourceMapUrl", "http://" + serverPrefix +
- WebServer.sourceMapLocationForModule(moduleDef.getName()));
// If present, set some config properties back to defaults.
// (Needed for Google's server-side linker.)
diff --git a/dev/codeserver/java/com/google/gwt/dev/codeserver/WebServer.java b/dev/codeserver/java/com/google/gwt/dev/codeserver/WebServer.java
index b3e5653..7250bcd 100644
--- a/dev/codeserver/java/com/google/gwt/dev/codeserver/WebServer.java
+++ b/dev/codeserver/java/com/google/gwt/dev/codeserver/WebServer.java
@@ -20,31 +20,23 @@
import com.google.gwt.core.ext.UnableToCompleteException;
import com.google.gwt.dev.json.JsonArray;
import com.google.gwt.dev.json.JsonObject;
-import com.google.gwt.thirdparty.org.mortbay.io.Buffer;
import com.google.gwt.thirdparty.org.mortbay.jetty.HttpConnection;
-import com.google.gwt.thirdparty.org.mortbay.jetty.MimeTypes;
import com.google.gwt.thirdparty.org.mortbay.jetty.Request;
import com.google.gwt.thirdparty.org.mortbay.jetty.Server;
import com.google.gwt.thirdparty.org.mortbay.jetty.handler.AbstractHandler;
import com.google.gwt.thirdparty.org.mortbay.jetty.nio.SelectChannelConnector;
-import com.google.gwt.thirdparty.org.mortbay.jetty.servlet.FilterHolder;
-import com.google.gwt.thirdparty.org.mortbay.jetty.servlet.ServletHandler;
-import com.google.gwt.thirdparty.org.mortbay.jetty.servlet.ServletHolder;
-import com.google.gwt.thirdparty.org.mortbay.servlet.GzipFilter;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
-import java.io.InputStream;
import java.io.PrintWriter;
+import java.net.URLConnection;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@@ -82,8 +74,6 @@
private static final Pattern SAFE_CALLBACK =
Pattern.compile("([a-zA-Z_][a-zA-Z0-9_]*\\.)*[a-zA-Z_][a-zA-Z0-9_]*");
- private static final MimeTypes MIME_TYPES = new MimeTypes();
-
private final SourceHandler handler;
private final Modules modules;
@@ -112,18 +102,13 @@
Server server = new Server();
server.addConnector(connector);
-
- ServletHandler servletHandler = new ServletHandler();
- servletHandler.addServletWithMapping(new ServletHolder(new HttpServlet() {
+ server.addHandler(new AbstractHandler() {
@Override
- protected void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- handleRequest(request.getPathInfo(), request, response);
+ public void handle(String target, HttpServletRequest request,
+ HttpServletResponse response, int port) throws IOException {
+ handleRequest(target, request, response);
}
- }), "/*");
- servletHandler.addFilterWithMapping(new FilterHolder(GzipFilter.class),
- "/*", AbstractHandler.DEFAULT);
- server.addHandler(servletHandler);
+ });
try {
server.start();
} catch (Exception e) {
@@ -211,13 +196,6 @@
}
if (target.equals("/favicon.ico")) {
- InputStream faviconStream = getClass().getResourceAsStream("favicon.ico");
- if (faviconStream != null) {
- setHandled(request);
- // IE8 will not load the favicon in an img tag with the default MIME type,
- // so use "image/x-icon" instead.
- PageUtil.sendStream("image/x-icon", faviconStream, response);
- }
return;
}
@@ -270,14 +248,15 @@
logger.log(TreeLogger.WARN, "client doesn't accept gzip; bailing");
return;
}
- response.setHeader("Content-Encoding", "gzip");
+ response.addHeader("Content-Encoding", "gzip");
}
- if (target.endsWith(".cache.js")) {
- response.setHeader("X-SourceMap", sourceMapLocationForModule(moduleName));
- }
- response.setHeader("Access-Control-Allow-Origin", "*");
String mimeType = guessMimeType(target);
+ if (target.endsWith(".cache.js")) {
+ response.addHeader("X-SourceMap", SourceHandler.SOURCEMAP_PATH + moduleName +
+ "/gwtSourceMap.json");
+ }
+ response.addHeader("Access-Control-Allow-Origin", "*");
PageUtil.sendFile(mimeType, file, response);
}
@@ -376,10 +355,8 @@
}
}
- /* visible for testing */
- static String guessMimeType(String filename) {
- Buffer mimeType = MIME_TYPES.getMimeByExtension(filename);
- return mimeType != null ? mimeType.toString() : "";
+ private static String guessMimeType(String filename) {
+ return URLConnection.guessContentTypeFromName(filename);
}
/**
@@ -397,11 +374,6 @@
return result;
}
- public static String sourceMapLocationForModule(String moduleName) {
- return SourceHandler.SOURCEMAP_PATH + moduleName +
- "/gwtSourceMap.json";
- }
-
private static void setHandled(HttpServletRequest request) {
Request baseRequest = (request instanceof Request) ? (Request) request :
HttpConnection.getCurrentConnection().getRequest();
diff --git a/dev/codeserver/java/com/google/gwt/dev/codeserver/dev_mode_on.js b/dev/codeserver/java/com/google/gwt/dev/codeserver/dev_mode_on.js
index a562f9c..26a2981 100644
--- a/dev/codeserver/java/com/google/gwt/dev/codeserver/dev_mode_on.js
+++ b/dev/codeserver/java/com/google/gwt/dev/codeserver/dev_mode_on.js
@@ -60,18 +60,13 @@
if (!params) {
return null;
}
- try {
- delete window.__gwt_bookmarklet_params;
- } catch (e) {
- // Delete window.x throws and exception in IE8.
- window['__gwt_bookmarklet_params'] = null;
- }
+ delete window.__gwt_bookmarklet_params;
return params;
}
function makeOverlay() {
var overlay = document.createElement('div');
- overlay.style.zIndex = 1000000;
+ overlay.style.zIndex = 1000;
overlay.style.position = 'absolute';
overlay.style.top = 0;
overlay.style.left = 0;
@@ -84,7 +79,7 @@
function makeDialog() {
var dialog = document.createElement('div');
- dialog.style.zIndex = 1000001;
+ dialog.style.zIndex = 1001;
dialog.style.position = 'fixed';
dialog.style.top = '20pt';
dialog.style.left = '20pt';
@@ -105,7 +100,7 @@
result.style.borderBottom = '1px solid black';
result.style.padding = '3pt';
result.setAttribute('href', 'javascript:' + encodeURIComponent(javascript));
- setTextContent(result, name);
+ result.textContent = name;
result.title = 'Tip: drag this button to the bookmark bar';
return result;
}
@@ -129,7 +124,8 @@
* a recompile will succeed.
*/
function getCannotCompileError(module_name) {
- if (!isModuleOnCodeServer(module_name)) {
+ var modules_on_codeserver = window.__gwt_codeserver_config.moduleNames;
+ if (modules_on_codeserver.indexOf(module_name) < 0) {
return 'The code server isn\'t configured to compile this module';
}
@@ -153,22 +149,6 @@
}
/**
- * Determines if the code server is configured to run the given module.
- * @param module_name {string}
- * @return {boolean} true if the code server supports the given module.
- */
- function isModuleOnCodeServer(module_name) {
- var modules_on_codeserver = window.__gwt_codeserver_config.moduleNames;
- // Support browsers without indexOf() (e.g. IE8).
- for (var i = 0; i < modules_on_codeserver.length; i++) {
- if (modules_on_codeserver[i] == module_name) {
- return true;
- }
- }
- return false;
- }
-
- /**
* Displays the "Choose module to compile" dialog.
* @param codeserver_url {string} The URL of the code server that will
* compile the chosen module.
@@ -178,7 +158,7 @@
function makeHeader() {
var message = document.createElement('div');
message.style.fontSize = '24pt';
- setTextContent(message, 'Choose a module to recompile:');
+ message.textContent = 'Choose a module to recompile:';
return message;
}
@@ -265,7 +245,7 @@
var message = document.createElement('div');
message.style.fontSize = '24pt';
- setTextContent(message, text);
+ message.textContent = text;
dialog.appendChild(message);
@@ -286,14 +266,14 @@
var error = document.createElement('a');
error.setAttribute('href', log_url);
error.setAttribute('target', 'gwt_dev_mode_log');
- setTextContent(error, errorText);
+ error.innerText = errorText;
error.style.color = 'red';
error.style.textDecoration = 'underline';
message.appendChild(error);
var button = document.createElement('button');
button.style.fontSize = '16pt';
- setTextContent(button, 'Try Again');
+ button.textContent = 'Try Again';
button.onclick = function() {
body.removeChild(dialog);
body.removeChild(overlay);
@@ -306,20 +286,6 @@
}
/**
- * Updates the contents of the given element with the provided text.
- * @param {Node} element The element to update.
- * @param {String} text The text to display.
- */
- function setTextContent(element, text) {
- if (typeof element.textContent === 'string') {
- element.textContent = text;
- } else {
- // Use innerText when textContent is not supported (e.g. IE8).
- element.innerText = text;
- }
- }
-
- /**
* Makes a JSONP call. Assumes that the callback parameter is named
* "callback". Handles multiple callbacks in flight at once.
* @param {string} url_prefix A URL prefix that ends with '?' or '&'.
@@ -409,7 +375,6 @@
}
function onCompileFinished(json) {
- globals.compiling = false;
if (json.status != 'ok') {
var log_url = codeserver_url + 'log/' + module_name;
dialog.showError(json.status, log_url, onClickTryAgain);
@@ -420,7 +385,6 @@
var url_prefix = codeserver_url + 'recompile/' + module_name + '?' +
getBindingParameters(module_name, get_prop_map);
- globals.compiling = true;
callJsonp(url_prefix, onCompileFinished);
}
@@ -430,12 +394,6 @@
* @param params {map} Parameters passed in by the bookmarklet.
*/
function runBookmarklet(params) {
- if (!!globals.compiling) {
- // A module is already being compiled.
- // We ignore the bookmarklet: the page will reload once the compilation
- // ends.
- return;
- }
if (!params || !params.server_url) {
window.alert('Need to reinstall the bookmarklets.');
return;
diff --git a/dev/codeserver/java/com/google/gwt/dev/codeserver/directorylist.html b/dev/codeserver/java/com/google/gwt/dev/codeserver/directorylist.html
index afe183b..b7427a1 100644
--- a/dev/codeserver/java/com/google/gwt/dev/codeserver/directorylist.html
+++ b/dev/codeserver/java/com/google/gwt/dev/codeserver/directorylist.html
@@ -18,8 +18,8 @@
<script>
function updatePage(config) {
var title = config.moduleName + " Source (GWT Code Server)";
- document.title = title;
- setTextContent(document.getElementById("title"), title);
+ document.getElementsByTagName("title")[0].textContent = title;
+ document.getElementById("title").textContent = title;
document.getElementById("logLink").setAttribute("href", "../log/" + config.moduleName);
updateFileList(config, document.getElementById("files"));
@@ -31,37 +31,17 @@
var anchor = document.createElement("a");
anchor.setAttribute("href", dir.link);
- setTextContent(anchor, dir.name);
+ anchor.textContent = dir.name;
var listItem = document.createElement("li");
listItem.appendChild(anchor);
resultElement.appendChild(listItem);
}
}
-
- function setTextContent(element, text) {
- if (typeof element.textContent === 'string') {
- element.textContent = text;
- } else {
- // Use innerText when textContent is not supported (e.g. IE8).
- element.innerText = text;
- }
- }
-
- function onPageLoad() {
- updatePage(config);
- }
-
- if (window.addEventListener) {
- window.addEventListener("load", onPageLoad, false);
- }
- else if (window.attachEvent) {
- window.attachEvent("onload", onPageLoad);
- }
</script>
</head>
-<body>
+<body onload="updatePage(config)">
<h1 id="title">Loading...</h1>
<p><a id="logLink">Messages</a> from the last time this module was compiled.</p>
diff --git a/dev/codeserver/java/com/google/gwt/dev/codeserver/favicon.ico b/dev/codeserver/java/com/google/gwt/dev/codeserver/favicon.ico
deleted file mode 100644
index d7ccc73..0000000
--- a/dev/codeserver/java/com/google/gwt/dev/codeserver/favicon.ico
+++ /dev/null
Binary files differ
diff --git a/dev/codeserver/java/com/google/gwt/dev/codeserver/filelist.html b/dev/codeserver/java/com/google/gwt/dev/codeserver/filelist.html
index 82c3b8e..511f39b 100644
--- a/dev/codeserver/java/com/google/gwt/dev/codeserver/filelist.html
+++ b/dev/codeserver/java/com/google/gwt/dev/codeserver/filelist.html
@@ -18,8 +18,8 @@
<script>
function updatePage(config) {
var title = config.moduleName + " Source (GWT Code Server)";
- document.title = title;
- setTextContent(document.getElementById("title"), title);
+ document.getElementsByTagName("title")[0].textContent = title;
+ document.getElementById("title").textContent = title;
document.getElementById("logLink")
.setAttribute("href", "/log/" + config.moduleName);
@@ -36,37 +36,17 @@
var anchor = document.createElement("a");
anchor.setAttribute("href", file.link);
- setTextContent(anchor, file.name);
+ anchor.textContent = file.name;
var listItem = document.createElement("li");
listItem.appendChild(anchor);
resultElement.appendChild(listItem);
}
}
-
- function setTextContent(element, text) {
- if (typeof element.textContent === 'string') {
- element.textContent = text;
- } else {
- // Use innerText when textContent is not supported (e.g. IE8).
- element.innerText = text;
- }
- }
-
- function onPageLoad() {
- updatePage(config);
- }
-
- if (window.addEventListener) {
- window.addEventListener("load", onPageLoad, false);
- }
- else if (window.attachEvent) {
- window.attachEvent("onload", onPageLoad);
- }
</script>
</head>
-<body>
+<body onload="updatePage(config)">
<h1 id="title">Loading...</h1>
<p><a id="logLink">Messages</a> from the last time this module was compiled.</p>
diff --git a/dev/codeserver/java/com/google/gwt/dev/codeserver/frontpage.html b/dev/codeserver/java/com/google/gwt/dev/codeserver/frontpage.html
index c855615..6a27050 100644
--- a/dev/codeserver/java/com/google/gwt/dev/codeserver/frontpage.html
+++ b/dev/codeserver/java/com/google/gwt/dev/codeserver/frontpage.html
@@ -35,8 +35,8 @@
var moduleName = moduleNames[i];
var anchor = document.createElement("a");
- anchor.setAttribute("href", "/" + moduleName + "/");
- setTextContent(anchor, moduleName);
+ anchor.setAttribute("href", moduleName + "/");
+ anchor.textContent = moduleName;
var item = document.createElement("li");
item.appendChild(anchor);
@@ -80,31 +80,11 @@
function makeBookmarklet(name, javascript) {
var result = document.createElement("a");
- result.setAttribute(document.all ? "className" : "class", "bookmarklet");
+ result.setAttribute("class", "bookmarklet");
result.setAttribute("href", "javascript:" + encodeURIComponent(javascript));
- setTextContent(result, name);
+ result.textContent = name;
return result;
}
-
-function setTextContent(element, text) {
- if (typeof element.textContent === 'string') {
- element.textContent = text;
- } else {
- // Use innerText when textContent is not supported (e.g. IE8).
- element.innerText = text;
- }
-}
-
-function onPageLoad() {
- updatePage(config);
-}
-
-if (window.addEventListener) {
- window.addEventListener("load", onPageLoad, false);
-}
-else if (window.attachEvent) {
- window.attachEvent("onload", onPageLoad);
-}
</script>
<style>
@@ -139,7 +119,7 @@
}
</style>
</head>
-<body>
+<body onload="updatePage(config)">
<h1>GWT Code Server</h1>
diff --git a/dev/codeserver/java/com/google/gwt/dev/codeserver/modulepage.html b/dev/codeserver/java/com/google/gwt/dev/codeserver/modulepage.html
index 29a8647..239d44e 100644
--- a/dev/codeserver/java/com/google/gwt/dev/codeserver/modulepage.html
+++ b/dev/codeserver/java/com/google/gwt/dev/codeserver/modulepage.html
@@ -18,8 +18,8 @@
<script>
function updatePage(config) {
var title = config.moduleName + " (GWT Code Server)";
- document.title = title;
- setTextContent(document.getElementById("title"), title);
+ document.getElementsByTagName("title")[0].textContent = title;
+ document.getElementById("title").textContent = title;
document.getElementById("logLink")
.setAttribute("href", "../log/" + config.moduleName);
@@ -34,37 +34,17 @@
var anchor = document.createElement("a");
anchor.setAttribute("href", file.link);
- setTextContent(anchor, file.name);
+ anchor.textContent = file.name;
var listItem = document.createElement("li");
listItem.appendChild(anchor);
resultElement.appendChild(listItem);
}
}
-
- function setTextContent(element, text) {
- if (typeof element.textContent === 'string') {
- element.textContent = text;
- } else {
- // Use innerText when textContent is not supported (e.g. IE8).
- element.innerText = text;
- }
- }
-
- function onPageLoad() {
- updatePage(config);
- }
-
- if (window.addEventListener) {
- window.addEventListener("load", onPageLoad, false);
- }
- else if (window.attachEvent) {
- window.attachEvent("onload", onPageLoad);
- }
</script>
</head>
-<body>
+<body onload="updatePage(config)">
<h1 id="title">Loading...</h1>
<p><a id="logLink">Messages</a> from the last time this module was compiled.</p>
diff --git a/dev/codeserver/java/com/google/gwt/dev/codeserver/nomodule.nocache.js b/dev/codeserver/java/com/google/gwt/dev/codeserver/nomodule.nocache.js
deleted file mode 100644
index 0b5e8e0..0000000
--- a/dev/codeserver/java/com/google/gwt/dev/codeserver/nomodule.nocache.js
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright 2012 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.
- */
-
-/**
- * @fileoverview Stub for non-compiled modules.
- *
- * This script forces the proper reload + compilation in Super Dev Mode.
- */
-
-(function() {
- var moduleName = '__MODULE_NAME__'; // Replaced by actual module name.
-
- // Active Super Dev Mode is assumed.
- var key = '__gwtDevModeHook:' + moduleName;
- if (!window.sessionStorage[key]) {
- alert('Unable to load Super Dev Mode version of ' + moduleName + '.');
- return;
- }
- var scriptLocation = window.sessionStorage[key];
-
- // Get the Super Dev Mode Server URL: use the HTML a.href parsing.
- var a = document.createElement('a');
- a.href = scriptLocation;
- var devServerUrl = a.protocol + '//' + a.host;
-
- // Load the bookmarklet.
- window.__gwt_bookmarklet_params = {
- 'server_url' : devServerUrl + '/',
- 'module_name': moduleName
- };
- var script = document.createElement('script');
- script.src = devServerUrl + '/dev_mode_on.js';
- document.getElementsByTagName('head')[0].appendChild(script);
-})();
diff --git a/dev/core/src/com/google/gwt/core/ext/linker/impl/installLocationIframe.js b/dev/core/src/com/google/gwt/core/ext/linker/impl/installLocationIframe.js
index 35c17a1..93e27fa 100644
--- a/dev/core/src/com/google/gwt/core/ext/linker/impl/installLocationIframe.js
+++ b/dev/core/src/com/google/gwt/core/ext/linker/impl/installLocationIframe.js
@@ -1,17 +1,12 @@
-// GWT code can be installed anywhere, but an iFrame is the best place if you
-// want both variable isolation and runAsync support. Variable isolation is
-// useful for avoiding conflicts with JavaScript libraries and critical if
-// you want more than one GWT module on your page. The runAsync implementation
-// will need to install additional chunks of code into the same iFrame later.
-//
-// By default, CrossSiteIFrameLinker will use this script to create the iFrame.
-// It may be replaced by overriding CrossSiteIframeLinker.getJsInstallLocation()
-// to return the name of a different resource file. The replacement script may
-// optionally set this variable inside the iframe:
-//
-// $wnd - the location where the bootstrap module is defined. It should also
-// be the location where the __gwtStatsEvent function is defined.
-// If not set, the module will set $wnd to window.parent.
+// The GWT code can be installed anywhere, although an iFrame is the best
+// approach if you want both variable isolation (useful in general, but
+// critical if you want more than one GWT module on your page) and runAsync
+// which will need to be able to install additional chunks of code into that
+// isolated environment later on.
+
+// The items that must be provided in any install location are:
+// $wnd - the location where the bootstrap module is defined. Should also
+// be the location where the __gwtStatsEvent is defined
var frameDoc;
@@ -47,7 +42,13 @@
// of the frame. However, we don't want to do this when runAsync calls
// installCode, so we do it here when we create the iframe.
frameDoc.open();
- var doctype = (document.compatMode == 'CSS1Compat') ? '<!doctype html>' : '';
- frameDoc.write(doctype + '<html><head></head><body></body></html>');
+ frameDoc.write('<html><head></head><body></body></html>');
frameDoc.close();
+
+ var frameDocbody = frameDoc.getElementsByTagName('body')[0];
+ var script = frameDoc.createElement('script');
+ script.language='javascript';
+ var temp = "var $wnd = window.parent;";
+ script.text = temp;
+ frameDocbody.appendChild(script);
}
diff --git a/dev/core/src/com/google/gwt/core/ext/linker/impl/properties.js b/dev/core/src/com/google/gwt/core/ext/linker/impl/properties.js
index 55db43a..297dccb 100644
--- a/dev/core/src/com/google/gwt/core/ext/linker/impl/properties.js
+++ b/dev/core/src/com/google/gwt/core/ext/linker/impl/properties.js
@@ -52,9 +52,7 @@
__MODULE_FUNC__.__getPropMap = function() {
var result = {};
for (var key in values) {
- if (values.hasOwnProperty(key)) {
- result[key] = computePropValue(key);
- }
+ result[key] = computePropValue(key);
}
return result;
};
diff --git a/dev/core/src/com/google/gwt/core/linker/CrossSiteIframeLinker.java b/dev/core/src/com/google/gwt/core/linker/CrossSiteIframeLinker.java
index 8e59403..baacf86 100644
--- a/dev/core/src/com/google/gwt/core/linker/CrossSiteIframeLinker.java
+++ b/dev/core/src/com/google/gwt/core/linker/CrossSiteIframeLinker.java
@@ -347,14 +347,12 @@
throws UnableToCompleteException {
TextOutput out = new DefaultTextOutput(context.isOutputCompact());
- // $wnd is the main window that the GWT code will affect and also the
- // location where the bootstrap function was defined. In iframe-based linkers,
- // $wnd is set to window.parent. Usually, in others, $wnd = window.
- // By default, $wnd is not set when the module starts, but a replacement for
- // installLocationIframe.js may set it.
+ // We assume that the $wnd has been set in the same scope as this code is
+ // executing in. $wnd is the main window which the GWT code is affecting. It
+ // is also usually the location the bootstrap function was defined in.
+ // In iframe based linkers, $wnd = window.parent;
+ // Usually, in others, $wnd = window;
- out.print("var $wnd = $wnd || window.parent;");
- out.newlineOpt();
out.print("var __gwtModuleFunction = $wnd." + context.getModuleFunctionName() + ";");
out.newlineOpt();
out.print("var $sendStats = __gwtModuleFunction.__sendStats;");
@@ -406,20 +404,7 @@
+ "__gwtModuleFunction.__computePropValue);");
out.newlineOpt();
out.print("$sendStats('moduleStartup', 'end');");
- String includeSourceMapUrl = getStringConfigurationProperty(context, "includeSourceMapUrl", "false");
- if (!"false".equalsIgnoreCase(includeSourceMapUrl)) {
- String sourceMapUrl = SymbolMapsLinker.SourceMapArtifact.sourceMapFilenameForFragment(0);
- if (!"true".equalsIgnoreCase(includeSourceMapUrl)) {
- sourceMapUrl = includeSourceMapUrl;
- }
- // The sourceURL magic comment can cause browsers to ignore the X-SourceMap header
- // This magic comment ensures that they can still locate them in that case
- out.print("\n//@ sourceMappingURL=" + sourceMapUrl + " ");
- }
- // Magic comment serves several purposes:
- // 1. renames strongName to a stable name in browser debugger
- // 2. provides name to scripts installed via eval()
- out.print("\n//@ sourceURL=0.js \n");
+ out.print("\n//@ sourceURL=0.js\n");
return out.toString();
}
@@ -589,7 +574,7 @@
for (String chunk : chunks) {
newChunks.add(JsToStringGenerationVisitor.javaScriptString(chunk));
}
- out.append(Joiner.on(",\n").join(newChunks));
+ out.append(Joiner.on(", ").join(newChunks));
out.append("]);\n");
} else {
out.append(script);
diff --git a/dev/core/src/com/google/gwt/core/linker/DevModeRedirectHook.js b/dev/core/src/com/google/gwt/core/linker/DevModeRedirectHook.js
index a5026f2..816e1b1 100644
--- a/dev/core/src/com/google/gwt/core/linker/DevModeRedirectHook.js
+++ b/dev/core/src/com/google/gwt/core/linker/DevModeRedirectHook.js
@@ -42,7 +42,7 @@
// The new script tag must come before the previous one so that
// computeScriptBase will see it.
- head.insertBefore(script, head.firstElementChild || head.children[0]);
+ head.insertBefore(script, head.firstElementChild);
return false; // Skip the regular bootstrap.
}
diff --git a/dev/core/src/com/google/gwt/core/linker/SymbolMapsLinker.java b/dev/core/src/com/google/gwt/core/linker/SymbolMapsLinker.java
index e4c8eaf..91a1d43 100644
--- a/dev/core/src/com/google/gwt/core/linker/SymbolMapsLinker.java
+++ b/dev/core/src/com/google/gwt/core/linker/SymbolMapsLinker.java
@@ -170,7 +170,7 @@
private byte[] js;
public SourceMapArtifact(int permutationId, int fragment, byte[] js) {
- super(SymbolMapsLinker.class, permutationId + '/' + sourceMapFilenameForFragment(fragment), js);
+ super(SymbolMapsLinker.class, permutationId + "/sourceMap" + fragment + ".json", js);
this.permutationId = permutationId;
this.fragment = fragment;
this.js = js;
@@ -183,10 +183,6 @@
public int getPermutationId() {
return permutationId;
}
-
- public static String sourceMapFilenameForFragment(int fragment) {
- return "sourceMap" + fragment + ".json";
- }
}
/**
diff --git a/dev/core/src/com/google/gwt/dev/CompileModule.java b/dev/core/src/com/google/gwt/dev/CompileModule.java
index 8ba6fb5..f9df91a 100644
--- a/dev/core/src/com/google/gwt/dev/CompileModule.java
+++ b/dev/core/src/com/google/gwt/dev/CompileModule.java
@@ -30,6 +30,8 @@
import com.google.gwt.dev.util.arg.ArgHandlerModuleName;
import com.google.gwt.dev.util.arg.ArgHandlerOutDir;
import com.google.gwt.dev.util.arg.ArgHandlerStrict;
+import com.google.gwt.dev.util.arg.OptionOutDir;
+import com.google.gwt.dev.util.arg.OptionStrict;
import com.google.gwt.dev.util.log.speedtracer.CompilerEventType;
import com.google.gwt.dev.util.log.speedtracer.SpeedTracerLogger;
import com.google.gwt.thirdparty.guava.common.collect.Sets;
@@ -98,6 +100,9 @@
}
}
+ interface CompileModuleOptions extends CompileTaskOptions, OptionOutDir, OptionStrict {
+ }
+
static class CompileModuleOptionsImpl extends CompileTaskOptionsImpl implements
CompileModuleOptions {
diff --git a/dev/core/src/com/google/gwt/dev/CompileModuleOptions.java b/dev/core/src/com/google/gwt/dev/CompileModuleOptions.java
deleted file mode 100644
index b3f6ee4..0000000
--- a/dev/core/src/com/google/gwt/dev/CompileModuleOptions.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright 2012 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.dev;
-
-import com.google.gwt.dev.util.arg.OptionOutDir;
-import com.google.gwt.dev.util.arg.OptionStrict;
-
-/**
- * The complete set of options for {@link CompileModule}.
- */
-public interface CompileModuleOptions extends CompileTaskOptions, OptionOutDir, OptionStrict {
-}
diff --git a/dev/core/src/com/google/gwt/dev/CompileTaskRunner.java b/dev/core/src/com/google/gwt/dev/CompileTaskRunner.java
index 914713d..7c65f6e 100644
--- a/dev/core/src/com/google/gwt/dev/CompileTaskRunner.java
+++ b/dev/core/src/com/google/gwt/dev/CompileTaskRunner.java
@@ -63,7 +63,7 @@
}
});
- compilerThread.setName("GWT Compiler Thread");
+ compilerThread.setName("GWTCompiler Thread");
compilerThread.start();
// TODO(jat): create an app frame for loggerWindow
diff --git a/dev/core/src/com/google/gwt/dev/DevelModeTabKey.java b/dev/core/src/com/google/gwt/dev/DevelModeTabKey.java
index 63f037e..f78b592 100644
--- a/dev/core/src/com/google/gwt/dev/DevelModeTabKey.java
+++ b/dev/core/src/com/google/gwt/dev/DevelModeTabKey.java
@@ -1,4 +1,4 @@
-/*
+/**
* Copyright 2009 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
diff --git a/dev/core/src/com/google/gwt/dev/Disconnectable.java b/dev/core/src/com/google/gwt/dev/Disconnectable.java
index 8c00318..ef42887 100644
--- a/dev/core/src/com/google/gwt/dev/Disconnectable.java
+++ b/dev/core/src/com/google/gwt/dev/Disconnectable.java
@@ -1,4 +1,4 @@
-/*
+/**
* Copyright 2009 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
diff --git a/dev/core/src/com/google/gwt/dev/GWTCompiler.java b/dev/core/src/com/google/gwt/dev/GWTCompiler.java
new file mode 100644
index 0000000..ef2e4ea
--- /dev/null
+++ b/dev/core/src/com/google/gwt/dev/GWTCompiler.java
@@ -0,0 +1,239 @@
+/*
+ * Copyright 2008 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.dev;
+
+import com.google.gwt.core.ext.TreeLogger;
+import com.google.gwt.core.ext.UnableToCompleteException;
+import com.google.gwt.core.ext.linker.ArtifactSet;
+import com.google.gwt.dev.CompileTaskRunner.CompileTask;
+import com.google.gwt.dev.cfg.ModuleDef;
+import com.google.gwt.dev.cfg.ModuleDefLoader;
+import com.google.gwt.dev.jjs.JJSOptions;
+import com.google.gwt.dev.jjs.PermutationResult;
+import com.google.gwt.dev.shell.CheckForUpdates;
+import com.google.gwt.dev.shell.CheckForUpdates.UpdateResult;
+import com.google.gwt.dev.util.FileBackedObject;
+import com.google.gwt.dev.util.Util;
+import com.google.gwt.dev.util.arg.ArgHandlerLocalWorkers;
+import com.google.gwt.dev.util.arg.ArgHandlerOutDir;
+import com.google.gwt.dev.util.arg.ArgHandlerWorkDirOptional;
+import com.google.gwt.dev.util.log.speedtracer.CompilerEventType;
+import com.google.gwt.dev.util.log.speedtracer.SpeedTracerLogger;
+import com.google.gwt.dev.util.log.speedtracer.SpeedTracerLogger.Event;
+import com.google.gwt.util.tools.ToolBase;
+import com.google.gwt.util.tools.Utility;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+import java.util.concurrent.FutureTask;
+
+/**
+ * The main executable entry point for the GWT Java to JavaScript compiler.
+ *
+ * @deprecated Use {@link Compiler} instead
+ */
+@Deprecated
+public class GWTCompiler {
+
+ static final class ArgProcessor extends PrecompileTaskArgProcessor {
+ public ArgProcessor(LegacyCompilerOptions options) {
+ super(options);
+
+ registerHandler(new ArgHandlerOutDir(options));
+
+ // Override the ArgHandlerWorkDirRequired in the super class.
+ registerHandler(new ArgHandlerWorkDirOptional(options));
+
+ registerHandler(new ArgHandlerLocalWorkers(options));
+ }
+
+ @Override
+ protected String getName() {
+ return GWTCompiler.class.getName();
+ }
+ }
+
+ /**
+ * Simple implementation of {@link LegacyCompilerOptions}.
+ */
+ public static class GWTCompilerOptionsImpl extends PrecompileTaskOptionsImpl
+ implements LegacyCompilerOptions {
+
+ private int localWorkers;
+ private File outDir;
+
+ public GWTCompilerOptionsImpl() {
+ }
+
+ public GWTCompilerOptionsImpl(LegacyCompilerOptions other) {
+ copyFrom(other);
+ }
+
+ public void copyFrom(LegacyCompilerOptions other) {
+ super.copyFrom(other);
+ setLocalWorkers(other.getLocalWorkers());
+ setOutDir(other.getOutDir());
+ }
+
+ @Override
+ public int getLocalWorkers() {
+ return localWorkers;
+ }
+
+ @Override
+ public File getOutDir() {
+ return outDir;
+ }
+
+ @Override
+ public void setLocalWorkers(int localWorkers) {
+ this.localWorkers = localWorkers;
+ }
+
+ @Override
+ public void setOutDir(File outDir) {
+ this.outDir = outDir;
+ }
+ }
+
+ public static void main(String[] args) {
+ ToolBase.legacyWarn(GWTCompiler.class, Compiler.class);
+ SpeedTracerLogger.init();
+ Event compileEvent = SpeedTracerLogger.start(CompilerEventType.COMPILE);
+
+ /*
+ * NOTE: main always exits with a call to System.exit to terminate any
+ * non-daemon threads that were started in Generators. Typically, this is to
+ * shutdown AWT related threads, since the contract for their termination is
+ * still implementation-dependent.
+ */
+ final LegacyCompilerOptions options = new GWTCompilerOptionsImpl();
+ boolean success = false;
+ if (new ArgProcessor(options).processArgs(args)) {
+ CompileTask task = new CompileTask() {
+ @Override
+ public boolean run(TreeLogger logger) throws UnableToCompleteException {
+ FutureTask<UpdateResult> updater = null;
+ if (!options.isUpdateCheckDisabled()) {
+ updater = CheckForUpdates.checkForUpdatesInBackgroundThread(logger,
+ CheckForUpdates.ONE_DAY);
+ }
+ boolean success = new GWTCompiler(options).run(logger);
+ if (success) {
+ CheckForUpdates.logUpdateAvailable(logger, updater);
+ }
+ return success;
+ }
+ };
+ if (CompileTaskRunner.runWithAppropriateLogger(options, task)) {
+ // Exit w/ success code.
+ success = true;
+ }
+ }
+
+ compileEvent.end();
+ // Exit w/ non-success code.
+ System.exit(success ? 0 : 1);
+ }
+
+ private final GWTCompilerOptionsImpl options;
+
+ public GWTCompiler(LegacyCompilerOptions options) {
+ this.options = new GWTCompilerOptionsImpl(options);
+ }
+
+ /**
+ * Compiles the set of modules specified in the options.
+ */
+ public boolean run(TreeLogger logger) throws UnableToCompleteException {
+ ModuleDef[] modules = new ModuleDef[options.getModuleNames().size()];
+ int i = 0;
+ for (String moduleName : options.getModuleNames()) {
+ modules[i++] = ModuleDefLoader.loadFromClassPath(logger, moduleName, true);
+ }
+ return run(logger, modules);
+ }
+
+ /**
+ * Compiles a specific set of modules.
+ */
+ public boolean run(TreeLogger logger, ModuleDef... modules)
+ throws UnableToCompleteException {
+ Event compileEvent = SpeedTracerLogger.start(CompilerEventType.COMPILE);
+ boolean tempWorkDir = false;
+ try {
+ if (options.getWorkDir() == null) {
+ options.setWorkDir(Utility.makeTemporaryDirectory(null, "gwtc"));
+ tempWorkDir = true;
+ }
+
+ for (ModuleDef module : modules) {
+ String moduleName = module.getName();
+
+ if (options.isValidateOnly()) {
+ if (!Precompile.validate(logger, options, module, options.getGenDir())) {
+ return false;
+ }
+ } else {
+ long compileStart = System.currentTimeMillis();
+ logger = logger.branch(TreeLogger.INFO, "Compiling module "
+ + moduleName);
+
+ // Optimize early since permutation compiles will run in process.
+ options.setOptimizePrecompile(true);
+ Precompilation precompilation = Precompile.precompile(logger,
+ options, module, options.getGenDir());
+
+ if (precompilation == null) {
+ return false;
+ }
+ Permutation[] allPerms = precompilation.getPermutations();
+ List<FileBackedObject<PermutationResult>> resultFiles = CompilePerms.makeResultFiles(
+ options.getCompilerWorkDir(moduleName), allPerms);
+ CompilePerms.compile(logger, precompilation, allPerms,
+ options.getLocalWorkers(), resultFiles);
+
+ ArtifactSet generatedArtifacts = precompilation.getGeneratedArtifacts();
+ JJSOptions precompileOptions = precompilation.getUnifiedAst().getOptions();
+
+ precompilation = null; // No longer needed, so save the memory
+
+ Link.legacyLink(logger.branch(TreeLogger.TRACE, "Linking into "
+ + options.getOutDir().getPath()), module, generatedArtifacts,
+ allPerms, resultFiles, options.getOutDir(), precompileOptions);
+
+ long compileDone = System.currentTimeMillis();
+ long delta = compileDone - compileStart;
+ if (logger.isLoggable(TreeLogger.INFO)) {
+ logger.log(TreeLogger.INFO, "Compilation succeeded -- "
+ + String.format("%.3f", delta / 1000d) + "s");
+ }
+ }
+ }
+ } catch (IOException e) {
+ logger.log(TreeLogger.ERROR, "Unable to create compiler work directory",
+ e);
+ return false;
+ } finally {
+ compileEvent.end();
+ if (tempWorkDir) {
+ Util.recursiveDelete(options.getWorkDir(), false);
+ }
+ }
+ return true;
+ }
+}
diff --git a/dev/core/src/com/google/gwt/dev/GWTShell.java b/dev/core/src/com/google/gwt/dev/GWTShell.java
new file mode 100644
index 0000000..77339ff
--- /dev/null
+++ b/dev/core/src/com/google/gwt/dev/GWTShell.java
@@ -0,0 +1,252 @@
+/*
+ * Copyright 2008 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.dev;
+
+import com.google.gwt.core.ext.TreeLogger;
+import com.google.gwt.core.ext.UnableToCompleteException;
+import com.google.gwt.core.ext.linker.ArtifactSet;
+import com.google.gwt.core.ext.linker.EmittedArtifact.Visibility;
+import com.google.gwt.core.ext.linker.impl.StandardLinkerContext;
+import com.google.gwt.dev.cfg.ModuleDef;
+import com.google.gwt.dev.shell.WorkDirs;
+import com.google.gwt.dev.shell.tomcat.EmbeddedTomcatServer;
+import com.google.gwt.dev.util.OutputFileSetOnDirectory;
+import com.google.gwt.dev.util.arg.ArgHandlerDisableUpdateCheck;
+import com.google.gwt.dev.util.arg.ArgHandlerOutDir;
+import com.google.gwt.util.tools.ArgHandlerExtra;
+
+import java.io.File;
+import java.util.Locale;
+import java.util.Set;
+
+/**
+ * The main executable class for the hosted mode shell.
+ */
+@Deprecated
+public class GWTShell extends DevModeBase {
+
+ /**
+ * Handles the list of startup urls that can be passed at the end of the
+ * command line.
+ */
+ protected static class ArgHandlerStartupURLsExtra extends ArgHandlerExtra {
+
+ private final OptionStartupURLs options;
+
+ public ArgHandlerStartupURLsExtra(OptionStartupURLs options) {
+ this.options = options;
+ }
+
+ @Override
+ public boolean addExtraArg(String arg) {
+ options.addStartupURL(arg);
+ return true;
+ }
+
+ @Override
+ public String getPurpose() {
+ return "Automatically launches the specified URL";
+ }
+
+ @Override
+ public String[] getTagArgs() {
+ return new String[] {"url"};
+ }
+ }
+
+ /**
+ * The GWTShell argument processor.
+ */
+ protected static class ArgProcessor extends DevModeBase.ArgProcessor {
+ public ArgProcessor(ShellOptionsImpl options, boolean forceServer,
+ boolean noURLs) {
+ super(options, forceServer);
+ if (!noURLs) {
+ registerHandler(new ArgHandlerStartupURLsExtra(options));
+ }
+ registerHandler(new ArgHandlerOutDir(options));
+ registerHandler(new ArgHandlerDisableUpdateCheck(options));
+ }
+
+ @Override
+ protected String getName() {
+ return GWTShell.class.getName();
+ }
+ }
+
+ /**
+ * Concrete class to implement all shell options.
+ */
+ protected static class ShellOptionsImpl extends HostedModeBaseOptionsImpl
+ implements WorkDirs, LegacyCompilerOptions {
+ private int localWorkers;
+ private File outDir;
+
+ public File getCompilerOutputDir(ModuleDef moduleDef) {
+ return new File(getOutDir(), moduleDef.getName());
+ }
+
+ public int getLocalWorkers() {
+ return localWorkers;
+ }
+
+ public File getOutDir() {
+ return outDir;
+ }
+
+ public File getShellPublicGenDir(ModuleDef moduleDef) {
+ File moduleWorkDir = new File(getWorkDir(), moduleDef.getName());
+ return new File(moduleWorkDir, "public");
+ }
+
+ @Override
+ public File getWorkDir() {
+ return new File(getOutDir(), ".gwt-tmp");
+ }
+
+ public void setLocalWorkers(int localWorkers) {
+ this.localWorkers = localWorkers;
+ }
+
+ public void setOutDir(File outDir) {
+ this.outDir = outDir;
+ }
+ }
+
+ public static String checkHost(String hostUnderConsideration,
+ Set<String> hosts) {
+ hostUnderConsideration = hostUnderConsideration.toLowerCase(Locale.ENGLISH);
+ for (String rule : hosts) {
+ // match on lowercased regex
+ if (hostUnderConsideration.matches(".*" + rule + ".*")) {
+ return rule;
+ }
+ }
+ return null;
+ }
+
+ public static String computeHostRegex(String url) {
+ // the entire URL up to the first slash not prefixed by a slash or colon.
+ String raw = url.split("(?<![:/])/")[0];
+ // escape the dots and put a begin line specifier on the result
+ return "^" + raw.replaceAll("[.]", "[.]");
+ }
+
+ public static String formatRules(Set<String> invalidHttpHosts) {
+ StringBuffer out = new StringBuffer();
+ for (String rule : invalidHttpHosts) {
+ out.append(rule);
+ out.append(" ");
+ }
+ return out.toString();
+ }
+
+ public static void main(String[] args) {
+ /*
+ * NOTE: main always exits with a call to System.exit to terminate any
+ * non-daemon threads that were started in Generators. Typically, this is to
+ * shutdown AWT related threads, since the contract for their termination is
+ * still implementation-dependent.
+ */
+ GWTShell gwtShell = new GWTShell();
+ ArgProcessor argProcessor = new ArgProcessor(gwtShell.options, false, false);
+ if (argProcessor.processArgs(args)) {
+ gwtShell.run();
+ // Exit w/ success code.
+ System.exit(0);
+ }
+ // Exit w/ non-success code.
+ System.exit(-1);
+ }
+
+ /**
+ * Hiding super field because it's actually the same object, just with a
+ * stronger type.
+ */
+ @SuppressWarnings("hiding")
+ protected final ShellOptionsImpl options = (ShellOptionsImpl) super.options;
+
+ protected File outDir;
+
+ @SuppressWarnings("unused")
+ public void restartServer(TreeLogger logger) throws UnableToCompleteException {
+ // Unimplemented.
+ }
+
+ @Override
+ protected HostedModeBaseOptions createOptions() {
+ return new ShellOptionsImpl();
+ }
+
+ @Override
+ protected void doShutDownServer() {
+ // Stop the HTTP server.
+ //
+ EmbeddedTomcatServer.stop();
+ }
+
+ @Override
+ protected boolean doStartup() {
+ File persistentCacheDir = new File(options.getWorkDir(), "gwt-unitCache");
+ return super.doStartup(persistentCacheDir);
+ }
+
+ @Override
+ protected int doStartUpServer() {
+ // TODO(jat): find a safe way to get an icon for Tomcat
+ TreeLogger logger = ui.getWebServerLogger("Tomcat", null);
+ // TODO(bruce): make tomcat work in terms of the modular launcher
+ String whyFailed = EmbeddedTomcatServer.start(isHeadless() ? getTopLogger()
+ : logger, getPort(), options, shouldAutoGenerateResources());
+
+ if (whyFailed != null) {
+ getTopLogger().log(TreeLogger.ERROR, "Starting Tomcat: " + whyFailed);
+ return -1;
+ }
+ return EmbeddedTomcatServer.getPort();
+ }
+
+ @Override
+ protected synchronized void produceOutput(TreeLogger logger,
+ StandardLinkerContext linkerStack, ArtifactSet artifacts,
+ ModuleDef module, boolean isRelink) throws UnableToCompleteException {
+ /*
+ * Legacy: in GWTShell we only copy generated artifacts into the public gen
+ * folder. Public files and "autogen" files have special handling (that
+ * needs to die).
+ */
+ if (isRelink) {
+ File outputDir = options.getShellPublicGenDir(module);
+ outputDir.mkdirs();
+ OutputFileSetOnDirectory outFileSet = new OutputFileSetOnDirectory(
+ outputDir, "");
+ linkerStack.produceOutput(logger, artifacts, Visibility.Public,
+ outFileSet);
+ outFileSet.close();
+ }
+ }
+
+ protected boolean shouldAutoGenerateResources() {
+ return true;
+ }
+
+ @Override
+ protected void warnAboutNoStartupUrls() {
+ getTopLogger().log(TreeLogger.WARN,
+ "No startup URLs were supplied -- add them to the end of the GWTShell"
+ + " command line");
+ }
+}
diff --git a/dev/core/src/com/google/gwt/dev/ModulePanel.java b/dev/core/src/com/google/gwt/dev/ModulePanel.java
index 07ed37e..a93957e 100644
--- a/dev/core/src/com/google/gwt/dev/ModulePanel.java
+++ b/dev/core/src/com/google/gwt/dev/ModulePanel.java
@@ -1,4 +1,4 @@
-/*
+/**
* Copyright 2008 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
diff --git a/dev/core/src/com/google/gwt/dev/ModuleTabPanel.java b/dev/core/src/com/google/gwt/dev/ModuleTabPanel.java
index 95b5ddd..434a0d5 100644
--- a/dev/core/src/com/google/gwt/dev/ModuleTabPanel.java
+++ b/dev/core/src/com/google/gwt/dev/ModuleTabPanel.java
@@ -1,4 +1,4 @@
-/*
+/**
* Copyright 2009 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
diff --git a/dev/core/src/com/google/gwt/dev/SessionModule.java b/dev/core/src/com/google/gwt/dev/SessionModule.java
index fb71456..7b25dbc 100644
--- a/dev/core/src/com/google/gwt/dev/SessionModule.java
+++ b/dev/core/src/com/google/gwt/dev/SessionModule.java
@@ -1,4 +1,4 @@
-/*
+/**
* Copyright 2009 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
diff --git a/dev/core/src/com/google/gwt/dev/WebServerPanel.java b/dev/core/src/com/google/gwt/dev/WebServerPanel.java
index 3505a15..62a121d 100644
--- a/dev/core/src/com/google/gwt/dev/WebServerPanel.java
+++ b/dev/core/src/com/google/gwt/dev/WebServerPanel.java
@@ -1,4 +1,4 @@
-/*
+/**
* Copyright 2008 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
diff --git a/dev/core/src/com/google/gwt/dev/cfg/ModuleDef.java b/dev/core/src/com/google/gwt/dev/cfg/ModuleDef.java
index 378ab1a..8d972e9 100644
--- a/dev/core/src/com/google/gwt/dev/cfg/ModuleDef.java
+++ b/dev/core/src/com/google/gwt/dev/cfg/ModuleDef.java
@@ -466,9 +466,9 @@
}
/**
- * For convenience in unit tests, servlets can be automatically loaded and
- * mapped in the embedded web server. If a servlet is already mapped to the
- * specified path, it is replaced.
+ * For convenience in hosted mode, servlets can be automatically loaded and
+ * delegated to via {@link com.google.gwt.dev.shell.GWTShellServlet}. If a
+ * servlet is already mapped to the specified path, it is replaced.
*
* @param path the url path at which the servlet resides
* @param servletClassName the name of the servlet to publish
diff --git a/dev/core/src/com/google/gwt/dev/cfg/ModuleDefLoader.java b/dev/core/src/com/google/gwt/dev/cfg/ModuleDefLoader.java
index 166723b..f7021d3 100644
--- a/dev/core/src/com/google/gwt/dev/cfg/ModuleDefLoader.java
+++ b/dev/core/src/com/google/gwt/dev/cfg/ModuleDefLoader.java
@@ -22,9 +22,11 @@
import com.google.gwt.dev.util.log.speedtracer.SpeedTracerLogger;
import com.google.gwt.dev.util.log.speedtracer.SpeedTracerLogger.Event;
import com.google.gwt.dev.util.xml.ReflectiveParser;
-import com.google.gwt.thirdparty.guava.common.collect.MapMaker;
import com.google.gwt.util.tools.Utility;
+import org.apache.commons.collections.map.AbstractReferenceMap;
+import org.apache.commons.collections.map.ReferenceMap;
+
import java.io.File;
import java.io.Reader;
import java.net.URISyntaxException;
@@ -55,8 +57,9 @@
* tight. The current context class loader used as a key for modules cache.
* The module's physical name is used as a key inside the cache.
*/
- private static final Map<ClassLoader, Map<String, ModuleDef>> loadedModulesCaches =
- new MapMaker().weakKeys().makeMap();
+ @SuppressWarnings("unchecked")
+ private static final Map<ClassLoader, Map<String, ModuleDef>> loadedModulesCaches = new ReferenceMap(
+ AbstractReferenceMap.WEAK, AbstractReferenceMap.HARD);
/**
* A mapping from effective to physical module names.
@@ -207,11 +210,12 @@
return moduleDef;
}
+ @SuppressWarnings("unchecked")
private static Map<String, ModuleDef> getModulesCache() {
ClassLoader keyClassLoader = Thread.currentThread().getContextClassLoader();
Map<String, ModuleDef> cache = loadedModulesCaches.get(keyClassLoader);
if (cache == null) {
- cache = new MapMaker().softValues().makeMap();
+ cache = new ReferenceMap(AbstractReferenceMap.HARD, AbstractReferenceMap.SOFT);
loadedModulesCaches.put(keyClassLoader, cache);
}
return cache;
diff --git a/dev/core/src/com/google/gwt/dev/etc/tomcat/conf/web.xml b/dev/core/src/com/google/gwt/dev/etc/tomcat/conf/web.xml
new file mode 100644
index 0000000..fee85f3
--- /dev/null
+++ b/dev/core/src/com/google/gwt/dev/etc/tomcat/conf/web.xml
@@ -0,0 +1,566 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!-- A tweaked version of the default Tomcat web.xml to remove everything except the stuff we want to use -->
+<web-app version="2.4">
+
+ <session-config>
+ <session-timeout>30</session-timeout>
+ </session-config>
+
+ <mime-mapping>
+ <extension>abs</extension>
+ <mime-type>audio/x-mpeg</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ai</extension>
+ <mime-type>application/postscript</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>aif</extension>
+ <mime-type>audio/x-aiff</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>aifc</extension>
+ <mime-type>audio/x-aiff</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>aiff</extension>
+ <mime-type>audio/x-aiff</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>aim</extension>
+ <mime-type>application/x-aim</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>art</extension>
+ <mime-type>image/x-jg</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>asf</extension>
+ <mime-type>video/x-ms-asf</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>asx</extension>
+ <mime-type>video/x-ms-asf</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>au</extension>
+ <mime-type>audio/basic</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>avi</extension>
+ <mime-type>video/x-msvideo</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>avx</extension>
+ <mime-type>video/x-rad-screenplay</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>bcpio</extension>
+ <mime-type>application/x-bcpio</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>bin</extension>
+ <mime-type>application/octet-stream</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>bmp</extension>
+ <mime-type>image/bmp</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>body</extension>
+ <mime-type>text/html</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>cdf</extension>
+ <mime-type>application/x-cdf</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>cer</extension>
+ <mime-type>application/x-x509-ca-cert</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>class</extension>
+ <mime-type>application/java</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>cpio</extension>
+ <mime-type>application/x-cpio</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>csh</extension>
+ <mime-type>application/x-csh</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>css</extension>
+ <mime-type>text/css</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>dib</extension>
+ <mime-type>image/bmp</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>doc</extension>
+ <mime-type>application/msword</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>dtd</extension>
+ <mime-type>text/plain</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>dv</extension>
+ <mime-type>video/x-dv</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>dvi</extension>
+ <mime-type>application/x-dvi</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>eps</extension>
+ <mime-type>application/postscript</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>etx</extension>
+ <mime-type>text/x-setext</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>exe</extension>
+ <mime-type>application/octet-stream</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>gif</extension>
+ <mime-type>image/gif</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>gtar</extension>
+ <mime-type>application/x-gtar</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>gz</extension>
+ <mime-type>application/x-gzip</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>hdf</extension>
+ <mime-type>application/x-hdf</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>hqx</extension>
+ <mime-type>application/mac-binhex40</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>htc</extension>
+ <mime-type>text/x-component</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>htm</extension>
+ <mime-type>text/html</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>html</extension>
+ <mime-type>text/html</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>hqx</extension>
+ <mime-type>application/mac-binhex40</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ief</extension>
+ <mime-type>image/ief</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>jad</extension>
+ <mime-type>text/vnd.sun.j2me.app-descriptor</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>jar</extension>
+ <mime-type>application/java-archive</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>java</extension>
+ <mime-type>text/plain</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>jnlp</extension>
+ <mime-type>application/x-java-jnlp-file</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>jpe</extension>
+ <mime-type>image/jpeg</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>jpeg</extension>
+ <mime-type>image/jpeg</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>jpg</extension>
+ <mime-type>image/jpeg</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>js</extension>
+ <mime-type>text/javascript</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>jsf</extension>
+ <mime-type>text/plain</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>jspf</extension>
+ <mime-type>text/plain</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>kar</extension>
+ <mime-type>audio/x-midi</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>latex</extension>
+ <mime-type>application/x-latex</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>m3u</extension>
+ <mime-type>audio/x-mpegurl</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mac</extension>
+ <mime-type>image/x-macpaint</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>man</extension>
+ <mime-type>application/x-troff-man</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>me</extension>
+ <mime-type>application/x-troff-me</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mid</extension>
+ <mime-type>audio/x-midi</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>midi</extension>
+ <mime-type>audio/x-midi</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mif</extension>
+ <mime-type>application/x-mif</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mov</extension>
+ <mime-type>video/quicktime</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>movie</extension>
+ <mime-type>video/x-sgi-movie</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mp1</extension>
+ <mime-type>audio/x-mpeg</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mp2</extension>
+ <mime-type>audio/x-mpeg</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mp3</extension>
+ <mime-type>audio/x-mpeg</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mpa</extension>
+ <mime-type>audio/x-mpeg</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mpe</extension>
+ <mime-type>video/mpeg</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mpeg</extension>
+ <mime-type>video/mpeg</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mpega</extension>
+ <mime-type>audio/x-mpeg</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mpg</extension>
+ <mime-type>video/mpeg</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>mpv2</extension>
+ <mime-type>video/mpeg2</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ms</extension>
+ <mime-type>application/x-wais-source</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>nc</extension>
+ <mime-type>application/x-netcdf</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>oda</extension>
+ <mime-type>application/oda</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>pbm</extension>
+ <mime-type>image/x-portable-bitmap</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>pct</extension>
+ <mime-type>image/pict</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>pdf</extension>
+ <mime-type>application/pdf</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>pgm</extension>
+ <mime-type>image/x-portable-graymap</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>pic</extension>
+ <mime-type>image/pict</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>pict</extension>
+ <mime-type>image/pict</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>pls</extension>
+ <mime-type>audio/x-scpls</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>png</extension>
+ <mime-type>image/png</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>pnm</extension>
+ <mime-type>image/x-portable-anymap</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>pnt</extension>
+ <mime-type>image/x-macpaint</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ppm</extension>
+ <mime-type>image/x-portable-pixmap</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ppt</extension>
+ <mime-type>application/powerpoint</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ps</extension>
+ <mime-type>application/postscript</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>psd</extension>
+ <mime-type>image/x-photoshop</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>qt</extension>
+ <mime-type>video/quicktime</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>qti</extension>
+ <mime-type>image/x-quicktime</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>qtif</extension>
+ <mime-type>image/x-quicktime</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ras</extension>
+ <mime-type>image/x-cmu-raster</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>rgb</extension>
+ <mime-type>image/x-rgb</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>rm</extension>
+ <mime-type>application/vnd.rn-realmedia</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>roff</extension>
+ <mime-type>application/x-troff</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>rtf</extension>
+ <mime-type>application/rtf</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>rtx</extension>
+ <mime-type>text/richtext</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>sh</extension>
+ <mime-type>application/x-sh</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>shar</extension>
+ <mime-type>application/x-shar</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>smf</extension>
+ <mime-type>audio/x-midi</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>sit</extension>
+ <mime-type>application/x-stuffit</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>snd</extension>
+ <mime-type>audio/basic</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>src</extension>
+ <mime-type>application/x-wais-source</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>sv4cpio</extension>
+ <mime-type>application/x-sv4cpio</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>sv4crc</extension>
+ <mime-type>application/x-sv4crc</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>swf</extension>
+ <mime-type>application/x-shockwave-flash</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>t</extension>
+ <mime-type>application/x-troff</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>tar</extension>
+ <mime-type>application/x-tar</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>tcl</extension>
+ <mime-type>application/x-tcl</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>tex</extension>
+ <mime-type>application/x-tex</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>texi</extension>
+ <mime-type>application/x-texinfo</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>texinfo</extension>
+ <mime-type>application/x-texinfo</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>tif</extension>
+ <mime-type>image/tiff</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>tiff</extension>
+ <mime-type>image/tiff</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>tr</extension>
+ <mime-type>application/x-troff</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>tsv</extension>
+ <mime-type>text/tab-separated-values</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>txt</extension>
+ <mime-type>text/plain</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ulw</extension>
+ <mime-type>audio/basic</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>ustar</extension>
+ <mime-type>application/x-ustar</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>xbm</extension>
+ <mime-type>image/x-xbitmap</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>xht</extension>
+ <mime-type>application/xhtml+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>xhtml</extension>
+ <mime-type>application/xhtml+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>xml</extension>
+ <mime-type>text/xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>xpm</extension>
+ <mime-type>image/x-xpixmap</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>xsl</extension>
+ <mime-type>text/xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>xwd</extension>
+ <mime-type>image/x-xwindowdump</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>wav</extension>
+ <mime-type>audio/x-wav</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>svg</extension>
+ <mime-type>image/svg+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>svgz</extension>
+ <mime-type>image/svg+xml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>vsd</extension>
+ <mime-type>application/x-visio</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <!-- Wireless Bitmap -->
+ <extension>wbmp</extension>
+ <mime-type>image/vnd.wap.wbmp</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <!-- WML Source -->
+ <extension>wml</extension>
+ <mime-type>text/vnd.wap.wml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <!-- Compiled WML -->
+ <extension>wmlc</extension>
+ <mime-type>application/vnd.wap.wmlc</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <!-- WML Script Source -->
+ <extension>wmls</extension>
+ <mime-type>text/vnd.wap.wmlscript</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <!-- Compiled WML Script -->
+ <extension>wmlscriptc</extension>
+ <mime-type>application/vnd.wap.wmlscriptc</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>wrl</extension>
+ <mime-type>x-world/x-vrml</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>Z</extension>
+ <mime-type>application/x-compress</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>z</extension>
+ <mime-type>application/x-compress</mime-type>
+ </mime-mapping>
+ <mime-mapping>
+ <extension>zip</extension>
+ <mime-type>application/zip</mime-type>
+ </mime-mapping>
+</web-app>
diff --git a/dev/core/src/com/google/gwt/dev/etc/tomcat/webapps/ROOT/WEB-INF/web.xml b/dev/core/src/com/google/gwt/dev/etc/tomcat/webapps/ROOT/WEB-INF/web.xml
new file mode 100644
index 0000000..e600b2f
--- /dev/null
+++ b/dev/core/src/com/google/gwt/dev/etc/tomcat/webapps/ROOT/WEB-INF/web.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<web-app>
+
+ <servlet>
+ <servlet-name>shell</servlet-name>
+ <servlet-class>com.google.gwt.dev.shell.GWTShellServlet</servlet-class>
+ </servlet>
+
+ <servlet-mapping>
+ <servlet-name>shell</servlet-name>
+ <url-pattern>/*</url-pattern>
+ </servlet-mapping>
+
+</web-app>
diff --git a/dev/core/src/com/google/gwt/dev/javac/CompilationUnit.java b/dev/core/src/com/google/gwt/dev/javac/CompilationUnit.java
index 53e30a8..3db7676 100644
--- a/dev/core/src/com/google/gwt/dev/javac/CompilationUnit.java
+++ b/dev/core/src/com/google/gwt/dev/javac/CompilationUnit.java
@@ -60,42 +60,16 @@
*/
List<String> classNames = new ArrayList<String>();
- int expectCode;
- int sawCode;
-
public List<String> getInnerClassNames() {
return classNames;
}
- /**
- * Return whether or not the class file visited was well-formed.
- * Currently, this only checks that all non-abstract, non-native methods
- * have a Code attribute.
- */
- public boolean isWellFormed() {
- return expectCode == sawCode;
- }
-
@Override
public void visitInnerClass(String name, String outerName, String innerName, int access) {
if ((access & Opcodes.ACC_SYNTHETIC) == 0) {
classNames.add(name);
}
}
-
- @Override
- public AnonymousClassVisitor visitMethod(int access, String name, String desc, String signature,
- String[] exceptions) {
- if ((access & (Opcodes.ACC_ABSTRACT | Opcodes.ACC_NATIVE)) == 0) {
- ++expectCode;
- }
- return this;
- }
-
- @Override
- public void visitCode() {
- ++sawCode;
- }
}
private final List<String> classesToScan;
@@ -127,18 +101,6 @@
continue;
}
- AnonymousClassVisitor cv = new AnonymousClassVisitor();
- new ClassReader(classBytes).accept(cv, 0);
- if (!cv.isWellFormed()) {
- /*
- * Weird case #2: As of OpenJDK 7, javac in the above case now does
- * generate a class file, but an incomplete one that fails to load
- * with a ClassFormatError "Absent Code attribute in method that
- * is not native or abstract in class file" error.
- */
- continue;
- }
-
/*
* Add the class to the list only if it can be loaded to get around the
* javac weirdness issue where javac refers a class but does not
@@ -147,6 +109,8 @@
if (isClassnameGenerated(lookupName) && !allGeneratedClasses.contains(lookupName)) {
allGeneratedClasses.add(lookupName);
}
+ AnonymousClassVisitor cv = new AnonymousClassVisitor();
+ new ClassReader(classBytes).accept(cv, 0);
List<String> innerClasses = cv.getInnerClassNames();
for (String innerClass : innerClasses) {
// The innerClass has to be an inner class of the lookupName
diff --git a/dev/core/src/com/google/gwt/dev/javac/MemoryUnitCache.java b/dev/core/src/com/google/gwt/dev/javac/MemoryUnitCache.java
index 875ce26..971a1d8 100644
--- a/dev/core/src/com/google/gwt/dev/javac/MemoryUnitCache.java
+++ b/dev/core/src/com/google/gwt/dev/javac/MemoryUnitCache.java
@@ -16,8 +16,11 @@
package com.google.gwt.dev.javac;
import com.google.gwt.core.ext.TreeLogger;
-import com.google.gwt.thirdparty.guava.common.collect.MapMaker;
+import org.apache.commons.collections.map.AbstractReferenceMap;
+import org.apache.commons.collections.map.ReferenceMap;
+
+import java.util.Collections;
import java.util.Map;
/**
@@ -76,13 +79,17 @@
*
* The key is resource path.
*/
- protected final Map<String, UnitCacheEntry> unitMap = new MapMaker().softValues().makeMap();
+ @SuppressWarnings("unchecked")
+ protected final Map<String, UnitCacheEntry> unitMap = Collections
+ .synchronizedMap(new ReferenceMap(AbstractReferenceMap.HARD, AbstractReferenceMap.SOFT));
/**
* References {@link CompilationUnit} objects by {@link ContentId}, which is
* composed of the type name and a hash on the source code contents.
*/
- protected final Map<ContentId, UnitCacheEntry> unitMapByContentId = new MapMaker().softValues().makeMap();
+ @SuppressWarnings("unchecked")
+ protected final Map<ContentId, UnitCacheEntry> unitMapByContentId = Collections
+ .synchronizedMap(new ReferenceMap(AbstractReferenceMap.HARD, AbstractReferenceMap.SOFT));
/**
* Adds a new entry into the cache.
diff --git a/dev/core/src/com/google/gwt/dev/javac/typemodel/TypeOracle.java b/dev/core/src/com/google/gwt/dev/javac/typemodel/TypeOracle.java
index de16ed7..334fcd0 100644
--- a/dev/core/src/com/google/gwt/dev/javac/typemodel/TypeOracle.java
+++ b/dev/core/src/com/google/gwt/dev/javac/typemodel/TypeOracle.java
@@ -28,7 +28,10 @@
import com.google.gwt.dev.util.Name;
import com.google.gwt.dev.util.collect.HashMap;
import com.google.gwt.dev.util.collect.IdentityHashMap;
-import com.google.gwt.thirdparty.guava.common.collect.MapMaker;
+
+import org.apache.commons.collections.map.AbstractReferenceMap;
+import org.apache.commons.collections.map.ReferenceIdentityMap;
+import org.apache.commons.collections.map.ReferenceMap;
import java.lang.annotation.Annotation;
import java.util.ArrayList;
@@ -280,7 +283,9 @@
* Cached types that represent Arrays of other types. These types are created
* as needed.
*/
- private final Map<JType, JArrayType> arrayTypes = new MapMaker().weakKeys().weakValues().makeMap();
+ @SuppressWarnings("unchecked")
+ private final Map<JType, JArrayType> arrayTypes = new ReferenceIdentityMap(
+ AbstractReferenceMap.WEAK, AbstractReferenceMap.WEAK, true);
/**
* Cached singleton type representing <code>java.lang.Object</code>.
@@ -304,8 +309,9 @@
* Subclasses of generic types that have type parameters filled in. These
* types are created as needed.
*/
+ @SuppressWarnings("unchecked")
private final Map<ParameterizedTypeKey, JParameterizedType> parameterizedTypes =
- new MapMaker().weakValues().makeMap();
+ new ReferenceMap(AbstractReferenceMap.HARD, AbstractReferenceMap.WEAK, true);
/**
* A list of recently-added types that will be fully initialized on the next
@@ -315,7 +321,9 @@
private JWildcardType unboundWildCardType;
- private final Map<WildCardKey, JWildcardType> wildcardTypes = new MapMaker().weakValues().makeMap();
+ @SuppressWarnings("unchecked")
+ private final Map<WildCardKey, JWildcardType> wildcardTypes = new ReferenceMap(
+ AbstractReferenceMap.HARD, AbstractReferenceMap.WEAK, true);
public TypeOracle() {
// Always create the default package.
diff --git a/dev/core/src/com/google/gwt/dev/jjs/AstConstructor.java b/dev/core/src/com/google/gwt/dev/jjs/AstConstructor.java
index 73333a6..8826981 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/AstConstructor.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/AstConstructor.java
@@ -66,8 +66,8 @@
JProgram jprogram = new JProgram();
JsProgram jsProgram = new JsProgram();
- UnifyAst unifyAst = new UnifyAst(logger, jprogram, jsProgram, options, rpo);
- unifyAst.buildEverything();
+ UnifyAst unifyAst = new UnifyAst(jprogram, jsProgram, options, rpo);
+ unifyAst.buildEverything(logger);
// Compute all super type/sub type info
jprogram.typeOracle.computeBeforeAST();
diff --git a/dev/core/src/com/google/gwt/dev/jjs/CorrelationFactory.java b/dev/core/src/com/google/gwt/dev/jjs/CorrelationFactory.java
index 8e13492..c8b99cb 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/CorrelationFactory.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/CorrelationFactory.java
@@ -21,9 +21,11 @@
import com.google.gwt.dev.jjs.ast.JField;
import com.google.gwt.dev.jjs.ast.JMethod;
import com.google.gwt.dev.jjs.ast.JType;
-import com.google.gwt.thirdparty.guava.common.collect.MapMaker;
+
+import org.apache.commons.collections.map.ReferenceMap;
import java.io.Serializable;
+import java.util.Collections;
import java.util.EnumMap;
import java.util.Map;
@@ -110,7 +112,9 @@
/**
* This cuts down on the total number of Correlation objects allocated.
*/
- private final Map<Object, Correlation> canonicalMap = new MapMaker().weakKeys().weakValues().makeMap();
+ @SuppressWarnings("unchecked")
+ private final Map<Object, Correlation> canonicalMap = Collections
+ .synchronizedMap(new ReferenceMap(ReferenceMap.WEAK, ReferenceMap.WEAK));
private RealCorrelationFactory() {
}
diff --git a/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java b/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
index e1a6180..042e145 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
@@ -485,32 +485,21 @@
PermutationResult toReturn =
new PermutationResultImpl(js, permutation, makeSymbolMap(symbolTable, jsProgram), ranges);
CompilationMetricsArtifact compilationMetrics = null;
-
// TODO: enable this when ClosureCompiler is enabled
- if (options.isCompilerMetricsEnabled()) {
- if (options.isClosureCompilerEnabled()) {
- logger.log(TreeLogger.WARN, "Incompatible options: -XenableClosureCompiler and "
- + "-XcompilerMetric; ignoring -XcompilerMetric.");
- } else {
- compilationMetrics = new CompilationMetricsArtifact(permutation.getId());
- compilationMetrics.setCompileElapsedMilliseconds(System.currentTimeMillis()
- - startTimeMilliseconds);
- compilationMetrics.setElapsedMilliseconds(System.currentTimeMillis()
- - ManagementFactory.getRuntimeMXBean().getStartTime());
- compilationMetrics.setJsSize(sizeBreakdowns);
- compilationMetrics.setPermutationDescription(permutation.prettyPrint());
- toReturn.addArtifacts(Lists.create(unifiedAst.getModuleMetrics(), unifiedAst
- .getPrecompilationMetrics(), compilationMetrics));
- }
+ if (!options.isClosureCompilerEnabled() && options.isCompilerMetricsEnabled()) {
+ compilationMetrics = new CompilationMetricsArtifact(permutation.getId());
+ compilationMetrics.setCompileElapsedMilliseconds(System.currentTimeMillis()
+ - startTimeMilliseconds);
+ compilationMetrics.setElapsedMilliseconds(System.currentTimeMillis()
+ - ManagementFactory.getRuntimeMXBean().getStartTime());
+ compilationMetrics.setJsSize(sizeBreakdowns);
+ compilationMetrics.setPermutationDescription(permutation.prettyPrint());
+ toReturn.addArtifacts(Lists.create(unifiedAst.getModuleMetrics(), unifiedAst
+ .getPrecompilationMetrics(), compilationMetrics));
}
// TODO: enable this when ClosureCompiler is enabled
- if (options.isClosureCompilerEnabled()) {
- if (options.isSoycEnabled()) {
- logger.log(TreeLogger.WARN, "Incompatible options: -XenableClosureCompiler and "
- + "-compileReport; ignoring -compileReport.");
- }
- } else {
+ if (!options.isClosureCompilerEnabled()) {
toReturn.addArtifacts(makeSoycArtifacts(logger, permutationId, jprogram, js, sizeBreakdowns,
options.isSoycExtra() ? sourceInfoMaps : null, dependencies, jjsmap, obfuscateMap,
unifiedAst.getModuleMetrics(), unifiedAst.getPrecompilationMetrics(), compilationMetrics,
@@ -518,15 +507,10 @@
}
// TODO: enable this when ClosureCompiler is enabled
- if (isSourceMapsEnabled) {
- if (options.isClosureCompilerEnabled()) {
- logger.log(TreeLogger.WARN, "Incompatible options: -XenableClosureCompiler and "
- + "compiler.useSourceMaps=true; ignoring compiler.useSourceMaps=true.");
- } else {
- logger.log(TreeLogger.INFO, "Source Maps Enabled");
- toReturn.addArtifacts(SourceMapRecorder.makeSourceMapArtifacts(sourceInfoMaps,
- permutationId));
- }
+ if (!options.isClosureCompilerEnabled() && isSourceMapsEnabled) {
+ logger.log(TreeLogger.INFO, "Source Maps Enabled");
+ toReturn.addArtifacts(SourceMapRecorder.makeSourceMapArtifacts(sourceInfoMaps,
+ permutationId));
}
logTrackingStats(logger);
@@ -633,11 +617,11 @@
try {
// (2) Assemble the Java AST.
- UnifyAst unifyAst = new UnifyAst(logger, jprogram, jsProgram, options, rpo);
+ UnifyAst unifyAst = new UnifyAst(jprogram, jsProgram, options, rpo);
unifyAst.addRootTypes(allRootTypes);
// TODO: move this into UnifyAst?
findEntryPoints(logger, rpo, declEntryPts, jprogram);
- unifyAst.exec();
+ unifyAst.exec(logger);
List<String> finalTypeOracleTypes = Lists.create();
if (precompilationMetrics != null) {
diff --git a/dev/core/src/com/google/gwt/dev/jjs/ast/JConstructor.java b/dev/core/src/com/google/gwt/dev/jjs/ast/JConstructor.java
index 1986666..6864453 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/ast/JConstructor.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/ast/JConstructor.java
@@ -74,11 +74,6 @@
return getEnclosingType().getNonNull();
}
- @Override
- public boolean isConstructor() {
- return true;
- }
-
/**
* Returns <code>true</code> if this constructor does no real work.
*
diff --git a/dev/core/src/com/google/gwt/dev/jjs/ast/JDeclaredType.java b/dev/core/src/com/google/gwt/dev/jjs/ast/JDeclaredType.java
index 1b9dc03..7b127d2 100755
--- a/dev/core/src/com/google/gwt/dev/jjs/ast/JDeclaredType.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/ast/JDeclaredType.java
@@ -27,22 +27,7 @@
import java.util.List;
/**
- * Base class for any declared type.
- *
- * Declared types have fields and methods. Two of the methods are treated specially: the class
- * initializer method (named <code>$clinit</code>) and the instance initializer method
- * (named <code>$init</code>).
- *
- * The class initializer method is responsible for initializing all class variables as well as
- * those of the superclasses (by calling the superclass class initializer method).
- *
- * The instance initializer is responsible for initializing all instance variables as well as those
- * of the superclasses (by calling the superclass instance initializer method).
- *
- * Optimizations may eliminate class initializers (<code>$clinit</code>) if no static variables need
- * initialization, and use the private variable <code>clinitTarget</code>to keep track which
- * initializer in the superclass chain needs to be called.
- *
+ * Base class for any reference type.
*/
public abstract class JDeclaredType extends JReferenceType {
@@ -63,8 +48,8 @@
protected transient List<JMethod> methods = Lists.create();
/**
- * Tracks the target static initialization for this class. Default to self (if it has a non
- * empty initializer) or point to a superclass or be null.
+ * Tracks the target static initialization for this class. Default to self
+ * until removed or set to be a superclass.
*/
private JDeclaredType clinitTarget = this;
@@ -89,26 +74,6 @@
*/
private List<JInterfaceType> superInterfaces = Lists.create();
- /**
- * Determines whether a subclass of this type is in the collection <code>types</code>.
- *
- * @param types a collections of types.
- * @return the first subtype found in the collection if the collection <code>types</code>
- * contains a subtype of this type; null otherwise.
- */
- public JDeclaredType findSubtype(Iterable<JDeclaredType> types) {
- for (JDeclaredType type : types) {
- JDeclaredType tp = type;
- while (tp != null) {
- if (this == tp) {
- return type;
- }
- tp = tp.getSuperClass();
- }
- }
- return null;
- }
-
public JDeclaredType(SourceInfo info, String name) {
super(info, name);
}
@@ -135,12 +100,8 @@
/**
* Adds a method to this type.
*/
- public final void addMethod(JMethod method) {
+ public void addMethod(JMethod method) {
assert method.getEnclosingType() == this;
- assert !method.getName().equals("$clinit") || getMethods().size() == 0 : "Attempted adding "
- + "$clinit method with index != 0";
- assert !method.getName().equals("$init") || getMethods().size() == 1 : "Attempted adding $init "
- + "method with index != 1";
methods = Lists.add(methods, method);
}
@@ -179,40 +140,10 @@
}
/**
- * Returns the instance initializer ($init) method.
- * Can only be called after making sure the class has an instance initializer method.
- *
- * @return The instance initializer method.
- */
- public final JMethod getInitMethod() {
- assert getMethods().size() > 1;
- JMethod init = this.getMethods().get(1);
-
- assert init != null;
- assert init.getName().equals("$init");
- return init;
- }
-
- /**
- * Returns the class initializer method.
- * Can only be called after making sure the class has a class initializer method.
- *
- * @return The class initializer method.
- */
- public final JMethod getClinitMethod() {
- assert getMethods().size() != 0;
- JMethod clinit = this.getMethods().get(0);
-
- assert clinit != null;
- assert clinit.getName().equals("$clinit");
- return clinit;
- }
-
- /**
* Returns the class that must be initialized to use this class. May be a
* superclass, or <code>null</code> if this class has no static initializer.
*/
- public final JDeclaredType getClinitTarget() {
+ public JDeclaredType getClinitTarget() {
return clinitTarget;
}
@@ -255,7 +186,7 @@
* Returns this type's declared methods; does not include methods defined in a
* super type unless they are overridden by this type.
*/
- public final List<JMethod> getMethods() {
+ public List<JMethod> getMethods() {
return methods;
}
@@ -287,7 +218,7 @@
* Removes the field at the specified index.
*/
public void removeField(int i) {
- assert !isExternal() : "External types can not be modified.";
+ assert !isExternal() : "External types can not be modiified.";
fields = Lists.remove(fields, i);
}
@@ -295,23 +226,11 @@
* Removes the method at the specified index.
*/
public void removeMethod(int i) {
- assert !isExternal() : "External types can not be modified.";
+ assert !isExternal() : "External types can not be modiified.";
methods = Lists.remove(methods, i);
}
/**
- * Resets the clinitTarget to the current class. Used by optimizations that move initializers from
- * superclasses down.
- *
- * Prerequisite: the $clinit method must exist and be non empty.
- */
- public void resetClinitTarget() {
- assert !((JMethodBody) getClinitMethod().getBody()).getStatements().isEmpty() : "Attempted to "
- + "reset the clinitTarget to an empty $clinit";
- this.clinitTarget = this;
- }
-
- /**
* Resolves external references during AST stitching.
*/
public void resolve(List<JInterfaceType> resolvedInterfaces, List<JNode> resolvedRescues) {
diff --git a/dev/core/src/com/google/gwt/dev/jjs/ast/JInstanceOf.java b/dev/core/src/com/google/gwt/dev/jjs/ast/JInstanceOf.java
index 53c46e3..675fcf0 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/ast/JInstanceOf.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/ast/JInstanceOf.java
@@ -45,7 +45,7 @@
@Override
public boolean hasSideEffects() {
- return expr.hasSideEffects();
+ return false;
}
/**
diff --git a/dev/core/src/com/google/gwt/dev/jjs/ast/JMethod.java b/dev/core/src/com/google/gwt/dev/jjs/ast/JMethod.java
index dede802..1f23013 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/ast/JMethod.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/ast/JMethod.java
@@ -249,11 +249,7 @@
sb.append(type.getJsniSignatureName());
}
sb.append(')');
- if (!isConstructor()) {
- sb.append(getOriginalReturnType().getJsniSignatureName());
- } else {
- sb.append(" <init>");
- }
+ sb.append(getOriginalReturnType().getJsniSignatureName());
signature = sb.toString();
}
return signature;
@@ -271,10 +267,6 @@
return isAbstract;
}
- public boolean isConstructor() {
- return false;
- }
-
public boolean isDefault() {
return access == AccessModifier.DEFAULT.ordinal();
}
diff --git a/dev/core/src/com/google/gwt/dev/jjs/ast/JProgram.java b/dev/core/src/com/google/gwt/dev/jjs/ast/JProgram.java
index bcc1331..ad4542f 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/ast/JProgram.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/ast/JProgram.java
@@ -231,7 +231,7 @@
public static boolean isClinit(JMethod method) {
JDeclaredType enclosingType = method.getEnclosingType();
- if ((enclosingType != null) && (method == enclosingType.getClinitMethod())) {
+ if ((enclosingType != null) && (method == enclosingType.getMethods().get(0))) {
assert (method.getName().equals("$clinit"));
return true;
} else {
diff --git a/dev/core/src/com/google/gwt/dev/jjs/ast/JTypeOracle.java b/dev/core/src/com/google/gwt/dev/jjs/ast/JTypeOracle.java
index 5963dd1..8850cb6 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/ast/JTypeOracle.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/ast/JTypeOracle.java
@@ -729,7 +729,7 @@
// Track that we've been seen.
alreadySeen.add(type);
- JMethod method = type.getClinitMethod();
+ JMethod method = type.getMethods().get(0);
assert (JProgram.isClinit(method));
CheckClinitVisitor v = new CheckClinitVisitor();
v.accept(method);
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/CodeSplitter2.java b/dev/core/src/com/google/gwt/dev/jjs/impl/CodeSplitter2.java
index 2c871f4..347088d 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/CodeSplitter2.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/CodeSplitter2.java
@@ -589,19 +589,8 @@
return union;
}
- /**
- * Performs set difference of <code>all - liveWithoutEntry</code> and confirms the result is in
- * <code>liveFromSplitPoint</code>. Resulting program statements are recorded in a map
- * that for each statement indicates it's fragment destination.
- * @param splitPoint splitPoint number
- * @param map map of statement to splitpoint number
- * @param liveWithoutEntry everything live except that reachable from split point
- * @param all everything reachable in the entire program
- * @param liveFromSplitPoint everything live from the split point, including leftovers
- * @param <T> the type of node (field, method, etc) in the map
- */
- private static <T> void updateReverseMap(int splitPoint, Map<T, Integer> map, Set<?> liveWithoutEntry,
- Iterable<T> all, Set<?> liveFromSplitPoint) {
+ private static <T> void updateReverseMap(int entry, Map<T, Integer> map, Set<?> liveWithoutEntry,
+ Iterable<T> all) {
for (T each : all) {
if (!liveWithoutEntry.contains(each)) {
/*
@@ -611,11 +600,7 @@
* been reached. Thus, it can be downloaded along with either i's or j's
* code.
*/
- if (!liveFromSplitPoint.contains(each)) {
- // complement says it should be live, but it is not actually live within the splitpoint
- } else {
- map.put(each, splitPoint);
- }
+ map.put(each, entry);
}
}
}
@@ -657,7 +642,7 @@
/**
* Maps a split-point number to a fragment number.
- *
+ *
* splitPointToFragmmentMap[x] = y implies split point #x is in fragment #y.
*
* TODO(acleung): We could use some better abstraction for this. I feel this
@@ -731,27 +716,6 @@
}
/**
- * Compute everything reachable from the set of input split points.
- * @param liveAfterInitialSequence everything live in initial fragment
- * @param splitPoints list of split points to start from
- * @return
- */
- private ControlFlowAnalyzer computeAllLiveFromSplitPoints(
- ControlFlowAnalyzer liveAfterInitialSequence, List<Integer> splitPoints) {
- ControlFlowAnalyzer cfa = new ControlFlowAnalyzer(liveAfterInitialSequence);
- for (JRunAsync otherRunAsync : jprogram.getRunAsyncs()) {
- if (isInitial(otherRunAsync.getSplitPoint())) {
- continue;
- }
- if (!splitPoints.contains(otherRunAsync.getSplitPoint())) {
- continue;
- }
- cfa.traverseFromRunAsync(otherRunAsync);
- }
- return cfa;
- }
-
- /**
* Compute a CFA that covers the entire live code of the program.
*/
private ControlFlowAnalyzer computeCompleteCfa() {
@@ -809,21 +773,7 @@
// Step #7: Replaces the splitpoint number with the new fragment number.
replaceFragmentId();
}
-
- /**
- * Given the set of code initially live, and a set of splitpoints grouped into fragments:
- * The core algorithm to compute exclusive merged fragments is as follows:
- * For each fragment (grouping of merged splitpoint numbers)
- * 1) compute the set of live statements of every splitpoint EXCEPT those in the fragment
- * 2) compute the set of live statements reachable from those in the fragment
- * 3) calculate a set difference of everything live minus the results of step 1
- * 4) filter results by checking for membership in the results of step 2
- * 5) assign resulting live code to this fragment (recorded in a map)
- *
- * The results of these steps are then used to extract individual JavaScript chunks
- * into blocks corresponding to fragments which are ultimately written to disk.
- * @param initiallyLive the CFA of code live from the entry point (initial fragments)
- */
+
private void extractStatements(ControlFlowAnalyzer initiallyLive) {
Map<Integer, List<JsStatement>> fragmentStats = new LinkedHashMap<Integer, List<JsStatement>>();
@@ -898,20 +848,14 @@
}
ControlFlowAnalyzer allButOne = computeAllButNCfas(liveAfterInitialSequence, splitPoints);
- ControlFlowAnalyzer allFromSplitPoints = computeAllLiveFromSplitPoints(liveAfterInitialSequence, splitPoints);
-
Set<JNode> allLiveNodes =
union(allButOne.getLiveFieldsAndMethods(), allButOne.getFieldsWritten());
- Set<JNode> allLiveFromSplitPoints = union(allFromSplitPoints.getLiveFieldsAndMethods(),
- allFromSplitPoints.getFieldsWritten());
- updateReverseMap(i, fragmentMap.fields, allLiveNodes, allFields, allLiveFromSplitPoints);
- updateReverseMap(i, fragmentMap.methods, allButOne.getLiveFieldsAndMethods(), allMethods,
- allFromSplitPoints.getLiveFieldsAndMethods());
+ updateReverseMap(i, fragmentMap.fields, allLiveNodes, allFields);
+ updateReverseMap(i, fragmentMap.methods, allButOne.getLiveFieldsAndMethods(), allMethods);
updateReverseMap(i, fragmentMap.strings, allButOne.getLiveStrings(), everything
- .getLiveStrings(), allFromSplitPoints.getLiveStrings());
+ .getLiveStrings());
updateReverseMap(i, fragmentMap.types, declaredTypesIn(allButOne.getInstantiatedTypes()),
- declaredTypesIn(everything.getInstantiatedTypes()),
- declaredTypesIn(allFromSplitPoints.getInstantiatedTypes()));
+ declaredTypesIn(everything.getInstantiatedTypes()));
// This mean split point [i] has been merged with another split point, ignore it.
if (splitPointToFragmentMap[i] != i) {
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/ControlFlowAnalyzer.java b/dev/core/src/com/google/gwt/dev/jjs/impl/ControlFlowAnalyzer.java
index 93485dd..f9b3aaa 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/ControlFlowAnalyzer.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/ControlFlowAnalyzer.java
@@ -226,7 +226,7 @@
// Rescue my clinit (it won't ever be explicitly referenced)
if (type.hasClinit()) {
- rescue(type.getClinitMethod());
+ rescue(type.getMethods().get(0));
}
// JLS 12.4.1: don't rescue my super interfaces just because I'm rescued.
@@ -304,7 +304,7 @@
// Rescue my clinit (it won't ever be explicitly referenced)
if (type.hasClinit()) {
- rescue(type.getClinitMethod());
+ rescue(type.getMethods().get(0));
}
// JLS 12.4.1: don't rescue my super interfaces just because I'm rescued.
@@ -671,7 +671,7 @@
JField field = (JField) var;
accept(field.getInitializer());
referencedTypes.add(field.getEnclosingType());
- liveFieldsAndMethods.add(field.getEnclosingType().getClinitMethod());
+ liveFieldsAndMethods.add(field.getEnclosingType().getMethods().get(0));
} else if (argsToRescueIfParameterRead != null && var instanceof JParameter) {
List<JExpression> list = argsToRescueIfParameterRead.remove(var);
if (list != null) {
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/DeadCodeElimination.java b/dev/core/src/com/google/gwt/dev/jjs/impl/DeadCodeElimination.java
index 0907c57..7013f53 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/DeadCodeElimination.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/DeadCodeElimination.java
@@ -37,7 +37,6 @@
import com.google.gwt.dev.jjs.ast.JFieldRef;
import com.google.gwt.dev.jjs.ast.JForStatement;
import com.google.gwt.dev.jjs.ast.JIfStatement;
-import com.google.gwt.dev.jjs.ast.JInstanceOf;
import com.google.gwt.dev.jjs.ast.JIntLiteral;
import com.google.gwt.dev.jjs.ast.JLiteral;
import com.google.gwt.dev.jjs.ast.JLocalRef;
@@ -145,10 +144,10 @@
}
switch (op) {
case AND:
- maybeReplaceMe(x, Simplifier.and(x), ctx);
+ maybeReplaceMe(x, simplifier.shortCircuitAnd(x, null, lhs, rhs), ctx);
break;
case OR:
- maybeReplaceMe(x, Simplifier.or(x), ctx);
+ maybeReplaceMe(x, simplifier.shortCircuitOr(x, null, lhs, rhs), ctx);
break;
case BIT_XOR:
simplifyXor(lhs, rhs, ctx);
@@ -265,12 +264,13 @@
@Override
public void endVisit(JCastOperation x, Context ctx) {
- maybeReplaceMe(x, Simplifier.cast(x), ctx);
+ maybeReplaceMe(x, simplifier.cast(x, x.getSourceInfo(), x.getCastType(), x.getExpr()), ctx);
}
@Override
public void endVisit(JConditional x, Context ctx) {
- maybeReplaceMe(x, Simplifier.conditional(x), ctx);
+ maybeReplaceMe(x, simplifier.conditional(x, x.getSourceInfo(), x.getType(), x.getIfTest(), x
+ .getThenExpr(), x.getElseExpr()), ctx);
}
@Override
@@ -365,19 +365,8 @@
*/
@Override
public void endVisit(JIfStatement x, Context ctx) {
- maybeReplaceMe(x, Simplifier.ifStatement(x, currentMethod), ctx);
- }
-
- /**
- * Simplify JInstanceOf expression whose output is ignored.
- */
- @Override
- public void endVisit(JInstanceOf x, Context ctx) {
-
- if (ignoringExpressionOutput.contains(x)) {
- ctx.replaceMe(x.getExpr());
- ignoringExpressionOutput.remove(x);
- }
+ maybeReplaceMe(x, simplifier.ifStatement(x, x.getSourceInfo(), x.getIfExpr(),
+ x.getThenStmt(), x.getElseStmt(), currentMethod), ctx);
}
@Override
@@ -450,7 +439,6 @@
}
}
- HashSet<JDeclaredType> clinitsCalled = new HashSet<JDeclaredType>();
for (int i = 0; i < numRemovableExpressions(x); ++i) {
JExpression expr = x.exprs.get(i);
if (!expr.hasSideEffects()) {
@@ -468,22 +456,6 @@
madeChanges();
continue;
}
-
- // Remove redundant clinits
- if (expr instanceof JMethodCall && JProgram.isClinit(((JMethodCall) expr).getTarget())) {
- JDeclaredType enclosingType = ((JMethodCall) expr).getTarget().getEnclosingType();
- // If a clinit of enclosingType or a subclass of enclosingType has already been
- // called as part of this JMultiExpression then this clinit call is noop at runtime
- // and can be statically removed.
- if (enclosingType.findSubtype(clinitsCalled) != null) {
- x.exprs.remove(i);
- --i;
- madeChanges();
- continue;
- } else {
- clinitsCalled.add(enclosingType);
- }
- }
}
if (x.exprs.size() == 1) {
@@ -550,7 +522,7 @@
}
}
if (x.getOp() == JUnaryOperator.NOT) {
- maybeReplaceMe(x, Simplifier.not(x), ctx);
+ maybeReplaceMe(x, simplifier.not(x, x.getSourceInfo(), x.getArg()), ctx);
return;
} else if (x.getOp() == JUnaryOperator.NEG) {
maybeReplaceMe(x, simplifyNegate(x, x.getArg()), ctx);
@@ -731,7 +703,7 @@
}
private JMethodCall createClinitCall(SourceInfo sourceInfo, JDeclaredType targetType) {
- JMethod clinit = targetType.getClinitTarget().getClinitMethod();
+ JMethod clinit = targetType.getClinitTarget().getMethods().get(0);
assert (JProgram.isClinit(clinit));
return new JMethodCall(sourceInfo, null, clinit);
}
@@ -1201,8 +1173,8 @@
private boolean isTypeIntegral(JType type) {
return ((type == program.getTypePrimitiveInt()) || (type == program.getTypePrimitiveLong())
- || (type == program.getTypePrimitiveChar()) || (type == program.getTypePrimitiveByte())
- || (type == program.getTypePrimitiveShort()));
+ || (type == program.getTypePrimitiveChar()) || (type == program.getTypePrimitiveByte()) || (type == program
+ .getTypePrimitiveShort()));
}
private boolean isTypeLong(JExpression exp) {
@@ -1354,11 +1326,11 @@
private boolean simplifyAdd(JExpression lhs, JExpression rhs, Context ctx, JType type) {
if (isLiteralZero(rhs)) {
- ctx.replaceMe(Simplifier.cast(type, lhs));
+ ctx.replaceMe(simplifier.cast(type, lhs));
return true;
}
if (isLiteralZero(lhs)) {
- ctx.replaceMe(Simplifier.cast(type, rhs));
+ ctx.replaceMe(simplifier.cast(type, rhs));
return true;
}
@@ -1399,11 +1371,11 @@
private boolean simplifyDiv(JExpression lhs, JExpression rhs, Context ctx, JType type) {
if (isLiteralOne(rhs)) {
- ctx.replaceMe(Simplifier.cast(type, lhs));
+ ctx.replaceMe(simplifier.cast(type, lhs));
return true;
}
if (isLiteralNegativeOne(rhs)) {
- ctx.replaceMe(simplifyNegate(Simplifier.cast(type, lhs)));
+ ctx.replaceMe(simplifyNegate(simplifier.cast(type, lhs)));
return true;
}
@@ -1423,27 +1395,27 @@
private boolean simplifyMul(JExpression lhs, JExpression rhs, Context ctx, JType type) {
if (isLiteralOne(rhs)) {
- ctx.replaceMe(Simplifier.cast(type, lhs));
+ ctx.replaceMe(simplifier.cast(type, lhs));
return true;
}
if (isLiteralOne(lhs)) {
- ctx.replaceMe(Simplifier.cast(type, rhs));
+ ctx.replaceMe(simplifier.cast(type, rhs));
return true;
}
if (isLiteralNegativeOne(rhs)) {
- ctx.replaceMe(simplifyNegate(Simplifier.cast(type, lhs)));
+ ctx.replaceMe(simplifyNegate(simplifier.cast(type, lhs)));
return true;
}
if (isLiteralNegativeOne(lhs)) {
- ctx.replaceMe(simplifyNegate(Simplifier.cast(type, rhs)));
+ ctx.replaceMe(simplifyNegate(simplifier.cast(type, rhs)));
return true;
}
if (isLiteralZero(rhs) && !lhs.hasSideEffects()) {
- ctx.replaceMe(Simplifier.cast(type, rhs));
+ ctx.replaceMe(simplifier.cast(type, rhs));
return true;
}
if (isLiteralZero(lhs) && !rhs.hasSideEffects()) {
- ctx.replaceMe(Simplifier.cast(type, lhs));
+ ctx.replaceMe(simplifier.cast(type, lhs));
return true;
}
return false;
@@ -1479,11 +1451,11 @@
private boolean simplifySub(JExpression lhs, JExpression rhs, Context ctx, JType type) {
if (isLiteralZero(rhs)) {
- ctx.replaceMe(Simplifier.cast(type, lhs));
+ ctx.replaceMe(simplifier.cast(type, lhs));
return true;
}
if (isLiteralZero(lhs) && !isTypeFloatOrDouble(type)) {
- ctx.replaceMe(simplifyNegate(Simplifier.cast(type, rhs)));
+ ctx.replaceMe(simplifyNegate(simplifier.cast(type, rhs)));
return true;
}
return false;
@@ -1569,7 +1541,7 @@
* Upcast the initializer so that the semantics of any arithmetic on
* this value is not changed.
*/
- // TODO(spoon): use Simplifier.cast to shorten this
+ // TODO(spoon): use simplifier.cast to shorten this
if ((x.getType() instanceof JPrimitiveType) && (lit instanceof JValueLiteral)) {
JPrimitiveType xTypePrim = (JPrimitiveType) x.getType();
lit = xTypePrim.coerceLiteral((JValueLiteral) lit);
@@ -1791,11 +1763,13 @@
}
private final JProgram program;
+ private final Simplifier simplifier;
private final Map<JType, Class<?>> typeClassMap = new IdentityHashMap<JType, Class<?>>();
public DeadCodeElimination(JProgram program) {
this.program = program;
+ simplifier = new Simplifier(program);
typeClassMap.put(program.getTypeJavaLangObject(), Object.class);
typeClassMap.put(program.getTypeJavaLangString(), String.class);
typeClassMap.put(program.getTypePrimitiveBoolean(), boolean.class);
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/EnumOrdinalizer.java b/dev/core/src/com/google/gwt/dev/jjs/impl/EnumOrdinalizer.java
index d7ea10c..959abc1 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/EnumOrdinalizer.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/EnumOrdinalizer.java
@@ -667,9 +667,10 @@
if (canBeOrdinal(x)) {
/*
- * Cleanup clinit method for ordinalizable enums.
+ * Cleanup clinit method for ordinalizable enums. Note, method 0 is
+ * always the clinit.
*/
- updateClinit(x.getClinitMethod());
+ updateClinit(x.getMethods().get(0));
/*
* Remove any static impl mappings for any methods in an ordinal enum
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java b/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java
index 6b86885..1616123 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java
@@ -439,7 +439,6 @@
JsParameter jsParam = jsCatch.getParameter();
names.put(arg.getTarget(), jsParam.getName());
catchMap.put(catchBlock, jsCatch);
- catchParamIdentifiers.add(jsParam.getName());
push(jsCatch.getScope());
accept(catchBlock);
@@ -1147,9 +1146,7 @@
for (int i = 0; i < locals.size(); ++i) {
JsName name = names.get(x.getLocals().get(i));
String ident = name.getIdent();
- if (!alreadySeen.contains(ident)
- // Catch block params don't need var declarations
- && !catchParamIdentifiers.contains(name)) {
+ if (!alreadySeen.contains(ident)) {
alreadySeen.add(ident);
vars.add(new JsVar(x.getSourceInfo(), name));
}
@@ -1190,7 +1187,7 @@
return;
} else if (type != clinitTarget) {
// replace the method with its retargeted clinit
- method = clinitTarget.getClinitMethod();
+ method = clinitTarget.getMethods().get(0);
}
}
@@ -1777,7 +1774,7 @@
* refs to super classes are preserved.
*/
JMethodBody clinitBody =
- (JMethodBody) program.getTypeClassLiteralHolder().getClinitMethod().getBody();
+ (JMethodBody) program.getTypeClassLiteralHolder().getMethods().get(0).getBody();
for (JStatement stmt : clinitBody.getStatements()) {
if (stmt instanceof JDeclarationStatement) {
generateClassLiteral((JDeclarationStatement) stmt, vars);
@@ -2160,7 +2157,7 @@
return null;
}
- JMethod clinitMethod = targetType.getClinitMethod();
+ JMethod clinitMethod = targetType.getMethods().get(0);
SourceInfo sourceInfo = x.getSourceInfo();
JsInvocation jsInvocation = new JsInvocation(sourceInfo);
jsInvocation.setQualifier(names.get(clinitMethod).makeRef(sourceInfo));
@@ -2183,7 +2180,7 @@
return null;
}
- JMethod clinitMethod = enclosingType.getClinitTarget().getClinitMethod();
+ JMethod clinitMethod = enclosingType.getClinitTarget().getMethods().get(0);
SourceInfo sourceInfo = x.getSourceInfo();
JsInvocation jsInvocation = new JsInvocation(sourceInfo);
jsInvocation.setQualifier(names.get(clinitMethod).makeRef(sourceInfo));
@@ -2340,8 +2337,6 @@
private final Map<JBlock, JsCatch> catchMap = new IdentityHashMap<JBlock, JsCatch>();
- private final Set<JsName> catchParamIdentifiers = new HashSet<JsName>();
-
private final Map<JClassType, JsScope> classScopes = new IdentityHashMap<JClassType, JsScope>();
/**
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/GwtAstBuilder.java b/dev/core/src/com/google/gwt/dev/jjs/impl/GwtAstBuilder.java
index 9423eeb..30102bc 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/GwtAstBuilder.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/GwtAstBuilder.java
@@ -686,7 +686,8 @@
* explicit this constructor call, in which case the callee will.
*/
if (!hasExplicitThis) {
- JMethod initMethod = curClass.type.getInitMethod();
+ // $init is always in position 1 (clinit is in 0)
+ JMethod initMethod = curClass.type.getMethods().get(1);
JMethodCall initCall = new JMethodCall(info, makeThisRef(info), initMethod);
block.addStmt(initCall.makeStatement());
}
@@ -1742,11 +1743,11 @@
JDeclaredType type = curClass.type;
/*
* Make clinits chain to super class (JDT doesn't write code to do this).
- * Call super class $clinit;
+ * Call super class $clinit; $clinit is always in position 0.
*/
if (type.getSuperClass() != null) {
- JMethod myClinit = type.getClinitMethod();
- JMethod superClinit = type.getSuperClass().getClinitMethod();
+ JMethod myClinit = type.getMethods().get(0);
+ JMethod superClinit = type.getSuperClass().getMethods().get(0);
JMethodCall superClinitCall = new JMethodCall(myClinit.getSourceInfo(), null, superClinit);
JMethodBody body = (JMethodBody) myClinit.getBody();
body.getBlock().addStmt(0, superClinitCall.makeStatement());
@@ -2050,7 +2051,7 @@
JNewArray newExpr = JNewArray.createInitializers(info, enumArrayType, initializers);
JFieldRef valuesRef = new JFieldRef(info, null, valuesField, type);
JDeclarationStatement declStmt = new JDeclarationStatement(info, valuesRef, newExpr);
- JBlock clinitBlock = ((JMethodBody) type.getClinitMethod().getBody()).getBlock();
+ JBlock clinitBlock = ((JMethodBody) type.getMethods().get(0).getBody()).getBlock();
/*
* HACKY: the $VALUES array must be initialized immediately after all of
@@ -2373,25 +2374,16 @@
}
}
- // Only called on nested instances constructors (explicitConstructorCalls) that are of the
- // form: outer.super(...) or super(...)
- //
- // Will set outer (in the first case) or the implicit enclosing object reference to
- // be the first parameter of super(...)
private void processSuperCallThisArgs(ReferenceBinding superClass, JMethodCall call,
JExpression qualifier, Expression qualification) {
- // Explicit super calls can only happend inside constructors
- assert curMethod.scope.isInsideConstructor();
if (superClass.syntheticEnclosingInstanceTypes() != null) {
- // there can only be ONE immediate enclosing instance.
- assert superClass.syntheticEnclosingInstanceTypes().length == 1;
- ReferenceBinding targetType = superClass.syntheticEnclosingInstanceTypes()[0];
- if (qualification != null) {
- // Outer object is the qualifier.
- call.addArg(qualifier);
- } else {
- // Get implicit outer object.
- call.addArg(makeThisReference(call.getSourceInfo(), targetType, false, curMethod.scope));
+ for (ReferenceBinding targetType : superClass.syntheticEnclosingInstanceTypes()) {
+ if (qualification != null && superClass.enclosingType() == targetType) {
+ assert qualification.resolvedType.erasure().isCompatibleWith(targetType);
+ call.addArg(qualifier);
+ } else {
+ call.addArg(makeThisReference(call.getSourceInfo(), targetType, false, curMethod.scope));
+ }
}
}
}
@@ -2441,9 +2433,9 @@
private void pushInitializerMethodInfo(FieldDeclaration x, MethodScope scope) {
JMethod initMeth;
if (x.isStatic()) {
- initMeth = curClass.type.getClinitMethod();
+ initMeth = curClass.type.getMethods().get(0);
} else {
- initMeth = curClass.type.getInitMethod();
+ initMeth = curClass.type.getMethods().get(1);
}
pushMethodInfo(new MethodInfo(initMeth, (JMethodBody) initMeth.getBody(), scope));
}
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/ImplementClassLiteralsAsFields.java b/dev/core/src/com/google/gwt/dev/jjs/impl/ImplementClassLiteralsAsFields.java
index 868cd93..d13c0fc 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/ImplementClassLiteralsAsFields.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/ImplementClassLiteralsAsFields.java
@@ -113,7 +113,7 @@
this.program = program;
this.typeClassLiteralHolder = program.getTypeClassLiteralHolder();
this.classLiteralHolderClinitBody =
- (JMethodBody) typeClassLiteralHolder.getClinitMethod().getBody();
+ (JMethodBody) typeClassLiteralHolder.getMethods().get(0).getBody();
assert program.getDeclaredTypes().contains(typeClassLiteralHolder);
}
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/LongCastNormalizer.java b/dev/core/src/com/google/gwt/dev/jjs/impl/LongCastNormalizer.java
index be68c72..52df25c 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/LongCastNormalizer.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/LongCastNormalizer.java
@@ -193,7 +193,7 @@
if (targetType != longType && arg.getType() != longType) {
return arg;
}
- return Simplifier.cast(targetType, arg);
+ return simplifier.cast(targetType, arg);
}
}
@@ -202,9 +202,11 @@
}
private final JProgram program;
+ private final Simplifier simplifier;
private LongCastNormalizer(JProgram program) {
this.program = program;
+ simplifier = new Simplifier(program);
}
private void execImpl() {
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/MethodInliner.java b/dev/core/src/com/google/gwt/dev/jjs/impl/MethodInliner.java
index beaf790..92eb2bb 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/MethodInliner.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/MethodInliner.java
@@ -110,7 +110,7 @@
List<JStatement> stmts = body.getStatements();
if (method.getEnclosingType() != null
- && method.getEnclosingType().getClinitMethod() == method && !stmts.isEmpty()) {
+ && method.getEnclosingType().getMethods().get(0) == method && !stmts.isEmpty()) {
// clinit() calls cannot be inlined unless they are empty
possibleToInline = false;
} else if (!body.getLocals().isEmpty()) {
@@ -177,7 +177,7 @@
return null;
}
- JMethod clinit = targetType.getClinitMethod();
+ JMethod clinit = targetType.getMethods().get(0);
// If the clinit is a non-native, empty body we can optimize it out here
if (!clinit.isNative() && (((JMethodBody) clinit.getBody())).getStatements().size() == 0) {
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/SameParameterValueOptimizer.java b/dev/core/src/com/google/gwt/dev/jjs/impl/SameParameterValueOptimizer.java
index 5c53646..408afaf 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/SameParameterValueOptimizer.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/SameParameterValueOptimizer.java
@@ -202,9 +202,11 @@
* TODO: support polymorphic calls properly.
*/
private final Set<JMethod> rescuedMethods = new HashSet<JMethod>();
+ private final Simplifier simplifier;
private SameParameterValueOptimizer(JProgram program) {
this.program = program;
+ simplifier = new Simplifier(program);
}
private OptimizerStats execImpl(JNode node) {
@@ -219,7 +221,7 @@
JValueLiteral valueLiteral = parameterValues.get(parameter);
if (valueLiteral != null) {
SubstituteParameterVisitor substituteParameterVisitor =
- new SubstituteParameterVisitor(parameter, Simplifier.cast(parameter.getType(),
+ new SubstituteParameterVisitor(parameter, simplifier.cast(parameter.getType(),
valueLiteral));
substituteParameterVisitor.accept(parameter.getEnclosingMethod());
stats.recordModified(substituteParameterVisitor.getNumMods());
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/Simplifier.java b/dev/core/src/com/google/gwt/dev/jjs/impl/Simplifier.java
index 65bebe3..66a66bf 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/Simplifier.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/Simplifier.java
@@ -29,6 +29,7 @@
import com.google.gwt.dev.jjs.ast.JNode;
import com.google.gwt.dev.jjs.ast.JPrefixOperation;
import com.google.gwt.dev.jjs.ast.JPrimitiveType;
+import com.google.gwt.dev.jjs.ast.JProgram;
import com.google.gwt.dev.jjs.ast.JReturnStatement;
import com.google.gwt.dev.jjs.ast.JStatement;
import com.google.gwt.dev.jjs.ast.JType;
@@ -60,7 +61,7 @@
* Negate the supplied expression if negating it makes the expression shorter.
* Otherwise, return null.
*/
- private static JExpression maybeUnflipBoolean(JExpression expr) {
+ static JExpression maybeUnflipBoolean(JExpression expr) {
if (expr instanceof JUnaryOperation) {
JUnaryOperation unop = (JUnaryOperation) expr;
if (unop.getOp() == JUnaryOperator.NOT) {
@@ -78,57 +79,14 @@
return list.get(list.size() - 1);
}
- /**
- * This class provides only static methods. No instances will ever be created.
- */
- private Simplifier() {
+ private final JProgram program;
+
+ public Simplifier(JProgram program) {
+ this.program = program;
}
- /**
- * Simplify cast operations. Used when creating a cast in DeadCodeElimination. For simplifying
- * casts that are actually in the AST, cast(JCastOperation) is used instead.
- *
- * <pre>
- * (int) 1 -> 1
- * (A) (a,b) -> (a, (A) b)
- * </pre>
- *
- * @param type the Type to cast the expression <code>exp</code> to.
- * @param exp the current JExpression under the cast as it is being simplified.
- * @return the simplified expression.
- */
- public static JExpression cast(JType type, JExpression exp) {
- return castImpl(null, exp.getSourceInfo(), type, exp);
- }
-
- /**
- * Simplify cast operations.
- *
- * <pre>
- * (int) 1 -> 1
- * (A) (a,b) -> (a, (A) b)
- * </pre>
- *
- * @param exp a JCastOperation to be simplified.
- * @return the simplified expression if a simplification was possible; <code>exp</code> otherwise.
- */
- public static JExpression cast(JCastOperation exp) {
- return castImpl(exp, exp.getSourceInfo(), exp.getCastType(), exp.getExpr());
- }
-
- private static JExpression castImpl(JExpression original, SourceInfo info, JType type,
- JExpression exp) {
+ public JExpression cast(JExpression original, SourceInfo info, JType type, JExpression exp) {
info = getBestSourceInfo(original, info, exp);
- if (exp instanceof JMultiExpression) {
- // (T)(a,b,c) -> a,b,(T) c
- JMultiExpression expMulti = (JMultiExpression) exp;
- JMultiExpression newMulti = new JMultiExpression(info);
- newMulti.exprs.addAll(allButLast(expMulti.exprs));
- newMulti.exprs.add(castImpl(null, info, type, last(expMulti.exprs)));
- // TODO(rluble): immediately simplify the resulting multi.
- // TODO(rluble): refactor common outward JMultiExpression movement.
- return newMulti;
- }
if (type == exp.getType()) {
return exp;
}
@@ -147,10 +105,10 @@
* implicit anyway. Cannot coerce char since that would change the semantics
* of concat.
*/
- if (type == JPrimitiveType.INT) {
+ if (type == program.getTypePrimitiveInt()) {
JType expType = exp.getType();
- if ((expType == JPrimitiveType.SHORT)
- || (expType == JPrimitiveType.BYTE)) {
+ if ((expType == program.getTypePrimitiveShort())
+ || (expType == program.getTypePrimitiveByte())) {
return exp;
}
}
@@ -162,29 +120,11 @@
return new JCastOperation(info, type, exp);
}
- /**
- * Simplify conditional expressions.
- *
- * <pre>
- * (a,b,c)?d:e -> a,b,(c?d:e)
- * true ? then : else -> then
- * false ? then : else -> else
- * cond ? true : else) -> cond || else
- * cond ? false : else -> !cond && else
- * cond ? then : true -> !cond || then
- * cond ? then : false -> cond && then
- * !cond ? then : else -> cond ? else : then
- * </pre>
- *
- * @param exp a JCondintional to be simplified.
- * @return the simplified expression if a simplification was possible; <code>exp</code> otherwise.
- */
- public static JExpression conditional(JConditional exp) {
- return conditionalImpl(exp, exp.getSourceInfo(), exp.getType(), exp.getIfTest(),
- exp.getThenExpr(), exp.getElseExpr());
+ public JExpression cast(JType type, JExpression exp) {
+ return cast(null, exp.getSourceInfo(), type, exp);
}
- private static JExpression conditionalImpl(JConditional original, SourceInfo info, JType type,
+ public JExpression conditional(JConditional original, SourceInfo info, JType type,
JExpression condExpr, JExpression thenExpr, JExpression elseExpr) {
info = getBestSourceInfo(original, info, condExpr);
if (condExpr instanceof JMultiExpression) {
@@ -193,8 +133,7 @@
JMultiExpression condMulti = (JMultiExpression) condExpr;
JMultiExpression newMulti = new JMultiExpression(info);
newMulti.exprs.addAll(allButLast(condMulti.exprs));
- newMulti.exprs.add(conditionalImpl(null, info, type, last(condMulti.exprs), thenExpr,
- elseExpr));
+ newMulti.exprs.add(conditional(null, info, type, last(condMulti.exprs), thenExpr, elseExpr));
// TODO(spoon): immediately simplify the resulting multi
return newMulti;
}
@@ -209,20 +148,20 @@
} else if (thenExpr instanceof JBooleanLiteral) {
if (((JBooleanLiteral) thenExpr).getValue()) {
// e.g. (cond ? true : else) -> cond || else
- return orImpl(null, info, condExpr, elseExpr);
+ return shortCircuitOr(null, info, condExpr, elseExpr);
} else {
// e.g. (cond ? false : else) -> !cond && else
- JExpression notCondExpr = notImpl(null, condExpr.getSourceInfo(), condExpr);
- return andImpl(null, info, notCondExpr, elseExpr);
+ JExpression notCondExpr = not(null, condExpr.getSourceInfo(), condExpr);
+ return shortCircuitAnd(null, info, notCondExpr, elseExpr);
}
} else if (elseExpr instanceof JBooleanLiteral) {
if (((JBooleanLiteral) elseExpr).getValue()) {
// e.g. (cond ? then : true) -> !cond || then
- JExpression notCondExpr = notImpl(null, condExpr.getSourceInfo(), condExpr);
- return orImpl(null, info, notCondExpr, thenExpr);
+ JExpression notCondExpr = not(null, condExpr.getSourceInfo(), condExpr);
+ return shortCircuitOr(null, info, notCondExpr, thenExpr);
} else {
// e.g. (cond ? then : false) -> cond && then
- return andImpl(null, info, condExpr, thenExpr);
+ return shortCircuitAnd(null, info, condExpr, thenExpr);
}
} else {
// e.g. (!cond ? then : else) -> (cond ? else : then)
@@ -239,31 +178,8 @@
return new JConditional(info, type, condExpr, thenExpr, elseExpr);
}
- /**
- * Simplifies an ifthenelse statement.
- *
- * <pre>
- * if(a,b,c) d [else e] -> {a; b; if(c) d [else e]; }
- * if(true) a [else b] -> a
- * if(false) a else b -> b
- * if(notImpl(c)) a else b -> if(c) b else a
- * if(true) ; else b -> true
- * if(false) a [else ;] -> false
- * if(c) ; [else ;] -> c
- *</pre>
- *
- * @param stmt the statement to simplify.
- * @param currentMethod the method where the statement resides
- * @return the simplified statement if a simplification could be done and <code>stmt</code>
- * otherwise.
- */
- public static JStatement ifStatement(JIfStatement stmt, JMethod currentMethod) {
- return ifStatementImpl(stmt, stmt.getSourceInfo(), stmt.getIfExpr(),
- stmt.getThenStmt(), stmt.getElseStmt(), currentMethod);
- }
-
- private static JStatement ifStatementImpl(JIfStatement original, SourceInfo info,
- JExpression condExpr, JStatement thenStmt,JStatement elseStmt, JMethod currentMethod) {
+ public JStatement ifStatement(JIfStatement original, SourceInfo info, JExpression condExpr,
+ JStatement thenStmt, JStatement elseStmt, JMethod currentMethod) {
info = getBestSourceInfo(original, info, condExpr);
if (condExpr instanceof JMultiExpression) {
// if(a,b,c) d else e -> {a; b; if(c) d else e; }
@@ -272,7 +188,7 @@
for (JExpression expr : allButLast(condMulti.exprs)) {
newBlock.addStmt(expr.makeStatement());
}
- newBlock.addStmt(ifStatementImpl(null, info, last(condMulti.exprs), thenStmt, elseStmt,
+ newBlock.addStmt(ifStatement(null, info, last(condMulti.exprs), thenStmt, elseStmt,
currentMethod));
// TODO(spoon): immediately simplify the resulting block
return newBlock;
@@ -305,7 +221,7 @@
// TODO: this goes away when we normalize the Java AST properly.
thenStmt = ensureBlock(thenStmt);
elseStmt = ensureBlock(elseStmt);
- return ifStatementImpl(null, info, unflipped, elseStmt, thenStmt, currentMethod);
+ return ifStatement(null, info, unflipped, elseStmt, thenStmt, currentMethod);
}
}
@@ -322,27 +238,14 @@
return new JIfStatement(info, condExpr, thenStmt, elseStmt);
}
- /**
- * Simplifies an negation expression.
- *
- * if(a,b,c) d else e -> {a; b; if(c) d else e; }
- *
- * @param expr the expression to simplify.
- * @return the simplified expression if a simplification could be done and <code>expr</code>
- * otherwise.
- */
- public static JExpression not(JPrefixOperation expr) {
- return notImpl(expr, expr.getSourceInfo(), expr.getArg());
- }
-
- private static JExpression notImpl(JPrefixOperation original, SourceInfo info, JExpression arg) {
+ public JExpression not(JPrefixOperation original, SourceInfo info, JExpression arg) {
info = getBestSourceInfo(original, info, arg);
if (arg instanceof JMultiExpression) {
// !(a,b,c) -> (a,b,!c)
JMultiExpression argMulti = (JMultiExpression) arg;
JMultiExpression newMulti = new JMultiExpression(info);
newMulti.exprs.addAll(allButLast(argMulti.exprs));
- newMulti.exprs.add(notImpl(null, info, last(argMulti.exprs)));
+ newMulti.exprs.add(not(null, info, last(argMulti.exprs)));
// TODO(spoon): immediately simplify the newMulti
return newMulti;
}
@@ -397,39 +300,18 @@
/**
* Simplify short circuit AND expressions.
- *
+ *
* <pre>
- * true && isWhatever() -> isWhatever()
- * false && isWhatever() -> false
- *
- * isWhatever() && true -> isWhatever()
- * isWhatever() && false -> false, unless side effects
- *
- * (a, b) && c -> (a, b && c)
+ * if (true && isWhatever()) -> if (isWhatever())
+ * if (false && isWhatever()) -> if (false)
+ *
+ * if (isWhatever() && true) -> if (isWhatever())
+ * if (isWhatever() && false) -> if (false), unless side effects
* </pre>
- *
- * @param exp an AND JBinaryExpression to be simplified.
- * @return the simplified expression if a simplification was possible; <code>exp</code> otherwise.
- *
*/
- public static JExpression and(JBinaryOperation exp) {
- assert exp.getOp() == JBinaryOperator.AND : "Simplifier.and was called with " + exp;
- return andImpl(exp, null, exp.getLhs(), exp.getRhs());
- }
-
- private static JExpression andImpl(JBinaryOperation original, SourceInfo info, JExpression lhs,
+ public JExpression shortCircuitAnd(JBinaryOperation original, SourceInfo info, JExpression lhs,
JExpression rhs) {
info = getBestSourceInfo(original, info, lhs);
- if (lhs instanceof JMultiExpression) {
- // (a,b,c)&&d -> a,b,(c&&d)
- JMultiExpression lhsMulti = (JMultiExpression) lhs;
- JMultiExpression newMulti = new JMultiExpression(info);
- newMulti.exprs.addAll(allButLast(lhsMulti.exprs));
- newMulti.exprs.add(andImpl(null, info, last(lhsMulti.exprs), rhs));
- // TODO(rluble): immediately simplify the resulting multi.
- // TODO(rluble): refactor common outward JMultiExpression movement.
- return newMulti;
- }
if (lhs instanceof JBooleanLiteral) {
JBooleanLiteral booleanLiteral = (JBooleanLiteral) lhs;
if (booleanLiteral.getValue()) {
@@ -455,39 +337,18 @@
/**
* Simplify short circuit OR expressions.
- *
+ *
* <pre>
- * true || isWhatever() -> true
- * false || isWhatever() -> isWhatever()
- *
- * isWhatever() || false isWhatever()
- * isWhatever() || true -> true, unless side effects
- *
- * (a, b) || c -> (a, b || c)
+ * if (true || isWhatever()) -> if (true)
+ * if (false || isWhatever()) -> if (isWhatever())
+ *
+ * if (isWhatever() || false) -> if (isWhatever())
+ * if (isWhatever() || true) -> if (true), unless side effects
* </pre>
- *
- * @param exp an OR JBinaryExpression to be simplified.
- * @return the simplified expression if a simplification was possible; <code>exp</code> otherwise.
- *
*/
- public static JExpression or(JBinaryOperation exp) {
- assert exp.getOp() == JBinaryOperator.OR : "Simplifier.and was called with " + exp;
- return orImpl(exp, null, exp.getLhs(), exp.getRhs());
- }
-
- private static JExpression orImpl(JBinaryOperation original, SourceInfo info, JExpression lhs,
+ public JExpression shortCircuitOr(JBinaryOperation original, SourceInfo info, JExpression lhs,
JExpression rhs) {
info = getBestSourceInfo(original, info, lhs);
- if (lhs instanceof JMultiExpression) {
- // (a,b,c)|| d -> a,b,(c||d)
- JMultiExpression lhsMulti = (JMultiExpression) lhs;
- JMultiExpression newMulti = new JMultiExpression(info);
- newMulti.exprs.addAll(allButLast(lhsMulti.exprs));
- newMulti.exprs.add(orImpl(null, info, last(lhsMulti.exprs), rhs));
- // TODO(rluble): immediately simplify the resulting multi.
- // TODO(rluble): refactor common outward JMultiExpression movement.
- return newMulti;
- }
if (lhs instanceof JBooleanLiteral) {
JBooleanLiteral booleanLiteral = (JBooleanLiteral) lhs;
if (booleanLiteral.getValue()) {
@@ -495,6 +356,7 @@
} else {
return rhs;
}
+
} else if (rhs instanceof JBooleanLiteral) {
JBooleanLiteral booleanLiteral = (JBooleanLiteral) rhs;
if (!booleanLiteral.getValue()) {
@@ -510,7 +372,7 @@
return new JBinaryOperation(info, rhs.getType(), JBinaryOperator.OR, lhs, rhs);
}
- private static JStatement ensureBlock(JStatement stmt) {
+ private JStatement ensureBlock(JStatement stmt) {
if (stmt == null) {
return null;
}
@@ -522,7 +384,7 @@
return stmt;
}
- private static JExpression extractExpression(JStatement stmt) {
+ private JExpression extractExpression(JStatement stmt) {
if (stmt instanceof JExpressionStatement) {
JExpressionStatement statement = (JExpressionStatement) stmt;
return statement.getExpr();
@@ -531,7 +393,7 @@
return null;
}
- private static JStatement extractSingleStatement(JStatement stmt) {
+ private JStatement extractSingleStatement(JStatement stmt) {
if (stmt instanceof JBlock) {
JBlock block = (JBlock) stmt;
if (block.getStatements().size() == 1) {
@@ -542,15 +404,7 @@
return stmt;
}
- /**
- * Determine the best SourceInfo to use in a particular transformation.
- *
- * @param original the original node that is being transformed. Can be <code>null</code>.
- * @param info an explicit SourceInfo that might be used, Can be <code>null</code>.
- * @param defaultNode a node from where to obtain the SourceInfo.
- * @return a SourceInfo chosen according to the following priority info>original>default.
- */
- private static SourceInfo getBestSourceInfo(JNode original, SourceInfo info, JNode defaultNode) {
+ private SourceInfo getBestSourceInfo(JNode original, SourceInfo info, JNode defaultNode) {
if (info == null) {
if (original == null) {
info = defaultNode.getSourceInfo();
@@ -561,7 +415,7 @@
return info;
}
- private static JStatement rewriteIfIntoBoolean(SourceInfo sourceInfo, JExpression condExpr,
+ private JStatement rewriteIfIntoBoolean(SourceInfo sourceInfo, JExpression condExpr,
JStatement thenStmt, JStatement elseStmt, JMethod currentMethod) {
thenStmt = extractSingleStatement(thenStmt);
elseStmt = extractSingleStatement(elseStmt);
@@ -612,7 +466,7 @@
}
JBinaryOperation binaryOperation =
- new JBinaryOperation(sourceInfo, JPrimitiveType.VOID, binaryOperator, condExpr,
+ new JBinaryOperation(sourceInfo, program.getTypeVoid(), binaryOperator, condExpr,
thenExpression);
return binaryOperation.makeStatement();
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/TypeTightener.java b/dev/core/src/com/google/gwt/dev/jjs/impl/TypeTightener.java
index 70ec21c..d93006c 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/TypeTightener.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/TypeTightener.java
@@ -870,13 +870,10 @@
if (!tightener.didChange()) {
break;
}
- }
- if (stats.didChange()) {
FixDanglingRefsVisitor fixer = new FixDanglingRefsVisitor();
fixer.accept(program);
}
-
return stats;
}
}
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/UnifyAst.java b/dev/core/src/com/google/gwt/dev/jjs/impl/UnifyAst.java
index 5aa134c..b6967c4 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/UnifyAst.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/UnifyAst.java
@@ -498,7 +498,7 @@
*/
private final Set<JNode> liveFieldsAndMethods = new IdentityHashSet<JNode>();
- private final TreeLogger logger;
+ private TreeLogger logger;
private Set<JMethod> magicMethodCalls = new IdentityHashSet<JMethod>();
private final Map<String, JMethod> methodMap = new HashMap<String, JMethod>();
private final JJSOptions options;
@@ -515,9 +515,8 @@
private final Map<String, List<JMethod>> virtualMethodsPending =
new java.util.HashMap<String, List<JMethod>>();
- public UnifyAst(TreeLogger logger, JProgram program, JsProgram jsProgram, JJSOptions options,
+ public UnifyAst(JProgram program, JsProgram jsProgram, JJSOptions options,
RebindPermutationOracle rpo) {
- this.logger = logger;
this.program = program;
this.jsProgram = jsProgram;
this.options = options;
@@ -539,7 +538,8 @@
* Special AST construction, useful for tests. Everything is resolved,
* translated, and unified.
*/
- public void buildEverything() throws UnableToCompleteException {
+ public void buildEverything(TreeLogger logger) throws UnableToCompleteException {
+ this.logger = logger;
for (String internalName : classFileMap.keySet()) {
String typeName = InternalName.toBinaryName(internalName);
searchForTypeByBinary(typeName);
@@ -568,7 +568,9 @@
* entry points. This reduces memory and improves compile speed. Any
* unreachable elements are pruned.
*/
- public void exec() throws UnableToCompleteException {
+ public void exec(TreeLogger logger) throws UnableToCompleteException {
+ this.logger = logger;
+
// Trace execution from entry points.
for (JMethod entryMethod : program.getEntryMethods()) {
flowInto(entryMethod);
@@ -639,7 +641,7 @@
}
// Special clinit handling.
- JMethod clinit = type.getClinitMethod();
+ JMethod clinit = type.getMethods().get(0);
if (!liveFieldsAndMethods.contains(clinit)) {
clinit.setBody(new JMethodBody(SourceOrigin.UNKNOWN));
}
@@ -992,7 +994,7 @@
assert errorsFound;
return;
}
- JMethod clinit = type.getClinitMethod();
+ JMethod clinit = type.getMethods().get(0);
if (!liveFieldsAndMethods.contains(clinit)) {
flowInto(clinit);
if (type.getSuperClass() != null) {
diff --git a/dev/core/src/com/google/gwt/dev/js/ClosureJsAstTranslator.java b/dev/core/src/com/google/gwt/dev/js/ClosureJsAstTranslator.java
index f52370e..c0d8f40 100644
--- a/dev/core/src/com/google/gwt/dev/js/ClosureJsAstTranslator.java
+++ b/dev/core/src/com/google/gwt/dev/js/ClosureJsAstTranslator.java
@@ -117,6 +117,7 @@
Node script = IR.script();
script.putBooleanProp(Node.SYNTHETIC_BLOCK_PROP, true);
script.setInputId(inputId);
+ script.putProp(Node.SOURCENAME_PROP, source);
script.setStaticSourceFile(getClosureSourceFile(source));
for (JsStatement s : fragment.getGlobalBlock().getStatements()) {
script.addChildToBack(transform(s));
diff --git a/dev/core/src/com/google/gwt/dev/resource/impl/ResourceOracleImpl.java b/dev/core/src/com/google/gwt/dev/resource/impl/ResourceOracleImpl.java
index daaffc5..5d598e1 100644
--- a/dev/core/src/com/google/gwt/dev/resource/impl/ResourceOracleImpl.java
+++ b/dev/core/src/com/google/gwt/dev/resource/impl/ResourceOracleImpl.java
@@ -25,7 +25,9 @@
import com.google.gwt.dev.util.log.speedtracer.SpeedTracerLogger.Event;
import com.google.gwt.dev.util.msg.Message0;
import com.google.gwt.dev.util.msg.Message1String;
-import com.google.gwt.thirdparty.guava.common.collect.MapMaker;
+
+import org.apache.commons.collections.map.AbstractReferenceMap;
+import org.apache.commons.collections.map.ReferenceMap;
import java.io.File;
import java.io.IOException;
@@ -151,8 +153,9 @@
}
}
- private static final Map<ResourceLoader, List<ClassPathEntry>> classPathCache =
- new MapMaker().weakKeys().makeMap();
+ @SuppressWarnings("unchecked")
+ private static final Map<ResourceLoader, List<ClassPathEntry>> classPathCache = new ReferenceMap(
+ AbstractReferenceMap.WEAK, AbstractReferenceMap.HARD);
public static void clearCache() {
classPathCache.clear();
diff --git a/dev/core/src/com/google/gwt/dev/resource/impl/ZipFileClassPathEntry.java b/dev/core/src/com/google/gwt/dev/resource/impl/ZipFileClassPathEntry.java
index 110de6a..17a4144 100644
--- a/dev/core/src/com/google/gwt/dev/resource/impl/ZipFileClassPathEntry.java
+++ b/dev/core/src/com/google/gwt/dev/resource/impl/ZipFileClassPathEntry.java
@@ -21,7 +21,10 @@
import com.google.gwt.dev.util.collect.IdentityMaps;
import com.google.gwt.dev.util.collect.Sets;
import com.google.gwt.dev.util.msg.Message1String;
-import com.google.gwt.thirdparty.guava.common.collect.MapMaker;
+
+import org.apache.commons.collections.map.AbstractReferenceMap;
+import org.apache.commons.collections.map.ReferenceIdentityMap;
+import org.apache.commons.collections.map.ReferenceMap;
import java.io.File;
import java.io.IOException;
@@ -72,7 +75,9 @@
* not referenced anywhere else, so we use hard reference, and soft reference on
* {@link ZipFileClassPathEntry} allows its clearing in response to memory demand.
*/
- private static final Map<String, ZipFileClassPathEntry> entryCache = new MapMaker().softValues().makeMap();
+ @SuppressWarnings("unchecked")
+ private static final Map<String, ZipFileClassPathEntry> entryCache = new ReferenceMap(
+ AbstractReferenceMap.HARD, AbstractReferenceMap.SOFT);
public static void clearCache() {
entryCache.clear();
@@ -100,7 +105,9 @@
* and {@link ZipFileSnapshot} is not referenced anywhere outside of {@link ZipFileClassPathEntry}
* . When the module dies, the {@link ZipFileSnapshot} needs to die also.
*/
- private final Map<PathPrefixSet, ZipFileSnapshot> cachedSnapshots = new MapMaker().weakKeys().makeMap();
+ @SuppressWarnings("unchecked")
+ private final Map<PathPrefixSet, ZipFileSnapshot> cachedSnapshots = new ReferenceIdentityMap(
+ AbstractReferenceMap.WEAK, AbstractReferenceMap.HARD, true);
private final long lastModified;
private final String location;
diff --git a/dev/core/src/com/google/gwt/dev/shell/CompilingClassLoader.java b/dev/core/src/com/google/gwt/dev/shell/CompilingClassLoader.java
index dd13008..dd6d468 100644
--- a/dev/core/src/com/google/gwt/dev/shell/CompilingClassLoader.java
+++ b/dev/core/src/com/google/gwt/dev/shell/CompilingClassLoader.java
@@ -45,9 +45,12 @@
import com.google.gwt.dev.util.log.speedtracer.DevModeEventType;
import com.google.gwt.dev.util.log.speedtracer.SpeedTracerLogger;
import com.google.gwt.dev.util.log.speedtracer.SpeedTracerLogger.Event;
-import com.google.gwt.thirdparty.guava.common.collect.MapMaker;
import com.google.gwt.util.tools.Utility;
+import org.apache.commons.collections.map.AbstractReferenceMap;
+import org.apache.commons.collections.map.ReferenceIdentityMap;
+import org.apache.commons.collections.map.ReferenceMap;
+
import java.beans.Beans;
import java.io.File;
import java.io.FileOutputStream;
@@ -937,9 +940,13 @@
private final TypeOracle typeOracle;
- private final Map<Object, Object> weakJavaWrapperCache = new MapMaker().weakKeys().weakValues().makeMap();
+ @SuppressWarnings("unchecked")
+ private final Map<Object, Object> weakJavaWrapperCache = new ReferenceIdentityMap(
+ AbstractReferenceMap.WEAK, AbstractReferenceMap.WEAK);
- private final Map<Integer, Object> weakJsoCache = new MapMaker().weakValues().makeMap();
+ @SuppressWarnings("unchecked")
+ private final Map<Integer, Object> weakJsoCache = new ReferenceMap(
+ AbstractReferenceMap.HARD, AbstractReferenceMap.WEAK);
public CompilingClassLoader(TreeLogger logger,
CompilationState compilationState, ShellJavaScriptHost javaScriptHost)
diff --git a/dev/core/src/com/google/gwt/dev/shell/GWTShellServlet.java b/dev/core/src/com/google/gwt/dev/shell/GWTShellServlet.java
new file mode 100644
index 0000000..77944a6
--- /dev/null
+++ b/dev/core/src/com/google/gwt/dev/shell/GWTShellServlet.java
@@ -0,0 +1,999 @@
+/*
+ * Copyright 2008 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.dev.shell;
+
+import com.google.gwt.core.ext.TreeLogger;
+import com.google.gwt.core.ext.UnableToCompleteException;
+import com.google.gwt.core.ext.linker.ArtifactSet;
+import com.google.gwt.core.ext.linker.impl.HostedModeLinker;
+import com.google.gwt.core.ext.linker.impl.StandardLinkerContext;
+import com.google.gwt.dev.cfg.ModuleDef;
+import com.google.gwt.dev.cfg.ModuleDefLoader;
+import com.google.gwt.dev.jjs.JJSOptionsImpl;
+import com.google.gwt.dev.resource.Resource;
+import com.google.gwt.dev.shell.log.ServletContextTreeLogger;
+import com.google.gwt.dev.util.HttpHeaders;
+import com.google.gwt.dev.util.Util;
+import com.google.gwt.util.tools.Utility;
+
+import org.apache.commons.collections.map.AbstractReferenceMap;
+import org.apache.commons.collections.map.ReferenceIdentityMap;
+import org.apache.commons.collections.map.ReferenceMap;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.PrintWriter;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLConnection;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * Built-in servlet for convenient access to the public path of a specified
+ * module.
+ */
+public class GWTShellServlet extends HttpServlet {
+
+ private static class RequestParts {
+ public final String moduleName;
+
+ public final String partialPath;
+
+ public RequestParts(HttpServletRequest request)
+ throws UnableToCompleteException {
+ String pathInfo = request.getPathInfo();
+ if (pathInfo != null) {
+ int slash = pathInfo.indexOf('/', 1);
+ if (slash != -1) {
+ moduleName = pathInfo.substring(1, slash);
+ partialPath = pathInfo.substring(slash + 1);
+ return;
+ } else {
+ moduleName = pathInfo.substring(1);
+ partialPath = null;
+ return;
+ }
+ }
+ throw new UnableToCompleteException();
+ }
+ }
+
+ /**
+ * This the default cache time in seconds for files that aren't either
+ * *.cache.*, *.nocache.*.
+ */
+ private static final int DEFAULT_CACHE_SECONDS = 5;
+
+ private static final String XHTML_MIME_TYPE = "application/xhtml+xml";
+
+ /**
+ * Must keep only weak references to ModuleDefs else we permanently pin them.
+ */
+ @SuppressWarnings("unchecked")
+ private final Map<String, ModuleDef> loadedModulesByName = new ReferenceMap(
+ AbstractReferenceMap.HARD, AbstractReferenceMap.WEAK);
+
+ /**
+ * The lifetime of the module pins the lifetime of the associated servlet;
+ * this is because the loaded servlet has a weak backRef to its live module
+ * through its context. When the module dies, the servlet needs to die also.
+ */
+ @SuppressWarnings("unchecked")
+ private final Map<ModuleDef, Map<String, HttpServlet>> loadedServletsByModuleAndClassName = new ReferenceIdentityMap(
+ AbstractReferenceMap.WEAK, AbstractReferenceMap.HARD, true);
+
+ private final Map<String, String> mimeTypes = new HashMap<String, String>();
+
+ /**
+ * Only for backwards compatibility. Shouldn't we remove this now?
+ */
+ @SuppressWarnings("unchecked")
+ private final Map<String, ModuleDef> modulesByServletPath = new ReferenceMap(
+ AbstractReferenceMap.HARD, AbstractReferenceMap.WEAK);
+
+ private int nextRequestId;
+
+ private final Object requestIdLock = new Object();
+
+ private TreeLogger topLogger;
+
+ private WorkDirs workDirs;
+
+ public GWTShellServlet() {
+ initMimeTypes();
+ }
+
+ @Override
+ protected void doGet(HttpServletRequest request, HttpServletResponse response)
+ throws ServletException, IOException {
+ processFileRequest(request, response);
+ }
+
+ @Override
+ protected void doPost(HttpServletRequest request, HttpServletResponse response)
+ throws ServletException, IOException {
+ processFileRequest(request, response);
+ }
+
+ protected void processFileRequest(HttpServletRequest request,
+ HttpServletResponse response) throws IOException {
+
+ String pathInfo = request.getPathInfo();
+ if (pathInfo.length() == 0 || pathInfo.equals("/")) {
+ response.setContentType("text/html");
+ PrintWriter writer = response.getWriter();
+ writer.println("<html><body><basefont face='arial'>");
+ writer.println("To launch an application, specify a URL of the form <code>/<i>module</i>/<i>file.html</i></code>");
+ writer.println("</body></html>");
+ return;
+ }
+
+ TreeLogger logger = getLogger();
+
+ // Parse the request assuming it is module/resource.
+ //
+ RequestParts parts;
+ try {
+ parts = new RequestParts(request);
+ } catch (UnableToCompleteException e) {
+ sendErrorResponse(response, HttpServletResponse.SC_NOT_FOUND,
+ "Don't know what to do with this URL: '" + pathInfo + "'");
+ return;
+ }
+
+ String partialPath = parts.partialPath;
+ String moduleName = parts.moduleName;
+
+ // If the module is renamed, substitute the renamed module name
+ ModuleDef moduleDef = loadedModulesByName.get(moduleName);
+ if (moduleDef != null) {
+ moduleName = moduleDef.getName();
+ }
+
+ if (partialPath == null) {
+ // Redir back to the same URL but ending with a slash.
+ //
+ response.sendRedirect(moduleName + "/");
+ return;
+ } else if (partialPath.length() > 0) {
+ // Both the module name and a resource.
+ //
+ doGetPublicFile(request, response, logger, partialPath, moduleName);
+ return;
+ } else {
+ // Was just the module name, ending with a slash.
+ //
+ doGetModule(request, response, logger, parts);
+ return;
+ }
+ }
+
+ @Override
+ protected void service(HttpServletRequest request,
+ HttpServletResponse response) throws ServletException, IOException {
+
+ TreeLogger logger = getLogger();
+ int id = allocateRequestId();
+ if (logger.isLoggable(TreeLogger.TRACE)) {
+ StringBuffer url = request.getRequestURL();
+
+ // Branch the logger in case we decide to log more below.
+ logger = logger.branch(TreeLogger.TRACE, "Request " + id + ": " + url,
+ null);
+ }
+
+ String servletClassName = null;
+ ModuleDef moduleDef = null;
+
+ try {
+ // Attempt to split the URL into module/path, which we'll use to see
+ // if we can map the request to a module's servlet.
+ RequestParts parts = new RequestParts(request);
+
+ if ("favicon.ico".equalsIgnoreCase(parts.moduleName)) {
+ sendErrorResponse(response, HttpServletResponse.SC_NOT_FOUND,
+ "Icon not available");
+ return;
+ }
+
+ // See if the request references a module we know.
+ moduleDef = getModuleDef(logger, parts.moduleName);
+ if (moduleDef != null) {
+ // Okay, we know this module. Do we know this servlet path?
+ // It is right to prepend the slash because (1) ModuleDefSchema requires
+ // every servlet path to begin with a slash and (2) RequestParts always
+ // rips off the leading slash.
+ String servletPath = "/" + parts.partialPath;
+ servletClassName = moduleDef.findServletForPath(servletPath);
+
+ // Fall-through below, where we check servletClassName.
+ } else {
+ // Fall-through below, where we check servletClassName.
+ }
+ } catch (UnableToCompleteException e) {
+ // Do nothing, since it was speculative anyway.
+ }
+
+ // BEGIN BACKWARD COMPATIBILITY
+ if (servletClassName == null) {
+ // Try to map a bare path that isn't preceded by the module name.
+ // This is no longer the recommended practice, so we warn.
+ String path = request.getPathInfo();
+ moduleDef = modulesByServletPath.get(path);
+ if (moduleDef != null) {
+ // See if there is a servlet we can delegate to for the given url.
+ servletClassName = moduleDef.findServletForPath(path);
+
+ if (servletClassName != null) {
+ TreeLogger branch = logger.branch(TreeLogger.WARN,
+ "Use of deprecated hosted mode servlet path mapping", null);
+ branch.log(
+ TreeLogger.WARN,
+ "The client code is invoking the servlet with a URL that is not module-relative: "
+ + path, null);
+ branch.log(
+ TreeLogger.WARN,
+ "Prepend GWT.getModuleBaseURL() to the URL in client code to create a module-relative URL: /"
+ + moduleDef.getName() + path, null);
+ branch.log(
+ TreeLogger.WARN,
+ "Using module-relative URLs ensures correct URL-independent behavior in external servlet containers",
+ null);
+ }
+
+ // Fall-through below, where we check servletClassName.
+ } else {
+ // Fall-through below, where we check servletClassName.
+ }
+ }
+ // END BACKWARD COMPATIBILITY
+
+ // Load/get the servlet if we found one.
+ if (servletClassName != null) {
+ HttpServlet delegatee = tryGetOrLoadServlet(logger, moduleDef,
+ servletClassName);
+ if (delegatee == null) {
+ logger.log(TreeLogger.ERROR, "Unable to dispatch request", null);
+ sendErrorResponse(response,
+ HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
+ "Unable to find/load mapped servlet class '" + servletClassName
+ + "'");
+ return;
+ }
+
+ // Delegate everything to the downstream servlet and we're done.
+ delegatee.service(request, response);
+ } else {
+ // Use normal default processing on this request, since we couldn't
+ // recognize it as anything special.
+ super.service(request, response);
+ }
+ }
+
+ private int allocateRequestId() {
+ synchronized (requestIdLock) {
+ return nextRequestId++;
+ }
+ }
+
+ /**
+ * Handle auto-generated resources.
+ *
+ * @return <code>true</code> if a resource was generated
+ */
+ private boolean autoGenerateResources(HttpServletRequest request,
+ HttpServletResponse response, TreeLogger logger, String partialPath,
+ String moduleName) throws IOException {
+
+ if (partialPath.equals(moduleName + ".nocache.js")) {
+ if (request.getParameter("compiled") == null) {
+ // Generate the .js file.
+ try {
+ String js = genSelectionScript(logger, moduleName);
+ setResponseCacheHeaders(response, 0); // do not cache selection script
+ response.setStatus(HttpServletResponse.SC_OK);
+ response.setContentType("text/javascript");
+ response.getWriter().println(js);
+ return true;
+ } catch (UnableToCompleteException e) {
+ // The error will have already been logged. Continue, since this could
+ // actually be a request for a static file that happens to have an
+ // unfortunately confusing name.
+ }
+ }
+ } else if (partialPath.equals("hosted.html")) {
+ String html = HostedModeLinker.getHostedHtml();
+ setResponseCacheHeaders(response, DEFAULT_CACHE_SECONDS);
+ response.setStatus(HttpServletResponse.SC_OK);
+ response.setContentType("text/html");
+ response.getWriter().println(html);
+ return true;
+ }
+
+ return false;
+ }
+
+ private void doGetModule(HttpServletRequest request,
+ HttpServletResponse response, TreeLogger logger, RequestParts parts)
+ throws IOException {
+
+ // Generate a generic empty host page.
+ //
+ String msg = "The development shell servlet received a request to generate a host page for module '"
+ + parts.moduleName + "' ";
+
+ logger = logger.branch(TreeLogger.TRACE, msg, null);
+
+ try {
+ // Try to load the module just to make sure it'll work.
+ getModuleDef(logger, parts.moduleName);
+ } catch (UnableToCompleteException e) {
+ sendErrorResponse(response, HttpServletResponse.SC_NOT_FOUND,
+ "Unable to find/load module '" + Util.escapeXml(parts.moduleName)
+ + "' (see server log for details)");
+ return;
+ }
+
+ response.setContentType("text/html");
+ PrintWriter writer = response.getWriter();
+ writer.println("<html><head>");
+ writer.print("<script language='javascript' src='");
+ writer.print(parts.moduleName);
+ writer.println(".nocache.js'></script>");
+
+ // Create a property for each query param.
+ Map<String, String[]> params = getParameterMap(request);
+ for (Map.Entry<String, String[]> entry : params.entrySet()) {
+ String[] values = entry.getValue();
+ if (values.length > 0) {
+ writer.print("<meta name='gwt:property' content='");
+ writer.print(entry.getKey());
+ writer.print("=");
+ writer.print(values[values.length - 1]);
+ writer.println("'>");
+ }
+ }
+
+ writer.println("</head><body>");
+ writer.println("<iframe src=\"javascript:''\" id='__gwt_historyFrame' "
+ + "style='position:absolute;width:0;height:0;border:0'></iframe>");
+ writer.println("<noscript>");
+ writer.println(" <div style=\"width: 22em; position: absolute; left: 50%; margin-left: -11em; color: red; background-color: white; border: 1px solid red; padding: 4px; font-family: sans-serif\">");
+ writer.println(" Your web browser must have JavaScript enabled");
+ writer.println(" in order for this application to display correctly.");
+ writer.println(" </div>");
+ writer.println("</noscript>");
+ writer.println("</body></html>");
+
+ // Done.
+ }
+
+ /**
+ * Fetch a file and return it as the HTTP response, setting the cache-related
+ * headers according to the name of the file (see
+ * {@link #getCacheTime(String)}). This function honors If-Modified-Since to
+ * minimize the impact of limiting caching of files for development.
+ *
+ * @param request the HTTP request
+ * @param response the HTTP response
+ * @param logger a TreeLogger to use for debug output
+ * @param partialPath the path within the module
+ * @param moduleName the name of the module
+ * @throws IOException
+ */
+ @SuppressWarnings("deprecation")
+ private void doGetPublicFile(HttpServletRequest request,
+ HttpServletResponse response, TreeLogger logger, String partialPath,
+ String moduleName) throws IOException {
+
+ // Create a logger branch for this request.
+ logger = logger.branch(TreeLogger.TRACE,
+ "The development shell servlet received a request for '"
+ + partialPath + "' in module '" + moduleName + ".gwt.xml' ", null);
+
+ // Handle auto-generation of resources.
+ if (shouldAutoGenerateResources()) {
+ if (autoGenerateResources(request, response, logger, partialPath,
+ moduleName)) {
+ return;
+ }
+ }
+
+ URL foundResource = null;
+ try {
+ // Look for the requested file on the public path.
+ //
+ ModuleDef moduleDef = getModuleDef(logger, moduleName);
+ if (shouldAutoGenerateResources()) {
+ Resource publicResource = moduleDef.findPublicFile(partialPath);
+ if (publicResource != null) {
+ foundResource = publicResource.getURL();
+ }
+
+ if (foundResource == null) {
+ // Look for public generated files
+ File shellDir = getShellWorkDirs().getShellPublicGenDir(moduleDef);
+ File requestedFile = new File(shellDir, partialPath);
+ if (requestedFile.exists()) {
+ try {
+ foundResource = requestedFile.toURI().toURL();
+ } catch (MalformedURLException e) {
+ // ignore since it was speculative anyway
+ }
+ }
+ }
+ }
+
+ /*
+ * If the user is coming from compiled web-mode, check the linker output
+ * directory for the real bootstrap file.
+ */
+ if (foundResource == null) {
+ File moduleDir = getShellWorkDirs().getCompilerOutputDir(moduleDef);
+ File requestedFile = new File(moduleDir, partialPath);
+ if (requestedFile.exists()) {
+ try {
+ foundResource = requestedFile.toURI().toURL();
+ } catch (MalformedURLException e) {
+ // ignore since it was speculative anyway
+ }
+ }
+ }
+
+ if (foundResource == null) {
+ String msg;
+ if ("gwt.js".equals(partialPath)) {
+ msg = "Loading the old 'gwt.js' bootstrap script is no longer supported; please load '"
+ + moduleName + ".nocache.js' directly";
+ } else {
+ msg = "Resource not found: " + partialPath + "; "
+ + "(could a file be missing from the public path or a <servlet> "
+ + "tag misconfigured in module " + moduleName + ".gwt.xml ?)";
+ }
+ logger.log(TreeLogger.WARN, msg, null);
+ throw new UnableToCompleteException();
+ }
+ } catch (UnableToCompleteException e) {
+ sendErrorResponse(response, HttpServletResponse.SC_NOT_FOUND,
+ "Cannot find resource '" + partialPath
+ + "' in the public path of module '" + moduleName + "'");
+ return;
+ }
+
+ // Get the MIME type.
+ String path = foundResource.toExternalForm();
+ String mimeType = null;
+ try {
+ mimeType = getServletContext().getMimeType(path);
+ } catch (UnsupportedOperationException e) {
+ // Certain minimalist servlet containers throw this.
+ // Fall through to guess the type.
+ }
+
+ if (mimeType == null) {
+ mimeType = guessMimeType(path);
+ if (logger.isLoggable(TreeLogger.TRACE)) {
+ logger.log(TreeLogger.TRACE, "Guessed MIME type '" + mimeType + "'", null);
+ }
+ }
+
+ maybeIssueXhtmlWarning(logger, mimeType, partialPath);
+
+ long cacheSeconds = getCacheTime(path);
+
+ InputStream is = null;
+ try {
+ // Check for up-to-datedness.
+ URLConnection conn = foundResource.openConnection();
+ long lastModified = conn.getLastModified();
+ if (isNotModified(request, lastModified)) {
+ response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
+ setResponseCacheHeaders(response, cacheSeconds);
+ return;
+ }
+
+ // Set up headers to really send it.
+ response.setStatus(HttpServletResponse.SC_OK);
+ long now = new Date().getTime();
+ response.setHeader(HttpHeaders.DATE,
+ HttpHeaders.toInternetDateFormat(now));
+ response.setContentType(mimeType);
+ String lastModifiedStr = HttpHeaders.toInternetDateFormat(lastModified);
+ response.setHeader(HttpHeaders.LAST_MODIFIED, lastModifiedStr);
+
+ // Expiration header. Either immediately stale (requiring an
+ // "If-Modified-Since") or infinitely cacheable (not requiring even a
+ // freshness check).
+ setResponseCacheHeaders(response, cacheSeconds);
+
+ // Content length.
+ int contentLength = conn.getContentLength();
+ if (contentLength >= 0) {
+ response.setHeader(HttpHeaders.CONTENT_LENGTH,
+ Integer.toString(contentLength));
+ }
+
+ // Send the bytes.
+ is = conn.getInputStream();
+ streamOut(is, response.getOutputStream(), 1024 * 8);
+ } finally {
+ Utility.close(is);
+ }
+ }
+
+ /**
+ * Generates a module.js file on the fly. Note that the nocache file that is
+ * generated that can only be used for hosted mode. It cannot produce a web
+ * mode version, since this servlet doesn't know strong names, since by
+ * definition of "hosted mode" JavaScript hasn't been compiled at this point.
+ */
+ private String genSelectionScript(TreeLogger logger, String moduleName)
+ throws UnableToCompleteException {
+ if (logger.isLoggable(TreeLogger.TRACE)) {
+ logger.log(TreeLogger.TRACE,
+ "Generating a script selection script for module " + moduleName);
+ }
+ ModuleDef module = getModuleDef(logger, moduleName);
+ StandardLinkerContext context = new StandardLinkerContext(logger, module,
+ new JJSOptionsImpl());
+ ArtifactSet artifacts = context.getArtifactsForPublicResources(logger,
+ module);
+ HostedModeLinker linker = new HostedModeLinker();
+ return linker.generateSelectionScript(logger, context, artifacts);
+ }
+
+ /**
+ * Get the length of time a given file should be cacheable. If the path
+ * contains *.nocache.*, it is never cacheable; if it contains *.cache.*, it
+ * is infinitely cacheable; anything else gets a default time.
+ *
+ * @return cache time in seconds, or 0 if the file is not cacheable at all
+ */
+ private long getCacheTime(String path) {
+ int lastDot = path.lastIndexOf('.');
+ if (lastDot >= 0) {
+ String prefix = path.substring(0, lastDot);
+ if (prefix.endsWith(".cache")) {
+ // RFC2616 says to never give a cache time of more than a year
+ // http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.21
+ return HttpHeaders.SEC_YR;
+ } else if (prefix.endsWith(".nocache")) {
+ return 0;
+ }
+ }
+ return DEFAULT_CACHE_SECONDS;
+ }
+
+ private synchronized TreeLogger getLogger() {
+ if (topLogger == null) {
+ ServletContext servletContext = getServletContext();
+ final String attr = "com.google.gwt.dev.shell.logger";
+ topLogger = (TreeLogger) servletContext.getAttribute(attr);
+ if (topLogger == null) {
+ // No shell available, so wrap the regular servlet context logger.
+ //
+ topLogger = new ServletContextTreeLogger(servletContext);
+ }
+ }
+ return topLogger;
+ }
+
+ /**
+ * We don't actually log this on purpose since the client does anyway.
+ */
+ private ModuleDef getModuleDef(TreeLogger logger, String moduleName)
+ throws UnableToCompleteException {
+ synchronized (loadedModulesByName) {
+ ModuleDef moduleDef = loadedModulesByName.get(moduleName);
+ if (moduleDef == null) {
+ moduleDef = ModuleDefLoader.loadFromClassPath(logger, moduleName, false);
+ loadedModulesByName.put(moduleName, moduleDef);
+ loadedModulesByName.put(moduleDef.getName(), moduleDef);
+
+ // BEGIN BACKWARD COMPATIBILITY
+ // The following map of servlet path to module is included only
+ // for backward-compatibility. We are going to remove this functionality
+ // when we go out of beta. The new behavior is that the client should
+ // specify the module name as part of the URL and construct it using
+ // getModuleBaseURL().
+ String[] servletPaths = moduleDef.getServletPaths();
+ for (int i = 0; i < servletPaths.length; i++) {
+ modulesByServletPath.put(servletPaths[i], moduleDef);
+ }
+ // END BACKWARD COMPATIBILITY
+ }
+ return moduleDef;
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ private Map<String, String[]> getParameterMap(HttpServletRequest request) {
+ return request.getParameterMap();
+ }
+
+ private synchronized WorkDirs getShellWorkDirs() {
+ if (workDirs == null) {
+ ServletContext servletContext = getServletContext();
+ final String attr = "com.google.gwt.dev.shell.workdirs";
+ workDirs = (WorkDirs) servletContext.getAttribute(attr);
+ assert (workDirs != null);
+ }
+ return workDirs;
+ }
+
+ private String guessMimeType(String fullPath) {
+ int dot = fullPath.lastIndexOf('.');
+ if (dot != -1) {
+ String ext = fullPath.substring(dot + 1);
+ String mimeType = mimeTypes.get(ext);
+ if (mimeType != null) {
+ return mimeType;
+ }
+
+ // Otherwise, fall through.
+ //
+ }
+
+ // Last resort.
+ //
+ return "application/octet-stream";
+ }
+
+ private void initMimeTypes() {
+ mimeTypes.put("abs", "audio/x-mpeg");
+ mimeTypes.put("ai", "application/postscript");
+ mimeTypes.put("aif", "audio/x-aiff");
+ mimeTypes.put("aifc", "audio/x-aiff");
+ mimeTypes.put("aiff", "audio/x-aiff");
+ mimeTypes.put("aim", "application/x-aim");
+ mimeTypes.put("art", "image/x-jg");
+ mimeTypes.put("asf", "video/x-ms-asf");
+ mimeTypes.put("asx", "video/x-ms-asf");
+ mimeTypes.put("au", "audio/basic");
+ mimeTypes.put("avi", "video/x-msvideo");
+ mimeTypes.put("avx", "video/x-rad-screenplay");
+ mimeTypes.put("bcpio", "application/x-bcpio");
+ mimeTypes.put("bin", "application/octet-stream");
+ mimeTypes.put("bmp", "image/bmp");
+ mimeTypes.put("body", "text/html");
+ mimeTypes.put("cdf", "application/x-cdf");
+ mimeTypes.put("cer", "application/x-x509-ca-cert");
+ mimeTypes.put("class", "application/java");
+ mimeTypes.put("cpio", "application/x-cpio");
+ mimeTypes.put("csh", "application/x-csh");
+ mimeTypes.put("css", "text/css");
+ mimeTypes.put("dib", "image/bmp");
+ mimeTypes.put("doc", "application/msword");
+ mimeTypes.put("dtd", "text/plain");
+ mimeTypes.put("dv", "video/x-dv");
+ mimeTypes.put("dvi", "application/x-dvi");
+ mimeTypes.put("eps", "application/postscript");
+ mimeTypes.put("etx", "text/x-setext");
+ mimeTypes.put("exe", "application/octet-stream");
+ mimeTypes.put("gif", "image/gif");
+ mimeTypes.put("gtar", "application/x-gtar");
+ mimeTypes.put("gz", "application/x-gzip");
+ mimeTypes.put("hdf", "application/x-hdf");
+ mimeTypes.put("hqx", "application/mac-binhex40");
+ mimeTypes.put("htc", "text/x-component");
+ mimeTypes.put("htm", "text/html");
+ mimeTypes.put("html", "text/html");
+ mimeTypes.put("hqx", "application/mac-binhex40");
+ mimeTypes.put("ief", "image/ief");
+ mimeTypes.put("jad", "text/vnd.sun.j2me.app-descriptor");
+ mimeTypes.put("jar", "application/java-archive");
+ mimeTypes.put("java", "text/plain");
+ mimeTypes.put("jnlp", "application/x-java-jnlp-file");
+ mimeTypes.put("jpe", "image/jpeg");
+ mimeTypes.put("jpeg", "image/jpeg");
+ mimeTypes.put("jpg", "image/jpeg");
+ mimeTypes.put("js", "text/javascript");
+ mimeTypes.put("jsf", "text/plain");
+ mimeTypes.put("jspf", "text/plain");
+ mimeTypes.put("kar", "audio/x-midi");
+ mimeTypes.put("latex", "application/x-latex");
+ mimeTypes.put("m3u", "audio/x-mpegurl");
+ mimeTypes.put("mac", "image/x-macpaint");
+ mimeTypes.put("man", "application/x-troff-man");
+ mimeTypes.put("me", "application/x-troff-me");
+ mimeTypes.put("mid", "audio/x-midi");
+ mimeTypes.put("midi", "audio/x-midi");
+ mimeTypes.put("mif", "application/x-mif");
+ mimeTypes.put("mov", "video/quicktime");
+ mimeTypes.put("movie", "video/x-sgi-movie");
+ mimeTypes.put("mp1", "audio/x-mpeg");
+ mimeTypes.put("mp2", "audio/x-mpeg");
+ mimeTypes.put("mp3", "audio/x-mpeg");
+ mimeTypes.put("mpa", "audio/x-mpeg");
+ mimeTypes.put("mpe", "video/mpeg");
+ mimeTypes.put("mpeg", "video/mpeg");
+ mimeTypes.put("mpega", "audio/x-mpeg");
+ mimeTypes.put("mpg", "video/mpeg");
+ mimeTypes.put("mpv2", "video/mpeg2");
+ mimeTypes.put("ms", "application/x-wais-source");
+ mimeTypes.put("nc", "application/x-netcdf");
+ mimeTypes.put("oda", "application/oda");
+ mimeTypes.put("pbm", "image/x-portable-bitmap");
+ mimeTypes.put("pct", "image/pict");
+ mimeTypes.put("pdf", "application/pdf");
+ mimeTypes.put("pgm", "image/x-portable-graymap");
+ mimeTypes.put("pic", "image/pict");
+ mimeTypes.put("pict", "image/pict");
+ mimeTypes.put("pls", "audio/x-scpls");
+ mimeTypes.put("png", "image/png");
+ mimeTypes.put("pnm", "image/x-portable-anymap");
+ mimeTypes.put("pnt", "image/x-macpaint");
+ mimeTypes.put("ppm", "image/x-portable-pixmap");
+ mimeTypes.put("ppt", "application/powerpoint");
+ mimeTypes.put("ps", "application/postscript");
+ mimeTypes.put("psd", "image/x-photoshop");
+ mimeTypes.put("qt", "video/quicktime");
+ mimeTypes.put("qti", "image/x-quicktime");
+ mimeTypes.put("qtif", "image/x-quicktime");
+ mimeTypes.put("ras", "image/x-cmu-raster");
+ mimeTypes.put("rgb", "image/x-rgb");
+ mimeTypes.put("rm", "application/vnd.rn-realmedia");
+ mimeTypes.put("roff", "application/x-troff");
+ mimeTypes.put("rtf", "application/rtf");
+ mimeTypes.put("rtx", "text/richtext");
+ mimeTypes.put("sh", "application/x-sh");
+ mimeTypes.put("shar", "application/x-shar");
+ mimeTypes.put("smf", "audio/x-midi");
+ mimeTypes.put("sit", "application/x-stuffit");
+ mimeTypes.put("snd", "audio/basic");
+ mimeTypes.put("src", "application/x-wais-source");
+ mimeTypes.put("sv4cpio", "application/x-sv4cpio");
+ mimeTypes.put("sv4crc", "application/x-sv4crc");
+ mimeTypes.put("swf", "application/x-shockwave-flash");
+ mimeTypes.put("t", "application/x-troff");
+ mimeTypes.put("tar", "application/x-tar");
+ mimeTypes.put("tcl", "application/x-tcl");
+ mimeTypes.put("tex", "application/x-tex");
+ mimeTypes.put("texi", "application/x-texinfo");
+ mimeTypes.put("texinfo", "application/x-texinfo");
+ mimeTypes.put("tif", "image/tiff");
+ mimeTypes.put("tiff", "image/tiff");
+ mimeTypes.put("tr", "application/x-troff");
+ mimeTypes.put("tsv", "text/tab-separated-values");
+ mimeTypes.put("txt", "text/plain");
+ mimeTypes.put("ulw", "audio/basic");
+ mimeTypes.put("ustar", "application/x-ustar");
+ mimeTypes.put("xbm", "image/x-xbitmap");
+ mimeTypes.put("xht", "application/xhtml+xml");
+ mimeTypes.put("xhtml", "application/xhtml+xml");
+ mimeTypes.put("xml", "text/xml");
+ mimeTypes.put("xpm", "image/x-xpixmap");
+ mimeTypes.put("xsl", "text/xml");
+ mimeTypes.put("xwd", "image/x-xwindowdump");
+ mimeTypes.put("wav", "audio/x-wav");
+ mimeTypes.put("svg", "image/svg+xml");
+ mimeTypes.put("svgz", "image/svg+xml");
+ mimeTypes.put("vsd", "application/x-visio");
+ mimeTypes.put("wbmp", "image/vnd.wap.wbmp");
+ mimeTypes.put("wml", "text/vnd.wap.wml");
+ mimeTypes.put("wmlc", "application/vnd.wap.wmlc");
+ mimeTypes.put("wmls", "text/vnd.wap.wmlscript");
+ mimeTypes.put("wmlscriptc", "application/vnd.wap.wmlscriptc");
+ mimeTypes.put("wrl", "x-world/x-vrml");
+ mimeTypes.put("Z", "application/x-compress");
+ mimeTypes.put("z", "application/x-compress");
+ mimeTypes.put("zip", "application/zip");
+ }
+
+ /**
+ * Checks to see whether or not a client's file is out of date relative to the
+ * original.
+ */
+ private boolean isNotModified(HttpServletRequest request, long ageOfServerCopy) {
+ // The age of the server copy *must* have the milliseconds truncated.
+ // Since milliseconds isn't part of the GMT format, failure to truncate
+ // will leave the file in a state where it appears constantly out of date
+ // and yet it can never get in sync because the Last-Modified date keeps
+ // truncating off the milliseconds part on its way out.
+ //
+ ageOfServerCopy -= (ageOfServerCopy % 1000);
+
+ long ageOfClientCopy = 0;
+ String ifModifiedSince = request.getHeader("If-Modified-Since");
+ if (ifModifiedSince != null) {
+ // Rip off any additional stuff at the end, such as "; length="
+ // (IE does add this).
+ //
+ int lastSemi = ifModifiedSince.lastIndexOf(';');
+ if (lastSemi != -1) {
+ ifModifiedSince = ifModifiedSince.substring(0, lastSemi);
+ }
+ ageOfClientCopy = HttpHeaders.fromInternetDateFormat(ifModifiedSince);
+ }
+
+ if (ageOfClientCopy >= ageOfServerCopy) {
+ // The client already has a good copy.
+ //
+ return true;
+ } else {
+ // The client needs a fresh copy of the requested file.
+ //
+ return false;
+ }
+ }
+
+ private void maybeIssueXhtmlWarning(TreeLogger logger, String mimeType,
+ String path) {
+ if (!XHTML_MIME_TYPE.equals(mimeType)) {
+ return;
+ }
+
+ String msg = "File was returned with content-type of \"" + mimeType
+ + "\". GWT requires browser features that are not available to "
+ + "documents with this content-type.";
+
+ int ix = path.lastIndexOf('.');
+ if (ix >= 0 && ix < path.length()) {
+ String base = path.substring(0, ix);
+ msg += " Consider renaming \"" + path + "\" to \"" + base + ".html\".";
+ }
+
+ logger.log(TreeLogger.WARN, msg, null);
+ }
+
+ private void sendErrorResponse(HttpServletResponse response, int statusCode,
+ String msg) throws IOException {
+ response.setContentType("text/html");
+ response.getWriter().println(msg);
+ response.setStatus(statusCode);
+ }
+
+ /**
+ * Sets the Cache-control and Expires headers in the response based on the
+ * supplied cache time.
+ *
+ * Expires is used in addition to Cache-control for older clients or proxies
+ * which may not properly understand Cache-control.
+ *
+ * @param response the HttpServletResponse to update
+ * @param cacheTime non-negative number of seconds to cache the response; 0
+ * means specifically do not allow caching at all.
+ * @throws IllegalArgumentException if cacheTime is negative
+ */
+ private void setResponseCacheHeaders(HttpServletResponse response,
+ long cacheTime) {
+ long expires;
+ if (cacheTime < 0) {
+ throw new IllegalArgumentException("cacheTime of " + cacheTime
+ + " is negative");
+ }
+ if (cacheTime > 0) {
+ // Expire the specified seconds in the future.
+ expires = new Date().getTime() + cacheTime * HttpHeaders.MS_SEC;
+ } else {
+ // Prevent caching by using a time in the past for cache expiration.
+ // Use January 2, 1970 00:00:00, to account for timezone changes
+ // in case a browser tries to convert to a local timezone first
+ // 0=Jan 1, so add 1 day's worth of milliseconds to get Jan 2
+ expires = HttpHeaders.SEC_DAY * HttpHeaders.MS_SEC;
+ }
+ response.setHeader(HttpHeaders.CACHE_CONTROL,
+ HttpHeaders.CACHE_CONTROL_MAXAGE + cacheTime);
+ String expiresString = HttpHeaders.toInternetDateFormat(expires);
+ response.setHeader(HttpHeaders.EXPIRES, expiresString);
+ }
+
+ private boolean shouldAutoGenerateResources() {
+ ServletContext servletContext = getServletContext();
+ final String attr = "com.google.gwt.dev.shell.shouldAutoGenerateResources";
+ Boolean attrValue = (Boolean) servletContext.getAttribute(attr);
+ if (attrValue == null) {
+ return true;
+ }
+ return attrValue;
+ }
+
+ private void streamOut(InputStream in, OutputStream out, int bufferSize)
+ throws IOException {
+ assert (bufferSize >= 0);
+
+ byte[] buffer = new byte[bufferSize];
+ int bytesRead = 0;
+ while (true) {
+ bytesRead = in.read(buffer);
+ if (bytesRead >= 0) {
+ // Copy the bytes out.
+ out.write(buffer, 0, bytesRead);
+ } else {
+ // End of input stream.
+ out.flush();
+ return;
+ }
+ }
+ }
+
+ private HttpServlet tryGetOrLoadServlet(TreeLogger logger,
+ ModuleDef moduleDef, String className) {
+
+ // Maps className to live servlet for this module.
+ Map<String, HttpServlet> moduleServlets;
+ synchronized (loadedServletsByModuleAndClassName) {
+ moduleServlets = loadedServletsByModuleAndClassName.get(moduleDef);
+ if (moduleServlets == null) {
+ moduleServlets = new HashMap<String, HttpServlet>();
+ loadedServletsByModuleAndClassName.put(moduleDef, moduleServlets);
+ }
+ }
+
+ synchronized (moduleServlets) {
+ HttpServlet servlet = moduleServlets.get(className);
+ if (servlet != null) {
+ // Found it.
+ //
+ return servlet;
+ }
+
+ // Try to load and instantiate it.
+ //
+ Throwable caught = null;
+ try {
+ Class<?> servletClass = Class.forName(className);
+ Object newInstance = servletClass.newInstance();
+ if (!(newInstance instanceof HttpServlet)) {
+ logger.log(TreeLogger.ERROR,
+ "Not compatible with HttpServlet: " + className
+ + " (does your service extend RemoteServiceServlet?)", null);
+ return null;
+ }
+
+ // Success. Hang onto the instance so we can reuse it.
+ //
+ servlet = (HttpServlet) newInstance;
+
+ // We create proxies for ServletContext and ServletConfig to enable
+ // RemoteServiceServlets to load public and generated resources via
+ // ServletContext.getResourceAsStream()
+ //
+ ServletContext context = new HostedModeServletContextProxy(
+ getServletContext(), moduleDef, getShellWorkDirs());
+ ServletConfig config = new HostedModeServletConfigProxy(
+ getServletConfig(), context);
+
+ servlet.init(config);
+
+ moduleServlets.put(className, servlet);
+ return servlet;
+ } catch (ClassNotFoundException e) {
+ caught = e;
+ } catch (InstantiationException e) {
+ caught = e;
+ } catch (IllegalAccessException e) {
+ caught = e;
+ } catch (ServletException e) {
+ caught = e;
+ }
+ String msg = "Unable to instantiate '" + className + "'";
+ logger.log(TreeLogger.ERROR, msg, caught);
+ return null;
+ }
+ }
+}
diff --git a/dev/core/src/com/google/gwt/dev/shell/HostedModeServletContextProxy.java b/dev/core/src/com/google/gwt/dev/shell/HostedModeServletContextProxy.java
new file mode 100644
index 0000000..d6b321e
--- /dev/null
+++ b/dev/core/src/com/google/gwt/dev/shell/HostedModeServletContextProxy.java
@@ -0,0 +1,338 @@
+/*
+ * Copyright 2007 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.dev.shell;
+
+import com.google.gwt.dev.cfg.ModuleDef;
+import com.google.gwt.dev.resource.Resource;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.ref.WeakReference;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Enumeration;
+import java.util.Set;
+
+import javax.servlet.RequestDispatcher;
+import javax.servlet.Servlet;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+
+/**
+ * ServletContext proxy that implements the getResource and getResourceAsStream
+ * members so that they can work with the {@link GWTShellServlet}.
+ */
+class HostedModeServletContextProxy implements ServletContext {
+ private final ServletContext context;
+ /**
+ * Avoid pinning my moduleDef.
+ */
+ private final WeakReference<ModuleDef> moduleDefRef;
+ private final WorkDirs workDirs;
+
+ HostedModeServletContextProxy(ServletContext context, ModuleDef moduleDef,
+ WorkDirs workDirs) {
+ this.context = context;
+ this.moduleDefRef = new WeakReference<ModuleDef>(moduleDef);
+ this.workDirs = workDirs;
+ }
+
+ /**
+ * @param arg0
+ * @return
+ * @see javax.servlet.ServletContext#getAttribute(java.lang.String)
+ */
+ public Object getAttribute(String arg0) {
+ return context.getAttribute(arg0);
+ }
+
+ /**
+ * @return
+ * @see javax.servlet.ServletContext#getAttributeNames()
+ */
+ @SuppressWarnings("unchecked")
+ public Enumeration<String> getAttributeNames() {
+ return context.getAttributeNames();
+ }
+
+ /**
+ * @param arg0
+ * @return
+ * @see javax.servlet.ServletContext#getContext(java.lang.String)
+ */
+ public ServletContext getContext(String arg0) {
+ return context.getContext(arg0);
+ }
+
+ public String getContextPath() {
+ return context.getContextPath();
+ }
+
+ /**
+ * @param arg0
+ * @return
+ * @see javax.servlet.ServletContext#getInitParameter(java.lang.String)
+ */
+ public String getInitParameter(String arg0) {
+ return context.getInitParameter(arg0);
+ }
+
+ /**
+ * @return
+ * @see javax.servlet.ServletContext#getInitParameterNames()
+ */
+ public Enumeration<?> getInitParameterNames() {
+ return context.getInitParameterNames();
+ }
+
+ /**
+ * @return
+ * @see javax.servlet.ServletContext#getMajorVersion()
+ */
+ public int getMajorVersion() {
+ return context.getMajorVersion();
+ }
+
+ /**
+ * @param arg0
+ * @return
+ * @see javax.servlet.ServletContext#getMimeType(java.lang.String)
+ */
+ public String getMimeType(String arg0) {
+ return context.getMimeType(arg0);
+ }
+
+ /**
+ * @return
+ * @see javax.servlet.ServletContext#getMinorVersion()
+ */
+ public int getMinorVersion() {
+ return context.getMinorVersion();
+ }
+
+ /**
+ * @param arg0
+ * @return
+ * @see javax.servlet.ServletContext#getNamedDispatcher(java.lang.String)
+ */
+ public RequestDispatcher getNamedDispatcher(String arg0) {
+ return context.getNamedDispatcher(arg0);
+ }
+
+ /**
+ * @param arg0
+ * @return
+ * @see javax.servlet.ServletContext#getRealPath(java.lang.String)
+ */
+ public String getRealPath(String arg0) {
+ return context.getRealPath(arg0);
+ }
+
+ /**
+ * @param arg0
+ * @return
+ * @see javax.servlet.ServletContext#getRequestDispatcher(java.lang.String)
+ */
+ public RequestDispatcher getRequestDispatcher(String arg0) {
+ return context.getRequestDispatcher(arg0);
+ }
+
+ /**
+ * @param arg0
+ * @return
+ * @throws MalformedURLException
+ * @see javax.servlet.ServletContext#getResource(java.lang.String)
+ */
+ @SuppressWarnings("deprecation")
+ public URL getResource(String path) throws MalformedURLException {
+ ModuleDef moduleDef = moduleDefRef.get();
+ assert (moduleDef != null) : "GWTShellServlet should have guaranteed that a"
+ + " live servlet will never process a request for a dead module; if you"
+ + " are using this servlet outside the context of processing a call,"
+ + " then don't do that";
+
+ String moduleContext = "/" + moduleDef.getName() + "/";
+ if (!path.startsWith(moduleContext)) {
+ // Check for a renamed module
+ moduleContext = "/" + moduleDef.getCanonicalName() + "/";
+ if (!path.startsWith(moduleContext)) {
+ // This path is in a different context; just return null
+ return null;
+ }
+ }
+
+ String partialPath = path.substring(moduleContext.length());
+
+ // Try to get the resource from the application's public path
+ Resource publicResource = moduleDef.findPublicFile(partialPath);
+ if (publicResource != null) {
+ return publicResource.getURL();
+ }
+
+ // Otherwise try the path in the shell's public generated directory
+ File shellDir = workDirs.getShellPublicGenDir(moduleDef);
+ File requestedFile = new File(shellDir, partialPath);
+ if (requestedFile.exists()) {
+ return requestedFile.toURI().toURL();
+ }
+
+ /*
+ * If the user is coming from compiled web-mode, check the linker output
+ * directory for the file. We'll default to using the output directory of
+ * the first linker defined in the <set-linker> tab.
+ */
+ File linkDir = workDirs.getCompilerOutputDir(moduleDef);
+ requestedFile = new File(linkDir, partialPath);
+ if (requestedFile.exists()) {
+ try {
+ return requestedFile.toURI().toURL();
+ } catch (MalformedURLException e) {
+ // ignore since it was speculative anyway
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * @param arg0
+ * @return
+ * @see javax.servlet.ServletContext#getResourceAsStream(java.lang.String)
+ */
+ public InputStream getResourceAsStream(String arg0) {
+ URL url;
+ try {
+ url = getResource(arg0);
+ if (url != null) {
+ return url.openStream();
+ }
+ } catch (MalformedURLException e) {
+ // Ignore the exception; return null
+ } catch (IOException e) {
+ // Ignore the exception; return null
+ }
+
+ return null;
+ }
+
+ /**
+ *
+ * @param path
+ * @return
+ * @see javax.servlet.ServletContext#getResourcePaths(java.lang.String)
+ */
+ @SuppressWarnings("unchecked")
+ public Set<String> getResourcePaths(String path) {
+ return context.getResourcePaths(path);
+ }
+
+ /**
+ * @return
+ * @see javax.servlet.ServletContext#getServerInfo()
+ */
+ public String getServerInfo() {
+ return context.getServerInfo();
+ }
+
+ /**
+ * @param arg0
+ * @return
+ * @throws ServletException
+ * @deprecated
+ * @see javax.servlet.ServletContext#getServlet(java.lang.String)
+ */
+ @Deprecated
+ public Servlet getServlet(String arg0) throws ServletException {
+ return context.getServlet(arg0);
+ }
+
+ /**
+ * @return
+ * @see javax.servlet.ServletContext#getServletContextName()
+ */
+ public String getServletContextName() {
+ return context.getServletContextName();
+ }
+
+ /**
+ * @return
+ * @deprecated
+ * @see javax.servlet.ServletContext#getServletNames()
+ */
+ @Deprecated
+ @SuppressWarnings("unchecked")
+ public Enumeration<String> getServletNames() {
+ return context.getServletNames();
+ }
+
+ /**
+ * @return
+ * @deprecated
+ * @see javax.servlet.ServletContext#getServlets()
+ */
+ @Deprecated
+ @SuppressWarnings("unchecked")
+ public Enumeration<Servlet> getServlets() {
+ return context.getServlets();
+ }
+
+ /**
+ * @param arg0
+ * @param arg1
+ * @deprecated
+ * @see javax.servlet.ServletContext#log(java.lang.Exception,
+ * java.lang.String)
+ */
+ @Deprecated
+ public void log(Exception arg0, String arg1) {
+ context.log(arg0, arg1);
+ }
+
+ /**
+ * @param arg0
+ * @see javax.servlet.ServletContext#log(java.lang.String)
+ */
+ public void log(String arg0) {
+ context.log(arg0);
+ }
+
+ /**
+ * @param arg0
+ * @param arg1
+ * @see javax.servlet.ServletContext#log(java.lang.String,java.lang.Throwable)
+ */
+ public void log(String arg0, Throwable arg1) {
+ context.log(arg0, arg1);
+ }
+
+ /**
+ * @param arg0
+ * @see javax.servlet.ServletContext#removeAttribute(java.lang.String)
+ */
+ public void removeAttribute(String arg0) {
+ context.removeAttribute(arg0);
+ }
+
+ /**
+ * @param arg0
+ * @param arg1
+ * @see javax.servlet.ServletContext#setAttribute(java.lang.String,java.lang.Object)
+ */
+ public void setAttribute(String arg0, Object arg1) {
+ context.setAttribute(arg0, arg1);
+ }
+}
diff --git a/dev/core/src/com/google/gwt/dev/shell/ModuleSpace.java b/dev/core/src/com/google/gwt/dev/shell/ModuleSpace.java
index 15e1354..b724854 100644
--- a/dev/core/src/com/google/gwt/dev/shell/ModuleSpace.java
+++ b/dev/core/src/com/google/gwt/dev/shell/ModuleSpace.java
@@ -621,7 +621,7 @@
String details = "<p>Exception while loading module <b>"
+ Util.escapeXml(entryPointTypeName) + "</b>."
+ " See Development Mode for details.</p>"
- + "<div style='overflow:visible;white-space:pre;'>" + stackTrace
+ + "<div style='overflow:visisble;white-space:pre;'>" + stackTrace
+ "</div>";
invokeNativeVoid("__gwt_displayGlassMessage", null,
diff --git a/dev/core/src/com/google/gwt/dev/shell/ShellMainWindow.java b/dev/core/src/com/google/gwt/dev/shell/ShellMainWindow.java
index edaffde..49a181d 100644
--- a/dev/core/src/com/google/gwt/dev/shell/ShellMainWindow.java
+++ b/dev/core/src/com/google/gwt/dev/shell/ShellMainWindow.java
@@ -1,4 +1,4 @@
-/*
+/**
* Copyright 2008 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
diff --git a/dev/core/src/com/google/gwt/dev/shell/log/SwingLoggerPanel.java b/dev/core/src/com/google/gwt/dev/shell/log/SwingLoggerPanel.java
index 9bac9bd..01c886a 100644
--- a/dev/core/src/com/google/gwt/dev/shell/log/SwingLoggerPanel.java
+++ b/dev/core/src/com/google/gwt/dev/shell/log/SwingLoggerPanel.java
@@ -50,7 +50,6 @@
import javax.swing.AbstractAction;
import javax.swing.BorderFactory;
import javax.swing.JButton;
-import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JEditorPane;
@@ -66,12 +65,10 @@
import javax.swing.PopupFactory;
import javax.swing.UIManager;
import javax.swing.event.HyperlinkEvent;
-import javax.swing.event.HyperlinkEvent.EventType;
import javax.swing.event.HyperlinkListener;
-import javax.swing.event.TreeModelEvent;
-import javax.swing.event.TreeModelListener;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
+import javax.swing.event.HyperlinkEvent.EventType;
import javax.swing.text.html.HTMLDocument;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
@@ -214,6 +211,9 @@
searchField.requestFocusInWindow();
}
+ /**
+ *
+ */
private void updateSearchResult() {
int n = matches.size();
if (n == 0) {
@@ -260,7 +260,7 @@
String regexFilter;
- private final JTree tree;
+ final JTree tree;
DefaultTreeModel treeModel;
@@ -286,8 +286,6 @@
private JScrollPane treeView;
- private JCheckBox autoScroll;
-
/**
* Create a Swing-based logger panel, with a tree section and a detail
* section.
@@ -319,9 +317,6 @@
}
});
logButtons.add(collapseButton);
- autoScroll = new JCheckBox("Auto-scroll", true);
- autoScroll.setMnemonic(KeyEvent.VK_U);
- logButtons.add(autoScroll);
topPanel.add(logButtons, BorderLayout.CENTER);
// TODO(jat): temporarily avoid showing parts that aren't implemented.
if (false) {
@@ -374,16 +369,6 @@
add(topPanel, BorderLayout.NORTH);
root = new DefaultMutableTreeNode();
treeModel = new DefaultTreeModel(root);
- treeModel.addTreeModelListener(new TreeModelListener() {
- @Override public void treeNodesInserted(TreeModelEvent e) {
- for (Object treeNode : e.getChildren()) {
- onTreeNodeAdded((DefaultMutableTreeNode) treeNode);
- }
- }
- @Override public void treeStructureChanged(TreeModelEvent e) { }
- @Override public void treeNodesRemoved(TreeModelEvent e) { }
- @Override public void treeNodesChanged(TreeModelEvent e) { }
- });
tree = new JTree(treeModel);
tree.setRootVisible(false);
tree.setEditable(false);
@@ -531,6 +516,13 @@
}
}
+ /**
+ * @param node
+ */
+ public void notifyChange(DefaultMutableTreeNode node) {
+ treeModel.nodeChanged(node);
+ }
+
@Override
public void removeAll() {
tree.removeAll();
@@ -724,18 +716,4 @@
buf.append('\n');
}
}
-
- private void onTreeNodeAdded(DefaultMutableTreeNode treeNode) {
- TreePath path = new TreePath(treeNode.getPath());
- if (autoScroll.isSelected()) {
- tree.scrollPathToVisible(path); // internally will also call makeVisible
- } else {
- Object userObject = treeNode.getUserObject();
- if (userObject instanceof LogEvent) {
- if (((LogEvent) userObject).type.needsAttention()) {
- tree.makeVisible(path);
- }
- }
- }
- }
}
diff --git a/dev/core/src/com/google/gwt/dev/shell/log/SwingTreeLogger.java b/dev/core/src/com/google/gwt/dev/shell/log/SwingTreeLogger.java
index 67d4804..ac5d464 100644
--- a/dev/core/src/com/google/gwt/dev/shell/log/SwingTreeLogger.java
+++ b/dev/core/src/com/google/gwt/dev/shell/log/SwingTreeLogger.java
@@ -30,6 +30,7 @@
import javax.swing.Icon;
import javax.swing.JLabel;
import javax.swing.tree.DefaultMutableTreeNode;
+import javax.swing.tree.TreePath;
/**
* Tree logger built on an Swing tree item.
@@ -354,6 +355,9 @@
}
int insertIndex = findInsertionPoint(parentNode, idx);
panel.treeModel.insertNodeInto(node, parentNode, insertIndex);
+ if (logEvent.type.needsAttention()) {
+ panel.tree.makeVisible(new TreePath(node.getPath()));
+ }
if (parentNode == panel.treeModel.getRoot()
&& parentNode.getChildCount() == 1) {
panel.treeModel.reload();
diff --git a/dev/core/src/com/google/gwt/dev/shell/tomcat/CatalinaLoggerAdapter.java b/dev/core/src/com/google/gwt/dev/shell/tomcat/CatalinaLoggerAdapter.java
new file mode 100644
index 0000000..9cf2d95
--- /dev/null
+++ b/dev/core/src/com/google/gwt/dev/shell/tomcat/CatalinaLoggerAdapter.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2006 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.dev.shell.tomcat;
+
+import com.google.gwt.core.ext.TreeLogger;
+
+import org.apache.catalina.logger.LoggerBase;
+
+class CatalinaLoggerAdapter extends LoggerBase {
+
+ private final TreeLogger logger;
+
+ public CatalinaLoggerAdapter(TreeLogger logger) {
+ this.logger = logger;
+ }
+
+ @Override
+ public void log(Exception exception, String msg) {
+ logger.log(TreeLogger.WARN, msg, exception);
+ }
+
+ @Override
+ public void log(String msg) {
+ logger.log(TreeLogger.INFO, msg, null);
+ }
+
+ @Override
+ public void log(String message, int verbosity) {
+ TreeLogger.Type type = mapVerbosityToLogType(verbosity);
+ logger.log(type, message, null);
+ }
+
+ @Override
+ public void log(String msg, Throwable throwable) {
+ logger.log(TreeLogger.WARN, msg, throwable);
+ }
+
+ @Override
+ public void log(String message, Throwable throwable, int verbosity) {
+ TreeLogger.Type type = mapVerbosityToLogType(verbosity);
+ logger.log(type, message, throwable);
+ }
+
+ private TreeLogger.Type mapVerbosityToLogType(int verbosity) {
+ switch (verbosity) {
+ case LoggerBase.FATAL:
+ case LoggerBase.ERROR:
+ case LoggerBase.WARNING:
+ return TreeLogger.WARN;
+
+ case LoggerBase.INFORMATION:
+ return TreeLogger.DEBUG;
+ case LoggerBase.DEBUG:
+ return TreeLogger.SPAM;
+
+ default:
+ // really, this was an unexpected type
+ return TreeLogger.WARN;
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/dev/core/src/com/google/gwt/dev/shell/tomcat/CommonsLoggerAdapter.java b/dev/core/src/com/google/gwt/dev/shell/tomcat/CommonsLoggerAdapter.java
new file mode 100644
index 0000000..d071d2a
--- /dev/null
+++ b/dev/core/src/com/google/gwt/dev/shell/tomcat/CommonsLoggerAdapter.java
@@ -0,0 +1,119 @@
+/*
+ * Copyright 2006 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.dev.shell.tomcat;
+
+import com.google.gwt.core.ext.TreeLogger;
+
+/**
+ * Maps Tomcat's commons logger onto the GWT shell's tree logger.
+ */
+public class CommonsLoggerAdapter implements org.apache.commons.logging.Log {
+
+ private TreeLogger log;
+
+ /**
+ * @param name unused
+ */
+ public CommonsLoggerAdapter(String name) {
+ // NOTE: this is ugly, but I don't know of any other way to get a
+ // non-static log to which we can delegate.
+ //
+ log = EmbeddedTomcatServer.sTomcat.getLogger();
+ }
+
+ public void debug(Object message) {
+ doLog(TreeLogger.SPAM, message, null);
+ }
+
+ public void debug(Object message, Throwable t) {
+ doLog(TreeLogger.SPAM, message, t);
+ }
+
+ public void error(Object message) {
+ doLog(TreeLogger.WARN, message, null);
+ }
+
+ public void error(Object message, Throwable t) {
+ doLog(TreeLogger.WARN, message, t);
+ }
+
+ public void fatal(Object message) {
+ doLog(TreeLogger.WARN, message, null);
+ }
+
+ public void fatal(Object message, Throwable t) {
+ doLog(TreeLogger.WARN, message, t);
+ }
+
+ public void info(Object message) {
+ // Intentionally low-level to us.
+ doLog(TreeLogger.TRACE, message, null);
+ }
+
+ public void info(Object message, Throwable t) {
+ // Intentionally low-level to us.
+ doLog(TreeLogger.TRACE, message, t);
+ }
+
+ public boolean isDebugEnabled() {
+ return log.isLoggable(TreeLogger.SPAM);
+ }
+
+ public boolean isErrorEnabled() {
+ return log.isLoggable(TreeLogger.WARN);
+ }
+
+ public boolean isFatalEnabled() {
+ return log.isLoggable(TreeLogger.WARN);
+ }
+
+ public boolean isInfoEnabled() {
+ // Intentionally low-level to us.
+ return log.isLoggable(TreeLogger.TRACE);
+ }
+
+ public boolean isTraceEnabled() {
+ // Intentionally low-level to us.
+ return log.isLoggable(TreeLogger.SPAM);
+ }
+
+ public boolean isWarnEnabled() {
+ return log.isLoggable(TreeLogger.WARN);
+ }
+
+ public void trace(Object message) {
+ // Intentionally low-level to us.
+ doLog(TreeLogger.DEBUG, message, null);
+ }
+
+ public void trace(Object message, Throwable t) {
+ // Intentionally low-level to us.
+ doLog(TreeLogger.DEBUG, message, t);
+ }
+
+ public void warn(Object message) {
+ doLog(TreeLogger.WARN, message, null);
+ }
+
+ public void warn(Object message, Throwable t) {
+ doLog(TreeLogger.WARN, message, t);
+ }
+
+ private void doLog(TreeLogger.Type type, Object message, Throwable t) {
+ String msg = message.toString();
+ log.log(type, msg, t);
+ }
+}
\ No newline at end of file
diff --git a/dev/core/src/com/google/gwt/dev/shell/tomcat/EmbeddedTomcatServer.java b/dev/core/src/com/google/gwt/dev/shell/tomcat/EmbeddedTomcatServer.java
new file mode 100644
index 0000000..e7d27ac
--- /dev/null
+++ b/dev/core/src/com/google/gwt/dev/shell/tomcat/EmbeddedTomcatServer.java
@@ -0,0 +1,436 @@
+/*
+ * Copyright 2006 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.dev.shell.tomcat;
+
+import com.google.gwt.core.ext.TreeLogger;
+import com.google.gwt.dev.resource.Resource;
+import com.google.gwt.dev.resource.impl.ClassPathEntry;
+import com.google.gwt.dev.resource.impl.PathPrefix;
+import com.google.gwt.dev.resource.impl.PathPrefixSet;
+import com.google.gwt.dev.resource.impl.ResourceOracleImpl;
+import com.google.gwt.dev.shell.WorkDirs;
+import com.google.gwt.dev.util.Util;
+
+import org.apache.catalina.Connector;
+import org.apache.catalina.ContainerEvent;
+import org.apache.catalina.ContainerListener;
+import org.apache.catalina.Engine;
+import org.apache.catalina.LifecycleException;
+import org.apache.catalina.Logger;
+import org.apache.catalina.core.StandardContext;
+import org.apache.catalina.core.StandardHost;
+import org.apache.catalina.startup.Embedded;
+import org.apache.catalina.startup.HostConfig;
+import org.apache.coyote.tomcat5.CoyoteConnector;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.lang.reflect.Field;
+import java.net.InetAddress;
+import java.net.ServerSocket;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.Collections;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Map.Entry;
+
+/**
+ * Wraps an instance of the Tomcat web server used in hosted mode.
+ */
+public class EmbeddedTomcatServer {
+
+ static EmbeddedTomcatServer sTomcat;
+
+ public static int getPort() {
+ return sTomcat.port;
+ }
+
+ public static String start(TreeLogger topLogger, int port, WorkDirs workDirs) {
+ return start(topLogger, port, workDirs, true);
+ }
+
+ public static synchronized String start(TreeLogger topLogger, int port,
+ WorkDirs workDirs, boolean shouldAutoGenerateResources) {
+ if (sTomcat != null) {
+ throw new IllegalStateException("Embedded Tomcat is already running");
+ }
+
+ try {
+ new EmbeddedTomcatServer(topLogger, port, workDirs,
+ shouldAutoGenerateResources);
+ return null;
+ } catch (LifecycleException e) {
+ String msg = e.getMessage();
+ if (msg != null && msg.indexOf("already in use") != -1) {
+ msg = "Port "
+ + port
+ + " is already is use; you probably still have another session active";
+ } else {
+ msg = "Unable to start the embedded Tomcat server; double-check that your configuration is valid";
+ }
+ return msg;
+ }
+ }
+
+ // Stop the embedded Tomcat server.
+ //
+ public static synchronized void stop() {
+ if (sTomcat != null) {
+ try {
+ sTomcat.catEmbedded.stop();
+ } catch (LifecycleException e) {
+ // There's nothing we can really do about this and the logger is
+ // gone in many scenarios, so we just ignore it.
+ //
+ } finally {
+ sTomcat = null;
+ }
+ }
+ }
+
+ /**
+ * Returns what local port the Tomcat connector is running on.
+ *
+ * When starting Tomcat with port 0 (i.e. choose an open port), there is just
+ * no way to figure out what port it actually chose. So we're using pure
+ * hackery to steal the port via reflection. The only works because we bundle
+ * Tomcat with GWT and know exactly what version it is.
+ */
+ private static int computeLocalPort(Connector connector) {
+ Throwable caught = null;
+ try {
+ Field phField = CoyoteConnector.class.getDeclaredField("protocolHandler");
+ phField.setAccessible(true);
+ Object protocolHandler = phField.get(connector);
+
+ Field epField = protocolHandler.getClass().getDeclaredField("ep");
+ epField.setAccessible(true);
+ Object endPoint = epField.get(protocolHandler);
+
+ Field ssField = endPoint.getClass().getDeclaredField("serverSocket");
+ ssField.setAccessible(true);
+ ServerSocket serverSocket = (ServerSocket) ssField.get(endPoint);
+
+ return serverSocket.getLocalPort();
+ } catch (SecurityException e) {
+ caught = e;
+ } catch (NoSuchFieldException e) {
+ caught = e;
+ } catch (IllegalArgumentException e) {
+ caught = e;
+ } catch (IllegalAccessException e) {
+ caught = e;
+ }
+ throw new RuntimeException(
+ "Failed to retrieve the startup port from Embedded Tomcat", caught);
+ }
+
+ private Embedded catEmbedded;
+
+ private Engine catEngine;
+
+ private StandardHost catHost = null;
+
+ private int port;
+
+ private final TreeLogger startupBranchLogger;
+
+ private EmbeddedTomcatServer(final TreeLogger topLogger, int listeningPort,
+ final WorkDirs workDirs, final boolean shouldAutoGenerateResources)
+ throws LifecycleException {
+ if (topLogger == null) {
+ throw new NullPointerException("No logger specified");
+ }
+
+ final TreeLogger logger = topLogger.branch(TreeLogger.INFO,
+ "Starting HTTP on port " + listeningPort, null);
+
+ startupBranchLogger = logger;
+
+ // Make myself the one static instance.
+ // NOTE: there is only one small implementation reason that this has
+ // to be a singleton, which is that the commons logger LogFactory insists
+ // on creating your logger class which must have a constructor with
+ // exactly one String argument, and since we want LoggerAdapter to delegate
+ // to the logger instance available through instance host, there is no
+ // way I can think of to delegate without accessing a static field.
+ // An inner class is almost right, except there's no outer instance.
+ //
+ sTomcat = this;
+
+ // Assume the working directory is simply the user's current directory.
+ //
+ File topWorkDir = new File(System.getProperty("user.dir"));
+
+ // Tell Tomcat its base directory so that it won't complain.
+ //
+ String catBase = System.getProperty("catalina.base");
+ if (catBase == null) {
+ // we (briefly) supported catalina.base.create, so let's not cut support
+ // until the deprecated sunset
+ catBase = System.getProperty("catalina.base.create");
+ if (catBase != null) {
+ logger.log(TreeLogger.WARN, "catalina.base.create is deprecated. " +
+ "Use catalina.base, and it will be created if necessary.");
+ topWorkDir = new File(catBase);
+ }
+ catBase = generateDefaultCatalinaBase(logger, topWorkDir);
+ System.setProperty("catalina.base", catBase);
+ }
+
+ // Some debug messages for ourselves.
+ //
+ if (logger.isLoggable(TreeLogger.DEBUG)) {
+ logger.log(TreeLogger.DEBUG, "catalina.base = " + catBase, null);
+ }
+
+ // Set up the logger that will be returned by the Commons logging factory.
+ //
+ String adapterClassName = CommonsLoggerAdapter.class.getName();
+ System.setProperty("org.apache.commons.logging.Log", adapterClassName);
+
+ // And set up an adapter that will work with the Catalina logger family.
+ //
+ Logger catalinaLogger = new CatalinaLoggerAdapter(topLogger);
+
+ // Create an embedded server.
+ //
+ catEmbedded = new Embedded();
+ catEmbedded.setDebug(0);
+ catEmbedded.setLogger(catalinaLogger);
+
+ // The embedded engine is called "gwt".
+ //
+ catEngine = catEmbedded.createEngine();
+ catEngine.setName("gwt");
+ catEngine.setDefaultHost("localhost");
+ catEngine.setParentClassLoader(this.getClass().getClassLoader());
+
+ // It answers localhost requests.
+ //
+ // String appBase = fCatalinaBaseDir.getAbsolutePath();
+ String appBase = catBase + "/webapps";
+ catHost = (StandardHost) catEmbedded.createHost("localhost", appBase);
+
+ // Hook up a host config to search for and pull in webapps.
+ //
+ HostConfig hostConfig = new HostConfig();
+ catHost.addLifecycleListener(hostConfig);
+
+ // Hook pre-install events so that we can add attributes to allow loaded
+ // instances to find their development instance host.
+ //
+ catHost.addContainerListener(new ContainerListener() {
+ public void containerEvent(ContainerEvent event) {
+ if (StandardHost.PRE_INSTALL_EVENT.equals(event.getType())) {
+ StandardContext webapp = (StandardContext) event.getData();
+ publishShellLoggerAttribute(logger, topLogger, webapp);
+ publishShellWorkDirsAttribute(logger, workDirs, webapp);
+ publishShouldAutoGenerateResourcesAttribute(logger,
+ shouldAutoGenerateResources, webapp);
+ }
+ }
+ });
+
+ // Tell the engine about the host.
+ //
+ catEngine.addChild(catHost);
+ catEngine.setDefaultHost(catHost.getName());
+
+ // Tell the embedded manager about the engine.
+ //
+ catEmbedded.addEngine(catEngine);
+ InetAddress nullAddr = null;
+ Connector connector = catEmbedded.createConnector(nullAddr, listeningPort,
+ false);
+ catEmbedded.addConnector(connector);
+
+ // start up!
+ catEmbedded.start();
+ port = computeLocalPort(connector);
+
+ if (port != listeningPort) {
+ if (logger.isLoggable(TreeLogger.INFO)) {
+ logger.log(TreeLogger.INFO, "HTTP listening on port " + port, null);
+ }
+ }
+ }
+
+ public TreeLogger getLogger() {
+ return startupBranchLogger;
+ }
+
+ /*
+ * Assumes that the leaf is a file (not a directory).
+ */
+ private void copyFileNoOverwrite(TreeLogger logger, String srcResName,
+ Resource srcRes, File catBase) {
+
+ File dest = new File(catBase, srcResName);
+ try {
+ // Only copy if src is newer than desc.
+ long srcLastModified = srcRes.getLastModified();
+ long dstLastModified = dest.lastModified();
+
+ if (srcLastModified < dstLastModified) {
+ // Don't copy over it.
+ if (logger.isLoggable(TreeLogger.SPAM)) {
+ logger.log(TreeLogger.SPAM, "Source is older than existing: "
+ + dest.getAbsolutePath(), null);
+ }
+ return;
+ } else if (srcLastModified == dstLastModified) {
+ // Exact same time; quietly don't overwrite.
+ return;
+ } else if (dest.exists()) {
+ // Warn about the overwrite
+ logger.log(TreeLogger.WARN, "Overwriting existing file '"
+ + dest.getAbsolutePath() + "' with '" + srcRes.getLocation()
+ + "', which has a newer timestamp");
+ }
+
+ // Make dest directories as required.
+ File destParent = dest.getParentFile();
+ if (destParent != null) {
+ // No need to check mkdirs result because IOException later anyway.
+ destParent.mkdirs();
+ }
+
+ Util.copy(srcRes.openContents(), new FileOutputStream(dest));
+ dest.setLastModified(srcLastModified);
+
+ if (logger.isLoggable(TreeLogger.TRACE)) {
+ logger.log(TreeLogger.TRACE, "Wrote: " + dest.getAbsolutePath(), null);
+ }
+ } catch (IOException e) {
+ logger.log(TreeLogger.WARN, "Failed to write: " + dest.getAbsolutePath(),
+ e);
+ }
+ }
+
+ /**
+ * Extracts a valid catalina base instance from the classpath. Does not
+ * overwrite any existing files.
+ */
+ private String generateDefaultCatalinaBase(TreeLogger logger, File workDir) {
+ logger = logger.branch(
+ TreeLogger.TRACE,
+ "Property 'catalina.base' not specified; checking for a standard catalina base image instead",
+ null);
+
+ // Recursively copies out files and directories
+ String tomcatEtcDir = "com/google/gwt/dev/etc/tomcat/";
+ Map<String, Resource> resourceMap = null;
+ Throwable caught = null;
+ try {
+ resourceMap = getResourcesFor(logger, tomcatEtcDir);
+ } catch (URISyntaxException e) {
+ caught = e;
+ } catch (IOException e) {
+ caught = e;
+ }
+
+ File catBase = new File(workDir, "tomcat");
+ if (resourceMap == null || resourceMap.isEmpty()) {
+ logger.log(TreeLogger.WARN, "Could not find " + tomcatEtcDir, caught);
+ } else {
+ for (Entry<String, Resource> entry : resourceMap.entrySet()) {
+ copyFileNoOverwrite(logger, entry.getKey(), entry.getValue(), catBase);
+ }
+ }
+
+ return catBase.getAbsolutePath();
+ }
+
+ /**
+ * Hacky, but fast.
+ */
+ private Map<String, Resource> getResourcesFor(TreeLogger logger,
+ String tomcatEtcDir) throws URISyntaxException, IOException {
+ ClassLoader contextClassLoader = this.getClass().getClassLoader();
+ URL url = contextClassLoader.getResource(tomcatEtcDir);
+ if (url == null) {
+ return null;
+ }
+ String prefix = "";
+ String urlString = url.toString();
+ if (urlString.startsWith("jar:")) {
+ assert urlString.toLowerCase(Locale.ENGLISH).contains(".jar!/"
+ + tomcatEtcDir);
+ urlString = urlString.substring(4, urlString.indexOf('!'));
+ url = new URL(urlString);
+ prefix = tomcatEtcDir;
+ } else if (urlString.startsWith("zip:")) {
+ assert urlString.toLowerCase(Locale.ENGLISH).contains(".zip!/"
+ + tomcatEtcDir);
+ urlString = urlString.substring(4, urlString.indexOf('!'));
+ url = new URL(urlString);
+ prefix = tomcatEtcDir;
+ }
+ ClassPathEntry entry = ResourceOracleImpl.createEntryForUrl(logger, url);
+ assert (entry != null);
+ ResourceOracleImpl resourceOracle = new ResourceOracleImpl(
+ Collections.singletonList(entry));
+ PathPrefixSet pathPrefixSet = new PathPrefixSet();
+ PathPrefix pathPrefix = new PathPrefix(prefix, null, true);
+ pathPrefixSet.add(pathPrefix);
+ resourceOracle.setPathPrefixes(pathPrefixSet);
+ ResourceOracleImpl.refresh(logger, resourceOracle);
+ Map<String, Resource> resourceMap = resourceOracle.getResourceMap();
+ return resourceMap;
+ }
+
+ private void publishAttributeToWebApp(TreeLogger logger,
+ StandardContext webapp, String attrName, Object attrValue) {
+ if (logger.isLoggable(TreeLogger.TRACE)) {
+ logger.log(TreeLogger.TRACE, "Adding attribute '" + attrName
+ + "' to web app '" + webapp.getName() + "'", null);
+ }
+ webapp.getServletContext().setAttribute(attrName, attrValue);
+ }
+
+ /**
+ * Publish the shell's tree logger as an attribute. This attribute is used to
+ * find the logger out of the thin air within the shell servlet.
+ */
+ private void publishShellLoggerAttribute(TreeLogger logger,
+ TreeLogger loggerToPublish, StandardContext webapp) {
+ final String attr = "com.google.gwt.dev.shell.logger";
+ publishAttributeToWebApp(logger, webapp, attr, loggerToPublish);
+ }
+
+ /**
+ * Publish the shell's work dir as an attribute. This attribute is used to
+ * find it out of the thin air within the shell servlet.
+ */
+ private void publishShellWorkDirsAttribute(TreeLogger logger,
+ WorkDirs workDirs, StandardContext webapp) {
+ final String attr = "com.google.gwt.dev.shell.workdirs";
+ publishAttributeToWebApp(logger, webapp, attr, workDirs);
+ }
+
+ /**
+ * Publish to the web app whether it should automatically generate resources.
+ */
+ private void publishShouldAutoGenerateResourcesAttribute(TreeLogger logger,
+ boolean shouldAutoGenerateResources, StandardContext webapp) {
+ publishAttributeToWebApp(logger, webapp,
+ "com.google.gwt.dev.shell.shouldAutoGenerateResources",
+ shouldAutoGenerateResources);
+ }
+}
diff --git a/dev/core/src/com/google/gwt/dev/util/BrowserInfo.java b/dev/core/src/com/google/gwt/dev/util/BrowserInfo.java
index d56513a..851eba6 100644
--- a/dev/core/src/com/google/gwt/dev/util/BrowserInfo.java
+++ b/dev/core/src/com/google/gwt/dev/util/BrowserInfo.java
@@ -1,4 +1,4 @@
-/*
+/**
* Copyright 2009 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
diff --git a/dev/core/src/com/google/gwt/dev/util/log/CompositeTreeLogger.java b/dev/core/src/com/google/gwt/dev/util/log/CompositeTreeLogger.java
index 78f3149..7029c58 100644
--- a/dev/core/src/com/google/gwt/dev/util/log/CompositeTreeLogger.java
+++ b/dev/core/src/com/google/gwt/dev/util/log/CompositeTreeLogger.java
@@ -1,4 +1,4 @@
-/*
+/**
* Copyright 2008 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
diff --git a/dev/core/src/com/google/gwt/soyc/GlobalInformation.java b/dev/core/src/com/google/gwt/soyc/GlobalInformation.java
index a6eac5d..4112404 100644
--- a/dev/core/src/com/google/gwt/soyc/GlobalInformation.java
+++ b/dev/core/src/com/google/gwt/soyc/GlobalInformation.java
@@ -36,12 +36,12 @@
private SizeBreakdown initialCodeBreakdown = new SizeBreakdown(
"Initially downloaded code", "initial");
private SizeBreakdown leftoversBreakdown = new SizeBreakdown(
- "Leftovers code, code not in any other fragment", "leftovers");
+ "Leftovers code, code not in any other split point", "leftovers");
+ private int numSplitPoints = 0;
private Map<String, TreeSet<String>> packageToClasses = new TreeMap<String, TreeSet<String>>();
private final String permutationId;
- private ArrayList<Integer> initialFragmentLoadSequence = new ArrayList<Integer>();
- private HashMap<Integer, List<String>> fragmentDescriptors =
- new HashMap<Integer, List<String>>();
+ private ArrayList<Integer> splitPointInitialLoadSequence = new ArrayList<Integer>();
+ private HashMap<Integer, String> splitPointToLocation = new HashMap<Integer, String>();
private SizeBreakdown totalCodeBreakdown = new SizeBreakdown("Total program",
"total");
@@ -53,10 +53,10 @@
List<SizeBreakdown> breakdowns = new ArrayList<SizeBreakdown>();
breakdowns.add(totalCodeBreakdown);
breakdowns.add(initialCodeBreakdown);
- if (getNumFragments() > 0) {
+ if (numSplitPoints > 0) {
breakdowns.add(leftoversBreakdown);
- for (int fragment = 1; fragment <= getNumFragments(); fragment++) {
- breakdowns.add(fragmentCodeBreakdown(fragment));
+ for (int sp = 1; sp <= numSplitPoints; sp++) {
+ breakdowns.add(splitPointCodeBreakdown(sp));
}
}
return breakdowns.toArray(EMPTY_SIZE_BREAKDOWN);
@@ -99,7 +99,7 @@
}
/**
- * Gets the initial fragment size breakdown.
+ * Gets the initial code breakdown.
*
* @return initialCodeBreakdown
*/
@@ -108,7 +108,7 @@
}
/**
- * Gets the leftovers fragment size breakdown.
+ * Gets the leftovers code breakdown.
*
* @return leftoversCodeBreakdown
*/
@@ -117,12 +117,12 @@
}
/**
- * Gets the number of fragments..
+ * Gets the number of split points.
*
- * @return the number of fragments.
+ * @return numSplitPoints
*/
- public final int getNumFragments() {
- return fragmentDescriptors.size();
+ public final int getNumSplitPoints() {
+ return numSplitPoints;
}
/**
@@ -141,37 +141,19 @@
/**
* Gets the initial load sequence.
*
- * @return initialFragmentLoadSequence
+ * @return splitPointInitialLoadSequence
*/
- public final ArrayList<Integer> getInitialFragmentLoadSequence() {
- return initialFragmentLoadSequence;
+ public final ArrayList<Integer> getSplitPointInitialLoadSequence() {
+ return splitPointInitialLoadSequence;
}
/**
- * Adds a descriptor (a split point) to a fragment.
- *
- * @param fragment the fragment number.
- * @param desc a string describing a split point for fragment <code>fragment</code>
- *
+ * Gets the mapping from split points to locations where they were set.
+ *
+ * @return splitPointToLocation
*/
- public final void addFragmentDescriptor(int fragment, String desc) {
- List<String> descriptions = fragmentDescriptors.get(fragment);
- if (descriptions == null) {
- descriptions = new ArrayList<String>();
- fragmentDescriptors.put(fragment, descriptions);
- }
- descriptions.add(desc);
- }
-
- /**
- * Gets the the descriptors associated with a
- * fragment.
- *
- * @param fragment the fragment number
- * @return a list of descriptors (each representing a single split point.
- */
- public final List<String> getFragmentDescriptors(int fragment) {
- return fragmentDescriptors.get(fragment);
+ public final HashMap<Integer, String> getSplitPointToLocation() {
+ return splitPointToLocation;
}
/**
@@ -184,18 +166,25 @@
}
/**
- * Gets an exclusive code breakdown for a fragment.
- *
- * @param fragment the fragment id
- * @return exlusive code breakdown for fragment
+ * Increments the split point count.
*/
- public SizeBreakdown fragmentCodeBreakdown(int fragment) {
- assert fragment >= 1 && fragment <= getNumFragments();
- if (!exclusiveCodeBreakdowns.containsKey(fragment)) {
- exclusiveCodeBreakdowns.put(fragment, new SizeBreakdown("split point " + fragment
- + ": " + fragmentDescriptors.get(fragment), "fragment" + fragment));
+ public final void incrementSplitPoints() {
+ numSplitPoints++;
+ }
+
+ /**
+ * Gets an exclusive code breakdown for a split point.
+ *
+ * @param sp split point
+ * @return exlusive code breakdown for sp
+ */
+ public SizeBreakdown splitPointCodeBreakdown(int sp) {
+ assert sp >= 1 && sp <= numSplitPoints;
+ if (!exclusiveCodeBreakdowns.containsKey(sp)) {
+ exclusiveCodeBreakdowns.put(sp, new SizeBreakdown("split point " + sp
+ + ": " + splitPointToLocation.get(sp), "sp" + sp));
}
- return exclusiveCodeBreakdowns.get(fragment);
+ return exclusiveCodeBreakdowns.get(sp);
}
/**
diff --git a/dev/core/src/com/google/gwt/soyc/MakeTopLevelHtmlForPerm.java b/dev/core/src/com/google/gwt/soyc/MakeTopLevelHtmlForPerm.java
index 4809e79..f3a70ef 100644
--- a/dev/core/src/com/google/gwt/soyc/MakeTopLevelHtmlForPerm.java
+++ b/dev/core/src/com/google/gwt/soyc/MakeTopLevelHtmlForPerm.java
@@ -20,7 +20,6 @@
import com.google.gwt.core.ext.linker.ModuleMetricsArtifact;
import com.google.gwt.core.ext.linker.PrecompilationMetricsArtifact;
import com.google.gwt.core.ext.soyc.impl.SizeMapRecorder;
-import com.google.gwt.dev.util.Strings;
import com.google.gwt.dev.util.Util;
import com.google.gwt.dev.util.collect.Lists;
import com.google.gwt.dev.util.collect.Sets;
@@ -261,16 +260,9 @@
// array of split point descriptions
outFile.println(" var spl = [");
- for (int fragment = 1; fragment <= globalInformation.getNumFragments(); fragment++) {
- final List<String> fragmentDescriptors = globalInformation.getFragmentDescriptors(fragment);
- String[] escapedFragmentDescriptors =
- new String[fragmentDescriptors.size()];
- for (int i = 0; i < fragmentDescriptors.size(); i++) {
- escapedFragmentDescriptors[i] =
- escapeJSString(fragmentDescriptors.get(i));
- }
- outFile.println(" '" + Strings.join(escapedFragmentDescriptors, ",")
- + "',");
+ for (int sp = 1; sp <= globalInformation.getNumSplitPoints(); sp++) {
+ outFile.println(" '"
+ + globalInformation.getSplitPointToLocation().get(sp) + "',");
}
outFile.println(" ];");
@@ -372,7 +364,7 @@
outFile.println(" document.write(\"<li><a href='\" + d1 + \"#\" + className + \"'>"
+ "See why it's live</a></li>\");");
outFile.println(" for (var sp = 1; sp <= "
- + globalInformation.getNumFragments() + "; sp++) {");
+ + globalInformation.getNumSplitPoints() + "; sp++) {");
outFile.println(" var d2 = 'methodDependencies-sp' + sp + '-" + getPermutationId() + ".html';");
outFile.println(" document.write(\"<li><a href='\" + d2 + \"#\" + className +\"'>"
+ " See why it's not exclusive to s.p. #\" + sp + \" (\" + spl[sp - 1] + \")"
@@ -627,14 +619,7 @@
return breakdown.getId() + "_" + permutationId + "_Classes.html";
}
- private String escapeJSString(String str) {
- // TODO(rluble): make into a Util routine.
- return str.replaceAll("/", "\\/");
- }
-
private static String escapeXml(String unescaped) {
- // TODO(rluble): see why SizeMapRecorder.escapeXML is different from Util.escapeXML. If two
- // different versions are needed at all move SizeMapRecorder.escapeXML to Util.
return SizeMapRecorder.escapeXml(unescaped);
}
@@ -1280,39 +1265,34 @@
percentFormatter.setMinimumFractionDigits(1);
percentFormatter.setMaximumFractionDigits(1);
- if (globalInformation.getNumFragments() >= 1) {
+ if (globalInformation.getSplitPointToLocation().size() >= 1) {
- int numFragments = globalInformation.getNumFragments();
+ int numSplitPoints = globalInformation.getSplitPointToLocation().size();
int maxSize = globalInformation.getTotalCodeBreakdown().sizeAllCode;
- for (int fragment = FRAGMENT_NUMBER_TOTAL_PROGRAM; fragment <= numFragments + 1; fragment++) {
+ for (int i = FRAGMENT_NUMBER_TOTAL_PROGRAM; i <= numSplitPoints + 1; i++) {
SizeBreakdown breakdown;
- if (fragment == FRAGMENT_NUMBER_TOTAL_PROGRAM
- || fragment == numFragments + 1 // leftovers
- || fragment == FRAGMENT_NUMBER_INITIAL_DOWNLOAD) {
+ if (i == FRAGMENT_NUMBER_TOTAL_PROGRAM) {
continue;
+ } else if (i == numSplitPoints + 1) { // leftovers
+ continue;
+ } else if (i == FRAGMENT_NUMBER_INITIAL_DOWNLOAD) {
+ continue;
+ } else {
+ breakdown = globalInformation.splitPointCodeBreakdown(i);
}
- breakdown = globalInformation.fragmentCodeBreakdown(fragment);
-
String drillDownFileName = shellFileName(breakdown, getPermutationId());
- final List<String> fragmentDescriptors = globalInformation.getFragmentDescriptors(fragment);
- String[] escapedFragmentDescriptors =
- new String[fragmentDescriptors.size()];
- for (int i = 0; i < fragmentDescriptors.size(); i++) {
- escapedFragmentDescriptors[i] =
- escapeXml(fragmentDescriptors.get(i));
- }
-
- String fragmentDescription = Strings.join(escapedFragmentDescriptors, "<BR>");
+ String splitPointDescription = globalInformation.getSplitPointToLocation().get(
+ i);
int size = breakdown.sizeAllCode;
float perc = (float) size / (float) maxSize;
outFile.println("<tr>");
- outFile.println("<td>" + fragment + "</td>");
- outFile.print("<td><a href=\"" + drillDownFileName + "\">" + fragmentDescription
- + "</a></td>");
+ outFile.println("<td>" + i + "</td>");
+ outFile.println("<td><a href=\"" + drillDownFileName + "\">"
+ + splitPointDescription + "</a></td>");
outFile.println("<td class=\"soyc-bargraph-col\">");
outFile.println("<div class=\"soyc-bar-graph goog-inline-block\">");
// CHECKSTYLE_OFF
@@ -1432,7 +1412,7 @@
* @returns true of the split point is initial, false otherwise
*/
private boolean isInitialSplitPoint(int splitPoint) {
- return globalInformation.getInitialFragmentLoadSequence().contains(
+ return globalInformation.getSplitPointInitialLoadSequence().contains(
splitPoint);
}
@@ -1844,8 +1824,8 @@
*/
private Iterable<Integer> splitPointsWithClass(String className) {
List<Integer> sps = new ArrayList<Integer>();
- for (int sp = 1; sp <= globalInformation.getNumFragments(); sp++) {
- Map<String, Integer> classToSize = globalInformation.fragmentCodeBreakdown(sp).classToSize;
+ for (int sp = 1; sp <= globalInformation.getNumSplitPoints(); sp++) {
+ Map<String, Integer> classToSize = globalInformation.splitPointCodeBreakdown(sp).classToSize;
if (classToSize.containsKey(className)) {
sps.add(sp);
}
diff --git a/dev/core/src/com/google/gwt/soyc/SoycDashboard.java b/dev/core/src/com/google/gwt/soyc/SoycDashboard.java
index 03d01c4..e2b3409 100644
--- a/dev/core/src/com/google/gwt/soyc/SoycDashboard.java
+++ b/dev/core/src/com/google/gwt/soyc/SoycDashboard.java
@@ -331,7 +331,7 @@
makeTopLevelHtmlForPerm.makeDependenciesHtml();
}
- if (globalInformation.getNumFragments() > 0) {
+ if (globalInformation.getNumSplitPoints() > 0) {
makeTopLevelHtmlForPerm.makeSplitStatusPages();
makeTopLevelHtmlForPerm.makeLeftoverStatusPages();
}
@@ -395,11 +395,11 @@
if (fragment == 0) {
breakdowns.add(globalInformation.getInitialCodeBreakdown());
}
- if (fragment == (globalInformation.getNumFragments() + 1)) {
+ if (fragment == (globalInformation.getNumSplitPoints() + 1)) {
breakdowns.add(globalInformation.getLeftoversBreakdown());
}
- if (fragment >= 1 && fragment <= globalInformation.getNumFragments()) {
- breakdowns.add(globalInformation.fragmentCodeBreakdown(fragment));
+ if (fragment >= 1 && fragment <= globalInformation.getNumSplitPoints()) {
+ breakdowns.add(globalInformation.splitPointCodeBreakdown(fragment));
}
return breakdowns;
}
@@ -411,7 +411,7 @@
}
if (breakdown == globalInformation.getTotalCodeBreakdown()) {
- if (globalInformation.getNumFragments() > 0) {
+ if (globalInformation.getNumSplitPoints() > 0) {
return makeTopLevelHtmlForPerm.new DependencyLinkerForTotalBreakdown();
} else {
return makeTopLevelHtmlForPerm.new DependencyLinkerForInitialCode();
@@ -419,7 +419,7 @@
} else if (breakdown == globalInformation.getInitialCodeBreakdown()) {
return makeTopLevelHtmlForPerm.new DependencyLinkerForInitialCode();
} else if (breakdown == globalInformation.getLeftoversBreakdown()) {
- assert globalInformation.getNumFragments() > 0;
+ assert globalInformation.getNumSplitPoints() > 0;
return makeTopLevelHtmlForPerm.new DependencyLinkerForLeftoversFragment();
} else {
return new NullDependencyLinker();
@@ -607,17 +607,13 @@
inInitialLoadSequence = true;
} else if (inInitialLoadSequence
&& strippedName.compareTo("splitpointref") == 0) {
- globalInformation.getInitialFragmentLoadSequence().add(
+ globalInformation.getSplitPointInitialLoadSequence().add(
parseSplitPointReference(attributes));
}
}
- /**
- * Parses a split point entry from a splitpoints XML soyc file.
- * A split point node as in \<splitpoint id=N location=DESC/\>
- *
- * @param attributes the attributes of the splitpoint node (provided by the SAX parsing
- * infrastructure)
+ /*
+ * parses the split points
*/
private void parseSplitPoint(final Attributes attributes) {
if (attributes.getValue("id") != null) {
@@ -628,8 +624,9 @@
curSplitPointLocation = curSplitPointLocation.replaceAll("\\(L.*",
"");
- globalInformation.addFragmentDescriptor(
+ globalInformation.getSplitPointToLocation().put(
Integer.parseInt(curSplitPoint), curSplitPointLocation);
+ globalInformation.incrementSplitPoints();
}
}
}
diff --git a/dev/core/src/org/apache/COPYING b/dev/core/src/org/apache/COPYING
new file mode 100644
index 0000000..d9a10c0
--- /dev/null
+++ b/dev/core/src/org/apache/COPYING
@@ -0,0 +1,176 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
diff --git a/dev/core/src/org/apache/catalina/loader/WebappClassLoader.java b/dev/core/src/org/apache/catalina/loader/WebappClassLoader.java
new file mode 100644
index 0000000..f941fad
--- /dev/null
+++ b/dev/core/src/org/apache/catalina/loader/WebappClassLoader.java
@@ -0,0 +1,2169 @@
+/*
+ * Copyright 1999,2004 The Apache Software Foundation.
+ *
+ * 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.
+ */
+// Modified by Google.
+
+package org.apache.catalina.loader;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.FilePermission;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.security.AccessControlException;
+import java.security.AccessController;
+import java.security.CodeSource;
+import java.security.Permission;
+import java.security.PermissionCollection;
+import java.security.Policy;
+import java.security.PrivilegedAction;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Vector;
+import java.util.jar.Attributes;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+import java.util.jar.Manifest;
+import java.util.jar.Attributes.Name;
+
+import javax.naming.NameClassPair;
+import javax.naming.NamingEnumeration;
+import javax.naming.NamingException;
+import javax.naming.directory.DirContext;
+
+import org.apache.catalina.Lifecycle;
+import org.apache.catalina.LifecycleException;
+import org.apache.catalina.LifecycleListener;
+import org.apache.catalina.util.StringManager;
+import org.apache.naming.JndiPermission;
+import org.apache.naming.resources.Resource;
+import org.apache.naming.resources.ResourceAttributes;
+import org.apache.tomcat.util.compat.JdkCompat;
+
+/**
+ * Specialized web application class loader.
+ * <p>
+ * This class loader is a full reimplementation of the
+ * <code>URLClassLoader</code> from the JDK. It is desinged to be fully
+ * compatible with a normal <code>URLClassLoader</code>, although its internal
+ * behavior may be completely different.
+ * <p>
+ * <strong>IMPLEMENTATION NOTE</strong> - This class loader faithfully follows
+ * the delegation model recommended in the specification. The system class
+ * loader will be queried first, then the local repositories, and only then
+ * delegation to the parent class loader will occur. This allows the web
+ * application to override any shared class except the classes from J2SE.
+ * Special handling is provided from the JAXP XML parser interfaces, the JNDI
+ * interfaces, and the classes from the servlet API, which are never loaded
+ * from the webapp repository.
+ * <p>
+ * <strong>IMPLEMENTATION NOTE</strong> - Due to limitations in Jasper
+ * compilation technology, any repository which contains classes from
+ * the servlet API will be ignored by the class loader.
+ * <p>
+ * <strong>IMPLEMENTATION NOTE</strong> - The class loader generates source
+ * URLs which include the full JAR URL when a class is loaded from a JAR file,
+ * which allows setting security permission at the class level, even when a
+ * class is contained inside a JAR.
+ * <p>
+ * <strong>IMPLEMENTATION NOTE</strong> - Local repositories are searched in
+ * the order they are added via the initial constructor and/or any subsequent
+ * calls to <code>addRepository()</code> or <code>addJar()</code>.
+ * <p>
+ * <strong>IMPLEMENTATION NOTE</strong> - No check for sealing violations or
+ * security is made unless a security manager is present.
+ *
+ * @author Remy Maucherat
+ * @author Craig R. McClanahan
+ * @version $Revision: 1.34 $ $Date: 2004/05/26 15:47:40 $
+ */
+public class WebappClassLoader
+ extends URLClassLoader
+ implements Reloader, Lifecycle
+ {
+
+ private static org.apache.commons.logging.Log log=
+ org.apache.commons.logging.LogFactory.getLog( WebappClassLoader.class );
+
+ protected class PrivilegedFindResource
+ implements PrivilegedAction {
+
+ private File file;
+ private String path;
+
+ PrivilegedFindResource(File file, String path) {
+ this.file = file;
+ this.path = path;
+ }
+
+ public Object run() {
+ return findResourceInternal(file, path);
+ }
+
+ }
+
+
+ // ------------------------------------------------------- Static Variables
+
+
+ /**
+ * The set of trigger classes that will cause a proposed repository not
+ * to be added if this class is visible to the class loader that loaded
+ * this factory class. Typically, trigger classes will be listed for
+ * components that have been integrated into the JDK for later versions,
+ * but where the corresponding JAR files are required to run on
+ * earlier versions.
+ */
+ private static final String[] triggers = {
+ "javax.servlet.Servlet" // Servlet API
+ };
+
+ /**
+ * Jdk Compatibility Support.
+ */
+ private static JdkCompat jdkCompat = JdkCompat.getJdkCompat();
+
+ /**
+ * Set of package names which are not allowed to be loaded from a webapp
+ * class loader without delegating first.
+ */
+ private static final String[] packageTriggers = {
+ "javax", // Java extensions
+ "org.xml.sax", // SAX 1 & 2
+ "org.w3c.dom", // DOM 1 & 2
+ "org.apache.xerces", // Xerces 1 & 2
+ "org.apache.xalan" // Xalan
+ };
+
+
+ /**
+ * The string manager for this package.
+ */
+ protected static final StringManager sm =
+ StringManager.getManager(Constants.Package);
+
+
+ // ----------------------------------------------------------- Constructors
+
+
+ /**
+ * Construct a new ClassLoader with no defined repositories and no
+ * parent ClassLoader.
+ */
+ public WebappClassLoader() {
+
+ super(new URL[0]);
+ this.parent = getParent();
+ system = getSystemClassLoader();
+ securityManager = System.getSecurityManager();
+
+ if (securityManager != null) {
+ refreshPolicy();
+ }
+
+ }
+
+
+ /**
+ * Construct a new ClassLoader with no defined repositories and no
+ * parent ClassLoader.
+ */
+ public WebappClassLoader(ClassLoader parent) {
+
+ super(new URL[0], parent);
+
+ this.parent = getParent();
+
+ system = getSystemClassLoader();
+ securityManager = System.getSecurityManager();
+
+ if (securityManager != null) {
+ refreshPolicy();
+ }
+ }
+
+
+ // ----------------------------------------------------- Instance Variables
+
+
+ /**
+ * Associated directory context giving access to the resources in this
+ * webapp.
+ */
+ protected DirContext resources = null;
+
+
+ /**
+ * The cache of ResourceEntry for classes and resources we have loaded,
+ * keyed by resource name.
+ */
+ protected HashMap resourceEntries = new HashMap();
+
+
+ /**
+ * The list of not found resources.
+ */
+ protected HashMap notFoundResources = new HashMap();
+
+
+ /**
+ * The debugging detail level of this component.
+ */
+ protected int debug = 0;
+
+
+ /**
+ * Should this class loader delegate to the parent class loader
+ * <strong>before</strong> searching its own repositories (i.e. the
+ * usual Java2 delegation model)? If set to <code>false</code>,
+ * this class loader will search its own repositories first, and
+ * delegate to the parent only if the class or resource is not
+ * found locally.
+ */
+ protected boolean delegate = false;
+
+
+ /**
+ * Last time a JAR was accessed.
+ */
+ protected long lastJarAccessed = 0L;
+
+
+ /**
+ * The list of local repositories, in the order they should be searched
+ * for locally loaded classes or resources.
+ */
+ protected String[] repositories = new String[0];
+
+
+ /**
+ * Repositories URLs, used to cache the result of getURLs.
+ */
+ protected URL[] repositoryURLs = null;
+
+
+ /**
+ * Repositories translated as path in the work directory (for Jasper
+ * originally), but which is used to generate fake URLs should getURLs be
+ * called.
+ */
+ protected File[] files = new File[0];
+
+
+ /**
+ * The list of JARs, in the order they should be searched
+ * for locally loaded classes or resources.
+ */
+ protected JarFile[] jarFiles = new JarFile[0];
+
+
+ /**
+ * The list of JARs, in the order they should be searched
+ * for locally loaded classes or resources.
+ */
+ protected File[] jarRealFiles = new File[0];
+
+
+ /**
+ * The path which will be monitored for added Jar files.
+ */
+ protected String jarPath = null;
+
+
+ /**
+ * The list of JARs, in the order they should be searched
+ * for locally loaded classes or resources.
+ */
+ protected String[] jarNames = new String[0];
+
+
+ /**
+ * The list of JARs last modified dates, in the order they should be
+ * searched for locally loaded classes or resources.
+ */
+ protected long[] lastModifiedDates = new long[0];
+
+
+ /**
+ * The list of resources which should be checked when checking for
+ * modifications.
+ */
+ protected String[] paths = new String[0];
+
+
+ /**
+ * A list of read File and Jndi Permission's required if this loader
+ * is for a web application context.
+ */
+ private ArrayList permissionList = new ArrayList();
+
+
+ /**
+ * Path where resources loaded from JARs will be extracted.
+ */
+ private File loaderDir = null;
+
+
+ /**
+ * The PermissionCollection for each CodeSource for a web
+ * application context.
+ */
+ private HashMap loaderPC = new HashMap();
+
+
+ /**
+ * Instance of the SecurityManager installed.
+ */
+ private SecurityManager securityManager = null;
+
+
+ /**
+ * The parent class loader.
+ */
+ private ClassLoader parent = null;
+
+
+ /**
+ * The system class loader.
+ */
+ private ClassLoader system = null;
+
+
+ /**
+ * Has this component been started?
+ */
+ protected boolean started = false;
+
+
+ /**
+ * Has external repositories.
+ */
+ protected boolean hasExternalRepositories = false;
+
+
+ /**
+ * All permission.
+ */
+ private Permission allPermission = new java.security.AllPermission();
+
+
+ // ------------------------------------------------------------- Properties
+
+
+ /**
+ * Get associated resources.
+ */
+ public DirContext getResources() {
+
+ return this.resources;
+
+ }
+
+
+ /**
+ * Set associated resources.
+ */
+ public void setResources(DirContext resources) {
+
+ this.resources = resources;
+
+ }
+
+
+ /**
+ * Return the debugging detail level for this component.
+ */
+ public int getDebug() {
+
+ return (this.debug);
+
+ }
+
+
+ /**
+ * Set the debugging detail level for this component.
+ *
+ * @param debug The new debugging detail level
+ */
+ public void setDebug(int debug) {
+
+ this.debug = debug;
+
+ }
+
+
+ /**
+ * Return the "delegate first" flag for this class loader.
+ */
+ public boolean getDelegate() {
+
+ return (this.delegate);
+
+ }
+
+
+ /**
+ * Set the "delegate first" flag for this class loader.
+ *
+ * @param delegate The new "delegate first" flag
+ */
+ public void setDelegate(boolean delegate) {
+
+ this.delegate = delegate;
+
+ }
+
+
+ /**
+ * If there is a Java SecurityManager create a read FilePermission
+ * or JndiPermission for the file directory path.
+ *
+ * @param path file directory path
+ */
+ public void addPermission(String path) {
+ if (path == null) {
+ return;
+ }
+
+ if (securityManager != null) {
+ Permission permission = null;
+ if( path.startsWith("jndi:") || path.startsWith("jar:jndi:") ) {
+ if (!path.endsWith("/")) {
+ path = path + "/";
+ }
+ permission = new JndiPermission(path + "*");
+ addPermission(permission);
+ } else {
+ if (!path.endsWith(File.separator)) {
+ permission = new FilePermission(path, "read");
+ addPermission(permission);
+ path = path + File.separator;
+ }
+ permission = new FilePermission(path + "-", "read");
+ addPermission(permission);
+ }
+ }
+ }
+
+
+ /**
+ * If there is a Java SecurityManager create a read FilePermission
+ * or JndiPermission for URL.
+ *
+ * @param url URL for a file or directory on local system
+ */
+ public void addPermission(URL url) {
+ if (url != null) {
+ addPermission(url.toString());
+ }
+ }
+
+
+ /**
+ * If there is a Java SecurityManager create a Permission.
+ *
+ * @param url URL for a file or directory on local system
+ */
+ public void addPermission(Permission permission) {
+ if ((securityManager != null) && (permission != null)) {
+ permissionList.add(permission);
+ }
+ }
+
+
+ /**
+ * Return the JAR path.
+ */
+ public String getJarPath() {
+
+ return this.jarPath;
+
+ }
+
+
+ /**
+ * Change the Jar path.
+ */
+ public void setJarPath(String jarPath) {
+
+ this.jarPath = jarPath;
+
+ }
+
+
+ /**
+ * Change the work directory.
+ */
+ public void setWorkDir(File workDir) {
+ this.loaderDir = new File(workDir, "loader");
+ }
+
+
+ // ------------------------------------------------------- Reloader Methods
+
+
+ /**
+ * Add a new repository to the set of places this ClassLoader can look for
+ * classes to be loaded.
+ *
+ * @param repository Name of a source of classes to be loaded, such as a
+ * directory pathname, a JAR file pathname, or a ZIP file pathname
+ *
+ * @exception IllegalArgumentException if the specified repository is
+ * invalid or does not exist
+ */
+ public void addRepository(String repository) {
+
+ // Ignore any of the standard repositories, as they are set up using
+ // either addJar or addRepository
+ if (repository.startsWith("/WEB-INF/lib")
+ || repository.startsWith("/WEB-INF/classes"))
+ return;
+
+ // Add this repository to our underlying class loader
+ try {
+ URL url = new URL(repository);
+ super.addURL(url);
+ hasExternalRepositories = true;
+ repositoryURLs = null;
+ } catch (MalformedURLException e) {
+ IllegalArgumentException iae = new IllegalArgumentException
+ ("Invalid repository: " + repository);
+ jdkCompat.chainException(iae, e);
+ throw iae;
+ }
+
+ }
+
+
+ /**
+ * Add a new repository to the set of places this ClassLoader can look for
+ * classes to be loaded.
+ *
+ * @param repository Name of a source of classes to be loaded, such as a
+ * directory pathname, a JAR file pathname, or a ZIP file pathname
+ *
+ * @exception IllegalArgumentException if the specified repository is
+ * invalid or does not exist
+ */
+ synchronized void addRepository(String repository, File file) {
+
+ // Note : There should be only one (of course), but I think we should
+ // keep this a bit generic
+
+ if (repository == null)
+ return;
+
+ if (log.isDebugEnabled())
+ log.debug("addRepository(" + repository + ")");
+
+ int i;
+
+ // Add this repository to our internal list
+ String[] result = new String[repositories.length + 1];
+ for (i = 0; i < repositories.length; i++) {
+ result[i] = repositories[i];
+ }
+ result[repositories.length] = repository;
+ repositories = result;
+
+ // Add the file to the list
+ File[] result2 = new File[files.length + 1];
+ for (i = 0; i < files.length; i++) {
+ result2[i] = files[i];
+ }
+ result2[files.length] = file;
+ files = result2;
+
+ }
+
+
+ synchronized void addJar(String jar, JarFile jarFile, File file)
+ throws IOException {
+
+ if (jar == null)
+ return;
+ if (jarFile == null)
+ return;
+ if (file == null)
+ return;
+
+ if (log.isDebugEnabled())
+ log.debug("addJar(" + jar + ")");
+
+ int i;
+
+ if ((jarPath != null) && (jar.startsWith(jarPath))) {
+
+ String jarName = jar.substring(jarPath.length());
+ while (jarName.startsWith("/"))
+ jarName = jarName.substring(1);
+
+ String[] result = new String[jarNames.length + 1];
+ for (i = 0; i < jarNames.length; i++) {
+ result[i] = jarNames[i];
+ }
+ result[jarNames.length] = jarName;
+ jarNames = result;
+
+ }
+
+ try {
+
+ // Register the JAR for tracking
+
+ long lastModified =
+ ((ResourceAttributes) resources.getAttributes(jar))
+ .getLastModified();
+
+ String[] result = new String[paths.length + 1];
+ for (i = 0; i < paths.length; i++) {
+ result[i] = paths[i];
+ }
+ result[paths.length] = jar;
+ paths = result;
+
+ long[] result3 = new long[lastModifiedDates.length + 1];
+ for (i = 0; i < lastModifiedDates.length; i++) {
+ result3[i] = lastModifiedDates[i];
+ }
+ result3[lastModifiedDates.length] = lastModified;
+ lastModifiedDates = result3;
+
+ } catch (NamingException e) {
+ // Ignore
+ }
+
+ // If the JAR currently contains invalid classes, don't actually use it
+ // for classloading
+ if (!validateJarFile(file))
+ return;
+
+ JarFile[] result2 = new JarFile[jarFiles.length + 1];
+ for (i = 0; i < jarFiles.length; i++) {
+ result2[i] = jarFiles[i];
+ }
+ result2[jarFiles.length] = jarFile;
+ jarFiles = result2;
+
+ // Add the file to the list
+ File[] result4 = new File[jarRealFiles.length + 1];
+ for (i = 0; i < jarRealFiles.length; i++) {
+ result4[i] = jarRealFiles[i];
+ }
+ result4[jarRealFiles.length] = file;
+ jarRealFiles = result4;
+ }
+
+
+ /**
+ * Return a String array of the current repositories for this class
+ * loader. If there are no repositories, a zero-length array is
+ * returned.For security reason, returns a clone of the Array (since
+ * String are immutable).
+ */
+ public String[] findRepositories() {
+
+ return ((String[])repositories.clone());
+
+ }
+
+
+ /**
+ * Have one or more classes or resources been modified so that a reload
+ * is appropriate?
+ */
+ public boolean modified() {
+
+ if (log.isDebugEnabled())
+ log.debug("modified()");
+
+ // Checking for modified loaded resources
+ int length = paths.length;
+
+ // A rare race condition can occur in the updates of the two arrays
+ // It's totally ok if the latest class added is not checked (it will
+ // be checked the next time
+ int length2 = lastModifiedDates.length;
+ if (length > length2)
+ length = length2;
+
+ for (int i = 0; i < length; i++) {
+ try {
+ long lastModified =
+ ((ResourceAttributes) resources.getAttributes(paths[i]))
+ .getLastModified();
+ if (lastModified != lastModifiedDates[i]) {
+ if( log.isDebugEnabled() )
+ log.debug(" Resource '" + paths[i]
+ + "' was modified; Date is now: "
+ + new java.util.Date(lastModified) + " Was: "
+ + new java.util.Date(lastModifiedDates[i]));
+ return (true);
+ }
+ } catch (NamingException e) {
+ log.error(" Resource '" + paths[i] + "' is missing");
+ return (true);
+ }
+ }
+
+ length = jarNames.length;
+
+ // Check if JARs have been added or removed
+ if (getJarPath() != null) {
+
+ try {
+ NamingEnumeration enum_ = resources.listBindings(getJarPath());
+ int i = 0;
+ while (enum_.hasMoreElements() && (i < length)) {
+ NameClassPair ncPair = (NameClassPair) enum_.nextElement();
+ String name = ncPair.getName();
+ // Ignore non JARs present in the lib folder
+ if (!name.endsWith(".jar"))
+ continue;
+ if (!name.equals(jarNames[i])) {
+ // Missing JAR
+ log.info(" Additional JARs have been added : '"
+ + name + "'");
+ return (true);
+ }
+ i++;
+ }
+ if (enum_.hasMoreElements()) {
+ while (enum_.hasMoreElements()) {
+ NameClassPair ncPair =
+ (NameClassPair) enum_.nextElement();
+ String name = ncPair.getName();
+ // Additional non-JAR files are allowed
+ if (name.endsWith(".jar")) {
+ // There was more JARs
+ log.info(" Additional JARs have been added");
+ return (true);
+ }
+ }
+ } else if (i < jarNames.length) {
+ // There was less JARs
+ log.info(" Additional JARs have been added");
+ return (true);
+ }
+ } catch (NamingException e) {
+ if (log.isDebugEnabled())
+ log.debug(" Failed tracking modifications of '"
+ + getJarPath() + "'");
+ } catch (ClassCastException e) {
+ log.error(" Failed tracking modifications of '"
+ + getJarPath() + "' : " + e.getMessage());
+ }
+
+ }
+
+ // No classes have been modified
+ return (false);
+
+ }
+
+
+ /**
+ * Render a String representation of this object.
+ */
+ public String toString() {
+
+ StringBuffer sb = new StringBuffer("WebappClassLoader\r\n");
+ sb.append(" delegate: ");
+ sb.append(delegate);
+ sb.append("\r\n");
+ sb.append(" repositories:\r\n");
+ if (repositories != null) {
+ for (int i = 0; i < repositories.length; i++) {
+ sb.append(" ");
+ sb.append(repositories[i]);
+ sb.append("\r\n");
+ }
+ }
+ if (this.parent != null) {
+ sb.append("----------> Parent Classloader:\r\n");
+ sb.append(this.parent.toString());
+ sb.append("\r\n");
+ }
+ return (sb.toString());
+
+ }
+
+
+ // ---------------------------------------------------- ClassLoader Methods
+
+
+ /**
+ * Add the specified URL to the classloader.
+ */
+ protected void addURL(URL url) {
+ super.addURL(url);
+ hasExternalRepositories = true;
+ repositoryURLs = null;
+ }
+
+
+ /**
+ * Find the specified class in our local repositories, if possible. If
+ * not found, throw <code>ClassNotFoundException</code>.
+ *
+ * @param name Name of the class to be loaded
+ *
+ * @exception ClassNotFoundException if the class was not found
+ */
+ public Class findClass(String name) throws ClassNotFoundException {
+
+ if (log.isDebugEnabled())
+ log.debug(" findClass(" + name + ")");
+
+ // (1) Permission to define this class when using a SecurityManager
+ if (securityManager != null) {
+ int i = name.lastIndexOf('.');
+ if (i >= 0) {
+ try {
+ if (log.isTraceEnabled())
+ log.trace(" securityManager.checkPackageDefinition");
+ securityManager.checkPackageDefinition(name.substring(0,i));
+ } catch (Exception se) {
+ if (log.isTraceEnabled())
+ log.trace(" -->Exception-->ClassNotFoundException", se);
+ throw new ClassNotFoundException(name, se);
+ }
+ }
+ }
+
+ // Ask our superclass to locate this class, if possible
+ // (throws ClassNotFoundException if it is not found)
+ Class clazz = null;
+ try {
+ if (log.isTraceEnabled())
+ log.trace(" findClassInternal(" + name + ")");
+ try {
+ clazz = findClassInternal(name);
+ } catch(ClassNotFoundException cnfe) {
+ if (!hasExternalRepositories) {
+ throw cnfe;
+ }
+ } catch(AccessControlException ace) {
+ throw new ClassNotFoundException(name, ace);
+ } catch (RuntimeException e) {
+ if (log.isTraceEnabled())
+ log.trace(" -->RuntimeException Rethrown", e);
+ throw e;
+ }
+ if ((clazz == null) && hasExternalRepositories) {
+ try {
+ clazz = super.findClass(name);
+ } catch(AccessControlException ace) {
+ throw new ClassNotFoundException(name, ace);
+ } catch (RuntimeException e) {
+ if (log.isTraceEnabled())
+ log.trace(" -->RuntimeException Rethrown", e);
+ throw e;
+ }
+ }
+ if (clazz == null) {
+ if (log.isDebugEnabled())
+ log.debug(" --> Returning ClassNotFoundException");
+ throw new ClassNotFoundException(name);
+ }
+ } catch (ClassNotFoundException e) {
+ if (log.isTraceEnabled())
+ log.trace(" --> Passing on ClassNotFoundException");
+ throw e;
+ }
+
+ // Return the class we have located
+ if (log.isTraceEnabled())
+ log.debug(" Returning class " + clazz);
+ if ((log.isTraceEnabled()) && (clazz != null))
+ log.debug(" Loaded by " + clazz.getClassLoader());
+ return (clazz);
+
+ }
+
+
+ /**
+ * Find the specified resource in our local repository, and return a
+ * <code>URL</code> refering to it, or <code>null</code> if this resource
+ * cannot be found.
+ *
+ * @param name Name of the resource to be found
+ */
+ public URL findResource(final String name) {
+
+ if (log.isDebugEnabled())
+ log.debug(" findResource(" + name + ")");
+
+ URL url = null;
+
+ ResourceEntry entry = (ResourceEntry) resourceEntries.get(name);
+ if (entry == null) {
+ entry = findResourceInternal(name, name);
+ }
+ if (entry != null) {
+ url = entry.source;
+ }
+
+ if ((url == null) && hasExternalRepositories)
+ url = super.findResource(name);
+
+ if (log.isDebugEnabled()) {
+ if (url != null)
+ log.debug(" --> Returning '" + url.toString() + "'");
+ else
+ log.debug(" --> Resource not found, returning null");
+ }
+ return (url);
+
+ }
+
+
+ /**
+ * Return an enumeration of <code>URLs</code> representing all of the
+ * resources with the given name. If no resources with this name are
+ * found, return an empty enumeration.
+ *
+ * @param name Name of the resources to be found
+ *
+ * @exception IOException if an input/output error occurs
+ */
+ public Enumeration findResources(String name) throws IOException {
+
+ if (log.isDebugEnabled())
+ log.debug(" findResources(" + name + ")");
+
+ Vector result = new Vector();
+
+ int jarFilesLength = jarFiles.length;
+ int repositoriesLength = repositories.length;
+
+ int i;
+
+ // Looking at the repositories
+ for (i = 0; i < repositoriesLength; i++) {
+ try {
+ String fullPath = repositories[i] + name;
+ resources.lookup(fullPath);
+ // Note : Not getting an exception here means the resource was
+ // found
+ try {
+ result.addElement(getURI(new File(files[i], name)));
+ } catch (MalformedURLException e) {
+ // Ignore
+ }
+ } catch (NamingException e) {
+ }
+ }
+
+ // Looking at the JAR files
+ synchronized (jarFiles) {
+ openJARs();
+ for (i = 0; i < jarFilesLength; i++) {
+ JarEntry jarEntry = jarFiles[i].getJarEntry(name);
+ if (jarEntry != null) {
+ try {
+ String jarFakeUrl = getURI(jarRealFiles[i]).toString();
+ jarFakeUrl = "jar:" + jarFakeUrl + "!/" + name;
+ result.addElement(new URL(jarFakeUrl));
+ } catch (MalformedURLException e) {
+ // Ignore
+ }
+ }
+ }
+ }
+
+ // Adding the results of a call to the superclass
+ if (hasExternalRepositories) {
+
+ Enumeration otherResourcePaths = super.findResources(name);
+
+ while (otherResourcePaths.hasMoreElements()) {
+ result.addElement(otherResourcePaths.nextElement());
+ }
+
+ }
+
+ return result.elements();
+
+ }
+
+
+ /**
+ * Find the resource with the given name. A resource is some data
+ * (images, audio, text, etc.) that can be accessed by class code in a
+ * way that is independent of the location of the code. The name of a
+ * resource is a "/"-separated path name that identifies the resource.
+ * If the resource cannot be found, return <code>null</code>.
+ * <p>
+ * This method searches according to the following algorithm, returning
+ * as soon as it finds the appropriate URL. If the resource cannot be
+ * found, returns <code>null</code>.
+ * <ul>
+ * <li>If the <code>delegate</code> property is set to <code>true</code>,
+ * call the <code>getResource()</code> method of the parent class
+ * loader, if any.</li>
+ * <li>Call <code>findResource()</code> to find this resource in our
+ * locally defined repositories.</li>
+ * <li>Call the <code>getResource()</code> method of the parent class
+ * loader, if any.</li>
+ * </ul>
+ *
+ * @param name Name of the resource to return a URL for
+ */
+ public URL getResource(String name) {
+
+ if (log.isDebugEnabled())
+ log.debug("getResource(" + name + ")");
+ URL url = null;
+
+ // (1) Delegate to parent if requested
+ if (delegate) {
+ if (log.isDebugEnabled())
+ log.debug(" Delegating to parent classloader " + parent);
+ ClassLoader loader = parent;
+ if (loader == null)
+ loader = system;
+ url = loader.getResource(name);
+ if (url != null) {
+ if (log.isDebugEnabled())
+ log.debug(" --> Returning '" + url.toString() + "'");
+ return (url);
+ }
+ }
+
+ // (2) Search local repositories
+ url = findResource(name);
+ if (url != null) {
+ // Locating the repository for special handling in the case
+ // of a JAR
+ ResourceEntry entry = (ResourceEntry) resourceEntries.get(name);
+ try {
+ String repository = entry.codeBase.toString();
+ if ((repository.endsWith(".jar"))
+ && (!(name.endsWith(".class")))) {
+ // Copy binary content to the work directory if not present
+ File resourceFile = new File(loaderDir, name);
+ url = resourceFile.toURL();
+ }
+ } catch (Exception e) {
+ // Ignore
+ }
+ if (log.isDebugEnabled())
+ log.debug(" --> Returning '" + url.toString() + "'");
+ return (url);
+ }
+
+ // (3) Delegate to parent unconditionally if not already attempted
+ if( !delegate ) {
+ ClassLoader loader = parent;
+ if (loader == null)
+ loader = system;
+ url = loader.getResource(name);
+ if (url != null) {
+ if (log.isDebugEnabled())
+ log.debug(" --> Returning '" + url.toString() + "'");
+ return (url);
+ }
+ }
+
+ // (4) Resource was not found
+ if (log.isDebugEnabled())
+ log.debug(" --> Resource not found, returning null");
+ return (null);
+
+ }
+
+
+ /**
+ * Find the resource with the given name, and return an input stream
+ * that can be used for reading it. The search order is as described
+ * for <code>getResource()</code>, after checking to see if the resource
+ * data has been previously cached. If the resource cannot be found,
+ * return <code>null</code>.
+ *
+ * @param name Name of the resource to return an input stream for
+ */
+ public InputStream getResourceAsStream(String name) {
+
+ if (log.isDebugEnabled())
+ log.debug("getResourceAsStream(" + name + ")");
+ InputStream stream = null;
+
+ // (0) Check for a cached copy of this resource
+ stream = findLoadedResource(name);
+ if (stream != null) {
+ if (log.isDebugEnabled())
+ log.debug(" --> Returning stream from cache");
+ return (stream);
+ }
+
+ // (1) Delegate to parent if requested
+ if (delegate) {
+ if (log.isDebugEnabled())
+ log.debug(" Delegating to parent classloader " + parent);
+ ClassLoader loader = parent;
+ if (loader == null)
+ loader = system;
+ stream = loader.getResourceAsStream(name);
+ if (stream != null) {
+ // FIXME - cache???
+ if (log.isDebugEnabled())
+ log.debug(" --> Returning stream from parent");
+ return (stream);
+ }
+ }
+
+ // (2) Search local repositories
+ if (log.isDebugEnabled())
+ log.debug(" Searching local repositories");
+ URL url = findResource(name);
+ if (url != null) {
+ // FIXME - cache???
+ if (log.isDebugEnabled())
+ log.debug(" --> Returning stream from local");
+ stream = findLoadedResource(name);
+ try {
+ if (hasExternalRepositories && (stream == null))
+ stream = url.openStream();
+ } catch (IOException e) {
+ ; // Ignore
+ }
+ if (stream != null)
+ return (stream);
+ }
+
+ // (3) Delegate to parent unconditionally
+ if (!delegate) {
+ if (log.isDebugEnabled())
+ log.debug(" Delegating to parent classloader unconditionally " + parent);
+ ClassLoader loader = parent;
+ if (loader == null)
+ loader = system;
+ stream = loader.getResourceAsStream(name);
+ if (stream != null) {
+ // FIXME - cache???
+ if (log.isDebugEnabled())
+ log.debug(" --> Returning stream from parent");
+ return (stream);
+ }
+ }
+
+ // (4) Resource was not found
+ if (log.isDebugEnabled())
+ log.debug(" --> Resource not found, returning null");
+ return (null);
+
+ }
+
+
+ /**
+ * Load the class with the specified name. This method searches for
+ * classes in the same manner as <code>loadClass(String, boolean)</code>
+ * with <code>false</code> as the second argument.
+ *
+ * @param name Name of the class to be loaded
+ *
+ * @exception ClassNotFoundException if the class was not found
+ */
+ public Class loadClass(String name) throws ClassNotFoundException {
+
+ return (loadClass(name, false));
+
+ }
+
+
+ /**
+ * Load the class with the specified name, searching using the following
+ * algorithm until it finds and returns the class. If the class cannot
+ * be found, returns <code>ClassNotFoundException</code>.
+ * <ul>
+ * <li>Call <code>findLoadedClass(String)</code> to check if the
+ * class has already been loaded. If it has, the same
+ * <code>Class</code> object is returned.</li>
+ * <li>If the <code>delegate</code> property is set to <code>true</code>,
+ * call the <code>loadClass()</code> method of the parent class
+ * loader, if any.</li>
+ * <li>Call <code>findClass()</code> to find this class in our locally
+ * defined repositories.</li>
+ * <li>Call the <code>loadClass()</code> method of our parent
+ * class loader, if any.</li>
+ * </ul>
+ * If the class was found using the above steps, and the
+ * <code>resolve</code> flag is <code>true</code>, this method will then
+ * call <code>resolveClass(Class)</code> on the resulting Class object.
+ *
+ * @param name Name of the class to be loaded
+ * @param resolve If <code>true</code> then resolve the class
+ *
+ * @exception ClassNotFoundException if the class was not found
+ */
+ public Class loadClass(String name, boolean resolve)
+ throws ClassNotFoundException {
+
+ if (log.isDebugEnabled())
+ log.debug("loadClass(" + name + ", " + resolve + ")");
+ Class clazz = null;
+
+ // Don't load classes if class loader is stopped
+ if (!started) {
+ log.info(sm.getString("webappClassLoader.stopped"));
+ throw new ThreadDeath();
+ }
+
+ // (0) Check our previously loaded local class cache
+ clazz = findLoadedClass0(name);
+ if (clazz != null) {
+ if (log.isDebugEnabled())
+ log.debug(" Returning class from cache");
+ if (resolve)
+ resolveClass(clazz);
+ return (clazz);
+ }
+
+ // (0.1) Check our previously loaded class cache
+ clazz = findLoadedClass(name);
+ if (clazz != null) {
+ if (log.isDebugEnabled())
+ log.debug(" Returning class from cache");
+ if (resolve)
+ resolveClass(clazz);
+ return (clazz);
+ }
+
+ // (0.2) Try loading the class with the system class loader, to prevent
+ // the webapp from overriding J2SE classes
+ // GOOGLE: use the bootstrap loader, not the system loader; it breaks
+ // embedding.
+ try {
+ // clazz = system.loadClass(name);
+ clazz = Class.forName(name, false, null);
+ if (clazz != null) {
+ if (resolve)
+ resolveClass(clazz);
+ return (clazz);
+ }
+ } catch (ClassNotFoundException e) {
+ // Ignore
+ }
+
+ // (0.5) Permission to access this class when using a SecurityManager
+ if (securityManager != null) {
+ int i = name.lastIndexOf('.');
+ if (i >= 0) {
+ try {
+ securityManager.checkPackageAccess(name.substring(0,i));
+ } catch (SecurityException se) {
+ String error = "Security Violation, attempt to use " +
+ "Restricted Class: " + name;
+ log.info(error, se);
+ throw new ClassNotFoundException(error, se);
+ }
+ }
+ }
+
+ boolean delegateLoad = delegate || filter(name);
+
+ // (1) Delegate to our parent if requested
+ if (delegateLoad) {
+ if (log.isDebugEnabled())
+ log.debug(" Delegating to parent classloader1 " + parent);
+ ClassLoader loader = parent;
+ if (loader == null)
+ loader = system;
+ try {
+ clazz = loader.loadClass(name);
+ if (clazz != null) {
+ if (log.isDebugEnabled())
+ log.debug(" Loading class from parent");
+ if (resolve)
+ resolveClass(clazz);
+ return (clazz);
+ }
+ } catch (ClassNotFoundException e) {
+ ;
+ }
+ }
+
+ // (2) Search local repositories
+ if (log.isDebugEnabled())
+ log.debug(" Searching local repositories");
+ try {
+ clazz = findClass(name);
+ if (clazz != null) {
+ if (log.isDebugEnabled())
+ log.debug(" Loading class from local repository");
+ if (resolve)
+ resolveClass(clazz);
+ return (clazz);
+ }
+ } catch (ClassNotFoundException e) {
+ ;
+ }
+
+ // (3) Delegate to parent unconditionally
+ if (!delegateLoad) {
+ if (log.isDebugEnabled())
+ log.debug(" Delegating to parent classloader at end: " + parent);
+ ClassLoader loader = parent;
+ if (loader == null)
+ loader = system;
+ try {
+ clazz = loader.loadClass(name);
+ if (clazz != null) {
+ if (log.isDebugEnabled())
+ log.debug(" Loading class from parent");
+ if (resolve)
+ resolveClass(clazz);
+ return (clazz);
+ }
+ } catch (ClassNotFoundException e) {
+ ;
+ }
+ }
+
+ throw new ClassNotFoundException(name);
+ }
+
+
+ /**
+ * Get the Permissions for a CodeSource. If this instance
+ * of WebappClassLoader is for a web application context,
+ * add read FilePermission or JndiPermissions for the base
+ * directory (if unpacked),
+ * the context URL, and jar file resources.
+ *
+ * @param codeSource where the code was loaded from
+ * @return PermissionCollection for CodeSource
+ */
+ protected PermissionCollection getPermissions(CodeSource codeSource) {
+
+ String codeUrl = codeSource.getLocation().toString();
+ PermissionCollection pc;
+ if ((pc = (PermissionCollection)loaderPC.get(codeUrl)) == null) {
+ pc = super.getPermissions(codeSource);
+ if (pc != null) {
+ Iterator perms = permissionList.iterator();
+ while (perms.hasNext()) {
+ Permission p = (Permission)perms.next();
+ pc.add(p);
+ }
+ loaderPC.put(codeUrl,pc);
+ }
+ }
+ return (pc);
+
+ }
+
+
+ /**
+ * Returns the search path of URLs for loading classes and resources.
+ * This includes the original list of URLs specified to the constructor,
+ * along with any URLs subsequently appended by the addURL() method.
+ * @return the search path of URLs for loading classes and resources.
+ */
+ public URL[] getURLs() {
+
+ if (repositoryURLs != null) {
+ return repositoryURLs;
+ }
+
+ URL[] external = super.getURLs();
+
+ int filesLength = files.length;
+ int jarFilesLength = jarRealFiles.length;
+ int length = filesLength + jarFilesLength + external.length;
+ int i;
+
+ try {
+
+ URL[] urls = new URL[length];
+ for (i = 0; i < length; i++) {
+ if (i < filesLength) {
+ urls[i] = getURL(files[i]);
+ } else if (i < filesLength + jarFilesLength) {
+ urls[i] = getURL(jarRealFiles[i - filesLength]);
+ } else {
+ urls[i] = external[i - filesLength - jarFilesLength];
+ }
+ }
+
+ repositoryURLs = urls;
+
+ } catch (MalformedURLException e) {
+ repositoryURLs = new URL[0];
+ }
+
+ return repositoryURLs;
+
+ }
+
+
+ // ------------------------------------------------------ Lifecycle Methods
+
+
+ /**
+ * Add a lifecycle event listener to this component.
+ *
+ * @param listener The listener to add
+ */
+ public void addLifecycleListener(LifecycleListener listener) {
+ }
+
+
+ /**
+ * Get the lifecycle listeners associated with this lifecycle. If this
+ * Lifecycle has no listeners registered, a zero-length array is returned.
+ */
+ public LifecycleListener[] findLifecycleListeners() {
+ return new LifecycleListener[0];
+ }
+
+
+ /**
+ * Remove a lifecycle event listener from this component.
+ *
+ * @param listener The listener to remove
+ */
+ public void removeLifecycleListener(LifecycleListener listener) {
+ }
+
+
+ /**
+ * Start the class loader.
+ *
+ * @exception LifecycleException if a lifecycle error occurs
+ */
+ public void start() throws LifecycleException {
+
+ started = true;
+
+ }
+
+
+ /**
+ * Stop the class loader.
+ *
+ * @exception LifecycleException if a lifecycle error occurs
+ */
+ public void stop() throws LifecycleException {
+
+ started = false;
+
+ int length = files.length;
+ for (int i = 0; i < length; i++) {
+ files[i] = null;
+ }
+
+ length = jarFiles.length;
+ for (int i = 0; i < length; i++) {
+ try {
+ if (jarFiles[i] != null) {
+ jarFiles[i].close();
+ }
+ } catch (IOException e) {
+ // Ignore
+ }
+ jarFiles[i] = null;
+ }
+
+ notFoundResources.clear();
+ resourceEntries.clear();
+ resources = null;
+ repositories = null;
+ repositoryURLs = null;
+ files = null;
+ jarFiles = null;
+ jarRealFiles = null;
+ jarPath = null;
+ jarNames = null;
+ lastModifiedDates = null;
+ paths = null;
+ hasExternalRepositories = false;
+ parent = null;
+
+ permissionList.clear();
+ loaderPC.clear();
+
+ if (loaderDir != null) {
+ deleteDir(loaderDir);
+ }
+
+ org.apache.commons.logging.LogFactory.release(this);
+
+ }
+
+
+ /**
+ * Used to periodically signal to the classloader to release
+ * JAR resources.
+ */
+ public void closeJARs(boolean force) {
+ if (jarFiles.length > 0) {
+ try {
+ synchronized (jarFiles) {
+ if (force || (System.currentTimeMillis()
+ > (lastJarAccessed + 90000))) {
+ for (int i = 0; i < jarFiles.length; i++) {
+ if (jarFiles[i] != null) {
+ jarFiles[i].close();
+ jarFiles[i] = null;
+ }
+ }
+ }
+ }
+ } catch (IOException e) {
+ log("Failed to close JAR", e);
+ }
+ }
+ }
+
+
+ // ------------------------------------------------------ Protected Methods
+
+
+ /**
+ * Used to periodically signal to the classloader to release JAR resources.
+ */
+ protected void openJARs() {
+ if (started && (jarFiles.length > 0)) {
+ lastJarAccessed = System.currentTimeMillis();
+ if (jarFiles[0] == null) {
+ try {
+ for (int i = 0; i < jarFiles.length; i++) {
+ jarFiles[i] = new JarFile(jarRealFiles[i]);
+ }
+ } catch (IOException e) {
+ log("Failed to open JAR", e);
+ }
+ }
+ }
+ }
+
+
+ /**
+ * Find specified class in local repositories.
+ *
+ * @return the loaded class, or null if the class isn't found
+ */
+ protected Class findClassInternal(String name)
+ throws ClassNotFoundException {
+
+ if (!validate(name))
+ throw new ClassNotFoundException(name);
+
+ String tempPath = name.replace('.', '/');
+ String classPath = tempPath + ".class";
+
+ ResourceEntry entry = null;
+
+ entry = findResourceInternal(name, classPath);
+
+ if ((entry == null) || (entry.binaryContent == null))
+ throw new ClassNotFoundException(name);
+
+ Class clazz = entry.loadedClass;
+ if (clazz != null)
+ return clazz;
+
+ // Looking up the package
+ String packageName = null;
+ int pos = name.lastIndexOf('.');
+ if (pos != -1)
+ packageName = name.substring(0, pos);
+
+ Package pkg = null;
+
+ if (packageName != null) {
+
+ pkg = getPackage(packageName);
+
+ // Define the package (if null)
+ if (pkg == null) {
+ if (entry.manifest == null) {
+ definePackage(packageName, null, null, null, null, null,
+ null, null);
+ } else {
+ definePackage(packageName, entry.manifest, entry.codeBase);
+ }
+ }
+
+ }
+
+ // Create the code source object
+ CodeSource codeSource =
+ new CodeSource(entry.codeBase, entry.certificates);
+
+ if (securityManager != null) {
+
+ // Checking sealing
+ if (pkg != null) {
+ boolean sealCheck = true;
+ if (pkg.isSealed()) {
+ sealCheck = pkg.isSealed(entry.codeBase);
+ } else {
+ sealCheck = (entry.manifest == null)
+ || !isPackageSealed(packageName, entry.manifest);
+ }
+ if (!sealCheck)
+ throw new SecurityException
+ ("Sealing violation loading " + name + " : Package "
+ + packageName + " is sealed.");
+ }
+
+ }
+
+ if (entry.loadedClass == null) {
+ synchronized (this) {
+ if (entry.loadedClass == null) {
+ clazz = defineClass(name, entry.binaryContent, 0,
+ entry.binaryContent.length,
+ codeSource);
+ entry.loadedClass = clazz;
+ entry.binaryContent = null;
+ entry.source = null;
+ entry.codeBase = null;
+ entry.manifest = null;
+ entry.certificates = null;
+ } else {
+ clazz = entry.loadedClass;
+ }
+ }
+ } else {
+ clazz = entry.loadedClass;
+ }
+
+ return clazz;
+
+ }
+
+ /**
+ * Find specified resource in local repositories. This block
+ * will execute under an AccessControl.doPrivilege block.
+ *
+ * @return the loaded resource, or null if the resource isn't found
+ */
+ private ResourceEntry findResourceInternal(File file, String path){
+ ResourceEntry entry = new ResourceEntry();
+ try {
+ entry.source = getURI(new File(file, path));
+ entry.codeBase = getURL(new File(file, path));
+ } catch (MalformedURLException e) {
+ return null;
+ }
+ return entry;
+ }
+
+
+ /**
+ * Find specified resource in local repositories.
+ *
+ * @return the loaded resource, or null if the resource isn't found
+ */
+ protected ResourceEntry findResourceInternal(String name, String path) {
+
+ if (!started) {
+ log.info(sm.getString("webappClassLoader.stopped"));
+ return null;
+ }
+
+ if ((name == null) || (path == null))
+ return null;
+
+ ResourceEntry entry = (ResourceEntry) resourceEntries.get(name);
+ if (entry != null)
+ return entry;
+
+ int contentLength = -1;
+ InputStream binaryStream = null;
+
+ int jarFilesLength = jarFiles.length;
+ int repositoriesLength = repositories.length;
+
+ int i;
+
+ Resource resource = null;
+
+ for (i = 0; (entry == null) && (i < repositoriesLength); i++) {
+ try {
+
+ String fullPath = repositories[i] + path;
+
+ Object lookupResult = resources.lookup(fullPath);
+ if (lookupResult instanceof Resource) {
+ resource = (Resource) lookupResult;
+ }
+
+ // Note : Not getting an exception here means the resource was
+ // found
+ if (securityManager != null) {
+ PrivilegedAction dp =
+ new PrivilegedFindResource(files[i], path);
+ entry = (ResourceEntry)AccessController.doPrivileged(dp);
+ } else {
+ entry = findResourceInternal(files[i], path);
+ }
+
+ ResourceAttributes attributes =
+ (ResourceAttributes) resources.getAttributes(fullPath);
+ contentLength = (int) attributes.getContentLength();
+ entry.lastModified = attributes.getLastModified();
+
+ if (resource != null) {
+
+ try {
+ binaryStream = resource.streamContent();
+ } catch (IOException e) {
+ return null;
+ }
+
+ // Register the full path for modification checking
+ // Note: Only syncing on a 'constant' object is needed
+ synchronized (allPermission) {
+
+ int j;
+
+ long[] result2 =
+ new long[lastModifiedDates.length + 1];
+ for (j = 0; j < lastModifiedDates.length; j++) {
+ result2[j] = lastModifiedDates[j];
+ }
+ result2[lastModifiedDates.length] = entry.lastModified;
+ lastModifiedDates = result2;
+
+ String[] result = new String[paths.length + 1];
+ for (j = 0; j < paths.length; j++) {
+ result[j] = paths[j];
+ }
+ result[paths.length] = fullPath;
+ paths = result;
+
+ }
+
+ }
+
+ } catch (NamingException e) {
+ }
+ }
+
+ if ((entry == null) && (notFoundResources.containsKey(name)))
+ return null;
+
+ JarEntry jarEntry = null;
+
+ synchronized (jarFiles) {
+
+ openJARs();
+ for (i = 0; (entry == null) && (i < jarFilesLength); i++) {
+
+ jarEntry = jarFiles[i].getJarEntry(path);
+
+ if (jarEntry != null) {
+
+ entry = new ResourceEntry();
+ try {
+ entry.codeBase = getURL(jarRealFiles[i]);
+ String jarFakeUrl = getURI(jarRealFiles[i]).toString();
+ jarFakeUrl = "jar:" + jarFakeUrl + "!/" + path;
+ entry.source = new URL(jarFakeUrl);
+ entry.lastModified = jarRealFiles[i].lastModified();
+ } catch (MalformedURLException e) {
+ return null;
+ }
+ contentLength = (int) jarEntry.getSize();
+ try {
+ entry.manifest = jarFiles[i].getManifest();
+ binaryStream = jarFiles[i].getInputStream(jarEntry);
+ } catch (IOException e) {
+ return null;
+ }
+
+ // Extract resources contained in JAR to the workdir
+ if (!(path.endsWith(".class"))) {
+ byte[] buf = new byte[1024];
+ File resourceFile = new File
+ (loaderDir, jarEntry.getName());
+ if (!resourceFile.exists()) {
+ Enumeration entries = jarFiles[i].entries();
+ while (entries.hasMoreElements()) {
+ JarEntry jarEntry2 =
+ (JarEntry) entries.nextElement();
+ if (!(jarEntry2.isDirectory())
+ && (!jarEntry2.getName().endsWith
+ (".class"))) {
+ resourceFile = new File
+ (loaderDir, jarEntry2.getName());
+ // No need to check mkdirs result because an
+ // IOException will occur anyway
+ resourceFile.getParentFile().mkdirs();
+ FileOutputStream os = null;
+ InputStream is = null;
+ try {
+ is = jarFiles[i].getInputStream
+ (jarEntry2);
+ os = new FileOutputStream
+ (resourceFile);
+ while (true) {
+ int n = is.read(buf);
+ if (n <= 0) {
+ break;
+ }
+ os.write(buf, 0, n);
+ }
+ } catch (IOException e) {
+ // Ignore
+ } finally {
+ try {
+ if (is != null) {
+ is.close();
+ }
+ } catch (IOException e) {
+ }
+ try {
+ if (os != null) {
+ os.close();
+ }
+ } catch (IOException e) {
+ }
+ }
+ }
+ }
+ }
+ }
+
+ }
+
+ }
+
+ if (entry == null) {
+ synchronized (notFoundResources) {
+ notFoundResources.put(name, name);
+ }
+ return null;
+ }
+
+ if (binaryStream != null) {
+
+ byte[] binaryContent = new byte[contentLength];
+
+ try {
+ int pos = 0;
+
+ while (true) {
+ int n = binaryStream.read(binaryContent, pos,
+ binaryContent.length - pos);
+ if (n <= 0)
+ break;
+ pos += n;
+ }
+ binaryStream.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ return null;
+ } catch (Exception e) {
+ e.printStackTrace();
+ return null;
+ }
+
+ entry.binaryContent = binaryContent;
+
+ // The certificates are only available after the JarEntry
+ // associated input stream has been fully read
+ if (jarEntry != null) {
+ entry.certificates = jarEntry.getCertificates();
+ }
+
+ }
+
+ }
+
+ // Add the entry in the local resource repository
+ synchronized (resourceEntries) {
+ // Ensures that all the threads which may be in a race to load
+ // a particular class all end up with the same ResourceEntry
+ // instance
+ ResourceEntry entry2 = (ResourceEntry) resourceEntries.get(name);
+ if (entry2 == null) {
+ resourceEntries.put(name, entry);
+ } else {
+ entry = entry2;
+ }
+ }
+
+ return entry;
+
+ }
+
+
+ /**
+ * Returns true if the specified package name is sealed according to the
+ * given manifest.
+ */
+ protected boolean isPackageSealed(String name, Manifest man) {
+
+ String path = name + "/";
+ Attributes attr = man.getAttributes(path);
+ String sealed = null;
+ if (attr != null) {
+ sealed = attr.getValue(Name.SEALED);
+ }
+ if (sealed == null) {
+ if ((attr = man.getMainAttributes()) != null) {
+ sealed = attr.getValue(Name.SEALED);
+ }
+ }
+ return "true".equalsIgnoreCase(sealed);
+
+ }
+
+
+ /**
+ * Finds the resource with the given name if it has previously been
+ * loaded and cached by this class loader, and return an input stream
+ * to the resource data. If this resource has not been cached, return
+ * <code>null</code>.
+ *
+ * @param name Name of the resource to return
+ */
+ protected InputStream findLoadedResource(String name) {
+
+ ResourceEntry entry = (ResourceEntry) resourceEntries.get(name);
+ if (entry != null) {
+ if (entry.binaryContent != null)
+ return new ByteArrayInputStream(entry.binaryContent);
+ }
+ return (null);
+
+ }
+
+
+ /**
+ * Finds the class with the given name if it has previously been
+ * loaded and cached by this class loader, and return the Class object.
+ * If this class has not been cached, return <code>null</code>.
+ *
+ * @param name Name of the resource to return
+ */
+ protected Class findLoadedClass0(String name) {
+
+ ResourceEntry entry = (ResourceEntry) resourceEntries.get(name);
+ if (entry != null) {
+ return entry.loadedClass;
+ }
+ return (null); // FIXME - findLoadedResource()
+
+ }
+
+
+ /**
+ * Refresh the system policy file, to pick up eventual changes.
+ */
+ protected void refreshPolicy() {
+
+ try {
+ // The policy file may have been modified to adjust
+ // permissions, so we're reloading it when loading or
+ // reloading a Context
+ Policy policy = Policy.getPolicy();
+ policy.refresh();
+ } catch (AccessControlException e) {
+ // Some policy files may restrict this, even for the core,
+ // so this exception is ignored
+ }
+
+ }
+
+
+ /**
+ * Filter classes.
+ *
+ * @param name class name
+ * @return true if the class should be filtered
+ */
+ protected boolean filter(String name) {
+
+ if (name == null)
+ return false;
+
+ // Looking up the package
+ String packageName = null;
+ int pos = name.lastIndexOf('.');
+ if (pos != -1)
+ packageName = name.substring(0, pos);
+ else
+ return false;
+
+ for (int i = 0; i < packageTriggers.length; i++) {
+ if (packageName.startsWith(packageTriggers[i]))
+ return true;
+ }
+
+ return false;
+
+ }
+
+
+ /**
+ * Validate a classname. As per SRV.9.7.2, we must restict loading of
+ * classes from J2SE (java.*) and classes of the servlet API
+ * (javax.servlet.*). That should enhance robustness and prevent a number
+ * of user error (where an older version of servlet.jar would be present
+ * in /WEB-INF/lib).
+ *
+ * @param name class name
+ * @return true if the name is valid
+ */
+ protected boolean validate(String name) {
+
+ if (name == null)
+ return false;
+ if (name.startsWith("java."))
+ return false;
+
+ return true;
+
+ }
+
+
+ /**
+ * Check the specified JAR file, and return <code>true</code> if it does
+ * not contain any of the trigger classes.
+ *
+ * @param jarfile The JAR file to be checked
+ *
+ * @exception IOException if an input/output error occurs
+ */
+ private boolean validateJarFile(File jarfile)
+ throws IOException {
+
+ if (triggers == null)
+ return (true);
+ JarFile jarFile = new JarFile(jarfile);
+ for (int i = 0; i < triggers.length; i++) {
+ Class clazz = null;
+ try {
+ if (parent != null) {
+ clazz = parent.loadClass(triggers[i]);
+ } else {
+ clazz = Class.forName(triggers[i]);
+ }
+ } catch (Throwable t) {
+ clazz = null;
+ }
+ if (clazz == null)
+ continue;
+ String name = triggers[i].replace('.', '/') + ".class";
+ if (log.isDebugEnabled())
+ log.debug(" Checking for " + name);
+ JarEntry jarEntry = jarFile.getJarEntry(name);
+ if (jarEntry != null) {
+ log.info("validateJarFile(" + jarfile +
+ ") - jar not loaded. See Servlet Spec 2.3, "
+ + "section 9.7.2. Offending class: " + name);
+ jarFile.close();
+ return (false);
+ }
+ }
+ jarFile.close();
+ return (true);
+
+ }
+
+
+ /**
+ * Get URL.
+ */
+ protected URL getURL(File file)
+ throws MalformedURLException {
+
+ File realFile = file;
+ try {
+ realFile = realFile.getCanonicalFile();
+ } catch (IOException e) {
+ // Ignore
+ }
+ return realFile.toURL();
+
+ }
+
+
+ /**
+ * Get URL.
+ */
+ protected URL getURI(File file)
+ throws MalformedURLException {
+
+ return jdkCompat.getURI(file);
+
+ }
+
+
+ /**
+ * Delete the specified directory, including all of its contents and
+ * subdirectories recursively.
+ *
+ * @param dir File object representing the directory to be deleted
+ */
+ protected static void deleteDir(File dir) {
+
+ String files[] = dir.list();
+ if (files == null) {
+ files = new String[0];
+ }
+ for (int i = 0; i < files.length; i++) {
+ File file = new File(dir, files[i]);
+ if (file.isDirectory()) {
+ deleteDir(file);
+ } else {
+ file.delete();
+ }
+ }
+ dir.delete();
+
+ }
+
+
+ /**
+ * Log a debugging output message.
+ *
+ * @param message Message to be logged
+ */
+ private void log(String message) {
+
+ System.out.println("WebappClassLoader: " + message);
+
+ }
+
+
+ /**
+ * Log a debugging output message with an exception.
+ *
+ * @param message Message to be logged
+ * @param throwable Exception to be logged
+ */
+ private void log(String message, Throwable throwable) {
+
+ System.out.println("WebappClassLoader: " + message);
+ throwable.printStackTrace(System.out);
+
+ }
+
+}
diff --git a/dev/core/test/com/google/gwt/core/ext/util/UtilSuite.java b/dev/core/test/com/google/gwt/core/ext/util/UtilSuite.java
index 93c0bb7..291dc81 100644
--- a/dev/core/test/com/google/gwt/core/ext/util/UtilSuite.java
+++ b/dev/core/test/com/google/gwt/core/ext/util/UtilSuite.java
@@ -18,7 +18,7 @@
import junit.framework.Test;
import junit.framework.TestSuite;
-public class UtilSuite {
+public class UtilSuite extends TestSuite {
public static Test suite() {
TestSuite suite = new TestSuite("Test suite for Util");
suite.addTestSuite(UtilTest.class);
diff --git a/dev/core/test/com/google/gwt/dev/GWTCompilerTest.java b/dev/core/test/com/google/gwt/dev/GWTCompilerTest.java
new file mode 100644
index 0000000..8955714
--- /dev/null
+++ b/dev/core/test/com/google/gwt/dev/GWTCompilerTest.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2009 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.dev;
+
+import com.google.gwt.core.ext.TreeLogger;
+import com.google.gwt.dev.GWTCompiler.GWTCompilerOptionsImpl;
+import com.google.gwt.dev.jjs.JsOutputOption;
+
+import java.io.File;
+
+/**
+ * Test for deprecated {@link GWTShell}.
+ */
+@SuppressWarnings("deprecation")
+public class GWTCompilerTest extends ArgProcessorTestBase {
+
+ private final GWTCompiler.ArgProcessor argProcessor;
+ private final GWTCompilerOptionsImpl options = new GWTCompilerOptionsImpl();
+
+ public GWTCompilerTest() {
+ argProcessor = new GWTCompiler.ArgProcessor(options);
+ }
+
+ public void testAllValidArgs() {
+ assertProcessSuccess(argProcessor, "-logLevel", "DEBUG", "-style",
+ "PRETTY", "-ea", "-XdisableAggressiveOptimization", "-out", "myWww",
+ "-gen", "myGen", "c.g.g.h.H", "my.Module");
+
+ assertEquals(new File("myGen").getAbsoluteFile(),
+ options.getGenDir().getAbsoluteFile());
+ assertEquals(new File("myWww"), options.getOutDir());
+
+ assertEquals(TreeLogger.DEBUG, options.getLogLevel());
+ assertEquals(JsOutputOption.PRETTY, options.getOutput());
+ assertTrue(options.isEnableAssertions());
+ assertFalse(options.isAggressivelyOptimize());
+
+ assertEquals(2, options.getModuleNames().size());
+ assertEquals("c.g.g.h.H", options.getModuleNames().get(0));
+ assertEquals("my.Module", options.getModuleNames().get(1));
+ }
+
+ public void testDefaultArgs() {
+ assertProcessSuccess(argProcessor, "c.g.g.h.H");
+
+ assertEquals(null, options.getGenDir());
+ assertEquals(new File("").getAbsoluteFile(),
+ options.getOutDir().getAbsoluteFile());
+
+ assertEquals(TreeLogger.INFO, options.getLogLevel());
+ assertEquals(JsOutputOption.OBFUSCATED, options.getOutput());
+ assertFalse(options.isEnableAssertions());
+ assertTrue(options.isAggressivelyOptimize());
+
+ assertEquals(1, options.getModuleNames().size());
+ assertEquals("c.g.g.h.H", options.getModuleNames().get(0));
+ }
+
+ public void testForbiddenArgs() {
+ assertProcessFailure(argProcessor, "-localWorkers", "2");
+ assertProcessFailure(argProcessor, "-extra", "extra");
+ assertProcessFailure(argProcessor, "-war", "war");
+ assertProcessFailure(argProcessor, "-work", "work");
+ }
+}
diff --git a/dev/core/test/com/google/gwt/dev/GWTShellTest.java b/dev/core/test/com/google/gwt/dev/GWTShellTest.java
new file mode 100644
index 0000000..557189e
--- /dev/null
+++ b/dev/core/test/com/google/gwt/dev/GWTShellTest.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright 2009 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.dev;
+
+import com.google.gwt.core.ext.TreeLogger;
+import com.google.gwt.dev.GWTShell.ShellOptionsImpl;
+import com.google.gwt.dev.HostedModeTest.MySCL;
+import com.google.gwt.dev.jjs.JsOutputOption;
+import com.google.gwt.dev.shell.BrowserWidgetHostChecker;
+
+import java.io.File;
+
+/**
+ * Test for deprecated {@link GWTShell}.
+ */
+@SuppressWarnings("deprecation")
+public class GWTShellTest extends ArgProcessorTestBase {
+
+ private final GWTShell.ArgProcessor argProcessor;
+ private final ShellOptionsImpl options = new ShellOptionsImpl();
+
+ public GWTShellTest() {
+ argProcessor = new GWTShell.ArgProcessor(options, false, false);
+ }
+
+ public void testAllValidArgs() {
+ assertProcessSuccess(argProcessor, "-port", "8080", "-whitelist", "white",
+ "-blacklist", "black", "-logLevel", "DEBUG", "-noserver", "-out",
+ "myWww", "-gen", "myGen", "http://www.google.com/", "foo");
+
+ assertNotNull(BrowserWidgetHostChecker.matchWhitelisted("white"));
+ assertNotNull(BrowserWidgetHostChecker.matchBlacklisted("black"));
+ assertFalse(BrowserWidgetHostChecker.isAlwaysWhitelisted("http://127.0.0.1.40"));
+ assertFalse(BrowserWidgetHostChecker.isAlwaysWhitelisted("http://127.0.0.1.40:88"));
+ assertFalse(BrowserWidgetHostChecker.isAlwaysWhitelisted("http://127.0.0.1.40:88/"));
+ assertFalse(BrowserWidgetHostChecker.isAlwaysWhitelisted("http://127.0.0.1.40:88/foo"));
+ assertFalse(BrowserWidgetHostChecker.isAlwaysWhitelisted("http://localhost.evildomain.org"));
+ assertFalse(BrowserWidgetHostChecker.isAlwaysWhitelisted("http://localhost.evildomain.org:88"));
+ assertFalse(BrowserWidgetHostChecker.isAlwaysWhitelisted("http://localhost.evildomain.org:88/"));
+ assertFalse(BrowserWidgetHostChecker.isAlwaysWhitelisted("http://localhost.evildomain.org:88/foo"));
+ assertFalse(BrowserWidgetHostChecker.isAlwaysWhitelisted("http://localhost.evildomain.org/"));
+ assertFalse(BrowserWidgetHostChecker.isAlwaysWhitelisted("http://localhost.evildomain.org/foo"));
+ assertFalse(BrowserWidgetHostChecker.isAlwaysWhitelisted("http://www.evildomain.org/foo?http://localhost"));
+ assertTrue(BrowserWidgetHostChecker.isAlwaysWhitelisted("http://127.0.0.1"));
+ assertTrue(BrowserWidgetHostChecker.isAlwaysWhitelisted("http://127.0.0.1:88"));
+ assertTrue(BrowserWidgetHostChecker.isAlwaysWhitelisted("http://127.0.0.1:88/"));
+ assertTrue(BrowserWidgetHostChecker.isAlwaysWhitelisted("http://127.0.0.1:88/foo"));
+
+ assertEquals(new File("myGen").getAbsoluteFile(),
+ options.getGenDir().getAbsoluteFile());
+ assertEquals(new File("myWww"), options.getOutDir());
+
+ assertEquals(TreeLogger.DEBUG, options.getLogLevel());
+
+ assertEquals(8080, options.getPort());
+ assertTrue(options.isNoServer());
+ assertEquals(2, options.getStartupURLs().size());
+ assertEquals("http://www.google.com/", options.getStartupURLs().get(0));
+ assertEquals("foo", options.getStartupURLs().get(1));
+ }
+
+ public void testDefaultArgs() {
+ assertProcessSuccess(argProcessor);
+
+ assertEquals(null, options.getGenDir());
+ assertEquals(new File("").getAbsoluteFile(),
+ options.getOutDir().getAbsoluteFile());
+
+ assertEquals(TreeLogger.INFO, options.getLogLevel());
+ assertEquals(JsOutputOption.OBFUSCATED, options.getOutput());
+ assertFalse(options.isEnableAssertions());
+ assertTrue(options.isAggressivelyOptimize());
+
+ assertEquals(8888, options.getPort());
+ assertFalse(options.isNoServer());
+ assertEquals(0, options.getStartupURLs().size());
+ }
+
+ public void testForbiddenArgs() {
+ assertProcessFailure(argProcessor, "-localWorkers", "2");
+ assertProcessFailure(argProcessor, "-extra", "extra");
+ assertProcessFailure(argProcessor, "-war", "war");
+ assertProcessFailure(argProcessor, "-work", "work");
+ assertProcessFailure(argProcessor, "-server", MySCL.class.getName());
+ }
+}
diff --git a/dev/core/test/com/google/gwt/dev/javac/GeneratedClassnameFinderTest.java b/dev/core/test/com/google/gwt/dev/javac/GeneratedClassnameFinderTest.java
index 8a988ca..0f428e2 100644
--- a/dev/core/test/com/google/gwt/dev/javac/GeneratedClassnameFinderTest.java
+++ b/dev/core/test/com/google/gwt/dev/javac/GeneratedClassnameFinderTest.java
@@ -89,10 +89,6 @@
+ "$MainClass$NestedClass").getClassNames().size());
}
- public void testAbstractNative() {
- assertEquals(2, new AbstractNativeTester().getGeneratedClasses().size());
- }
-
public void testAnonymous() {
assertEquals(1, new AnonymousTester().getGeneratedClasses().size());
}
@@ -128,28 +124,6 @@
assertEquals(1, new TopLevelTester().getGeneratedClasses().size());
}
-
-}
-
-/**
- * For testing a class containing anonymous inner classes with abstract and
- * native methods.
- */
-class AbstractNativeTester {
- void foo() {
- abstract class Fooer {
- abstract void foo();
- }
- Fooer a = new Fooer() {
- native void foo();
- };
- a.foo();
- }
-
- List<String> getGeneratedClasses() {
- return (new GeneratedClassnameFinder(GeneratedClassnameFinderTest.logger,
- this.getClass().getName().replace('.', '/'))).getClassNames();
- }
}
/**
diff --git a/dev/core/test/com/google/gwt/dev/javac/TypeOracleMediatorTestBase.java b/dev/core/test/com/google/gwt/dev/javac/TypeOracleMediatorTestBase.java
index 759bf3d..86c5580 100644
--- a/dev/core/test/com/google/gwt/dev/javac/TypeOracleMediatorTestBase.java
+++ b/dev/core/test/com/google/gwt/dev/javac/TypeOracleMediatorTestBase.java
@@ -64,10 +64,12 @@
import com.google.gwt.dev.util.Util;
import com.google.gwt.dev.util.log.AbstractTreeLogger;
import com.google.gwt.dev.util.log.PrintWriterTreeLogger;
-import com.google.gwt.thirdparty.guava.common.collect.MapMaker;
import junit.framework.TestCase;
+import org.apache.commons.collections.map.AbstractReferenceMap;
+import org.apache.commons.collections.map.ReferenceMap;
+
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
@@ -858,13 +860,15 @@
* parameterizedTypes, arrayTypes, and wildCardTypes in TypeOracle. Note: this
* test is manual because gc can be unreliable.
*/
+ @SuppressWarnings("unchecked")
public void manualTestAbstractRefrenceMap() {
/*
* with a HARD -> WEAK map, verify that the entry remains if there is no
* reference to key, but is deleted when the reference to value is gone
*/
- Map<Integer, Integer> simpleMap = new MapMaker().weakValues().makeMap();
+ Map<Integer, Integer> simpleMap =
+ new ReferenceMap(AbstractReferenceMap.HARD, AbstractReferenceMap.WEAK, true);
Integer bar = new Integer(42);
simpleMap.put(new Integer(32), bar);
Runtime.getRuntime().gc();
@@ -877,8 +881,9 @@
* with a WEAK -> WEAK map, verify that the entry is gone if there are no
* references to either the key or the value.
*/
- simpleMap = new MapMaker().weakKeys().weakValues().makeMap();
- Map<Integer, Integer> reverseMap = new MapMaker().weakKeys().weakValues().makeMap();
+ simpleMap = new ReferenceMap(AbstractReferenceMap.WEAK, AbstractReferenceMap.WEAK, true);
+ Map<Integer, Integer> reverseMap =
+ new ReferenceMap(AbstractReferenceMap.WEAK, AbstractReferenceMap.WEAK, true);
Integer foo = new Integer(32);
bar = new Integer(42);
simpleMap.put(foo, bar);
diff --git a/dev/core/test/com/google/gwt/dev/javac/typemodel/TypeOracleSuite.java b/dev/core/test/com/google/gwt/dev/javac/typemodel/TypeOracleSuite.java
index cdd2f1b..96b730a 100644
--- a/dev/core/test/com/google/gwt/dev/javac/typemodel/TypeOracleSuite.java
+++ b/dev/core/test/com/google/gwt/dev/javac/typemodel/TypeOracleSuite.java
@@ -18,7 +18,7 @@
import junit.framework.Test;
import junit.framework.TestSuite;
-public class TypeOracleSuite {
+public class TypeOracleSuite extends TestSuite {
public static Test suite() {
TestSuite suite = new TestSuite("Test suite for TypeOracle");
suite.addTestSuite(AnnotationsTest.class);
diff --git a/dev/core/test/com/google/gwt/dev/jjs/impl/DeadCodeEliminationTest.java b/dev/core/test/com/google/gwt/dev/jjs/impl/DeadCodeEliminationTest.java
index 878780a..0913202 100644
--- a/dev/core/test/com/google/gwt/dev/jjs/impl/DeadCodeEliminationTest.java
+++ b/dev/core/test/com/google/gwt/dev/jjs/impl/DeadCodeEliminationTest.java
@@ -37,8 +37,6 @@
addSnippetClassDecl("static volatile double d;");
addSnippetClassDecl("static volatile String s;");
addSnippetClassDecl("static volatile Object o;");
-
- runMethodInliner = false;
}
public void testConditionalOptimizations() throws Exception {
@@ -101,27 +99,6 @@
"EntryPoint.b && (EntryPoint.i = 1);");
}
- /**
- * BUG: JInstance was marked as not having side effects whereas it all depends on the
- * whether the expression on the left has side effects.
- *
- * Reproduces Issue:7818.
- */
- public void testInstanceOfOptimization() throws Exception {
- runMethodInliner = true;
- addSnippetClassDecl(
- "static class A { "
- + "static int f1;"
- + "static A createA() { A.f1 = 1; return new A(); } "
- + "static boolean instanceofMulti() { return (createA() instanceof A); } "
- + "static boolean inlineable() { instanceofMulti(); return true;}"
- + "}");
-
- optimizeExpressions(false, "void", "A.inlineable()")
- .into("A.f1 = 1; new A();");
- }
-
-
public void testDoOptimization() throws Exception {
optimize("void", "do {} while (b);").intoString(
"do {",
@@ -137,32 +114,8 @@
"} while (false);");
}
- public void testMultiExpressionOptimization() throws Exception {
- runMethodInliner = true;
- addSnippetClassDecl(
- "static class A { ",
- " static int f;",
- " static { if (4-f ==0) f=4; }",
- " static boolean t() { return true; }",
- " static boolean f() { return false; }",
- " static boolean notInlineable() { if (4-f == 0) return true;return false;}",
- "}");
-
- addSnippetClassDecl(
- "static class B { ",
- " static boolean inlineableOr() { return A.t() || A.notInlineable(); }",
- " static boolean inlineableAnd() { return A.t() && A.notInlineable(); }",
- "}");
-
- optimize("void", "B.inlineableAnd();")
- .intoString("EntryPoint$A.$clinit();\nEntryPoint$A.notInlineable();");
- optimize("void", "B.inlineableOr();")
- .intoString("EntryPoint$A.$clinit();");
- }
-
public void testOptimizeStringCalls() throws Exception {
- // Note: we're limited here by the methods declared in the mock String in
- // JJSTestBase#addBuiltinClasses
+ // Note: we're limited here by the methods declared in the mock String in JJSTestBase#addBuiltinClasses
// String.length
optimize("int", "return \"abc\".length();").intoString("return 3;");
@@ -192,42 +145,10 @@
optimize("double", "return 0.0 - d;").intoString("return 0.0 - EntryPoint.d;");
}
- public void testMultiExpression_RedundantClinitRemoval() throws Exception {
- addSnippetClassDecl(
- "static class A { "
- + "static int f1;"
- + "static int f2;"
- + "static { f1 = 1; }"
- + "static void m1() { } "
- + "}" +
- "static class B extends A { "
- + "static int f3;"
- + "static int f4;"
- + "static { f3 = 1; }"
- + "static void m2() { } "
- + "}");
-
- optimizeExpressions(true, "void", "A.m1()", "A.m1()").intoString("EntryPoint$A.$clinit();\n"
- + "EntryPoint$A.m1();\n"
- + "EntryPoint$A.m1();");
- optimizeExpressions(true, "void", "B.m2()", "A.m1()").intoString("EntryPoint$B.$clinit();\n"
- + "EntryPoint$B.m2();\n"
- + "EntryPoint$A.m1();");
- optimizeExpressions(true, "void", "A.m1()", "B.m2()").intoString("EntryPoint$A.$clinit();\n"
- + "EntryPoint$A.m1();\n"
- + "EntryPoint$B.$clinit();\n"
- + "EntryPoint$B.m2();");
- }
-
- private boolean runMethodInliner;
-
@Override
protected boolean optimizeMethod(JProgram program, JMethod method) {
-
- if (runMethodInliner) {
- MethodInliner.exec(program);
- }
-
+ // This is necessary for String calls optimizations
+ MethodCallTightener.exec(program);
OptimizerStats result = DeadCodeElimination.exec(program, method);
if (result.didChange()) {
// Make sure we converge in one pass.
diff --git a/dev/core/test/com/google/gwt/dev/jjs/impl/OptimizerTestBase.java b/dev/core/test/com/google/gwt/dev/jjs/impl/OptimizerTestBase.java
index 0d47a3f..98a4d13 100644
--- a/dev/core/test/com/google/gwt/dev/jjs/impl/OptimizerTestBase.java
+++ b/dev/core/test/com/google/gwt/dev/jjs/impl/OptimizerTestBase.java
@@ -16,24 +16,10 @@
package com.google.gwt.dev.jjs.impl;
import com.google.gwt.core.ext.UnableToCompleteException;
-import com.google.gwt.dev.jjs.SourceInfo;
-import com.google.gwt.dev.jjs.ast.Context;
-import com.google.gwt.dev.jjs.ast.JBinaryOperation;
-import com.google.gwt.dev.jjs.ast.JBinaryOperator;
import com.google.gwt.dev.jjs.ast.JDeclaredType;
-import com.google.gwt.dev.jjs.ast.JExpression;
-import com.google.gwt.dev.jjs.ast.JExpressionStatement;
import com.google.gwt.dev.jjs.ast.JField;
-import com.google.gwt.dev.jjs.ast.JFieldRef;
-import com.google.gwt.dev.jjs.ast.JLocal;
-import com.google.gwt.dev.jjs.ast.JLocalRef;
import com.google.gwt.dev.jjs.ast.JMethod;
-import com.google.gwt.dev.jjs.ast.JMethodBody;
-import com.google.gwt.dev.jjs.ast.JMethodCall;
import com.google.gwt.dev.jjs.ast.JProgram;
-import com.google.gwt.dev.jjs.ast.JReturnStatement;
-import com.google.gwt.dev.jjs.ast.JStatement;
-import com.google.gwt.dev.jjs.ast.js.JMultiExpression;
import com.google.gwt.dev.util.Preconditions;
import com.google.gwt.dev.util.Strings;
@@ -108,155 +94,11 @@
}
}
- /**
- * Makes implicit <code>$clinit()</code> calls explicit to mimic the effect of other
- * optimizations. Otherwise can not test optimizations that involve <code>$clinit</code> calls
- * as they don't appear when compiling small snippets.
- *
- * @param method method to transform to make <code>$clinit</code> calls explicit.
- */
- private void insertImplicitClinitCalls(final JMethod method) {
- // Mimic the method inliner which inserts clinits calls prior to method or field dereference.
- // The actual clinit() calls might be inserted as a result of optimizations: e,g,
- // DeadCodeElimination inserts clinit calls when it removes (some) field accesses or method
- // calls.
- final JMethodBody body = (JMethodBody) method.getBody();
-
- new TempLocalVisitor() {
-
- private JMethodCall createClinitCall(SourceInfo sourceInfo, JDeclaredType targetType) {
- JMethod clinit = targetType.getClinitTarget().getClinitMethod();
- assert (JProgram.isClinit(clinit));
- return new JMethodCall(sourceInfo, null, clinit);
- }
-
- private JMultiExpression createMultiExpressionForInstanceAndClinit(JExpression x) {
- JMultiExpression multi = new JMultiExpression(x.getSourceInfo());
-
- JMethodCall clinit = null;
- if (x instanceof JMethodCall) {
- JExpression instance = ((JMethodCall) x).getInstance();
-
- // Any instance expression goes first (this can happen even with statics).
- if (instance != null) {
-
- multi.exprs.add(instance);
- JLocal var = createTempLocal(instance.getSourceInfo(), instance.getType());
-
- JLocalRef localRef = new JLocalRef(var.getSourceInfo(), var);
- instance = new JBinaryOperation(instance.getSourceInfo(), localRef.getType(),
- JBinaryOperator.ASG, localRef, instance);
- }
- clinit = createClinitCall(x.getSourceInfo(),
- ((JMethodCall) x).getTarget().getEnclosingType());
- } else if (x instanceof JFieldRef) {
- clinit = createClinitCall(x.getSourceInfo(), ((JFieldRef) x).getEnclosingType());
- }
- // If we need a clinit call, add it first
- if (clinit != null) {
- multi.exprs.add(clinit);
- }
- multi.exprs.add(x);
- return multi;
- }
-
- @Override
- public void endVisit(JMethodCall x, Context ctx) {
- ctx.replaceMe(createMultiExpressionForInstanceAndClinit(x));
- }
-
- @Override
- public void endVisit(JFieldRef x, Context ctx) {
- ctx.replaceMe(createMultiExpressionForInstanceAndClinit(x));
- }
-
- }.accept(method);
- }
-
protected final Result optimize(final String returnType,
final String... codeSnippet) throws UnableToCompleteException {
return optimizeMethod(MAIN_METHOD_NAME, returnType, codeSnippet);
}
- /**
- * Test the effect of an optimization on a JMultiExpression.
- * JMultiExpression can not be constructed from source code at the moment as it is not a valid
- * java source construct.
- *
- * @param addClinitCalls whether to insert the implicit clinit calls. This is necessary because
- * clinit() methods are synthetic can not be inserted explicitly as source
- * code calls.
- * @param returnType the return type of the JMultiExpression. Must be <code>void</code> or
- * compatible with the last expression.
- * @param expressionSnippets source code of the expressions.
- * @return the optimization result.
- * @throws UnableToCompleteException
- */
- protected final Result optimizeExpressions(boolean addClinitCalls, final String returnType,
- final String... expressionSnippets)
- throws UnableToCompleteException {
-
- // TODO(rluble): Not very elegant to require that the snippets be statements instead of
- // expressions.
-
- assert expressionSnippets.length > 0;
-
- // Compile as statements
- if (!returnType.equals("void")) {
- expressionSnippets[expressionSnippets.length - 1] =
- "return " + expressionSnippets[expressionSnippets.length - 1];
- }
- String snippet = Strings.join(expressionSnippets, ";\n") + ";\n";
- final JProgram program = compileSnippet(returnType, snippet);
- JMethod method = findMethod(program, MAIN_METHOD_NAME);
- JMethodBody body = (JMethodBody) method.getBody();
- JMultiExpression multi = new JMultiExpression(body.getSourceInfo());
-
- // Transform statement sequence into a JMultiExpression
- for (JStatement stmt : body.getStatements()) {
-
- if (stmt instanceof JExpressionStatement) {
- JExpressionStatement exprStmt = (JExpressionStatement) stmt;
- JExpression expr = exprStmt.getExpr();
- multi.exprs.add(expr);
- } else if (stmt instanceof JReturnStatement) {
- JReturnStatement returnStatement = (JReturnStatement) stmt;
- JExpression expr = returnStatement.getExpr();
- if (expr != null) {
- multi.exprs.add(expr);
- }
- } else {
- assert false : "Not a valid multiexpression";
- }
- }
-
- // Take care of the return type
- JStatement multiStm;
- if (!returnType.equals("void")) {
- multiStm = new JReturnStatement(multi.getSourceInfo(), multi);
- } else {
- multiStm = multi.makeStatement();
- }
-
- // Replace the method body
- JMethodBody newBody = new JMethodBody(method.getBody().getSourceInfo());
- newBody.getBlock().addStmt(multiStm);
- method.setBody(newBody);
- newBody.setMethod(method);
- if (addClinitCalls) {
- insertImplicitClinitCalls(method);
- }
-
-
- // Finally optimize.
- boolean madeChanges = optimizeMethod(program, method);
- if (madeChanges && runDeadCodeElimination) {
- DeadCodeElimination.exec(program);
- }
-
- return new Result(program, returnType, MAIN_METHOD_NAME, snippet, madeChanges);
- }
-
protected final Result optimizeMethod(final String methodName,
final String mainMethodReturnType, final String... mainMethodSnippet)
throws UnableToCompleteException {
diff --git a/dev/core/test/com/google/gwt/dev/jjs/impl/gflow/DataflowOptimizerTest.java b/dev/core/test/com/google/gwt/dev/jjs/impl/gflow/DataflowOptimizerTest.java
index 85e3530..9ee6e0d 100644
--- a/dev/core/test/com/google/gwt/dev/jjs/impl/gflow/DataflowOptimizerTest.java
+++ b/dev/core/test/com/google/gwt/dev/jjs/impl/gflow/DataflowOptimizerTest.java
@@ -350,8 +350,9 @@
* despite there being side-effects of the multi-expression. So, we want to test that inlining
* proceeds, but not further constant transformation.
*
- * TODO(rluble): This test may need to evolve over time, as the specifics of the
- * optimizers change.
+ * TODO: This test may need to evolve over time, as the specifics of the optimizers change. One
+ * obvious todo is to allow some form of constant transformation to occur with inlined
+ * multi-expressions (see comment below).
*/
public void testInlinedConstantExpressionWithSideEffects() throws Exception {
@@ -373,9 +374,10 @@
" fail();",
"}",
"return x;")
- .into("Integer n = new Integer(1);",
- "x = n;",
- "return x;");
+ // TODO: Allow the second line below to be transformed to just: "EntryPoint.x = n;"
+ .intoString("Integer n = new Integer(1);",
+ "((EntryPoint.x = n, true)) || EntryPoint.fail();",
+ "return EntryPoint.x.intValue();");
}
@@ -385,21 +387,14 @@
@Override
protected boolean optimizeMethod(JProgram program, JMethod method) {
boolean didChange = false;
- boolean optimizeChange = false;
- // Run optimizations in a loop to make the tests more robusts to unrelated
- // changes.
- do {
- optimizeChange = false;
- if (runDCE) {
- optimizeChange = DeadCodeElimination.exec(program).didChange() || optimizeChange;
- }
+ if (runDCE) {
+ didChange = DeadCodeElimination.exec(program).didChange() || didChange;
+ }
- if (runMethodInliner) {
- optimizeChange = MethodInliner.exec(program).didChange() || optimizeChange;
- }
- didChange = didChange || optimizeChange;
- } while (optimizeChange);
+ if (runMethodInliner) {
+ didChange = MethodInliner.exec(program).didChange() || didChange;
+ }
didChange = DataflowOptimizer.exec(program, method).didChange() || didChange;
return didChange;
diff --git a/dev/core/test/org/apache/commons/collections/collection/AbstractTestCollection.java b/dev/core/test/org/apache/commons/collections/collection/AbstractTestCollection.java
index a3591db..2071e3d 100644
--- a/dev/core/test/org/apache/commons/collections/collection/AbstractTestCollection.java
+++ b/dev/core/test/org/apache/commons/collections/collection/AbstractTestCollection.java
@@ -16,8 +16,6 @@
*/
package org.apache.commons.collections.collection;
-import org.apache.commons.collections.AbstractTestObject;
-
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
@@ -36,6 +34,8 @@
import java.util.Map;
import java.util.NoSuchElementException;
+import org.apache.commons.collections.AbstractTestObject;
+
/**
* Abstract test class for {@link java.util.Collection} methods and contracts.
* <p>
@@ -121,7 +121,6 @@
* @author Neil O'Toole
* @author Stephen Colebourne
*/
-@SuppressWarnings({"unchecked", "rawtypes"})
public abstract class AbstractTestCollection extends AbstractTestObject {
//
diff --git a/dev/core/test/org/apache/commons/collections/iterators/AbstractTestIterator.java b/dev/core/test/org/apache/commons/collections/iterators/AbstractTestIterator.java
index a9ce434..d2e6870 100644
--- a/dev/core/test/org/apache/commons/collections/iterators/AbstractTestIterator.java
+++ b/dev/core/test/org/apache/commons/collections/iterators/AbstractTestIterator.java
@@ -16,11 +16,11 @@
*/
package org.apache.commons.collections.iterators;
-import org.apache.commons.collections.AbstractTestObject;
-
import java.util.Iterator;
import java.util.NoSuchElementException;
+import org.apache.commons.collections.AbstractTestObject;
+
/**
* Abstract class for testing the Iterator interface.
* <p>
@@ -35,7 +35,6 @@
* @author Morgan Delagrange
* @author Stephen Colebourne
*/
-@SuppressWarnings({"unchecked", "rawtypes"})
public abstract class AbstractTestIterator extends AbstractTestObject {
/**
diff --git a/dev/core/test/org/apache/commons/collections/iterators/AbstractTestMapIterator.java b/dev/core/test/org/apache/commons/collections/iterators/AbstractTestMapIterator.java
index b5e7e01..5bd5191 100644
--- a/dev/core/test/org/apache/commons/collections/iterators/AbstractTestMapIterator.java
+++ b/dev/core/test/org/apache/commons/collections/iterators/AbstractTestMapIterator.java
@@ -16,14 +16,14 @@
*/
package org.apache.commons.collections.iterators;
-import org.apache.commons.collections.MapIterator;
-
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.NoSuchElementException;
import java.util.Set;
+import org.apache.commons.collections.MapIterator;
+
/**
* Abstract class for testing the MapIterator interface.
* <p>
@@ -37,7 +37,6 @@
*
* @author Stephen Colebourne
*/
-@SuppressWarnings({"unchecked", "rawtypes"})
public abstract class AbstractTestMapIterator extends AbstractTestIterator {
/**
diff --git a/dev/core/test/org/apache/commons/collections/map/AbstractTestIterableMap.java b/dev/core/test/org/apache/commons/collections/map/AbstractTestIterableMap.java
index a9d1250..46b0436 100644
--- a/dev/core/test/org/apache/commons/collections/map/AbstractTestIterableMap.java
+++ b/dev/core/test/org/apache/commons/collections/map/AbstractTestIterableMap.java
@@ -16,15 +16,15 @@
*/
package org.apache.commons.collections.map;
-import org.apache.commons.collections.BulkTest;
-import org.apache.commons.collections.IterableMap;
-import org.apache.commons.collections.MapIterator;
-import org.apache.commons.collections.iterators.AbstractTestMapIterator;
-
import java.util.ConcurrentModificationException;
import java.util.Iterator;
import java.util.Map;
+import org.apache.commons.collections.IterableMap;
+import org.apache.commons.collections.BulkTest;
+import org.apache.commons.collections.MapIterator;
+import org.apache.commons.collections.iterators.AbstractTestMapIterator;
+
/**
* Abstract test class for {@link IterableMap} methods and contracts.
*
@@ -32,7 +32,6 @@
*
* @author Stephen Colebourne
*/
-@SuppressWarnings({"unchecked", "rawtypes"})
public abstract class AbstractTestIterableMap extends AbstractTestMap {
/**
diff --git a/dev/core/test/org/apache/commons/collections/map/AbstractTestMap.java b/dev/core/test/org/apache/commons/collections/map/AbstractTestMap.java
index 3d4668f..433a665 100644
--- a/dev/core/test/org/apache/commons/collections/map/AbstractTestMap.java
+++ b/dev/core/test/org/apache/commons/collections/map/AbstractTestMap.java
@@ -16,11 +16,6 @@
*/
package org.apache.commons.collections.map;
-import org.apache.commons.collections.AbstractTestObject;
-import org.apache.commons.collections.BulkTest;
-import org.apache.commons.collections.collection.AbstractTestCollection;
-import org.apache.commons.collections.set.AbstractTestSet;
-
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
@@ -30,6 +25,11 @@
import java.util.Map;
import java.util.Set;
+import org.apache.commons.collections.AbstractTestObject;
+import org.apache.commons.collections.BulkTest;
+import org.apache.commons.collections.collection.AbstractTestCollection;
+import org.apache.commons.collections.set.AbstractTestSet;
+
/**
* Abstract test class for {@link java.util.Map} methods and contracts.
* <p>
@@ -119,7 +119,6 @@
* @author Stephen Colebourne
* @version $Revision: 646780 $ $Date: 2008-04-10 13:48:07 +0100 (Thu, 10 Apr 2008) $
*/
-@SuppressWarnings({"unchecked", "rawtypes"})
public abstract class AbstractTestMap extends AbstractTestObject {
/**
diff --git a/dev/core/test/org/apache/commons/collections/map/TestIdentityMap.java b/dev/core/test/org/apache/commons/collections/map/TestIdentityMap.java
index 532ac95..13e042a 100644
--- a/dev/core/test/org/apache/commons/collections/map/TestIdentityMap.java
+++ b/dev/core/test/org/apache/commons/collections/map/TestIdentityMap.java
@@ -16,6 +16,11 @@
*/
package org.apache.commons.collections.map;
+import java.io.IOException;
+import java.io.Serializable;
+import java.util.Iterator;
+import java.util.Map;
+
import junit.framework.Test;
import junit.framework.TestSuite;
import junit.textui.TestRunner;
@@ -23,11 +28,6 @@
import org.apache.commons.collections.AbstractTestObject;
import org.apache.commons.collections.IterableMap;
-import java.io.IOException;
-import java.io.Serializable;
-import java.util.Iterator;
-import java.util.Map;
-
/**
* JUnit tests.
*
@@ -35,7 +35,6 @@
*
* @author Stephen Colebourne
*/
-@SuppressWarnings({"unchecked", "rawtypes"})
public class TestIdentityMap extends AbstractTestObject {
private static final Integer I1A = new Integer(1);
diff --git a/dev/core/test/org/apache/commons/collections/set/AbstractTestSet.java b/dev/core/test/org/apache/commons/collections/set/AbstractTestSet.java
index dc3a3d4..398fa78 100644
--- a/dev/core/test/org/apache/commons/collections/set/AbstractTestSet.java
+++ b/dev/core/test/org/apache/commons/collections/set/AbstractTestSet.java
@@ -16,14 +16,14 @@
*/
package org.apache.commons.collections.set;
-import org.apache.commons.collections.collection.AbstractTestCollection;
-
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
+import org.apache.commons.collections.collection.AbstractTestCollection;
+
/**
* Abstract test class for {@link Set} methods and contracts.
* <p>
@@ -43,7 +43,6 @@
*
* @author Paul Jack
*/
-@SuppressWarnings({"unchecked", "rawtypes"})
public abstract class AbstractTestSet extends AbstractTestCollection {
/**
diff --git a/eclipse/build_tools/ant_gwt/.checkstyle b/eclipse/build-tools/ant-gwt/.checkstyle
similarity index 100%
rename from eclipse/build_tools/ant_gwt/.checkstyle
rename to eclipse/build-tools/ant-gwt/.checkstyle
diff --git a/eclipse/build_tools/ant_gwt/.classpath b/eclipse/build-tools/ant-gwt/.classpath
similarity index 100%
rename from eclipse/build_tools/ant_gwt/.classpath
rename to eclipse/build-tools/ant-gwt/.classpath
diff --git a/eclipse/build-tools/ant-gwt/.project b/eclipse/build-tools/ant-gwt/.project
new file mode 100644
index 0000000..1366e70
--- /dev/null
+++ b/eclipse/build-tools/ant-gwt/.project
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>ant-gwt</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>com.atlassw.tools.eclipse.checkstyle.CheckstyleBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>com.atlassw.tools.eclipse.checkstyle.CheckstyleNature</nature>
+ </natures>
+ <linkedResources>
+ <link>
+ <name>core</name>
+ <type>2</type>
+ <location>GWT_ROOT/build-tools/ant-gwt</location>
+ </link>
+ </linkedResources>
+</projectDescription>
diff --git a/eclipse/build_tools/customchecks/.checkstyle b/eclipse/build-tools/customchecks/.checkstyle
similarity index 100%
rename from eclipse/build_tools/customchecks/.checkstyle
rename to eclipse/build-tools/customchecks/.checkstyle
diff --git a/eclipse/build_tools/customchecks/.classpath b/eclipse/build-tools/customchecks/.classpath
similarity index 100%
rename from eclipse/build_tools/customchecks/.classpath
rename to eclipse/build-tools/customchecks/.classpath
diff --git a/eclipse/build-tools/customchecks/.project b/eclipse/build-tools/customchecks/.project
new file mode 100644
index 0000000..2895078
--- /dev/null
+++ b/eclipse/build-tools/customchecks/.project
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>customchecks</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>com.atlassw.tools.eclipse.checkstyle.CheckstyleBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>com.atlassw.tools.eclipse.checkstyle.CheckstyleNature</nature>
+ </natures>
+ <linkedResources>
+ <link>
+ <name>core</name>
+ <type>2</type>
+ <location>GWT_ROOT/build-tools/customchecks</location>
+ </link>
+ </linkedResources>
+</projectDescription>
diff --git a/eclipse/build_tools/doctool/.checkstyle b/eclipse/build-tools/doctool/.checkstyle
similarity index 100%
rename from eclipse/build_tools/doctool/.checkstyle
rename to eclipse/build-tools/doctool/.checkstyle
diff --git a/eclipse/build_tools/doctool/.classpath b/eclipse/build-tools/doctool/.classpath
similarity index 100%
rename from eclipse/build_tools/doctool/.classpath
rename to eclipse/build-tools/doctool/.classpath
diff --git a/eclipse/build-tools/doctool/.project b/eclipse/build-tools/doctool/.project
new file mode 100644
index 0000000..f998847
--- /dev/null
+++ b/eclipse/build-tools/doctool/.project
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>DocTool</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>com.atlassw.tools.eclipse.checkstyle.CheckstyleBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>com.atlassw.tools.eclipse.checkstyle.CheckstyleNature</nature>
+ </natures>
+ <linkedResources>
+ <link>
+ <name>core</name>
+ <type>2</type>
+ <locationURI>GWT_ROOT/build-tools/doctool</locationURI>
+ </link>
+ </linkedResources>
+</projectDescription>
diff --git a/eclipse/build_tools/ant_gwt/.project b/eclipse/build_tools/ant_gwt/.project
deleted file mode 100644
index 5e11ce7..0000000
--- a/eclipse/build_tools/ant_gwt/.project
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
- <name>ant-gwt</name>
- <comment></comment>
- <projects>
- </projects>
- <buildSpec>
- <buildCommand>
- <name>org.eclipse.jdt.core.javabuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- <buildCommand>
- <name>com.atlassw.tools.eclipse.checkstyle.CheckstyleBuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- </buildSpec>
- <natures>
- <nature>org.eclipse.jdt.core.javanature</nature>
- <nature>com.atlassw.tools.eclipse.checkstyle.CheckstyleNature</nature>
- </natures>
- <linkedResources>
- <link>
- <name>core</name>
- <type>2</type>
- <location>GWT_ROOT/build_tools/ant_gwt</location>
- </link>
- </linkedResources>
-</projectDescription>
diff --git a/eclipse/build_tools/customchecks/.project b/eclipse/build_tools/customchecks/.project
deleted file mode 100644
index be5e338..0000000
--- a/eclipse/build_tools/customchecks/.project
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
- <name>customchecks</name>
- <comment></comment>
- <projects>
- </projects>
- <buildSpec>
- <buildCommand>
- <name>org.eclipse.jdt.core.javabuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- <buildCommand>
- <name>com.atlassw.tools.eclipse.checkstyle.CheckstyleBuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- </buildSpec>
- <natures>
- <nature>org.eclipse.jdt.core.javanature</nature>
- <nature>com.atlassw.tools.eclipse.checkstyle.CheckstyleNature</nature>
- </natures>
- <linkedResources>
- <link>
- <name>core</name>
- <type>2</type>
- <location>GWT_ROOT/build_tools/customchecks</location>
- </link>
- </linkedResources>
-</projectDescription>
diff --git a/eclipse/build_tools/doctool/.project b/eclipse/build_tools/doctool/.project
deleted file mode 100644
index 249e503..0000000
--- a/eclipse/build_tools/doctool/.project
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
- <name>DocTool</name>
- <comment></comment>
- <projects>
- </projects>
- <buildSpec>
- <buildCommand>
- <name>org.eclipse.jdt.core.javabuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- <buildCommand>
- <name>com.atlassw.tools.eclipse.checkstyle.CheckstyleBuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- </buildSpec>
- <natures>
- <nature>org.eclipse.jdt.core.javanature</nature>
- <nature>com.atlassw.tools.eclipse.checkstyle.CheckstyleNature</nature>
- </natures>
- <linkedResources>
- <link>
- <name>core</name>
- <type>2</type>
- <locationURI>GWT_ROOT/build_tools/doctool</locationURI>
- </link>
- </linkedResources>
-</projectDescription>
diff --git a/eclipse/dev/.classpath b/eclipse/dev/.classpath
index 4b1f5b4..fa17a0d 100644
--- a/eclipse/dev/.classpath
+++ b/eclipse/dev/.classpath
@@ -12,16 +12,35 @@
<classpathentry kind="var" path="GWT_TOOLS/lib/tomcat/ant-launcher-1.6.5.jar"/>
<classpathentry kind="var" path="GWT_TOOLS/lib/tomcat/catalina-1.0.jar"/>
<classpathentry kind="var" path="GWT_TOOLS/lib/tomcat/catalina-optional-1.0.jar"/>
+ <classpathentry kind="var" path="GWT_TOOLS/lib/tomcat/commons-beanutils-1.6.jar"/>
+ <classpathentry kind="var" path="GWT_TOOLS/lib/tomcat/commons-collections-3.1.jar" sourcepath="/GWT_TOOLS/lib/tomcat/commons-collections-3.1-src.zip"/>
+ <classpathentry kind="var" path="GWT_TOOLS/lib/tomcat/commons-digester-1.5.jar"/>
<classpathentry kind="var" path="GWT_TOOLS/lib/tomcat/commons-el-1.0.jar"/>
+ <classpathentry kind="var" path="GWT_TOOLS/lib/tomcat/commons-logging-1.0.jar"/>
+ <classpathentry kind="var" path="GWT_TOOLS/lib/tomcat/commons-modeler-1.1.jar"/>
+ <classpathentry kind="var" path="GWT_TOOLS/lib/tomcat/jakarta-regexp-1.3.jar"/>
<classpathentry kind="var" path="GWT_TOOLS/lib/tomcat/jasper-compiler-1.0.jar"/>
<classpathentry kind="var" path="GWT_TOOLS/lib/tomcat/jasper-runtime-1.0.jar"/>
<classpathentry kind="var" path="GWT_TOOLS/lib/tomcat/jsp-api-2.0.jar"/>
+ <classpathentry kind="var" path="GWT_TOOLS/lib/tomcat/mx4j-jmx-1.1.jar"/>
+ <classpathentry kind="var" path="GWT_TOOLS/lib/tomcat/naming-common-1.0.jar"/>
+ <classpathentry kind="var" path="GWT_TOOLS/lib/tomcat/naming-factory-1.0.jar"/>
+ <classpathentry kind="var" path="GWT_TOOLS/lib/tomcat/naming-java-1.0.jar"/>
+ <classpathentry kind="var" path="GWT_TOOLS/lib/tomcat/naming-resources-1.0.jar"/>
+ <classpathentry kind="var" path="GWT_TOOLS/lib/tomcat/servlet-api-2.5.jar"/>
+ <classpathentry kind="var" path="GWT_TOOLS/lib/tomcat/servlet-api-2.4.jar"/>
+ <classpathentry kind="var" path="GWT_TOOLS/lib/tomcat/servlets-common-1.0.jar"/>
+ <classpathentry kind="var" path="GWT_TOOLS/lib/tomcat/servlets-default-1.0.jar"/>
+ <classpathentry kind="var" path="GWT_TOOLS/lib/tomcat/servlets-invoker-1.0.jar"/>
+ <classpathentry kind="var" path="GWT_TOOLS/lib/tomcat/tomcat-coyote-1.0.jar"/>
+ <classpathentry kind="var" path="GWT_TOOLS/lib/tomcat/tomcat-http11-1.0.jar" sourcepath="/GWT_TOOLS/lib/tomcat/tomcat-http11-1.0.jar"/>
+ <classpathentry kind="var" path="GWT_TOOLS/lib/tomcat/tomcat-jk2-2.1.jar"/>
+ <classpathentry kind="var" path="GWT_TOOLS/lib/tomcat/tomcat-util-5.1.jar"/>
<classpathentry kind="var" path="GWT_TOOLS/lib/htmlunit/htmlunit-2.9/htmlunit-core-js-2.9.jar" sourcepath="/GWT_TOOLS/lib/htmlunit/htmlunit-2.9/htmlunit-core-js-2.9-sources.jar"/>
<classpathentry kind="var" path="GWT_TOOLS/lib/htmlunit/htmlunit-2.9/htmlunit-2.9.jar" sourcepath="/GWT_TOOLS/lib/htmlunit/htmlunit-2.9/htmlunit-2.9-sources.jar"/>
<classpathentry kind="var" path="GWT_TOOLS/lib/protobuf/protobuf-2.2.0/protobuf-java-rebased-2.2.0.jar"/>
<classpathentry kind="var" path="GWT_TOOLS/lib/guava/guava-10.0.1/guava-10.0.1-rebased.jar"/>
<classpathentry kind="var" path="GWT_TOOLS/lib/jscomp/sourcemap-rebased.jar"/>
<classpathentry kind="var" path="GWT_TOOLS/lib/jscomp/r1649/compiler-rebased.jar"/>
- <classpathentry kind="var" path="GWT_TOOLS/lib/apache/commons/commons-collections-3.2.1.jar"/>
<classpathentry kind="output" path="bin"/>
</classpath>
diff --git a/eclipse/external/cldr-tools/.classpath b/eclipse/external/cldr-tools/.classpath
index a360353..60d2da3 100644
--- a/eclipse/external/cldr-tools/.classpath
+++ b/eclipse/external/cldr-tools/.classpath
@@ -5,7 +5,7 @@
<classpathentry kind="var" path="GWT_TOOLS/lib/cup/java-cup-11a.jar"/>
<classpathentry kind="var" path="GWT_TOOLS/lib/xalan/xalan-2.7.1-nocup.jar"/>
<classpathentry kind="var" path="GWT_TOOLS/lib/apache/ant-1.7.1.jar"/>
- <classpathentry kind="var" path="GWT_TOOLS/lib/icu4j/50.1.1/icu4j.jar" sourcepath="/GWT_TOOLS/lib/icu4j/50.1.1/icu4j-src.jar"/>
- <classpathentry kind="var" path="GWT_TOOLS/lib/icu4j/50.1.1/utilities.jar" sourcepath="/GWT_TOOLS/lib/icu4j/50.1.1/utilities-src.jar"/>
+ <classpathentry kind="var" path="GWT_TOOLS/lib/icu4j/4.4.2/icu4j.jar" sourcepath="/GWT_TOOLS/lib/icu4j/4.4.2/icu4jsrc.jar"/>
+ <classpathentry kind="var" path="GWT_TOOLS/lib/icu4j/4.4.2/utilities.jar" sourcepath="/GWT_TOOLS/lib/icu4j/4.4.2/icu4jsrc.jar"/>
<classpathentry kind="output" path="bin"/>
</classpath>
diff --git a/eclipse/settings/code-style/gwt-checkstyle-tests.xml b/eclipse/settings/code-style/gwt-checkstyle-tests.xml
index bbd1205..d27c8e2 100644
--- a/eclipse/settings/code-style/gwt-checkstyle-tests.xml
+++ b/eclipse/settings/code-style/gwt-checkstyle-tests.xml
@@ -87,10 +87,10 @@
<property name="logLoadErrors" value="true"/>
<property name="tokens" value="METHOD_DEF"/>
</module>
- <module name="RegexpHeader">
+ <module name="com.google.gwt.checkstyle.GwtHeaderCheck">
<property name="severity" value="error"/>
- <property name="header" value="^/\*[ ]*$\n^ \* Copyright 20(0[6789]|[12][0-9]) Google Inc\.$\n^ \*[ ]*$\n^ \* Licensed under the Apache License, Version 2\.0 \(the "License"\); you may not( use this file except)?$\n^ \* (use this file except )?in compliance with the License\. You may obtain a copy of( the License at)?$\n^ \* the License at$\n^ \*[ ]*$\n^ \* http://www\.apache\.org/licenses/LICENSE-2\.0$\n^ \*[ ]*\n \* Unless required by applicable law or agreed to in writing, software( distributed under the License)?$\n^ \* (distributed under the License )?is distributed on an "AS IS" BASIS, WITHOUT( WARRANTIES OR CONDITIONS OF ANY KIND, either express)?$\n^ \* (WARRANTIES OR CONDITIONS OF ANY KIND, either express )?or implied\. See the( License for the specific language governing permissions and limitations under)?$\n^ \* License for the specific language governing permissions and limitations under$\n^ \* the License\.$\n^ \*/$"/>
- <property name="multiLines" value="6,13"/>
+ <property name="header" value="/\*\n \* Copyright 20(0[6789]|[12][0-9]) Google Inc\.\n \*[ ]*\n \* Licensed under the Apache License, Version 2\.0 \(the "License"\); you may not\n \* use this file except in compliance with the License\. You may obtain a copy of\n \* the License at\n \*[ ]*\n \* http://www\.apache\.org/licenses/LICENSE-2\.0\n \*[ ]*\n \* Unless required by applicable law or agreed to in writing, software\n \* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT\n \* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied\. See the\n \* License for the specific language governing permissions and limitations under\n \* the License\.\n \*/"/>
+ <property name="headerAlt" value="/\*\n \* Copyright 20(0[6789]|[12][0-9]) Google Inc\.\n \*[ ]*\n \* Licensed under the Apache License, Version 2\.0 \(the "License"\); you may not use this file except\n \* in compliance with the License\. You may obtain a copy of the License at\n \*[ ]*\n \* http://www\.apache\.org/licenses/LICENSE-2\.0\n \*[ ]*\n \* Unless required by applicable law or agreed to in writing, software distributed under the License\n \* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express\n \* or implied\. See the License for the specific language governing permissions and limitations under\n \* the License\.\n \*/"/>
</module>
<module name="ImportOrder">
<property name="severity" value="error"/>
@@ -153,6 +153,14 @@
<module name="AvoidStarImport">
<property name="severity" value="error"/>
</module>
+ <module name="com.google.gwt.checkstyle.OrderCheck">
+ <metadata name="com.atlassw.tools.eclipse.checkstyle.lastEnabledSeverity" value="error"/>
+ <property name="severity" value="ignore"/>
+ </module>
+ <module name="com.google.gwt.checkstyle.FieldCheck">
+ <metadata name="com.atlassw.tools.eclipse.checkstyle.lastEnabledSeverity" value="error"/>
+ <property name="severity" value="ignore"/>
+ </module>
<module name="GenericIllegalRegexp">
<metadata name="com.atlassw.tools.eclipse.checkstyle.comment" value="bad // comment"/>
<property name="severity" value="error"/>
@@ -173,10 +181,9 @@
<property name="format" value="^[a-z_][a-zA-Z0-9_]*$"/>
</module>
<module name="MemberName">
- <metadata name="com.atlassw.tools.eclipse.checkstyle.comment" value="Field names must start with [a-z], may not start with f[A-Z], and should not contain '_''s."/>
<metadata name="com.atlassw.tools.eclipse.checkstyle.lastEnabledSeverity" value="error"/>
<property name="severity" value="ignore"/>
- <property name="format" value="^([a-eg-z]|(f[a-z0-9]))[a-zA-Z0-9]*$"/>
+ <property name="format" value="[a-z]|[a-z][a-z_0-9][A-Za-z0-9_]*|[a-z](?<!f)[A-Z0-9]*"/>
</module>
<module name="TodoComment">
<metadata name="com.atlassw.tools.eclipse.checkstyle.comment" value="Author tags"/>
diff --git a/eclipse/settings/code-style/gwt-checkstyle.xml b/eclipse/settings/code-style/gwt-checkstyle.xml
index 0206954..c3c30d3 100644
--- a/eclipse/settings/code-style/gwt-checkstyle.xml
+++ b/eclipse/settings/code-style/gwt-checkstyle.xml
@@ -80,10 +80,10 @@
<property name="logLoadErrors" value="true"/>
<property name="tokens" value="METHOD_DEF"/>
</module>
- <module name="RegexpHeader">
+ <module name="com.google.gwt.checkstyle.GwtHeaderCheck">
<property name="severity" value="error"/>
- <property name="header" value="^/\*[ ]*$\n^ \* Copyright 20(0[6789]|[12][0-9]) Google Inc\.$\n^ \*[ ]*$\n^ \* Licensed under the Apache License, Version 2\.0 \(the "License"\); you may not( use this file except)?$\n^ \* (use this file except )?in compliance with the License\. You may obtain a copy of( the License at)?$\n^ \* the License at$\n^ \*[ ]*$\n^ \* http://www\.apache\.org/licenses/LICENSE-2\.0$\n^ \*[ ]*\n \* Unless required by applicable law or agreed to in writing, software( distributed under the License)?$\n^ \* (distributed under the License )?is distributed on an "AS IS" BASIS, WITHOUT( WARRANTIES OR CONDITIONS OF ANY KIND, either express)?$\n^ \* (WARRANTIES OR CONDITIONS OF ANY KIND, either express )?or implied\. See the( License for the specific language governing permissions and limitations under)?$\n^ \* License for the specific language governing permissions and limitations under$\n^ \* the License\.$\n^ \*/$"/>
- <property name="multiLines" value="6,13"/>
+ <property name="header" value="/\*\n \* Copyright 20(0[6789]|[12][0-9]) Google Inc\.\n \*[ ]*\n \* Licensed under the Apache License, Version 2\.0 \(the "License"\); you may not\n \* use this file except in compliance with the License\. You may obtain a copy of\n \* the License at\n \*[ ]*\n \* http://www\.apache\.org/licenses/LICENSE-2\.0\n \*[ ]*\n \* Unless required by applicable law or agreed to in writing, software\n \* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT\n \* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied\. See the\n \* License for the specific language governing permissions and limitations under\n \* the License\.\n \*/"/>
+ <property name="headerAlt" value="/\*\n \* Copyright 20(0[6789]|[12][0-9]) Google Inc\.\n \*[ ]*\n \* Licensed under the Apache License, Version 2\.0 \(the "License"\); you may not use this file except\n \* in compliance with the License\. You may obtain a copy of the License at\n \*[ ]*\n \* http://www\.apache\.org/licenses/LICENSE-2\.0\n \*[ ]*\n \* Unless required by applicable law or agreed to in writing, software distributed under the License\n \* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express\n \* or implied\. See the License for the specific language governing permissions and limitations under\n \* the License\.\n \*/"/>
</module>
<module name="ImportOrder">
<property name="severity" value="error"/>
@@ -141,6 +141,12 @@
<module name="AvoidStarImport">
<property name="severity" value="error"/>
</module>
+ <module name="com.google.gwt.checkstyle.OrderCheck">
+ <property name="severity" value="error"/>
+ </module>
+ <module name="com.google.gwt.checkstyle.FieldCheck">
+ <property name="severity" value="error"/>
+ </module>
<module name="GenericIllegalRegexp">
<metadata name="com.atlassw.tools.eclipse.checkstyle.comment" value="bad // comment"/>
<property name="severity" value="error"/>
@@ -157,9 +163,8 @@
<property name="severity" value="error"/>
</module>
<module name="MemberName">
- <metadata name="com.atlassw.tools.eclipse.checkstyle.comment" value="Field names must start with [a-z], may not start with f[A-Z], and should not contain '_''s."/>
<property name="severity" value="error"/>
- <property name="format" value="^([a-eg-z]|(f[a-z0-9]))[a-zA-Z0-9]*$"/>
+ <property name="format" value="[a-z]|[a-z][a-z_0-9][A-Za-z0-9_]*|[a-z](?<!f)[A-Z0-9]*"/>
</module>
<module name="TodoComment">
<metadata name="com.atlassw.tools.eclipse.checkstyle.comment" value="Author tags"/>
diff --git a/eclipse/settings/code-style/gwt-customchecks.jar b/eclipse/settings/code-style/gwt-customchecks.jar
new file mode 100644
index 0000000..1b51aa7
--- /dev/null
+++ b/eclipse/settings/code-style/gwt-customchecks.jar
Binary files differ
diff --git a/eclipse/tools/cldr-import/.classpath b/eclipse/tools/cldr-import/.classpath
index acb1c55..14514f2 100644
--- a/eclipse/tools/cldr-import/.classpath
+++ b/eclipse/tools/cldr-import/.classpath
@@ -9,7 +9,7 @@
<classpathentry combineaccessrules="false" kind="src" path="/cldr-tools"/>
<classpathentry combineaccessrules="false" kind="src" path="/gwt-dev"/>
<classpathentry kind="var" path="GWT_TOOLS/lib/cldr/21/cldr.jar" />
- <classpathentry kind="var" path="GWT_TOOLS/lib/icu4j/50.1.1/icu4j.jar" />
- <classpathentry kind="var" path="GWT_TOOLS/lib/icu4j/50.1.1/utilities.jar" />
+ <classpathentry kind="var" path="GWT_TOOLS/lib/cldr/21/icu4j.jar" />
+ <classpathentry kind="var" path="GWT_TOOLS/lib/cldr/21/utilities.jar" />
<classpathentry kind="output" path="bin"/>
</classpath>
diff --git a/eclipse/user/.classpath b/eclipse/user/.classpath
index 42172aa..fbbbd48 100644
--- a/eclipse/user/.classpath
+++ b/eclipse/user/.classpath
@@ -46,7 +46,7 @@
<classpathentry kind="var" path="GWT_TOOLS/lib/slf4j/slf4j-log4j12/slf4j-log4j12-1.6.1.jar"/>
<classpathentry kind="var" path="GWT_TOOLS/lib/guava/guava-10.0.1/guava-10.0.1-rebased.jar"/>
<classpathentry kind="var" path="GWT_TOOLS/lib/streamhtmlparser/streamhtmlparser-jsilver-r10/streamhtmlparser-jsilver-r10-1.5-rebased.jar"/>
- <classpathentry kind="var" path="GWT_TOOLS/lib/icu4j/50.1.1/icu4j.jar"/>
+ <classpathentry kind="var" path="GWT_TOOLS/lib/icu4j/4.4.2/icu4j.jar"/>
<classpathentry kind="var" path="GWT_TOOLS/lib/javax/activation/activation-1.1.jar"/>
<classpathentry kind="var" path="GWT_TOOLS/lib/javax/xml/bind/jaxb-api-2.1.jar"/>
<classpathentry kind="var" path="GWT_TOOLS/lib/hibernate/validator/tck/jsr303-tck-1.0.3.GA-sources.jar"/>
diff --git a/elemental/src/elemental/js/json/JsJsonString.java b/elemental/src/elemental/js/json/JsJsonString.java
index 2db459b..3ed35bb 100644
--- a/elemental/src/elemental/js/json/JsJsonString.java
+++ b/elemental/src/elemental/js/json/JsJsonString.java
@@ -37,7 +37,7 @@
* MAGIC: String cast to object interface.
*/
private static native JsJsonString createProd(String string) /*-{
- return @elemental.js.json.JsJsonValue::box(Lelemental/json/JsonValue;)(string);
+ return @elemental.js.json.JsJsonValue::box(Lelemental/json/JsonValue;)(value);
}-*/;
protected JsJsonString() {
diff --git a/plugins/Makefile b/plugins/Makefile
new file mode 100644
index 0000000..28babe1
--- /dev/null
+++ b/plugins/Makefile
@@ -0,0 +1,4 @@
+# Placeholder Makefile, to be replaced with ant build file
+
+xpcom::
+ cd xpcom; make
diff --git a/plugins/MissingBrowserPlugin.html b/plugins/MissingBrowserPlugin.html
new file mode 100644
index 0000000..1ae3dba
--- /dev/null
+++ b/plugins/MissingBrowserPlugin.html
@@ -0,0 +1,11 @@
+<html>
+<head>
+<title>Missing GWT Browser Plugin</title>
+</head>
+<body>
+<h1>No GWT Browser Plugin Detected</h1>
+GWT Development Mode needs a browser plugin to operate. Please <a
+ href="http://gwt-dev-plugin-missing.appspot.com/">install</a> the
+appropriate one for your browser.
+</body>
+</html>
diff --git a/plugins/MissingPlugin/assets/Download.psd b/plugins/MissingPlugin/assets/Download.psd
new file mode 100644
index 0000000..da7ca6f
--- /dev/null
+++ b/plugins/MissingPlugin/assets/Download.psd
Binary files differ
diff --git a/plugins/MissingPlugin/assets/download.png b/plugins/MissingPlugin/assets/download.png
new file mode 100644
index 0000000..31c080d
--- /dev/null
+++ b/plugins/MissingPlugin/assets/download.png
Binary files differ
diff --git a/plugins/MissingPlugin/build.xml b/plugins/MissingPlugin/build.xml
new file mode 100644
index 0000000..c3dcf01
--- /dev/null
+++ b/plugins/MissingPlugin/build.xml
@@ -0,0 +1,84 @@
+<!-- -->
+<!-- Copyright 2009 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 -->
+<!-- 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. License for the specific language governing permissions and -->
+<!-- limitations under the License. -->
+<project name="MissingPlugin" default="build" basedir=".">
+ <property name="gwt.root" location="../.." />
+ <property name="project.tail" value="plugins/MissingPlugin" />
+ <import file="${gwt.root}/common.ant.xml" />
+
+ <property.ensure name="gwt.user.jar" location="${gwt.build.lib}/gwt-user.jar" />
+ <property.ensure name="gwt.dev.jar" location="${gwt.build.lib}/gwt-dev.jar" />
+
+ <path id="project.class.path">
+ <pathelement location="war/WEB-INF/classes"/>
+ <pathelement location="${gwt.user.jar}" />
+ <pathelement location="${gwt.dev.jar}" />
+ </path>
+
+ <target name="javac" description="Compile java source">
+ <mkdir dir="war/WEB-INF/classes"/>
+ <javac srcdir="src" includes="**" encoding="utf-8"
+ destdir="war/WEB-INF/classes"
+ source="1.5" target="1.5" nowarn="true"
+ debug="true" debuglevel="lines,vars,source">
+ <classpath refid="project.class.path"/>
+ </javac>
+ <copy todir="war/WEB-INF/classes">
+ <fileset dir="src" excludes="**/*.java"/>
+ </copy>
+ </target>
+
+ <target name="gwtc" depends="javac" description="GWT compile to JavaScript">
+ <gwt.javac destdir="war/WEB-INF/classes">
+ <classpath>
+ <path refid="project.class.path"/>
+ </classpath>
+ </gwt.javac>
+ <java failonerror="true" fork="true" classname="com.google.gwt.dev.Compiler">
+ <classpath>
+ <pathelement location="src"/>
+ <path refid="project.class.path"/>
+ </classpath>
+ <!-- add jvmarg -Xss16M or similar if you see a StackOverflowError -->
+ <jvmarg value="-Xmx256M"/>
+ <!-- Additional arguments like -style PRETTY or -logLevel DEBUG -->
+ <arg value="com.google.gwt.missingplugin.MissingPlugin"/>
+ </java>
+ </target>
+
+ <target name="devmode" depends="javac" description="Run development mode">
+ <java failonerror="true" fork="true" classname="com.google.gwt.dev.DevMode">
+ <classpath>
+ <pathelement location="src"/>
+ <path refid="project.class.path"/>
+ </classpath>
+ <jvmarg value="-Xmx256M"/>
+ <arg value="-startupUrl"/>
+ <arg value="MissingPlugin.html"/>
+ <!-- Additional arguments like -style PRETTY or -logLevel DEBUG -->
+ <arg value="com.google.gwt.missingplugin.MissingPlugin"/>
+ </java>
+ </target>
+
+ <target name="build" depends="gwtc" description="Build this project" />
+
+ <target name="war" depends="build" description="Create a war file">
+ <zip destfile="MissingPlugin.war" basedir="war"/>
+ </target>
+
+ <target name="clean" description="Cleans this project">
+ <delete dir="war/WEB-INF/classes" failonerror="false" />
+ <delete dir="war/missingplugin" failonerror="false" />
+ </target>
+
+</project>
diff --git a/plugins/MissingPlugin/src/com/google/gwt/missingplugin/MissingPlugin.gwt.xml b/plugins/MissingPlugin/src/com/google/gwt/missingplugin/MissingPlugin.gwt.xml
new file mode 100644
index 0000000..7f3bf7f
--- /dev/null
+++ b/plugins/MissingPlugin/src/com/google/gwt/missingplugin/MissingPlugin.gwt.xml
@@ -0,0 +1,18 @@
+<!-- -->
+<!-- Copyright 2009 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 -->
+<!-- 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. License for the specific language governing permissions and -->
+<!-- limitations under the License. -->
+<module rename-to='missingplugin'>
+ <inherits name='com.google.gwt.user.User'/>
+ <entry-point class='com.google.gwt.missingplugin.client.MissingPlugin'/>
+ <source path='client'/>
+</module>
diff --git a/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/AllDownloadsPane.java b/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/AllDownloadsPane.java
new file mode 100644
index 0000000..b992d77
--- /dev/null
+++ b/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/AllDownloadsPane.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2009 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.missingplugin.client;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JsArray;
+import com.google.gwt.event.dom.client.ClickEvent;
+import com.google.gwt.resources.client.CssResource;
+import com.google.gwt.uibinder.client.UiBinder;
+import com.google.gwt.uibinder.client.UiField;
+import com.google.gwt.uibinder.client.UiHandler;
+import com.google.gwt.user.client.ui.Anchor;
+import com.google.gwt.user.client.ui.Composite;
+import com.google.gwt.user.client.ui.VerticalPanel;
+import com.google.gwt.user.client.ui.Widget;
+
+/**
+ * Shows a download box for each supported download.
+ */
+public class AllDownloadsPane extends Composite {
+
+ private static final DownloadListPaneBinder uiBinder = GWT.create(DownloadListPaneBinder.class);
+
+ interface DownloadListPaneBinder extends UiBinder<Widget, AllDownloadsPane> {
+ }
+
+ interface MyStyle extends CssResource {
+ String platforms();
+ }
+
+ @UiField
+ MyStyle style;
+
+ @UiField
+ VerticalPanel downloadBoxes;
+
+ @UiField(provided = true)
+ Anchor inferredDownloadLink = new Anchor("");
+
+ private final MissingPluginPane.Controller controller;
+
+ public AllDownloadsPane(MissingPluginPane.Controller controller, DownloadInfo linkInfo) {
+ this.controller = controller;
+ initWidget(uiBinder.createAndBindUi(this));
+
+ JsArray<DownloadEntry> links = linkInfo.getAllDownloads();
+ for (int i = 0, n = links.length(); i < n; ++i) {
+ DownloadEntry link = links.get(i);
+ if (link.isSupported()) {
+ String linkContentHtml = link.getLinkContentHtml();
+ String href = link.getHref();
+ String platforms = link.getPlatforms();
+ if (platforms != null) {
+ linkContentHtml += "<br><span class=\"" + style.platforms() + "\">"
+ + platforms + "</span>";
+ }
+ DownloadBox box = new DownloadBox(linkContentHtml, href, true);
+ downloadBoxes.add(box);
+ downloadBoxes.setCellWidth(box, "100%");
+ }
+ }
+ }
+
+ @UiHandler("inferredDownloadLink")
+ void onInferredDownloadLinkClicked(ClickEvent e) {
+ controller.onInferredDownloadClicked();
+ }
+}
diff --git a/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/AllDownloadsPane.ui.xml b/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/AllDownloadsPane.ui.xml
new file mode 100644
index 0000000..59e91d0
--- /dev/null
+++ b/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/AllDownloadsPane.ui.xml
@@ -0,0 +1,57 @@
+<!-- -->
+<!-- Copyright 2009 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 -->
+<!-- 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. License for the specific language governing permissions and -->
+<!-- limitations under the License. -->
+<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" xmlns:g="urn:import:com.google.gwt.user.client.ui">
+ <ui:style type='com.google.gwt.missingplugin.client.AllDownloadsPane.MyStyle'>
+ .pane {
+ }
+
+ .actionTable {
+ margin: 10px 0 0 30px;
+ font-size: 100%;
+ }
+
+ .downloadBoxes {
+ }
+
+ .inferredDownloadLink {
+ margin-top: 2px;
+ margin-right: 8px;
+ text-align: right;
+ font-size: 80%;
+ display: block;
+ color: black;
+ }
+
+ .platforms {
+ font-size: 80%;
+ font-style: italic;
+ }
+ </ui:style>
+ <g:HTMLPanel styleName="{style.pane}">
+
+ <table class="{style.actionTable}" cellspacing="0" cellpadding="0">
+ <tr>
+ <td>
+ <g:VerticalPanel ui:field="downloadBoxes" styleName="{style.downloadBoxes}" width="100%"/>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <g:Anchor ui:field="inferredDownloadLink" styleName="{style.inferredDownloadLink}">suggested download only</g:Anchor>
+ </td>
+ </tr>
+ </table>
+
+ </g:HTMLPanel>
+</ui:UiBinder>
diff --git a/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/DownloadBox.java b/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/DownloadBox.java
new file mode 100644
index 0000000..2235d96
--- /dev/null
+++ b/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/DownloadBox.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2009 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.missingplugin.client;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.dom.client.AnchorElement;
+import com.google.gwt.uibinder.client.UiBinder;
+import com.google.gwt.uibinder.client.UiField;
+import com.google.gwt.uibinder.client.UiTemplate;
+import com.google.gwt.user.client.ui.Composite;
+import com.google.gwt.user.client.ui.HTMLPanel;
+
+/**
+ * The pretty box used to display a hyperlink for one download (or a link to
+ * help for unsupported platforms).
+ */
+public class DownloadBox extends Composite {
+
+ private static DownloadBoxUiBinder downloadBoxUiBinder = GWT.create(DownloadBoxUiBinder.class);
+ private static UnsupportedBoxUiBinder unsupportedBoxUiBinder = GWT.create(UnsupportedBoxUiBinder.class);
+
+ interface DownloadBoxUiBinder extends UiBinder<HTMLPanel, DownloadBox> {
+ }
+
+ @UiTemplate("UnsupportedBox.ui.xml")
+ interface UnsupportedBoxUiBinder extends UiBinder<HTMLPanel, DownloadBox> {
+ }
+
+ @UiField
+ AnchorElement downloadLink, downloadLinkIcon;
+
+ public DownloadBox(String linkContentHtml, String url, boolean supported) {
+ if (supported) {
+ initWidget(downloadBoxUiBinder.createAndBindUi(this));
+ } else {
+ initWidget(unsupportedBoxUiBinder.createAndBindUi(this));
+ }
+ downloadLink.setInnerHTML(linkContentHtml);
+ downloadLink.setHref(url);
+ downloadLinkIcon.setHref(url);
+ }
+}
diff --git a/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/DownloadBox.ui.xml b/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/DownloadBox.ui.xml
new file mode 100644
index 0000000..36e7b39
--- /dev/null
+++ b/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/DownloadBox.ui.xml
@@ -0,0 +1,60 @@
+<!-- -->
+<!-- Copyright 2009 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 -->
+<!-- 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. License for the specific language governing permissions and -->
+<!-- limitations under the License. -->
+<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" xmlns:g="urn:import:com.google.gwt.user.client.ui">
+
+ <ui:image field='downloadIcon' src='download.gif' />
+
+ <ui:style>
+ .downloadBox {
+ margin-top: 8px;
+ padding: 6px;
+ font-size: 100%;
+ font-weight: bold;
+ background-color: rgb(120, 158, 250);
+ border: 2px solid #5e7aab;
+ \-moz-border-radius: 5px;
+ \-moz-box-shadow: rgba(0, 0, 0, 0.199219) 3px 3px 3px;
+ \-webkit-border-radius: 5px;
+ \-webkit-box-shadow: rgba(0, 0, 0, 0.199219) 3px 3px 3px;
+ }
+
+ @sprite .downloadIcon {
+ gwt-image: 'downloadIcon';
+ display: block;
+ }
+
+ .downloadLink {
+ white-space: nowrap;
+ display: block;
+ color: white;
+ margin-left: 8px;
+ margin-right: 8px;
+ text-align: right;
+ font-size: 11px;
+ }
+ </ui:style>
+
+ <g:HTMLPanel>
+ <table class="{style.downloadBox}" width="100%">
+ <tr>
+ <td>
+ <a ui:field="downloadLink" style="text-decoration: none" class="{style.downloadLink}"/>
+ </td>
+ <td width="1%">
+ <a ui:field="downloadLinkIcon" class="{style.downloadIcon}"/>
+ </td>
+ </tr>
+ </table>
+ </g:HTMLPanel>
+</ui:UiBinder>
diff --git a/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/DownloadEntry.java b/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/DownloadEntry.java
new file mode 100644
index 0000000..1915735
--- /dev/null
+++ b/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/DownloadEntry.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2009 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.missingplugin.client;
+
+import com.google.gwt.core.client.JavaScriptObject;
+
+/**
+ * Overlay type representing one recognized potential download target.
+ */
+public final class DownloadEntry extends JavaScriptObject {
+
+ protected DownloadEntry() { }
+
+ public native String getHref()/*-{
+ return this.url;
+ }-*/;
+
+ public native String getLinkContentHtml()/*-{
+ return this.caption;
+ }-*/;
+
+ public native String getPlatforms()/*-{
+ return this.platforms;
+ }-*/;
+
+ public native boolean isSupported() /*-{
+ return this.supported;
+ }-*/;
+
+}
diff --git a/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/DownloadInfo.java b/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/DownloadInfo.java
new file mode 100644
index 0000000..f32238e
--- /dev/null
+++ b/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/DownloadInfo.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2009 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.missingplugin.client;
+
+import com.google.gwt.core.client.JavaScriptObject;
+import com.google.gwt.core.client.JsArray;
+
+/**
+ * Overlay type representing the set of recognized platforms.
+ */
+public final class DownloadInfo extends JavaScriptObject {
+
+ protected DownloadInfo() {
+ }
+
+ public native JsArray<DownloadEntry> getAllDownloads() /*-{
+ var a = [];
+ for (var k in this.allDownloads) {
+ a[a.length] = this.allDownloads[k];
+ }
+ return a;
+ }-*/;
+
+ /**
+ * @return the {@link DownloadEntry} that was inferred, or <code>null</code>
+ * if inference failed
+ */
+ public native DownloadEntry getInferredDownload() /*-{
+ var d = this.allDownloads[this.inferredDownloadId];
+ if (d) return d;
+ return this.allDownloads["unknown"];
+ }-*/;
+
+ public native String getTroubleshootingUrl() /*-{
+ return this.troubleshootingUrl;
+ }-*/;
+
+}
diff --git a/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/InferredDownloadPane.java b/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/InferredDownloadPane.java
new file mode 100644
index 0000000..43fb4a7
--- /dev/null
+++ b/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/InferredDownloadPane.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2009 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.missingplugin.client;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.event.dom.client.ClickEvent;
+import com.google.gwt.uibinder.client.UiBinder;
+import com.google.gwt.uibinder.client.UiField;
+import com.google.gwt.uibinder.client.UiHandler;
+import com.google.gwt.user.client.ui.Anchor;
+import com.google.gwt.user.client.ui.Composite;
+import com.google.gwt.user.client.ui.Widget;
+
+/**
+ * A subview that shows only the download that is recommended.
+ */
+public class InferredDownloadPane extends Composite {
+
+ private static InferredDownloadPaneUiBinder uiBinder = GWT.create(InferredDownloadPaneUiBinder.class);
+
+ @UiField(provided = true)
+ Anchor allDownloadsLink;
+
+ @UiField(provided = true)
+ DownloadBox downloadBox;
+
+ private final MissingPluginPane.Controller controller;
+
+ interface InferredDownloadPaneUiBinder extends UiBinder<Widget, InferredDownloadPane> {
+ }
+
+ public InferredDownloadPane(MissingPluginPane.Controller controller, DownloadInfo linkInfo) {
+ this.controller = controller;
+ this.allDownloadsLink = new Anchor("");
+ DownloadEntry inferredDownload = linkInfo.getInferredDownload();
+ if (inferredDownload != null) {
+ String linkContentHtml = inferredDownload.getLinkContentHtml();
+ String href = inferredDownload.getHref();
+ boolean supported = inferredDownload.isSupported();
+ this.downloadBox = new DownloadBox(linkContentHtml, href, supported);
+ } else {
+ // Unsupported/unknown browser
+ this.downloadBox = new DownloadBox("Unsupported or unrecognized browser", "", false);
+ }
+
+ initWidget(uiBinder.createAndBindUi(this));
+ }
+
+ @UiHandler("allDownloadsLink")
+ void onOtherLinkClicked(ClickEvent e) {
+ controller.onAllDownloadsClicked();
+ }
+}
diff --git a/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/InferredDownloadPane.ui.xml b/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/InferredDownloadPane.ui.xml
new file mode 100644
index 0000000..d602ab1
--- /dev/null
+++ b/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/InferredDownloadPane.ui.xml
@@ -0,0 +1,50 @@
+<!-- -->
+<!-- Copyright 2009 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 -->
+<!-- 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. License for the specific language governing permissions and -->
+<!-- limitations under the License. -->
+<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" xmlns:g="urn:import:com.google.gwt.user.client.ui"
+ xmlns:m="urn:import:com.google.gwt.missingplugin.client">
+
+
+ <ui:style>
+ .actionTable {
+ margin: 10px 0 0 30px;
+ font-size: 100%;
+ }
+
+ .allDownloadsLink {
+ margin-top: 2px;
+ margin-right: 8px;
+ text-align: right;
+ font-size: 80%;
+ display: block;
+ color: black;
+ }
+
+ </ui:style>
+ <g:HTMLPanel>
+ <table class="{style.actionTable}" cellspacing="0" cellpadding="0">
+ <tr>
+ <td>
+ <m:DownloadBox ui:field="downloadBox"/>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <g:Anchor ui:field="allDownloadsLink" styleName="{style.allDownloadsLink}">plugins for other systems</g:Anchor>
+ </td>
+ </tr>
+ </table>
+ </g:HTMLPanel>
+</ui:UiBinder>
+
+
\ No newline at end of file
diff --git a/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/MissingPlugin.java b/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/MissingPlugin.java
new file mode 100644
index 0000000..c7433ee
--- /dev/null
+++ b/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/MissingPlugin.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2009 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.missingplugin.client;
+
+import com.google.gwt.core.client.EntryPoint;
+import com.google.gwt.user.client.ui.RootPanel;
+
+/**
+ * The entry point that launches the download UI.
+ */
+public class MissingPlugin implements EntryPoint {
+
+ public void onModuleLoad() {
+ DownloadInfo linkInfo = getAmbientLinkInfo();
+ MissingPluginPane pane = new MissingPluginPane(linkInfo);
+ RootPanel.get().add(pane);
+ }
+
+ private DownloadInfo getAmbientLinkInfo() {
+ DownloadInfo r = getAmbientLinkInfo0();
+ assert r != null : "expecting $wnd.downloadInfo";
+ return r;
+ }
+
+ private native DownloadInfo getAmbientLinkInfo0() /*-{
+ return $wnd.downloadInfo;
+ }-*/;
+
+}
diff --git a/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/MissingPluginPane.java b/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/MissingPluginPane.java
new file mode 100644
index 0000000..e094195
--- /dev/null
+++ b/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/MissingPluginPane.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2009 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.missingplugin.client;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.dom.client.AnchorElement;
+import com.google.gwt.uibinder.client.UiBinder;
+import com.google.gwt.uibinder.client.UiField;
+import com.google.gwt.user.client.ui.Composite;
+import com.google.gwt.user.client.ui.HTMLPanel;
+
+/**
+ * The main UI. Also manages subviews.
+ */
+public class MissingPluginPane extends Composite {
+
+ /**
+ * Abstract the relationships between the subviews and this one.
+ */
+ public class Controller {
+ void onAllDownloadsClicked() {
+ allDownloadsPane.setVisible(true);
+ inferredDownloadPane.setVisible(false);
+ }
+
+ void onInferredDownloadClicked() {
+ allDownloadsPane.setVisible(false);
+ inferredDownloadPane.setVisible(true);
+ }
+ }
+
+ interface MissingPluginPaneUiBinder extends UiBinder<HTMLPanel, MissingPluginPane> {
+ }
+
+ @UiField(provided = true)
+ AllDownloadsPane allDownloadsPane;
+
+ @UiField(provided = true)
+ InferredDownloadPane inferredDownloadPane;
+
+ @UiField
+ AnchorElement troubleshootingLink;
+
+ private final Controller controller = new Controller();
+
+ private final MissingPluginPaneUiBinder uiBinder = GWT.create(MissingPluginPaneUiBinder.class);
+
+ public MissingPluginPane(DownloadInfo linkInfo) {
+ inferredDownloadPane = new InferredDownloadPane(controller, linkInfo);
+ allDownloadsPane = new AllDownloadsPane(controller, linkInfo);
+
+ initWidget(uiBinder.createAndBindUi(this));
+ troubleshootingLink.setHref(linkInfo.getTroubleshootingUrl());
+ }
+
+}
diff --git a/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/MissingPluginPane.ui.xml b/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/MissingPluginPane.ui.xml
new file mode 100644
index 0000000..e8a4ecb
--- /dev/null
+++ b/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/MissingPluginPane.ui.xml
@@ -0,0 +1,65 @@
+<!-- -->
+<!-- Copyright 2009 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 -->
+<!-- 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. License for the specific language governing permissions and -->
+<!-- limitations under the License. -->
+<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" xmlns:g="urn:import:com.google.gwt.user.client.ui"
+ xmlns:m="urn:import:com.google.gwt.missingplugin.client">
+
+ <ui:style>
+ .pane {
+ background-image: initial;
+ background-attachment: initial;
+ background-origin: initial;
+ background-clip: initial;
+ background-color: #ffff88;
+ padding-top: 5px;
+ padding-right: 10px;
+ padding-bottom: 20px;
+ padding-left: 10px;
+ z-index: 10000;
+ font-size: 9pt;
+ font-family: Verdana;
+ border-bottom-width: 2px;
+ border-bottom-style: solid;
+ border-bottom-color: rgb(221, 221, 153);
+ background-position: initial initial;
+ background-repeat: initial initial;
+ }
+
+ .title {
+ font-size: 11pt;
+ font-family: Verdana;
+ padding-top: 10px;
+ font-weight: bold;
+ }
+
+ .text {
+ font-size: 9pt;
+ font-family: Verdana;
+ padding-top: 10px;
+ }
+ </ui:style>
+
+ <g:HTMLPanel styleName='{style.pane}'>
+ <div class="{style.title}">Development Mode requires the Google Web Toolkit Developer Plugin</div>
+
+ <div class="{style.text}">By downloading, you agree to the <a href="http://code.google.com/webtoolkit/terms.html">Terms & Conditions</a> and <a href="http://code.google.com/webtoolkit/privacy.html">Privacy Policy</a>.</div>
+
+ <m:InferredDownloadPane ui:field="inferredDownloadPane" visible="true" />
+ <m:AllDownloadsPane ui:field="allDownloadsPane" visible="false" />
+
+ <div class="{style.text}">
+ For help or troubleshooting, ask questions in the <a ui:field="troubleshootingLink" style="color:#000;">discussion group</a>.
+ </div>
+ </g:HTMLPanel>
+
+</ui:UiBinder>
diff --git a/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/UnsupportedBox.ui.xml b/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/UnsupportedBox.ui.xml
new file mode 100644
index 0000000..bdfeac3
--- /dev/null
+++ b/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/UnsupportedBox.ui.xml
@@ -0,0 +1,60 @@
+<!-- -->
+<!-- Copyright 2009 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 -->
+<!-- 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. License for the specific language governing permissions and -->
+<!-- limitations under the License. -->
+<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" xmlns:g="urn:import:com.google.gwt.user.client.ui">
+
+ <ui:image field='unsupportedIcon' src='unsupported.gif' />
+
+ <ui:style>
+ .downloadBox {
+ margin-top: 8px;
+ padding: 6px;
+ font-size: 100%;
+ font-weight: bold;
+ background-color: rgb(120, 158, 250);
+ border: 2px solid #5e7aab;
+ \-moz-border-radius: 5px;
+ \-moz-box-shadow: rgba(0, 0, 0, 0.199219) 3px 3px 3px;
+ \-webkit-border-radius: 5px;
+ \-webkit-box-shadow: rgba(0, 0, 0, 0.199219) 3px 3px 3px;
+ }
+
+ @sprite .downloadIcon {
+ gwt-image: 'unsupportedIcon';
+ display: block;
+ }
+
+ .downloadLink {
+ white-space: nowrap;
+ display: block;
+ color: white;
+ margin-left: 8px;
+ margin-right: 8px;
+ text-align: left;
+ font-size: 11px;
+ }
+ </ui:style>
+
+ <g:HTMLPanel>
+ <table class="{style.downloadBox}" width="100%">
+ <tr>
+ <td>
+ <a ui:field="downloadLink" style="text-decoration: none" class="{style.downloadLink}"/>
+ </td>
+ <td width="1%">
+ <a ui:field="downloadLinkIcon" class="{style.downloadIcon}" />
+ </td>
+ </tr>
+ </table>
+ </g:HTMLPanel>
+</ui:UiBinder>
diff --git a/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/download.gif b/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/download.gif
new file mode 100644
index 0000000..da0d53e
--- /dev/null
+++ b/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/download.gif
Binary files differ
diff --git a/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/unsupported.gif b/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/unsupported.gif
new file mode 100644
index 0000000..304788d
--- /dev/null
+++ b/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/unsupported.gif
Binary files differ
diff --git a/plugins/MissingPlugin/war/MissingPlugin.html b/plugins/MissingPlugin/war/MissingPlugin.html
new file mode 100644
index 0000000..eb709ae
--- /dev/null
+++ b/plugins/MissingPlugin/war/MissingPlugin.html
@@ -0,0 +1,199 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<!-- The HTML 4.01 Transitional DOCTYPE declaration-->
+<!-- above set at the top of the file will set -->
+<!-- the browser's rendering engine into -->
+<!-- "Quirks Mode". Replacing this declaration -->
+<!-- with a "Standards Mode" doctype is supported, -->
+<!-- but may lead to some differences in layout. -->
+
+<html>
+ <head>
+ <meta http-equiv="content-type" content="text/html; charset=UTF-8">
+ <title>Google Web Toolkit Developer Plugin Not Installed</title>
+ <style>
+ body {
+ margin: 0;
+ padding: 0;
+ }
+ </style>
+
+ <script>
+ var troubleshootingUrl = "http://groups.google.com/group/google-web-toolkit";
+
+ // The missing plugin module expects downloadInfo.inferredDownloadId to contain the key to use
+ // in allDownloads field.
+ var downloadInfo = {
+ "inferredDownloadId" : null,
+ "troubleshootingUrl" : troubleshootingUrl,
+ "allDownloads" : {
+ "unknown" :
+ {
+ "caption" : "Regrettably, this browser is currently unsupported :-(",
+ "url" : troubleshootingUrl,
+ "supported" : false
+ },
+
+ "firefox-old" :
+ {
+ "caption" : "Sorry, the GWT Developer Plugin only supports Firefox 3.0 - 15.0 at present",
+ "url" : "http://www.getfirefox.com",
+ "supported" : false
+ },
+
+ "opera" :
+ {
+ "caption" : "Sorry, there is currently no GWT Developer Plugin for Opera",
+ // TODO(you): If you are reading this, maybe you would be interested in contributing an Opera version?
+ "url" : "http://code.google.com/webtoolkit/makinggwtbetter.html#contributingcode",
+ "supported" : false
+ },
+
+ "safari-iphone" :
+ {
+ "caption" : "Sorry, there is currently no GWT Developer Plugin for mobile Safari",
+ "url" : troubleshootingUrl,
+ "supported" : false
+ },
+
+ "webkit-android" :
+ {
+ "caption" : "Sorry, there is currently no GWT Developer Plugin for mobile WebKit",
+ "url" : troubleshootingUrl,
+ "supported" : false
+ },
+
+ "chrome" :
+ {
+ "caption" : "Download the GWT Developer Plugin<br>For Chrome",
+ "url" : "https://dl-ssl.google.com/gwt/plugins/chrome/gwt-dev-plugin.crx",
+ "platforms" : "Win x86, Linux x86/x86_64, Mac x86",
+ "supported" : true
+ },
+
+ "safari-win" :
+ {
+ "caption" : "Sorry, there is currently no GWT Developer Plugin for Safari on Windows",
+ "url" : troubleshootingUrl,
+ "supported" : false
+ },
+
+ "firefox" :
+ {
+ "caption" : "Download the GWT Developer Plugin<br>For Firefox",
+ "url" : "https://dl-ssl.google.com/gwt/plugins/firefox/gwt-dev-plugin.xpi",
+ "platforms" : "Win x86, Linux x86/x86_64, Mac x86/PPC(3.x only)/x86_64",
+ "supported" : true
+ },
+
+ "ie" :
+ {
+ "caption" : "Download the GWT Developer Plugin<br>For Internet Explorer",
+ "url" : "https://dl-ssl.google.com/tag/s/appguid%3D%7B9a5e649a-ec63-4c7d-99bf-75adb345e7e5%7D%26lang%3Den%26appname%3DGWT%2520Developer%2520Plugin%2520for%2520IE%2520%2528x86%2529%26needsadmin%3Dfalse/gwt/plugins/ie/GwtDevPluginSetup.exe",
+ "platforms" : "Win x86",
+ "supported" : true
+ },
+
+ "ie-x64" :
+ {
+ "caption" : "Download the GWT Developer Plugin<br>For Internet Explorer (64-bit)",
+ "url" : "https://dl-ssl.google.com/tag/s/appguid%3D%7B53dae7d2-8c28-440f-920b-b2d665ce73b2%7D%26lang%3Den%26appname%3DGWT%2520Developer%2520Plugin%2520for%2520IE%2520%2528x64%2529%26needsadmin%3Dfalse/gwt/plugins/ie/GwtDevPluginSetup.exe",
+ "platforms" : "Win x64",
+ "supported" : true
+ },
+
+ "safari-mac" :
+ {
+ "caption" : "Download the GWT Developer Plugin<br>For Safari",
+ "url" : "https://dl-ssl.google.com/gwt/plugins/safari/gwt-dev-plugin.dmg",
+ "platforms" : "Mac x86/x86_64/PPC",
+ "supported" : true
+ },
+
+ "safari-mac-late" :
+ {
+ "caption" : "Sorry, there is currently no GWT Developer Plugin for Safari 5.1<br>"
+ + "or later, due to major changes in the Safari plugin API. <br><br>"
+ + "In the meantime, <a href='http://www.omnigroup.com/products/omniweb/'>OmniWeb 5.11</a> is similar to Safari 5.0 and <br>"
+ + "known to work.",
+ "url" : troubleshootingUrl,
+ "supported" : false
+ }
+ }
+ };
+
+ function leadingDigits(s) {
+ var suffix = s.search(/[^\d]/g);
+ if (suffix != -1) {
+ s = s.substring(0, suffix);
+ }
+ return s;
+ }
+
+ function isSafariLate(ua) {
+ // Distinguish Safari from something "like Safari", e.g. OmniWeb
+ // "Version/" comes after "like"
+ var versionAndBeyond = ua.substring(ua.indexOf("version/"));
+ if (versionAndBeyond.indexOf("safari/") == -1) {
+ return false;
+ }
+
+ var componentsAfterVersion =
+ ua.substring(ua.indexOf("version/") + "version/".length).split(" ");
+ var version = componentsAfterVersion[0].split(".");
+
+ var major = Number(version[0]);
+ // Sometimes minor has a suffix like "dp1"
+ var minor = Number(leadingDigits(version[1]));
+
+ return major > 5 || major == 5 && minor > 0;
+ }
+
+ var ua = navigator.userAgent.toLowerCase();
+ var id = 'unknown';
+ if (ua.indexOf("webkit") != -1) {
+ if ( (ua.indexOf("iphone") != -1) || (ua.indexOf("ipod") != -1) ) {
+ id = 'safari-iphone';
+ } else if (ua.indexOf("android") != -1) {
+ id = 'webkit-android';
+ } else if (ua.indexOf("chrome") != -1) {
+ id = 'chrome';
+ } else if (ua.indexOf("macintosh") != -1) {
+ if (isSafariLate(ua)) {
+ id = 'safari-mac-late';
+ } else {
+ id = 'safari-mac';
+ }
+ } else if (ua.indexOf("windows") != -1) {
+ id = 'safari-win';
+ }
+ } else if (ua.indexOf("msie") != -1) {
+ id = (ua.indexOf("win64") == -1) ? 'ie' : 'ie-x64';
+ } else if (ua.indexOf("opera") != -1) {
+ id = 'opera';
+ } else if (ua.indexOf("gecko") != -1) {
+ // Note: Gecko version != Firefox version before 5.0.
+ // See: https://developer.mozilla.org/en-US/docs/Gecko_user_agent_string_reference
+ var gecko_versions = ["1.9", "2.0", "5.0", "6.0", "7.0", "8.0", "9.0", "10.0", "11.0", "12.0", "13.0", "14.0", "15.0"];
+ id = 'firefox-old';
+ for (var i = 0; i < gecko_versions.length; i++) {
+ if (ua.indexOf("rv:" + gecko_versions[i]) != -1) {
+ id = 'firefox';
+ break;
+ }
+ }
+ }
+ downloadInfo.inferredDownloadId = id;
+ </script>
+
+ <script type="text/javascript" language="javascript" src="missingplugin/missingplugin.nocache.js"></script>
+ </head>
+
+ <noscript>
+ <div style="width: 22em; position: absolute; left: 50%; margin-left: -11em; color: red; background-color: white; border: 1px solid red; padding: 4px; font-family: sans-serif">
+ The Google Web Toolkit Developer Plugin does not appear to be installed.
+ Also, you also don't seem to have a browser that is willing to run JavaScript.
+ Please enable JavaScript or switch to a browser that supports JavaScript and try again.
+ </div>
+ </noscript>
+ </body>
+</html>
diff --git a/plugins/MissingPlugin/war/WEB-INF/appengine-web.xml b/plugins/MissingPlugin/war/WEB-INF/appengine-web.xml
new file mode 100644
index 0000000..afac8c3
--- /dev/null
+++ b/plugins/MissingPlugin/war/WEB-INF/appengine-web.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
+ <application>gwt-dev-plugin-missing</application>
+ <version>4</version>
+ <!-- TODO(???) please update threadsafe to true if code is threadsafe -->
+ <threadsafe>false</threadsafe>
+
+ <!-- Configure java.util.logging -->
+ <system-properties>
+ <property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/>
+ </system-properties>
+
+</appengine-web-app>
+
diff --git a/plugins/MissingPlugin/war/WEB-INF/logging.properties b/plugins/MissingPlugin/war/WEB-INF/logging.properties
new file mode 100644
index 0000000..ccb3a6f
--- /dev/null
+++ b/plugins/MissingPlugin/war/WEB-INF/logging.properties
@@ -0,0 +1,24 @@
+# Logging configuration file for Google App Engine tools.
+
+# Specify the handlers to create in the root logger
+# (all loggers are children of the root logger)
+# The following creates the console handler
+handlers = java.util.logging.ConsoleHandler
+
+# Set the default logging level for the root logger
+.level = WARNING
+
+# Set the default logging level for the datanucleus loggers
+DataNucleus.JDO.level=WARNING
+DataNucleus.Persistence.level=WARNING
+DataNucleus.Cache.level=WARNING
+DataNucleus.MetaData.level=WARNING
+DataNucleus.General.level=WARNING
+DataNucleus.Utility.level=WARNING
+DataNucleus.Transaction.level=WARNING
+DataNucleus.Datastore.level=WARNING
+DataNucleus.ClassLoading.level=WARNING
+DataNucleus.Plugin.level=WARNING
+DataNucleus.ValueGeneration.level=WARNING
+DataNucleus.Enhancer.level=WARNING
+DataNucleus.SchemaTool.level=WARNING
diff --git a/plugins/MissingPlugin/war/WEB-INF/web.xml b/plugins/MissingPlugin/war/WEB-INF/web.xml
new file mode 100644
index 0000000..658aca0
--- /dev/null
+++ b/plugins/MissingPlugin/war/WEB-INF/web.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE web-app
+ PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
+ "http://java.sun.com/dtd/web-app_2_3.dtd">
+
+<web-app>
+
+ <!-- Default page to serve -->
+ <welcome-file-list>
+ <welcome-file>MissingPlugin.html</welcome-file>
+ </welcome-file-list>
+
+</web-app>
diff --git a/plugins/Protocol.txt b/plugins/Protocol.txt
new file mode 100644
index 0000000..4d980fc
--- /dev/null
+++ b/plugins/Protocol.txt
@@ -0,0 +1,46 @@
+Startup protocol changes for version 2:
+
+C->S S->C
+==== ====
+{later:
+GetRealPlugin(String pluginType, String platformId)
+
+ FatalError(String message)
+
+ RealPlugin(byte[] plugin)
+}
+
+
+CheckVersions(int minProtoVersion, int maxProtoVersion,
+ String hostedHtmlVersion)
+
+ FatalError(String message)
+
+ ProtocolVersion(int protoVersion)
+
+
+{may be ommitted if no other supported transports:
+ChooseTransport(String[] supportedTransports)
+
+ FatalError(String msg)
+
+ SwitchTransport(String transport, String transportArgs)
+
+ [If transport is not empty, all further communication should be
+ switched to the selected transport. transportArgs varies by the
+ transport.]
+}
+
+
+LoadModule(String url, String sessionKey, String userAgent, String moduleName)
+
+ [sessionKey is some arbitrary string to identify one group of modules as
+ being part of the same session of one application.]
+
+... as before
+
+
+
+The v1 protocol LoadModule message is still accepted, though with reduced
+functionality in the OOPHM UI. After the module is loaded, v1 and v2 are
+exactly the same, which makes supporting both versions easier.
diff --git a/plugins/README.txt b/plugins/README.txt
new file mode 100644
index 0000000..447c0fc
--- /dev/null
+++ b/plugins/README.txt
@@ -0,0 +1,22 @@
+This directory contains the source for the OOPHM plugin which resides in
+the browser to allow hosted mode debugging.
+
+Subdirectories:
+ - common
+ Code that is shared between all platforms, and mostly deals with the wire
+ protocol and related tables.
+
+ - ie
+ Plugin for 32-bit Internet Explorer
+
+ - npapi
+ Obsolete NPAPI plugin for Firefox
+
+ - webkit
+ plugin for WebKit-based browsers that support its extension mechanism
+ (ie, no Safari/Windows support)
+
+ - xpcom
+ XPCOM-based Firefox plugin
+
+To build, see instructions in each directory.
diff --git a/plugins/common/AllowedConnections.cpp b/plugins/common/AllowedConnections.cpp
new file mode 100644
index 0000000..ffe6441
--- /dev/null
+++ b/plugins/common/AllowedConnections.cpp
@@ -0,0 +1,183 @@
+/*
+ * Copyright 2008 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.
+ */
+
+#include "Debug.h"
+#include <string>
+#include <cstring>
+#include <vector>
+
+#include "AllowedConnections.h"
+
+
+// TODO(jat): do we need to protect against parallel access to static state?
+// current browsers only use one thread, but Chrome is multithreaded, though
+// it isn't clear if plugins see parallel execution. For now, we will
+// assume the caller takes responsibility for making sure there are no
+// concurrent calls into AllowedConnections.
+std::vector<AllowedConnections::Rule> AllowedConnections::rules;
+
+/**
+ * Get the host portion of the URL, not including the port.
+ *
+ * @return the host portion of the URL, or the unmodified URL if it does not appear
+ * to be valid
+ */
+std::string AllowedConnections::getHostFromUrl(const std::string& url) {
+ int protoEnd = url.find("://");
+ if (protoEnd == std::string::npos) {
+ Debug::log(Debug::Debugging) << "getHostFromUrl(" << url
+ << ") - no :// in URL" << Debug::flush;
+ return url;
+ }
+ protoEnd += 3; // skip over "://"
+ int hostEnd = url.find('/', protoEnd);
+ if (hostEnd == std::string::npos) {
+ hostEnd = url.length();
+ }
+ //skip over user:passwd@ if it exists
+ int userPassword = url.find( '@', protoEnd );
+ if (userPassword == std::string::npos || userPassword > hostEnd)
+ {
+ userPassword = protoEnd;
+ }
+
+ int colon = url.find(':', userPassword);
+ if (colon == std::string::npos || colon > hostEnd) {
+ colon = hostEnd;
+ }
+ std::string host = url.substr(userPassword, colon - userPassword);
+ return host;
+}
+
+std::string AllowedConnections::getCodeServerFromUrl(const std::string& url) {
+ int queryStart = url.find("?");
+ if (queryStart == std::string::npos) {
+ Debug::log(Debug::Debugging) << "getCodeServerFromUrl(" << url
+ << ") - no ? in URL" << Debug::flush;
+ return "";
+ }
+ ++queryStart; //skip the ?
+
+ int paramStart = url.find("gwt.codesvr=", queryStart);
+ if (paramStart == std::string::npos) {
+ Debug::log(Debug::Debugging) << "getCodeServerFromUrl(" << url
+ << ") - missing gwt.codesvr in URL" << Debug::flush;
+ return "";
+ }
+ paramStart += 12;
+
+ int colon = url.find(':', paramStart);
+ // After navigation, the URL parameter could be encoded.
+ // ex: gwt.codesvr=127.0.0.1:9997 -> gwt.codesvr=127.0.0.1%3A9997.
+ int colonEncoded = url.find("%3A", paramStart);
+ if (colonEncoded != std::string::npos
+ && (colon == std::string::npos || colonEncoded < colon)) {
+ colon = colonEncoded;
+ }
+
+ int variableEnd = url.find('&', paramStart);
+ if ( variableEnd == std::string::npos || colon < variableEnd) {
+ variableEnd = colon; //could be std::string::npos!
+ }
+ Debug::log(Debug::Spam) << "getCodeServerFromUrl(" << url
+ << ") - gwt.codesvr=" <<
+ url.substr(paramStart, variableEnd-paramStart) << " in URL"
+ << Debug::flush;
+
+ return url.substr(paramStart, variableEnd-paramStart);
+}
+
+bool AllowedConnections::matchesRule(const std::string& webHost,
+ const std::string& codeServer,
+ bool* allowed) {
+ std::string host = webHost;
+ std::string server = codeServer;
+
+ //Remap variants of localhost
+ if (host.find("localhost.") == 0 || host == "127.0.0.1") {
+ host = "localhost";
+ }
+
+ if (server.find("localhost.") == 0 || server == "127.0.0.1" )
+ {
+ server = "localhost";
+ }
+
+ // always allow localhost
+ // TODO(jat): try and get IP addresses of local interfaces?
+ if (host == "localhost" && server == "localhost") {
+ *allowed = true;
+ return true;
+ }
+
+ Debug::log(Debug::Spam) << "Checking webHost(" << webHost
+ << "), codeServer(" << codeServer << ") " << Debug::flush;
+ for (std::vector<AllowedConnections::Rule>::const_iterator it = rules.begin();
+ it != rules.end(); ++it) {
+ Debug::log(Debug::Spam) << " comparing to webHost=(" << it->getWebHost()
+ << ") codeServer=(" << it->getCodeServer() << ")" << Debug::flush;
+ // TODO(jat): add support for regexes
+ if (webHost == it->getWebHost() && codeServer == it->getCodeServer()) {
+ *allowed = !it->isExcluded();
+ Debug::log(Debug::Spam) << " found! allowed=" << *allowed
+ << Debug::flush;
+ return true;
+ }
+ }
+ Debug::log(Debug::Info)
+ << "GWT Development Mode connection requested by unknown web server "
+ << webHost << ", code server " << codeServer << Debug::flush;
+ return false;
+}
+
+void AllowedConnections::addRule(const std::string& webHost,
+ const std::string& codeServer,
+ bool exclude) {
+ Debug::log(Debug::Spam) << "AllowedConnections::addRule(webHost=" << webHost
+ << ", codeServer=" << codeServer << ", excl=" << exclude << ")"
+ << Debug::flush;
+ rules.push_back(AllowedConnections::Rule(webHost, codeServer, exclude));
+}
+
+void AllowedConnections::clearRules() {
+ rules.clear();
+}
+
+void AllowedConnections::initFromAccessList(const std::string& accessList) {
+ Debug::log(Debug::Spam) << "initFromAccessList() accessList="
+ << accessList << Debug::flush;
+ clearRules();
+ int n = accessList.length();
+ for (int i = 0; i < n; ) {
+ bool exclude = false;
+ if (accessList[i] == '!') {
+ exclude = true;
+ ++i;
+ }
+ int comma = i - 1; // for pre-increment below
+ while (++comma < n && accessList[comma] != ','); // empty
+ std::string option = accessList.substr(i, comma - i);
+ i = comma + 1;
+
+ //parse the [/codeserver] optional element
+ int slash = option.find( '/');
+ if( slash == std::string::npos ) {
+ addRule(option, "localhost", exclude);
+ } else {
+ addRule(option.substr(0, slash), option.substr(slash+1), exclude);
+ }
+ }
+}
diff --git a/plugins/common/AllowedConnections.h b/plugins/common/AllowedConnections.h
new file mode 100644
index 0000000..0856aee
--- /dev/null
+++ b/plugins/common/AllowedConnections.h
@@ -0,0 +1,125 @@
+#ifndef _H_AllowedConnections
+#define _H_AllowedConnections
+/*
+ * Copyright 2008 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.
+ */
+
+#include <string>
+#include <vector>
+#include <utility>
+
+/**
+ * Manages rules to control access to other sites from the plugin. This is
+ * important since arbitrary web pages could try and use the plugin to connect
+ * to hosts the browser's machine has access to, such as doing port scanning
+ * behind a firewall.
+ */
+class AllowedConnections {
+public:
+ /**
+ * Add a rule to match new requests against.
+ *
+ * @param pattern pattern to match
+ * @param exclude true if matches should be excluded instead of included
+ */
+ static void addRule(const std::string& webHost,
+ const std::string& codeServer,
+ bool exclude = false);
+
+ /**
+ * Clear all rules.
+ */
+ static void clearRules();
+
+ /**
+ * Get the host portion of the URL, not including the port.
+ *
+ * @return the host portion of the URL, or the unmodified URL if it does not
+ * appear to be valid
+ */
+ static std::string getHostFromUrl(const std::string& url);
+
+ /**
+ * Get the code server value from the URL, not including the port
+ *
+ * @return the first found server in the URL, or the unmodified URL if it
+ * does not appear to be valid
+ */
+ static std::string getCodeServerFromUrl(const std::string& url);
+
+ /**
+ * Clear any existing rules and reinitialize from the supplied access list.
+ *
+ * This access list is of the form:
+ * [!]pattern,[!]pattern...
+ * where the optional exclamation indicates the following pattern is to be
+ * excluded, and an arbitrary number of patterns may be supplied with the
+ * first match being used. Each pattern currently is only an exact literal
+ * match against the host name, but will be extended to support simple
+ * wildcard patterns.
+ */
+ static void initFromAccessList(const std::string& accessList);
+
+ /**
+ * Returns true if the server for the requested URL matched any rule in
+ * our access list, and sets a flag based on whether that rule permits or
+ * denies the request. A host name of localhost or 127.0.0.1 is always
+ * allowed.
+ *
+ * @param hostname host name of webserver or codeserver
+ * @param allowed pointer to return value indiciating that this URL should
+ * be allowed to initiate GWT development mode connections
+ * @return true if url matched a rule
+ */
+ static bool matchesRule(const std::string& webHost,
+ const std::string& codeServer,
+ bool* allowed);
+
+private:
+ AllowedConnections() {
+ }
+
+ /**
+ * Internal class used for representing a rule.
+ */
+ class Rule {
+ public:
+ Rule(const std::string& webHost,
+ const std::string& codeServer,
+ bool exclude)
+ : webhost(webHost), codesvr(codeServer), excluded(exclude) {}
+
+ const std::string& getWebHost() const {
+ return webhost;
+ }
+
+ const std::string& getCodeServer() const {
+ return codesvr;
+ }
+
+ bool isExcluded() const {
+ return excluded;
+ }
+
+ private:
+ std::string webhost;
+ std::string codesvr;
+ bool excluded;
+ };
+
+ static std::vector<Rule> rules;
+};
+
+#endif
diff --git a/plugins/common/BrowserChannel.h b/plugins/common/BrowserChannel.h
new file mode 100644
index 0000000..ac91af5
--- /dev/null
+++ b/plugins/common/BrowserChannel.h
@@ -0,0 +1,44 @@
+/*
+ * DO NOT EDIT
+ * Generated by com.google.gwt.util.tools.OophmHeaderFileGenerator
+ * TODO(jat): update generator to handle modifications
+ */
+
+/* from BrowserChannel.BROWSERCHANNEL_PROTOCOL_VERSION */
+#define BROWSERCHANNEL_PROTOCOL_VERSION 2
+
+/* from com.google.gwt.dev.shell.BrowserChannel.SpecialDispatchId */
+#define SPECIAL_HAS_METHOD 0
+#define SPECIAL_HAS_PROPERTY 1
+#define SPECIAL_GET_PROPERTY 2
+#define SPECIAL_SET_PROPERTY 3
+
+/* from com.google.gwt.dev.shell.BrowserChannel.MessageType */
+#define MESSAGE_TYPE_INVOKE 0
+#define MESSAGE_TYPE_RETURN 1
+#define MESSAGE_TYPE_OLD_LOAD_MODULE 2
+#define MESSAGE_TYPE_QUIT 3
+#define MESSAGE_TYPE_LOADJSNI 4
+#define MESSAGE_TYPE_INVOKESPECIAL 5
+#define MESSAGE_TYPE_FREEVALUE 6
+#define MESSAGE_TYPE_FATAL_ERROR 7
+#define MESSAGE_TYPE_CHECK_VERSIONS 8
+#define MESSAGE_TYPE_PROTOCOL_VERSION 9
+#define MESSAGE_TYPE_CHOOSE_TRANSPORT 10
+#define MESSAGE_TYPE_SWITCH_TRANSPORT 11
+#define MESSAGE_TYPE_LOAD_MODULE 12
+
+/* from com.google.gwt.dev.shell.BrowserChannel.Value.ValueType */
+#define VALUE_TYPE_NULL 0
+#define VALUE_TYPE_BOOLEAN 1
+#define VALUE_TYPE_BYTE 2
+#define VALUE_TYPE_CHAR 3
+#define VALUE_TYPE_SHORT 4
+#define VALUE_TYPE_INT 5
+#define VALUE_TYPE_LONG 6
+#define VALUE_TYPE_FLOAT 7
+#define VALUE_TYPE_DOUBLE 8
+#define VALUE_TYPE_STRING 9
+#define VALUE_TYPE_JAVA_OBJECT 10
+#define VALUE_TYPE_JS_OBJECT 11
+#define VALUE_TYPE_UNDEFINED 12
diff --git a/plugins/common/ByteOrder.h b/plugins/common/ByteOrder.h
new file mode 100644
index 0000000..7e6bd86
--- /dev/null
+++ b/plugins/common/ByteOrder.h
@@ -0,0 +1,141 @@
+#ifndef __H_ByteOrder
+#define __H_ByteOrder
+/*
+ * Copyright 2008 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.
+ */
+
+#include "Platform.h"
+#include <cstring>
+
+class ByteOrder {
+private:
+ enum FloatByteOrder {
+ FLOAT_BIG_ENDIAN,
+ FLOAT_LITTLE_ENDIAN,
+ // TODO(jat): do we need to consider anything other than straight
+ // big-endian or little-endian? PDP-11 (irrelevant), ARM (probably
+ // relevant for mobile devices), MIPS (probably not relevant, but maybe)
+ // and others have some intermediate endianess. Also, FP-endianess is not
+ // necessarily the same as that for integers.
+ };
+#ifdef PLATFORM_FLOAT_ENDIANESS
+ static const FloatByteOrder floatByteOrder = PLATFORM_FLOAT_ENDIANESS;
+#else
+ FloatByteOrder floatByteOrder;
+#endif
+
+ typedef union {
+ float v;
+ char b[sizeof(float)];
+ } FloatUnion;
+
+ typedef union {
+ double v;
+ char b[sizeof(double)];
+ } DoubleUnion;
+
+ /**
+ * Copy src to dest, reversing the order of the bytes.
+ * Assumes src and dest do not overlap.
+ */
+ void memcpyrev(char* dest, const char* src, size_t n) {
+ src += n;
+ while (n-- > 0) {
+ *dest++ = *--src;
+ }
+ }
+public:
+ ByteOrder() {
+#ifndef PLATFORM_FLOAT_ENDIANESS
+ DoubleUnion u;
+ memset(u.b, 0, sizeof(u.b));
+ u.b[0] = (char) 0x80;
+ u.b[7] = (char) 0x02;
+ // TODO(jat): add more tests here if we support other endianess
+ floatByteOrder = u.v > 0 ? FLOAT_LITTLE_ENDIAN : FLOAT_BIG_ENDIAN;
+ if (Debug::level(Debug::Debugging)) {
+ std::string str = "Unknown";
+ switch (floatByteOrder) {
+ case FLOAT_LITTLE_ENDIAN:
+ str = "little-endian";
+ break;
+ case FLOAT_BIG_ENDIAN:
+ str = "big-endian";
+ break;
+ }
+ Debug::log(Debug::Debugging) << "Dynamically detected float byte order: "
+ << str << Debug::flush;
+ }
+#endif
+ }
+
+ void bytesFromDouble(double v, char* bytes) {
+ DoubleUnion u;
+ u.v = v;
+ switch (floatByteOrder) {
+ case FLOAT_LITTLE_ENDIAN:
+ memcpyrev(bytes, u.b, sizeof(u.b));
+ break;
+ case FLOAT_BIG_ENDIAN:
+ memcpy(bytes, u.b, sizeof(u.b));
+ break;
+ }
+ }
+
+ void bytesFromFloat(float v, char* bytes) {
+ FloatUnion u;
+ u.v = v;
+ switch (floatByteOrder) {
+ case FLOAT_LITTLE_ENDIAN:
+ memcpyrev(bytes, u.b, sizeof(u.b));
+ break;
+ case FLOAT_BIG_ENDIAN:
+ memcpy(bytes, u.b, sizeof(u.b));
+ break;
+ }
+ }
+
+ double doubleFromBytes(const char* bytes) {
+ DoubleUnion u;
+ switch (floatByteOrder) {
+ case FLOAT_LITTLE_ENDIAN:
+ memcpyrev(u.b, bytes, sizeof(u.b));
+ break;
+ case FLOAT_BIG_ENDIAN:
+ // TODO(jat): find a way to avoid the extra copy while keeping the
+ // compiler happy.
+ memcpy(u.b, bytes, sizeof(u.b));
+ break;
+ }
+ return u.v;
+ }
+
+ float floatFromBytes(const char* bytes) {
+ FloatUnion u;
+ switch (floatByteOrder) {
+ case FLOAT_LITTLE_ENDIAN:
+ memcpyrev(u.b, bytes, sizeof(u.b));
+ break;
+ case FLOAT_BIG_ENDIAN:
+ // TODO(jat): find a way to avoid the extra copy while keeping the
+ // compiler happy.
+ memcpy(u.b, bytes, sizeof(u.b));
+ break;
+ }
+ return u.v;
+ }
+};
+
+#endif
diff --git a/plugins/common/CheckVersionsMessage.cpp b/plugins/common/CheckVersionsMessage.cpp
new file mode 100644
index 0000000..911cf38
--- /dev/null
+++ b/plugins/common/CheckVersionsMessage.cpp
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2008 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.
+ */
+
+#include "CheckVersionsMessage.h"
+#include "HostChannel.h"
+#include "scoped_ptr/scoped_ptr.h"
+
+CheckVersionsMessage::~CheckVersionsMessage() {
+}
+
+char CheckVersionsMessage::getType() const {
+ return TYPE;
+}
+
+/**
+ * Receive a CheckVersions message from the channel (note that the message
+ * type has already been read). Caller is responsible for destroying
+ * returned message. Returns null on error.
+ */
+CheckVersionsMessage* CheckVersionsMessage::receive(HostChannel& channel) {
+ int minVersion;
+ if (!channel.readInt(minVersion)) {
+ // TODO(jat): error handling
+ printf("Failed to read minimum version\n");
+ return 0;
+ }
+ int maxVersion;
+ if (!channel.readInt(maxVersion)) {
+ // TODO(jat): error handling
+ printf("Failed to read maximum version\n");
+ return 0;
+ }
+ std::string hostedHtmlVersion;
+ if (!channel.readString(hostedHtmlVersion)) {
+ // TODO(jat): error handling
+ printf("Failed to read hosted.html version\n");
+ return 0;
+ }
+ return new CheckVersionsMessage(minVersion, maxVersion, hostedHtmlVersion);
+}
+
+/**
+ * Send a fatal error message on the channel.
+ */
+bool CheckVersionsMessage::send(HostChannel& channel, int minVersion,
+ int maxVersion, const std::string& hostedHtmlVersion) {
+ if (!channel.sendByte(TYPE)) return false;
+ if (!channel.sendInt(minVersion)) return false;
+ if (!channel.sendInt(maxVersion)) return false;
+ if (!channel.sendString(hostedHtmlVersion)) return false;
+ return true;
+}
diff --git a/plugins/common/CheckVersionsMessage.h b/plugins/common/CheckVersionsMessage.h
new file mode 100644
index 0000000..10634ae
--- /dev/null
+++ b/plugins/common/CheckVersionsMessage.h
@@ -0,0 +1,56 @@
+#ifndef __CHECKVERSIONSMESSAGE_H
+#define __CHECKVERSIONSMESSAGE_H
+/*
+ * Copyright 2009 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.
+ */
+
+#include <string>
+#include "Message.h"
+#include "BrowserChannel.h"
+#include "Value.h"
+
+class HostChannel;
+
+/**
+ * Class representing a CheckVersions message sent to the server.
+ *
+ * This message tells the server the range or protocol versions this plugin
+ * understands as well as the hosted.html version (so stale copies of it can
+ * be detected).
+ */
+class CheckVersionsMessage : public Message {
+public:
+ static const char TYPE = MESSAGE_TYPE_CHECK_VERSIONS;
+private:
+ int minVersion;
+ int maxVersion;
+ const std::string& hostedHtmlVersion;
+
+protected:
+ CheckVersionsMessage(int minVersion, int maxVersion,
+ const std::string& hostedHtmlVersion) : minVersion(minVersion),
+ maxVersion(maxVersion), hostedHtmlVersion(hostedHtmlVersion) {}
+
+public:
+ ~CheckVersionsMessage();
+ virtual char getType() const;
+
+ const std::string& getHostedHtmlVersion() const { return hostedHtmlVersion; }
+
+ static CheckVersionsMessage* receive(HostChannel& channel);
+ static bool send(HostChannel& channel, int minVersion, int maxVersion,
+ const std::string& hostedHtmlVersion);
+};
+#endif
diff --git a/plugins/common/ChooseTransportMessage.cpp b/plugins/common/ChooseTransportMessage.cpp
new file mode 100644
index 0000000..08c315f
--- /dev/null
+++ b/plugins/common/ChooseTransportMessage.cpp
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2008 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.
+ */
+
+#include <cstdarg>
+#include <vector>
+#include "ChooseTransportMessage.h"
+#include "HostChannel.h"
+#include "scoped_ptr/scoped_ptr.h"
+
+ChooseTransportMessage::~ChooseTransportMessage() {
+}
+
+char ChooseTransportMessage::getType() const {
+ return TYPE;
+}
+
+/**
+ * Receive an ChooseTransport message from the channel (note that the message
+ * type has already been read). Caller is responsible for destroying
+ * returned message. Returns null on error.
+ */
+ChooseTransportMessage* ChooseTransportMessage::receive(HostChannel& channel) {
+ int length;
+ if (!channel.readInt(length)) {
+ // TODO(jat): error handling
+ printf("Failed to read transport\n");
+ return 0;
+ }
+ std::vector<std::string> transports;
+ for (int i = 0; i < length; ++i) {
+ std::string transport;
+ if (!channel.readString(transport)) {
+ // TODO(jat): error handling
+ printf("Failed to read transport\n");
+ return 0;
+ }
+ transports.push_back(transport);
+ }
+ return new ChooseTransportMessage(transports);
+}
+
+/**
+ * Send this ChooseTransport message on the channel.
+ */
+bool ChooseTransportMessage::send(HostChannel& channel,
+ const std::vector<std::string>& transports) {
+ if (!channel.sendByte(TYPE)) return false;
+ int n = transports.size();
+ if (!channel.sendInt(n)) return false;
+ for (int i = 0; i < n; ++i) {
+ if (!channel.sendString(transports[i])) return false;
+ }
+ return true;
+}
diff --git a/plugins/common/ChooseTransportMessage.h b/plugins/common/ChooseTransportMessage.h
new file mode 100644
index 0000000..512185e
--- /dev/null
+++ b/plugins/common/ChooseTransportMessage.h
@@ -0,0 +1,55 @@
+#ifndef __CHOOSETRANSPORTMESSAGE_H
+#define __CHOOSETRANSPORTMESSAGE_H
+/*
+ * Copyright 2009 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.
+ */
+
+#include <string>
+#include <vector>
+#include "Message.h"
+#include "BrowserChannel.h"
+#include "Value.h"
+
+class HostChannel;
+
+/**
+ * Class representing a ChooseTransport message to send to the server.
+ *
+ * This message type is a request for the server to choose an alternate
+ * transport from a provide list, such as a shared memory transport. The
+ * set of transport names is open-ended and thus requires mutual agreement
+ * on the names between the client and server.
+ */
+class ChooseTransportMessage : public Message {
+public:
+ static const char TYPE = MESSAGE_TYPE_CHOOSE_TRANSPORT;
+private:
+ std::vector<std::string> transports;
+
+protected:
+ ChooseTransportMessage(const std::vector<std::string>& transports)
+ : transports(transports) {}
+
+public:
+ ~ChooseTransportMessage();
+ virtual char getType() const;
+
+ const std::vector<std::string>& getTransports() const { return transports; }
+
+ static ChooseTransportMessage* receive(HostChannel& channel);
+ static bool send(HostChannel& channel,
+ const std::vector<std::string>& transport);
+};
+#endif
diff --git a/plugins/common/Debug.cpp b/plugins/common/Debug.cpp
new file mode 100644
index 0000000..586c1b6
--- /dev/null
+++ b/plugins/common/Debug.cpp
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2008 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.
+ */
+
+#include <cstdio>
+
+#ifdef _WINDOWS
+#include <windows.h>
+#endif
+
+#include "Debug.h"
+
+#ifdef GWT_DEBUGDISABLE
+// Dummy implementations for when debugging has been disabled
+Debug::DebugStream& Debug::flush(Debug::DebugStream& dbg) {
+ return dbg;
+}
+
+void Debug::logFinish() {}
+
+void Debug::logString(const char* str) {}
+
+#else
+// Warning: this function is inlined in the manipulator output operator in DebugStream.
+// It only remains here because some compiler/linker combinations such as MSVC will
+// give unresolved symbol errors if it isn't -- GCC, for example, will completely remove
+// all traces of this method.
+Debug::DebugStream& Debug::flush(Debug::DebugStream& dbg) {
+ Debug::logFinish();
+ return dbg;
+}
+
+// These methods are implemented in an Objective-C++ file on OSX
+#if !defined(__APPLE_CC__) || defined(__mac)
+
+#ifdef _WINDOWS
+#define DEBUG_BUF_SIZE 2048
+
+static char buf[DEBUG_BUF_SIZE + 3]; // room for CR NL Null
+static char *bufPtr = buf;
+#endif
+
+void Debug::logFinish() {
+#ifdef _WINDOWS
+ logString("\r\n");
+ ::OutputDebugStringA(buf);
+ bufPtr = buf;
+#else
+ putchar('\n');
+#endif
+}
+
+// logStart may be called multiple times per logFinish
+void Debug::logStart(LogLevel level) {
+}
+
+void Debug::logString(const char* str) {
+#ifdef _WINDOWS
+ size_t len = strlen(str);
+ size_t buflen = DEBUG_BUF_SIZE - (bufPtr - buf);
+ if (len >= buflen) {
+ len = buflen - 1;
+ }
+ strncpy_s(bufPtr, buflen, str, len);
+ bufPtr += len;
+#else
+ fputs(str, stdout);
+#endif
+}
+#endif
+#endif
+
diff --git a/plugins/common/Debug.h b/plugins/common/Debug.h
new file mode 100644
index 0000000..c44e824
--- /dev/null
+++ b/plugins/common/Debug.h
@@ -0,0 +1,214 @@
+#ifndef _H_Debug
+#define _H_Debug
+/*
+ * Copyright 2008 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.
+ */
+#ifndef _WINDOWS
+// TODO(jat): remove, for snprintf prototypes which should go away
+#include <stdio.h>
+#endif
+
+#include <ostream>
+#include <string>
+
+#include "Platform.h"
+
+// Get a default debug config if none supplied.
+#ifndef GWT_DEBUGLEVEL
+#include "DebugLevel.h"
+#endif
+
+/**
+ * Debugging class to get debugging output to a platform-specific location, with multiple
+ * levels supported.
+ *
+ * To use:
+ * #define GWT_DEBUGLEVEL level // where level is in LogLevel
+ * #include "Debug.h"
+ * Debug::log(Debug::Warning) << ...
+ *
+ * Zero overhead if GWT_DEBUGDISABLE is defined, other than the effort spent on side
+ * effects for stream object construction. If that is expensive, use something like
+ * Debug::level(Debug::Warning) to conditionalize expensive logging computations.
+ */
+class Debug {
+public:
+ enum LogLevel {
+ None,
+ Error,
+ Warning,
+ Info,
+ Debugging,
+ Spam
+ };
+
+private:
+ static const LogLevel minLogLevel = GWT_DEBUGLEVEL;
+
+public:
+ /**
+ * Return true if the requested level would be logged. Use to protect
+ * expensive computations for logging.
+ */
+ static bool level(LogLevel testLevel) {
+#ifdef GWT_DEBUGDISABLE
+ return false;
+#else
+ return testLevel <= minLogLevel;
+#endif
+ }
+
+private:
+ // complete the current log message
+ static void logFinish();
+
+ // begin a new log message
+ static void logStart(LogLevel level);
+
+ // add a string to the current log message
+ static void logString(const char* str);
+ static void logString(const std::string& str) {
+ logString(str.c_str());
+ }
+
+public:
+ // Note that flush is special-cased in the manipulator output operator,
+ // and its implementation is inlined there. If its implementation is
+ // modified, the implementation of the manipulator output operator will
+ // need to be modified as well.
+ class DebugStream;
+ static DebugStream& flush(DebugStream& dbg);
+
+ class DebugStream {
+
+ const bool shouldLog;
+
+ // TODO(jat): better implementations of output operators
+ public:
+ DebugStream(LogLevel level) : shouldLog(Debug::level(level)) {
+ if (shouldLog) {
+ Debug::logStart(level);
+ }
+ }
+
+ bool isActive() const {
+ return shouldLog;
+ }
+
+ DebugStream& operator<<(long v) {
+ if (shouldLog) {
+ char buf[20];
+ snprintf(buf, sizeof(buf), "%ld", v);
+ Debug::logString(buf);
+ }
+ return *this;
+ }
+
+ DebugStream& operator<<(unsigned long v) {
+ if (shouldLog) {
+ char buf[20];
+ snprintf(buf, sizeof(buf), "%lu", v);
+ Debug::logString(buf);
+ }
+ return *this;
+ }
+
+ DebugStream& operator<<(long long v) {
+ if (shouldLog) {
+ char buf[40];
+ snprintf(buf, sizeof(buf), "%lld", v);
+ Debug::logString(buf);
+ }
+ return *this;
+ }
+
+ DebugStream& operator<<(unsigned long long v) {
+ if (shouldLog) {
+ char buf[40];
+ snprintf(buf, sizeof(buf), "%llu", v);
+ Debug::logString(buf);
+ }
+ return *this;
+ }
+
+ DebugStream& operator<<(int v) {
+ if (shouldLog) {
+ char buf[20];
+ snprintf(buf, sizeof(buf), "%d", v);
+ Debug::logString(buf);
+ }
+ return *this;
+ }
+
+ DebugStream& operator<<(unsigned int v) {
+ if (shouldLog) {
+ char buf[20];
+ snprintf(buf, sizeof(buf), "%u", v);
+ Debug::logString(buf);
+ }
+ return *this;
+ }
+
+ DebugStream& operator<<(double v) {
+ if (shouldLog) {
+ char buf[20];
+ snprintf(buf, sizeof(buf), "%g", v);
+ Debug::logString(buf);
+ }
+ return *this;
+ }
+
+ DebugStream& operator<<(const std::string& str) {
+ if (shouldLog) {
+ Debug::logString(str);
+ }
+ return *this;
+ }
+
+ DebugStream& operator<<(const char* str) {
+ if (shouldLog) {
+ Debug::logString(str);
+ }
+ return *this;
+ }
+
+ DebugStream& operator<<(const void* v) {
+ if (shouldLog) {
+ char buf[20];
+ snprintf(buf, sizeof(buf), "%p", v);
+ Debug::logString(buf);
+ }
+ return *this;
+ }
+
+ DebugStream& operator<<(DebugStream& (*manip)(DebugStream&)) {
+ if (shouldLog) {
+ // Special-case flush for efficiency.
+ if (manip == Debug::flush) {
+ Debug::logFinish();
+ } else {
+ return manip(*this);
+ }
+ }
+ return *this;
+ }
+ };
+
+ static DebugStream log(LogLevel testLevel) {
+ return DebugStream(testLevel);
+ }
+};
+
+#endif
diff --git a/plugins/common/DebugLevel.h b/plugins/common/DebugLevel.h
new file mode 100644
index 0000000..b6f6a27
--- /dev/null
+++ b/plugins/common/DebugLevel.h
@@ -0,0 +1,25 @@
+#ifndef _H_DebugLevel
+#define _H_DebugLevel
+/*
+ * Copyright 2008 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.
+ */
+
+// Defines the default debug level if not defined -- see Debug.h
+// Can also define GWT_DEBUGDISABLE to remove all traces of the debug code.
+//#define GWT_DEBUGLEVEL Debugging
+#define GWT_DEBUGLEVEL Info
+//#define GWT_DEBUGDISABLE
+
+#endif
diff --git a/plugins/common/FatalErrorMessage.cpp b/plugins/common/FatalErrorMessage.cpp
new file mode 100644
index 0000000..0b4b2d0
--- /dev/null
+++ b/plugins/common/FatalErrorMessage.cpp
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2008 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.
+ */
+
+#include "FatalErrorMessage.h"
+#include "HostChannel.h"
+#include "scoped_ptr/scoped_ptr.h"
+
+FatalErrorMessage::~FatalErrorMessage() {
+}
+
+char FatalErrorMessage::getType() const {
+ return TYPE;
+}
+
+/**
+ * Receive an FatalError message from the channel (note that the message
+ * type has already been read). Caller is responsible for destroying
+ * returned message. Returns null on error.
+ */
+FatalErrorMessage* FatalErrorMessage::receive(HostChannel& channel) {
+ std::string error;
+ if (!channel.readString(error)) {
+ // TODO(jat): error handling
+ printf("Failed to read error message\n");
+ return 0;
+ }
+ return new FatalErrorMessage(error);
+}
+
+/**
+ * Send a fatal error message on the channel.
+ */
+bool FatalErrorMessage::send(HostChannel& channel, const std::string& error) {
+ if (!channel.sendByte(TYPE)) return false;
+ if (!channel.sendString(error)) return false;
+ return true;
+}
diff --git a/plugins/common/FatalErrorMessage.h b/plugins/common/FatalErrorMessage.h
new file mode 100644
index 0000000..a80b9d1
--- /dev/null
+++ b/plugins/common/FatalErrorMessage.h
@@ -0,0 +1,54 @@
+#ifndef __FATALERRORMESSAGE_H
+#define __FATALERRORMESSAGE_H
+/*
+ * Copyright 2009 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.
+ */
+
+#include <string>
+#include "Message.h"
+#include "BrowserChannel.h"
+#include "Value.h"
+
+class HostChannel;
+
+/**
+ * Class representing an FatalError message received from the server.
+ *
+ * This message indicates that a fatal error occurred during the processing
+ * of the previous message from the client and the connection should be
+ * aborted.
+ */
+class FatalErrorMessage : public Message {
+public:
+ static const char TYPE = MESSAGE_TYPE_FATAL_ERROR;
+private:
+ std::string error;
+
+protected:
+ /**
+ * @param error error message
+ */
+ FatalErrorMessage(const std::string& error) : error(error) {}
+
+public:
+ ~FatalErrorMessage();
+ virtual char getType() const;
+
+ const std::string& getError() const { return error; }
+
+ static FatalErrorMessage* receive(HostChannel& channel);
+ static bool send(HostChannel& channel, const std::string& error);
+};
+#endif
diff --git a/plugins/common/FreeValueMessage.cpp b/plugins/common/FreeValueMessage.cpp
new file mode 100644
index 0000000..b7f0bab
--- /dev/null
+++ b/plugins/common/FreeValueMessage.cpp
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2008 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.
+ */
+
+#include "FreeValueMessage.h"
+#include "HostChannel.h"
+#include "scoped_ptr/scoped_ptr.h"
+
+FreeValueMessage::~FreeValueMessage() {
+ delete[] ids;
+}
+
+FreeValueMessage* FreeValueMessage::receive(HostChannel& channel) {
+ int idCount;
+ if (!channel.readInt(idCount)) {
+ // TODO(jat): error handling
+ return 0;
+ }
+ // TODO: validate idCount
+ scoped_array<int> ids(new int[idCount]);
+
+ for (int i = 0; i < idCount; ++i) {
+ if (!channel.readInt(ids[i])) return 0;
+ }
+ return new FreeValueMessage(idCount, ids.release());
+}
+
+bool FreeValueMessage::send(HostChannel& channel, int idCount, const int* ids) {
+ if (!channel.sendByte(TYPE)) return false;
+ if (!channel.sendInt(idCount)) return false;
+ for (int i = 0; i < idCount; ++i) {
+ if (!channel.sendInt(ids[i])) return false;
+ }
+ return true;
+}
diff --git a/plugins/common/FreeValueMessage.h b/plugins/common/FreeValueMessage.h
new file mode 100644
index 0000000..3158f40
--- /dev/null
+++ b/plugins/common/FreeValueMessage.h
@@ -0,0 +1,60 @@
+#ifndef __H_FreeValueMessage
+#define __H_FreeValueMessage
+/*
+ * Copyright 2008 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.
+ */
+
+#include <string>
+#include "Message.h"
+#include "BrowserChannel.h"
+#include "HostChannel.h"
+
+/**
+ * Class representing an FreeValue message sent or received from the server.
+ *
+ * This message gives a list of object IDs which are no longer needed by the
+ * sending side. Note that there is no reply to this message, and it can
+ * only be sent when the other side is expecting to receive a return value or
+ * another invoke. Special care must be taken to ensure that any freed values
+ * referenced by the succeeding invoke/return are resurrected instead of freed.
+ */
+class FreeValueMessage : public Message {
+public:
+ static const char TYPE = MESSAGE_TYPE_FREEVALUE;
+private:
+ int idCount;
+ const int* ids;
+
+ FreeValueMessage(int idCount, const int* ids) : idCount(idCount), ids(ids) {}
+
+public:
+ ~FreeValueMessage();
+
+ virtual char getType() const {
+ return TYPE;
+ }
+
+ int getIdCount() const {
+ return idCount;
+ }
+
+ const int* const getIds() const {
+ return ids;
+ }
+
+ static FreeValueMessage* receive(HostChannel& channel);
+ static bool send(HostChannel& channel, int idCount, const int* ids);
+};
+#endif
diff --git a/plugins/common/HashMap.h b/plugins/common/HashMap.h
new file mode 100644
index 0000000..ebf634a
--- /dev/null
+++ b/plugins/common/HashMap.h
@@ -0,0 +1,58 @@
+#ifndef _H_HashMap
+#define _H_HashMap
+/*
+ * Copyright 2008 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.
+ */
+
+// Portability wrapper for hash maps, since they aren't part of the standard C++ library
+
+#ifdef __GNUC__
+#ifdef CXX_TR1
+// future support
+#include <unordered_map>
+#define hash_map std::tr1::unordered_map
+
+namespace HashFunctions = std;
+#else
+#include <ext/hash_map>
+using __gnu_cxx::hash_map;
+
+// TODO(jat): surely this exists somewhere already?
+// TODO(jat): portability issues
+namespace __gnu_cxx {
+ using std::size_t;
+
+ template<> struct hash<std::string> {
+ size_t operator()(const std::string& str) const {
+ return hash<const char*>()(str.c_str());
+ }
+ };
+};
+namespace HashFunctions = __gnu_cxx;
+#endif
+#elif sun
+// TODO(jat): find a hash_map implementation for Solaris
+#include <map>
+namespace HashFunctions = std;
+#define hash_map map
+using std::map;
+#else
+// Try something reasonably standard, which works in Windows
+#include <hash_map>
+using stdext::hash_map;
+namespace HashFunctions = stdext;
+#endif
+
+#endif
diff --git a/plugins/common/HostChannel.cpp b/plugins/common/HostChannel.cpp
new file mode 100644
index 0000000..2cabb01
--- /dev/null
+++ b/plugins/common/HostChannel.cpp
@@ -0,0 +1,445 @@
+/*
+ * Copyright 2008 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.
+ */
+
+#include <cstdio>
+#include <cstdlib>
+#include <cstring>
+#include <cerrno>
+
+#include "Debug.h"
+
+#ifdef _WINDOWS
+#include <winsock2.h>
+#include <ws2tcpip.h>
+#else
+#include <netdb.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <unistd.h>
+#include <sys/time.h>
+#endif
+#include <time.h>
+
+#include "Platform.h"
+#include "ByteOrder.h"
+
+#include "CheckVersionsMessage.h"
+#include "ProtocolVersionMessage.h"
+#include "ChooseTransportMessage.h"
+#include "SwitchTransportMessage.h"
+#include "FatalErrorMessage.h"
+#include "FreeValueMessage.h"
+#include "HostChannel.h"
+#include "LoadJsniMessage.h"
+#include "InvokeMessage.h"
+#include "InvokeSpecialMessage.h"
+#include "QuitMessage.h"
+#include "ReturnMessage.h"
+#include "Value.h"
+#include "scoped_ptr/scoped_ptr.h"
+
+using namespace std;
+
+ByteOrder HostChannel::byteOrder;
+
+bool HostChannel::connectToHost(const char* host, unsigned port) {
+ if (!port) {
+ port = 9997;
+ }
+ Debug::log(Debug::Info)
+ << "Initiating GWT Development Mode connection to host " << host
+ << ", port " << port << Debug::flush;
+ return sock.connect(host, port);
+}
+
+bool HostChannel::init(SessionHandler* handler, int minProtoVers,
+ int maxProtoVers, const std::string& hostedHtmlVers) {
+ this->handler = handler;
+ Debug::log(Debug::Debugging)
+ << " negotiating versions - we support protocol " << minProtoVers
+ << " through " << maxProtoVers << ", hostedHtmlVersion=" << hostedHtmlVers
+ << Debug::flush;
+ // TODO(jat): support transport selection
+ CheckVersionsMessage::send(*this, minProtoVers, maxProtoVers, hostedHtmlVers);
+ flush();
+ char type;
+ if (!readByte(type)) {
+ handler->fatalError(*this, "Failed to receive message type");
+ Debug::log(Debug::Error) << "Failed to receive message type" << Debug::flush;
+ disconnectFromHost();
+ return false;
+ }
+
+ switch (type) {
+ case MESSAGE_TYPE_PROTOCOL_VERSION:
+ {
+ scoped_ptr<ProtocolVersionMessage> imsg(ProtocolVersionMessage
+ ::receive(*this));
+ if (!imsg.get()) {
+ Debug::log(Debug::Error) << "Failed to receive protocol version message"
+ << Debug::flush;
+ return false;
+ }
+ // TODO(jat): save selected protocol version when we support a range
+ break;
+ }
+ case MESSAGE_TYPE_FATAL_ERROR:
+ {
+ scoped_ptr<FatalErrorMessage> imsg(FatalErrorMessage::receive(*this));
+ if (!imsg.get()) {
+ Debug::log(Debug::Error) << "Failed to receive fatal error message"
+ << Debug::flush;
+ return false;
+ }
+ handler->fatalError(*this, imsg.get()->getError());
+ return false;
+ }
+ default:
+ return false;
+ }
+ return true;
+}
+
+bool HostChannel::disconnectFromHost() {
+ Debug::log(Debug::Debugging) << "Disconnecting channel" << Debug::flush;
+ if (!isConnected()) {
+ Debug::log(Debug::Error) << "Disconnecting already disconnected channel" << Debug::flush;
+ return false;
+ }
+ QuitMessage::send(*this);
+ flush();
+ sock.disconnect();
+ return true;
+}
+
+bool HostChannel::readInt(int32_t& data) {
+ int32_t d;
+ if (!readBytes(&d, sizeof(d))) return false;
+ data = ntohl(d);
+ return true;
+}
+
+bool HostChannel::sendInt(int32_t data) {
+ uint32_t d = htonl(data);
+ return sendBytes(&d, sizeof(d));
+}
+
+bool HostChannel::readShort(short& data) {
+ int16_t d;
+ if (!readBytes(&d, sizeof(d))) return false;
+ data = ntohs(d);
+ return true;
+}
+
+bool HostChannel::sendShort(const short data) {
+ uint16_t d = htons(data);
+ return sendBytes(&d, sizeof(d));
+}
+
+bool HostChannel::readLong(int64_t& data) {
+ // network is big-endian
+ int32_t d[2];
+ if (!readInt(d[0])) return false;
+ if (!readInt(d[1])) return false;
+ data = (static_cast<int64_t>(d[0]) << 32) | ntohl(d[1]);
+ return true;
+}
+
+bool HostChannel::sendLong(const int64_t data) {
+ if (!sendInt(static_cast<int32_t>(data >> 32))) {
+ return false;
+ }
+ return sendInt(static_cast<int32_t>(data));
+}
+
+bool HostChannel::readFloat(float& data) {
+ char bytes[sizeof(data)];
+ if (!readBytes(bytes, sizeof(bytes))) {
+ return false;
+ }
+ data = byteOrder.floatFromBytes(bytes);
+ return true;
+}
+
+bool HostChannel::sendFloat(const float data) {
+ char bytes[sizeof(data)];
+ byteOrder.bytesFromFloat(data, bytes);
+ return sendBytes(bytes, sizeof(bytes));
+}
+
+bool HostChannel::readDouble(double& data) {
+ char bytes[sizeof(data)];
+ if (!readBytes(bytes, sizeof(bytes))) {
+ return false;
+ }
+ data = byteOrder.doubleFromBytes(bytes);
+ return true;
+}
+
+bool HostChannel::sendDouble(const double data) {
+ char bytes[sizeof(data)];
+ byteOrder.bytesFromDouble(data, bytes);
+ return sendBytes(bytes, sizeof(bytes));
+}
+
+bool HostChannel::readStringLength(uint32_t& data) {
+ int32_t val;
+ if (!readInt(val)) return false;
+ // TODO: assert positive?
+ data = val;
+ return true;
+}
+
+bool HostChannel::readStringBytes(char* data, const uint32_t len) {
+ return readBytes(data, len);
+}
+
+bool HostChannel::readString(std::string& strRef) {
+ uint32_t len;
+ if (!readStringLength(len)) {
+ Debug::log(Debug::Error) << "readString: failed to read length"
+ << Debug::flush;
+ return false;
+ }
+ // Allocating variable-length arrays on the stack is a GCC feature,
+ // and is vulnerable to stack overflow attacks, so we allocate on the heap.
+ scoped_array<char> buf(new char[len]);
+ if (!readStringBytes(buf.get(), len)) {
+ Debug::log(Debug::Error) << "readString: failed to read " << len
+ << " bytes" << Debug::flush;
+ return false;
+ }
+ strRef.assign(buf.get(), len);
+ return true;
+}
+
+static inline double operator-(const struct timeval& end,
+ const struct timeval& begin) {
+ double us = end.tv_sec * 1000000.0 + end.tv_usec - begin.tv_sec * 1000000.0
+ - begin.tv_usec;
+ return us;
+}
+
+ReturnMessage* HostChannel::reactToMessages(SessionHandler* handler, bool expectReturn) {
+ char type;
+ while (true) {
+ flush();
+ Debug::log(Debug::Debugging) << "Waiting for response, flushed output" << Debug::flush;
+ if (!readByte(type)) {
+ if (isConnected()) {
+ Debug::log(Debug::Debugging) << "Failed to receive message type"
+ << Debug::flush;
+ }
+ return 0;
+ }
+ switch (type) {
+ case MESSAGE_TYPE_INVOKE:
+ {
+ scoped_ptr<InvokeMessage> imsg(InvokeMessage::receive(*this));
+ if (!imsg.get()) {
+ Debug::log(Debug::Error) << "Failed to receive invoke message" << Debug::flush;
+ return 0;
+ }
+ gwt::Value returnValue;
+ bool exception = handler->invoke(*this, imsg->getThis(), imsg->getMethodName(),
+ imsg->getNumArgs(), imsg->getArgs(), &returnValue);
+ handler->sendFreeValues(*this);
+ ReturnMessage::send(*this, exception, returnValue);
+ }
+ break;
+ case MESSAGE_TYPE_INVOKESPECIAL:
+ {
+ // scottb: I think this is never used; I think server never sends invokeSpecial
+ scoped_ptr<InvokeSpecialMessage> imsg(InvokeSpecialMessage::receive(*this));
+ if (!imsg.get()) {
+ Debug::log(Debug::Error) << "Failed to receive invoke special message" << Debug::flush;
+ return 0;
+ }
+ gwt::Value returnValue;
+ bool exception = handler->invokeSpecial(*this, imsg->getDispatchId(),
+ imsg->getNumArgs(), imsg->getArgs(), &returnValue);
+ handler->sendFreeValues(*this);
+ ReturnMessage::send(*this, exception, returnValue);
+ }
+ break;
+ case MESSAGE_TYPE_FREEVALUE:
+ {
+ scoped_ptr<FreeValueMessage> freeMsg(FreeValueMessage::receive(*this));
+ if (!freeMsg.get()) {
+ Debug::log(Debug::Error) << "Failed to receive free value message" << Debug::flush;
+ return 0;
+ }
+ handler->freeValue(*this, freeMsg->getIdCount(), freeMsg->getIds());
+ }
+ // do not send a response
+ break;
+ case MESSAGE_TYPE_LOADJSNI:
+ {
+ scoped_ptr<LoadJsniMessage> loadMsg(LoadJsniMessage::receive(*this));
+ if (!loadMsg.get()) {
+ Debug::log(Debug::Error) << "Failed to receive load JSNI message" << Debug::flush;
+ return 0;
+ }
+ handler->loadJsni(*this, loadMsg->getJs());
+ }
+ // do not send a response
+ break;
+ case MESSAGE_TYPE_RETURN:
+ if (!expectReturn) {
+ Debug::log(Debug::Error) << "Received unexpected RETURN" << Debug::flush;
+ }
+ return ReturnMessage::receive(*this);
+ case MESSAGE_TYPE_QUIT:
+ if (expectReturn) {
+ Debug::log(Debug::Error) << "Received QUIT while waiting for return" << Debug::flush;
+ }
+ disconnectFromHost();
+ return 0;
+ default:
+ // TODO(jat): error handling
+ Debug::log(Debug::Error) << "Unexpected message type " << type
+ << ", expectReturn=" << expectReturn << Debug::flush;
+ disconnectFromHost();
+ return 0;
+ }
+ }
+}
+
+bool HostChannel::readValue(gwt::Value& valueRef) {
+ char typeBuf;
+ if (!readByte(typeBuf)) return false;
+ gwt::Value::ValueType type = gwt::Value::ValueType(typeBuf);
+ switch (type) {
+ case gwt::Value::NULL_TYPE:
+ valueRef.setNull();
+ return true;
+ case gwt::Value::UNDEFINED:
+ valueRef.setUndefined();
+ return true;
+ case gwt::Value::BOOLEAN:
+ {
+ char val;
+ if (!readByte(val)) return false;
+ valueRef.setBoolean(val != 0);
+ }
+ return true;
+ case gwt::Value::BYTE:
+ {
+ char val;
+ if (!readByte(val)) return false;
+ valueRef.setByte(val);
+ }
+ return true;
+ case gwt::Value::CHAR:
+ {
+ short val;
+ if (!readShort(val)) return false;
+ valueRef.setChar(val);
+ }
+ return true;
+ case gwt::Value::SHORT:
+ {
+ short val;
+ if (!readShort(val)) return false;
+ valueRef.setShort(val);
+ }
+ return true;
+ case gwt::Value::STRING:
+ {
+ std::string val;
+ if (!readString(val)) return false;
+ valueRef.setString(val);
+ }
+ return true;
+ case gwt::Value::INT:
+ {
+ int val;
+ if (!readInt(val)) return false;
+ valueRef.setInt(val);
+ }
+ return true;
+ case gwt::Value::LONG:
+ {
+ int64_t val;
+ if (!readLong(val)) return false;
+ valueRef.setLong(val);
+ }
+ return true;
+ case gwt::Value::DOUBLE:
+ {
+ double val;
+ if (!readDouble(val)) return false;
+ valueRef.setDouble(val);
+ }
+ return true;
+ case gwt::Value::JAVA_OBJECT:
+ {
+ int objId;
+ if (!readInt(objId)) return false;
+ valueRef.setJavaObject(objId);
+ }
+ return true;
+ case gwt::Value::JS_OBJECT:
+ {
+ int val;
+ if (!readInt(val)) return false;
+ valueRef.setJsObjectId(val);
+ }
+ return true;
+ default:
+ Debug::log(Debug::Error) << "Unhandled value type sent from server: " << type << Debug::flush;
+ break;
+ }
+ return false;
+}
+
+bool HostChannel::sendValue(const gwt::Value& value) {
+ gwt::Value::ValueType type = value.getType();
+ if (!sendByte(type)) return false;
+ switch (type) {
+ case gwt::Value::NULL_TYPE:
+ case gwt::Value::UNDEFINED:
+ // Null and Undefined only have the tag byte, no data
+ return true;
+ case gwt::Value::BOOLEAN:
+ return sendByte(value.getBoolean() ? 1 : 0);
+ case gwt::Value::BYTE:
+ return sendByte(value.getByte());
+ case gwt::Value::CHAR:
+ return sendShort(short(value.getChar()));
+ case gwt::Value::SHORT:
+ return sendShort(value.getShort());
+ case gwt::Value::INT:
+ return sendInt(value.getInt());
+ case gwt::Value::LONG:
+ return sendLong(value.getLong());
+ case gwt::Value::STRING:
+ return sendString(value.getString());
+ case gwt::Value::DOUBLE:
+ return sendDouble(value.getDouble());
+ case gwt::Value::FLOAT:
+ return sendFloat(value.getFloat());
+ case gwt::Value::JS_OBJECT:
+ return sendInt(value.getJsObjectId());
+ case gwt::Value::JAVA_OBJECT:
+ return sendInt(value.getJavaObjectId());
+ default:
+ Debug::log(Debug::Error) << "Unhandled value type sent to server: " << type << Debug::flush;
+ break;
+ }
+ return false;
+}
diff --git a/plugins/common/HostChannel.h b/plugins/common/HostChannel.h
new file mode 100644
index 0000000..e8a53ec
--- /dev/null
+++ b/plugins/common/HostChannel.h
@@ -0,0 +1,159 @@
+#ifndef __H_HostChannel
+#define __H_HostChannel
+/*
+ * Copyright 2008 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.
+ */
+
+#include "Debug.h"
+
+// Sun's cstdio doesn't define a bunch of stuff
+#include <stdio.h>
+#include <string>
+
+#include "ByteOrder.h"
+#include "Socket.h"
+#include "Platform.h"
+#include "Message.h"
+#include "ReturnMessage.h"
+#include "Value.h"
+#include "SessionHandler.h"
+
+class HostChannel {
+ Socket sock;
+ static ByteOrder byteOrder;
+ SessionHandler* handler;
+
+public:
+ ~HostChannel() {
+ if (isConnected()) {
+ disconnectFromHost();
+ }
+ Debug::log(Debug::Debugging) << "HostChannel destroyed" << Debug::flush;
+ }
+
+ // Connects to the OOPHM server (socket operations only).
+ bool connectToHost(const char* host, unsigned port);
+
+ // Negotiates protocol version and transport selection.
+ bool init(SessionHandler* handler, int minVersion, int maxVersion,
+ const std::string& hostedHtmlVersion);
+
+ bool disconnectFromHost();
+
+ bool isConnected() const {
+ return sock.isConnected();
+ }
+
+ bool readBytes(void* data, size_t dataLen) {
+ char* ptr = static_cast<char*>(data);
+ while(dataLen > 0) {
+ if (!readByte(*ptr++)) {
+ return false;
+ }
+ --dataLen;
+ }
+ return true;
+ }
+
+ bool sendBytes(const void* data, size_t dataLen) {
+ const char* ptr = static_cast<const char*>(data);
+ while(dataLen > 0) {
+ if (!sendByte(*ptr++)) {
+ return false;
+ }
+ --dataLen;
+ }
+ return true;
+ }
+
+ // TODO: don't pass out-params by reference as it makes the call site misleading
+ bool readInt(int32_t& data);
+ bool sendInt(const int32_t data);
+
+ bool readShort(short& data);
+ bool sendShort(const short data);
+
+ bool readLong(int64_t& data);
+ bool sendLong(const int64_t data);
+
+ bool readFloat(float& data);
+ bool sendFloat(const float data);
+
+ bool readDouble(double& doubleRef);
+ bool sendDouble(const double data);
+
+ bool readByte(char& data) {
+ if (!isConnected()) {
+ handler->disconnectDetected();
+ return false;
+ }
+ int c = sock.readByte();
+ if (c < 0) {
+ handler->disconnectDetected();
+ return false;
+ }
+ data = static_cast<char>(c);
+ return true;
+ }
+
+ bool sendByte(const char data) {
+ if (!isConnected()) {
+ handler->disconnectDetected();
+ return false;
+ }
+ if (!sock.writeByte(data)) {
+ handler->disconnectDetected();
+ return false;
+ }
+ return true;
+ }
+
+ bool readStringLength(uint32_t& data);
+ bool readStringBytes(char* data, const uint32_t len);
+ bool readString(std::string& strRef);
+ bool sendString(const char* data, const uint32_t len) {
+ return sendInt(len) && sendBytes(data, len);
+ }
+
+ bool sendString(const std::string& str) {
+ return sendString(str.c_str(), static_cast<uint32_t>(str.length()));
+ }
+
+ bool readValue(gwt::Value& valueRef);
+ bool sendValue(const gwt::Value& value);
+
+ ReturnMessage* reactToMessages(SessionHandler* handler, bool expectReturn);
+
+ bool reactToMessages(SessionHandler* handler) {
+ return !reactToMessages(handler, false);
+ }
+
+ bool flush() {
+ if (!sock.isConnected()) {
+ handler->disconnectDetected();
+ return false;
+ }
+ if (!sock.flush()) {
+ handler->disconnectDetected();
+ return false;
+ }
+ return true;
+ }
+
+ ReturnMessage* reactToMessagesWhileWaitingForReturn(SessionHandler* handler) {
+ return reactToMessages(handler, true);
+ }
+};
+#endif
diff --git a/plugins/common/InvokeMessage.cpp b/plugins/common/InvokeMessage.cpp
new file mode 100644
index 0000000..9207f81
--- /dev/null
+++ b/plugins/common/InvokeMessage.cpp
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2008 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.
+ */
+
+#include "InvokeMessage.h"
+#include "HostChannel.h"
+#include "scoped_ptr/scoped_ptr.h"
+
+InvokeMessage::~InvokeMessage() {
+ delete[] args;
+}
+
+char InvokeMessage::getType() const {
+ return TYPE;
+}
+
+/**
+ * Receive an Invoke message from the channel (note that the message
+ * type has already been read). Caller is responsible for destroying
+ * returned message. Returns null on error.
+ */
+InvokeMessage* InvokeMessage::receive(HostChannel& channel) {
+ std::string methodName;
+ if (!channel.readString(methodName)) {
+ // TODO(jat): error handling
+ printf("Failed to read method name\n");
+ return 0;
+ }
+ gwt::Value thisRef;
+ if (!channel.readValue(thisRef)) {
+ // TODO(jat): error handling
+ printf("Failed to read thisRef\n");
+ return 0;
+ }
+ int numArgs;
+ if (!channel.readInt(numArgs)) {
+ // TODO(jat): error handling
+ printf("Failed to read #args\n");
+ return 0;
+ }
+ scoped_array<gwt::Value> args(new gwt::Value[numArgs]);
+ for (int i = 0; i < numArgs; ++i) {
+ if (!channel.readValue(args[i])) {
+ // TODO(jat): error handling
+ printf("Failed to read arg[%d]\n", i);
+ return 0;
+ }
+ }
+ return new InvokeMessage(thisRef, methodName, numArgs, args.release());
+}
+
+/**
+ * Request the server invoke a method on an object and return the result.
+ *
+ * Note that the method to be invoked is sent as an integer (a dispatch id) to the server.
+ */
+bool InvokeMessage::send(HostChannel& channel, const gwt::Value& thisRef, int methodDispatchId,
+ int numArgs, const gwt::Value* args) {
+ if (!channel.sendByte(TYPE)) return false;
+ if (!channel.sendInt(methodDispatchId)) return false;
+ if (!channel.sendValue(thisRef)) return false;
+ if (!channel.sendInt(numArgs)) return false;
+ for (int i = 0; i < numArgs; ++i) {
+ if (!channel.sendValue(args[i])) return false;
+ }
+ return true;
+}
diff --git a/plugins/common/InvokeMessage.h b/plugins/common/InvokeMessage.h
new file mode 100644
index 0000000..0296d75
--- /dev/null
+++ b/plugins/common/InvokeMessage.h
@@ -0,0 +1,67 @@
+#ifndef __INVOKEMESSAGE_H
+#define __INVOKEMESSAGE_H
+/*
+ * Copyright 2008 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.
+ */
+
+#include <string>
+#include "Message.h"
+#include "BrowserChannel.h"
+#include "Value.h"
+
+class HostChannel;
+
+/**
+ * Class representing an InvokeMessage received from the server, and a way
+ * to send an invoke message to the server.
+ *
+ * Note that the wire protocol is different in the two directions, as the
+ * server sends a string for the method name and the client send an integer
+ * dispatchID.
+ */
+class InvokeMessage : public Message {
+public:
+ static const char TYPE = MESSAGE_TYPE_INVOKE;
+ static const int TOSTRING_DISP_ID = 0;
+private:
+ gwt::Value thisRef;
+ std::string methodName;
+ int methodDispatchId;
+ int numArgs;
+ const gwt::Value* args;
+
+protected:
+ /**
+ * @param args array of arguments -- InvokeMessage takes ownership and will
+ * destroy when it is destroyed.
+ */
+ InvokeMessage(const gwt::Value& thisRef, const std::string& methodName,
+ int numArgs, const gwt::Value* args) : thisRef(thisRef), methodName(methodName),
+ numArgs(numArgs), args(args) {}
+
+public:
+ ~InvokeMessage();
+ virtual char getType() const;
+
+ gwt::Value getThis() const { return thisRef; }
+ const std::string& getMethodName() const { return methodName; }
+ int getNumArgs() const { return numArgs; }
+ const gwt::Value* const getArgs() const { return args; }
+
+ static InvokeMessage* receive(HostChannel& channel);
+ static bool send(HostChannel& channel, const gwt::Value& thisRef, int methodDispatchId,
+ int numArgs, const gwt::Value* args);
+};
+#endif
diff --git a/plugins/common/InvokeSpecialMessage.cpp b/plugins/common/InvokeSpecialMessage.cpp
new file mode 100644
index 0000000..0a9f418
--- /dev/null
+++ b/plugins/common/InvokeSpecialMessage.cpp
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2008 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.
+ */
+
+#include "InvokeSpecialMessage.h"
+#include "HostChannel.h"
+#include "SessionHandler.h"
+#include "scoped_ptr/scoped_ptr.h"
+
+InvokeSpecialMessage::~InvokeSpecialMessage() {
+ delete[] args;
+}
+
+char InvokeSpecialMessage::getType() const {
+ return TYPE;
+}
+
+/**
+ * Receive an InvokeSpecial message from the channel (note that the message
+ * type has already been read). Caller is responsible for destroying
+ * returned message. Returns null on error.
+ */
+InvokeSpecialMessage* InvokeSpecialMessage::receive(HostChannel& channel) {
+ char dispatchId;
+ if (!channel.readByte(dispatchId)) {
+ // TODO(jat): error handling
+ printf("Failed to read method name\n");
+ return 0;
+ }
+ int numArgs;
+ if (!channel.readInt(numArgs)) {
+ // TODO(jat): error handling
+ printf("Failed to read #args\n");
+ return 0;
+ }
+ scoped_array<gwt::Value> args(new gwt::Value[numArgs]);
+ for (int i = 0; i < numArgs; ++i) {
+ if (!channel.readValue(args[i])) {
+ // TODO(jat): error handling
+ printf("Failed to read arg[%d]\n", i);
+ return 0;
+ }
+ }
+
+ SessionHandler::SpecialMethodId id =
+ static_cast<SessionHandler::SpecialMethodId>(dispatchId);
+ return new InvokeSpecialMessage(id, numArgs, args.release());
+}
+
+/**
+ * Request the server perform a special method and return the result.
+ */
+bool InvokeSpecialMessage::send(HostChannel& channel, int dispatchId,
+ int numArgs, const gwt::Value* args) {
+ if (!channel.sendByte(TYPE)) return false;
+ if (!channel.sendByte(dispatchId)) return false;
+ if (!channel.sendInt(numArgs)) return false;
+ for (int i = 0; i < numArgs; ++i) {
+ if (!channel.sendValue(args[i])) return false;
+ }
+ return true;
+}
diff --git a/plugins/common/InvokeSpecialMessage.h b/plugins/common/InvokeSpecialMessage.h
new file mode 100644
index 0000000..84c90ff
--- /dev/null
+++ b/plugins/common/InvokeSpecialMessage.h
@@ -0,0 +1,59 @@
+#ifndef __INVOKESPECIALMESSAGE_H
+#define __INVOKESPECIALMESSAGE_H
+/*
+ * Copyright 2008 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.
+ */
+
+#include <string>
+#include "Message.h"
+#include "BrowserChannel.h"
+#include "SessionHandler.h"
+#include "Value.h"
+
+class HostChannel;
+
+/**
+ * Class representing an InvokeSpecial message received from the server, and a
+ * way to send an invoke message to the server.
+ */
+class InvokeSpecialMessage : public Message {
+public:
+ static const char TYPE = MESSAGE_TYPE_INVOKESPECIAL;
+private:
+ SessionHandler::SpecialMethodId dispatchId;
+ int numArgs;
+ const gwt::Value* args;
+
+protected:
+ /**
+ * @param args array of arguments -- InvokeMessage takes ownership and will
+ * destroy when it is destroyed.
+ */
+ InvokeSpecialMessage(SessionHandler::SpecialMethodId dispatchId, int numArgs,
+ const gwt::Value* args) : dispatchId(dispatchId), numArgs(numArgs), args(args) {}
+
+public:
+ ~InvokeSpecialMessage();
+ virtual char getType() const;
+
+ SessionHandler::SpecialMethodId getDispatchId() const { return dispatchId; }
+ int getNumArgs() const { return numArgs; }
+ const gwt::Value* const getArgs() const { return args; }
+
+ static InvokeSpecialMessage* receive(HostChannel& channel);
+ static bool send(HostChannel& channel, int dispatchId, int numArgs,
+ const gwt::Value* args);
+};
+#endif
diff --git a/plugins/common/LoadJsniMessage.cpp b/plugins/common/LoadJsniMessage.cpp
new file mode 100644
index 0000000..db8b943
--- /dev/null
+++ b/plugins/common/LoadJsniMessage.cpp
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2008 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.
+ */
+
+#include "LoadJsniMessage.h"
+
+LoadJsniMessage* LoadJsniMessage::receive(HostChannel& channel) {
+ std::string js;
+ if (!channel.readString(js)) {
+ // TODO(jat): error handling
+ return 0;
+ }
+ return new LoadJsniMessage(js);
+}
diff --git a/plugins/common/LoadJsniMessage.h b/plugins/common/LoadJsniMessage.h
new file mode 100644
index 0000000..5b1f8d9
--- /dev/null
+++ b/plugins/common/LoadJsniMessage.h
@@ -0,0 +1,43 @@
+#ifndef __H_LoadJsniMessage
+#define __H_LoadJsniMessage
+/*
+ * Copyright 2008 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.
+ */
+
+#include <string>
+#include "Message.h"
+#include "BrowserChannel.h"
+#include "HostChannel.h"
+
+class LoadJsniMessage : public Message {
+public:
+ static const char TYPE = MESSAGE_TYPE_LOADJSNI;
+private:
+ const std::string js;
+
+ LoadJsniMessage(const std::string& js) : js(js) {}
+
+public:
+ virtual char getType() const {
+ return TYPE;
+ }
+
+ std::string getJs() const {
+ return js;
+ }
+
+ static LoadJsniMessage* receive(HostChannel& channel);
+};
+#endif
diff --git a/plugins/common/LoadModuleMessage.cpp b/plugins/common/LoadModuleMessage.cpp
new file mode 100644
index 0000000..525383b
--- /dev/null
+++ b/plugins/common/LoadModuleMessage.cpp
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2008 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.
+ */
+
+#include "Debug.h"
+
+#include <cstring>
+#include <string>
+
+#include "LoadModuleMessage.h"
+#include "scoped_ptr/scoped_ptr.h"
+
+char LoadModuleMessage::getType() const {
+ return LoadModuleMessage::TYPE;
+}
+
+bool LoadModuleMessage::send(HostChannel& channel, const std::string& url,
+ const std::string& tabKey, const std::string& sessionKey,
+ const std::string& moduleName, const std::string& userAgent,
+ SessionHandler* handler) {
+ Debug::log(Debug::Debugging) << "LoadModule(url=\"" << url << "\", tabKey=\""
+ << "\", sessionKey=\"" << sessionKey << "\", module=\"" << moduleName
+ << "\")" << Debug::flush;
+ if (!channel.sendByte(TYPE) || !channel.sendString(url)
+ || !channel.sendString(tabKey)
+ || !channel.sendString(sessionKey)
+ || !channel.sendString(moduleName)
+ || !channel.sendString(userAgent)) {
+ return false;
+ }
+ scoped_ptr<ReturnMessage> ret(channel.reactToMessagesWhileWaitingForReturn(
+ handler));
+ if (!ret.get()) {
+ return false;
+ }
+ return !ret.get()->isException();
+}
diff --git a/plugins/common/LoadModuleMessage.h b/plugins/common/LoadModuleMessage.h
new file mode 100644
index 0000000..4a331cb
--- /dev/null
+++ b/plugins/common/LoadModuleMessage.h
@@ -0,0 +1,62 @@
+#ifndef __LOADMODULEMESSAGE_H
+#define __LOADMODULEMESSAGE_H
+/*
+ * Copyright 2008 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.
+ */
+
+#include <string>
+
+#include "Message.h"
+#include "BrowserChannel.h"
+#include "HostChannel.h"
+#include "SessionHandler.h"
+
+class HostChannel;
+
+/**
+ * Class representing a LoadModule message sent to the server.
+ *
+ * This message requests that the server load the requested module. A return
+ * message is not sent until the module is unloaded or fails to load.
+ */
+
+class LoadModuleMessage : public Message {
+ static const char TYPE = MESSAGE_TYPE_LOAD_MODULE;
+
+public:
+ LoadModuleMessage(const std::string& url, const std::string& tabKey,
+ const std::string& sessionKey, const std::string& moduleName,
+ const std::string& userAgent) : url(url), tabKey(tabKey),
+ sessionKey(sessionKey), moduleName(moduleName), userAgent(userAgent) { }
+
+ const std::string& getUrl() const { return url; }
+ const std::string& getTabKey() const { return tabKey; }
+ const std::string& getSessionKey() const { return sessionKey; }
+ const std::string& getModuleName() const { return moduleName; }
+ const std::string& getUserAgent() const { return userAgent; }
+ virtual char getType() const;
+
+ static bool send(HostChannel& channel, const std::string& url,
+ const std::string& tabKey, const std::string& sessionKey,
+ const std::string& moduleName, const std::string& userAgent,
+ SessionHandler* handler);
+private:
+ std::string url;
+ std::string tabKey;
+ std::string sessionKey;
+ std::string moduleName;
+ std::string userAgent;
+};
+#endif
diff --git a/plugins/common/Makefile b/plugins/common/Makefile
new file mode 100644
index 0000000..4003274
--- /dev/null
+++ b/plugins/common/Makefile
@@ -0,0 +1,124 @@
+# Copyright 2009 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.
+
+include ../config.mk
+
+HDRS= HostChannel.h InvokeMessage.h LoadModuleMessage.h Message.h \
+ ReturnMessage.h Value.h BrowserChannel.h Debug.h DebugLevel.h \
+ SessionHandler.h ServerMethods.h Socket.h AllowedConnections.h \
+ LoadJsniMessage.h InvokeSpecialMessage.h FreeValueMessage.h \
+ ByteOrder.h FatalErrorMessage.h CheckVersionsMessage.h \
+ ChooseTransportMessage.h SwitchTransportMessage.h \
+ ProtocolVersionMessage.h
+
+SRCS= HostChannel.cpp LoadModuleMessage.cpp InvokeMessage.cpp \
+ ReturnMessage.cpp ServerMethods.cpp Debug.cpp Socket.cpp \
+ AllowedConnections.cpp LoadJsniMessage.cpp InvokeSpecialMessage.cpp \
+ FreeValueMessage.cpp FatalErrorMessage.cpp CheckVersionsMessage.cpp \
+ ChooseTransportMessage.cpp SwitchTransportMessage.cpp \
+ ProtocolVersionMessage.cpp
+
+LIBCOMMON= libcommon$(FLAG32BIT).a
+OBJDIR= obj$(FLAG32BIT)
+OBJS= $(patsubst %.cpp,$(OBJDIR)/%.o,$(SRCS))
+
+all:: $(OBJDIR) $(LIBCOMMON)
+
+$(OBJDIR):
+ -mkdir $@
+
+$(LIBCOMMON): $(OBJS)
+ $(AR) $(ARFLAGS) $@ $(OBJS)
+
+$(OBJDIR)/%.o: %.cpp
+ $(CXX) $(BASECFLAGS) $(ALLARCHCFLAGS) -c $< -o $@
+
+$(OBJDIR)/%.o: DebugLevel.h
+
+.PHONY: clean depend testdebug
+
+testdebug:
+ (cd testing; CXX=$(CXX) CXXFLAGS="$(CFLAGS) -m32" ./testdebug)
+ (cd testing; CXX=$(CXX) CXXFLAGS="$(CFLAGS) -m64" ./testdebug)
+
+clean:
+ rm -rf obj32 obj64 libcommon32.a libcommon64.a
+
+depend:
+ g++ -MM $(CFLAGS) $(SRCS) >>Makefile
+# makedepend -- $(CFLAGS) -- $(SRCS)
+
+# DO NOT DELETE
+HostChannel.o: HostChannel.cpp Debug.h Platform.h DebugLevel.h \
+ ByteOrder.h CheckVersionsMessage.h Message.h BrowserChannel.h Value.h \
+ ProtocolVersionMessage.h ChooseTransportMessage.h \
+ SwitchTransportMessage.h FreeValueMessage.h HostChannel.h Socket.h \
+ AllowedConnections.h ReturnMessage.h SessionHandler.h LoadJsniMessage.h \
+ InvokeMessage.h InvokeSpecialMessage.h QuitMessage.h \
+ scoped_ptr/scoped_ptr.h
+LoadModuleMessage.o: LoadModuleMessage.cpp Debug.h Platform.h \
+ DebugLevel.h LoadModuleMessage.h Message.h BrowserChannel.h \
+ HostChannel.h ByteOrder.h Socket.h AllowedConnections.h ReturnMessage.h \
+ Value.h SessionHandler.h scoped_ptr/scoped_ptr.h
+InvokeMessage.o: InvokeMessage.cpp InvokeMessage.h Message.h \
+ BrowserChannel.h Value.h Debug.h Platform.h DebugLevel.h HostChannel.h \
+ ByteOrder.h Socket.h AllowedConnections.h ReturnMessage.h \
+ SessionHandler.h scoped_ptr/scoped_ptr.h
+ReturnMessage.o: ReturnMessage.cpp ReturnMessage.h Message.h \
+ BrowserChannel.h Value.h Debug.h Platform.h DebugLevel.h HostChannel.h \
+ ByteOrder.h Socket.h AllowedConnections.h SessionHandler.h
+ServerMethods.o: ServerMethods.cpp Debug.h Platform.h DebugLevel.h \
+ FreeValueMessage.h Message.h BrowserChannel.h HostChannel.h ByteOrder.h \
+ Socket.h AllowedConnections.h ReturnMessage.h Value.h SessionHandler.h \
+ InvokeMessage.h InvokeSpecialMessage.h ServerMethods.h \
+ scoped_ptr/scoped_ptr.h
+Debug.o: Debug.cpp Debug.h Platform.h DebugLevel.h
+Socket.o: Socket.cpp Platform.h Socket.h Debug.h DebugLevel.h
+AllowedConnections.o: AllowedConnections.cpp Debug.h Platform.h \
+ DebugLevel.h AllowedConnections.h
+LoadJsniMessage.o: LoadJsniMessage.cpp LoadJsniMessage.h Message.h \
+ BrowserChannel.h HostChannel.h Debug.h Platform.h DebugLevel.h \
+ ByteOrder.h Socket.h AllowedConnections.h ReturnMessage.h Value.h \
+ SessionHandler.h
+InvokeSpecialMessage.o: InvokeSpecialMessage.cpp InvokeSpecialMessage.h \
+ Message.h BrowserChannel.h SessionHandler.h Value.h Debug.h Platform.h \
+ DebugLevel.h HostChannel.h ByteOrder.h Socket.h AllowedConnections.h \
+ ReturnMessage.h scoped_ptr/scoped_ptr.h
+FreeValueMessage.o: FreeValueMessage.cpp FreeValueMessage.h Message.h \
+ BrowserChannel.h HostChannel.h Debug.h Platform.h DebugLevel.h \
+ ByteOrder.h Socket.h AllowedConnections.h ReturnMessage.h Value.h \
+ SessionHandler.h scoped_ptr/scoped_ptr.h
+FatalErrorMessage.o: FatalErrorMessage.cpp FatalErrorMessage.h Message.h \
+ BrowserChannel.h Value.h Debug.h Platform.h DebugLevel.h HostChannel.h \
+ ByteOrder.h Socket.h AllowedConnections.h ReturnMessage.h \
+ SessionHandler.h scoped_ptr/scoped_ptr.h
+CheckVersionsMessage.o: CheckVersionsMessage.cpp CheckVersionsMessage.h \
+ Message.h BrowserChannel.h Value.h Debug.h Platform.h DebugLevel.h \
+ HostChannel.h ByteOrder.h Socket.h AllowedConnections.h ReturnMessage.h \
+ SessionHandler.h scoped_ptr/scoped_ptr.h
+ChooseTransportMessage.o: ChooseTransportMessage.cpp \
+ ChooseTransportMessage.h Message.h BrowserChannel.h Value.h Debug.h \
+ Platform.h DebugLevel.h HostChannel.h ByteOrder.h Socket.h \
+ AllowedConnections.h ReturnMessage.h SessionHandler.h \
+ scoped_ptr/scoped_ptr.h
+SwitchTransportMessage.o: SwitchTransportMessage.cpp \
+ SwitchTransportMessage.h Message.h BrowserChannel.h Value.h Debug.h \
+ Platform.h DebugLevel.h HostChannel.h ByteOrder.h Socket.h \
+ AllowedConnections.h ReturnMessage.h SessionHandler.h \
+ scoped_ptr/scoped_ptr.h
+ProtocolVersionMessage.o: ProtocolVersionMessage.cpp \
+ ProtocolVersionMessage.h Message.h BrowserChannel.h Value.h Debug.h \
+ Platform.h DebugLevel.h HostChannel.h ByteOrder.h Socket.h \
+ AllowedConnections.h ReturnMessage.h SessionHandler.h \
+ scoped_ptr/scoped_ptr.h
diff --git a/plugins/common/Makefile.sun b/plugins/common/Makefile.sun
new file mode 100644
index 0000000..2043187
--- /dev/null
+++ b/plugins/common/Makefile.sun
@@ -0,0 +1,115 @@
+# Set to classpath value to get GWT classes from
+#GWTDEV=../build/staging/gwt-linux-0.0.0/gwt-dev-linux.jar
+GWTDEV=../eclipse/dev/linux/bin
+
+INC=-I..
+#CFLAGS=-fast -g0 -Kpic $(INC) -Bdynamic -noex
+# SunC appears to miscompile Socket::writeByte by not incrementing the
+# buffer pointer, so no optimization for now
+#CFLAGS=-g -Kpic $(INC) -Bdynamic -noex
+CFLAGS=-g0 -Kpic -noex -xO1 -xlibmil -xlibmopt -features=tmplife -xbuiltin=%all -mt $(INC)
+CXXFLAGS=$(CFLAGS)
+CXX=CC
+
+HDRS= HostChannel.h InvokeMessage.h LoadModuleMessage.h Message.h \
+ ReturnMessage.h Value.h BrowserChannel.h Debug.h DebugLevel.h \
+ SessionHandler.h ServerMethods.h Socket.h AllowedConnections.h \
+ LoadJsniMessage.h InvokeSpecialMessage.h FreeValueMessage.h
+
+OBJS= HostChannel.o LoadModuleMessage.o InvokeMessage.o \
+ ReturnMessage.o ServerMethods.o Debug.o Socket.o \
+ AllowedConnections.o LoadJsniMessage.o InvokeSpecialMessage.o \
+ FreeValueMessage.o
+
+SRCS= HostChannel.cpp LoadModuleMessage.cpp InvokeMessage.cpp \
+ ReturnMessage.cpp ServerMethods.cpp Debug.cpp Socket.cpp \
+ AllowedConnections.cpp LoadJsniMessage.cpp InvokeSpecialMessage.cpp \
+ FreeValueMessage.cpp
+
+OBJ32= $(patsubst %.cpp,obj32/%.o,$(SRCS))
+OBJ64= $(patsubst %.cpp,obj64/%.o,$(SRCS))
+
+all:: libcommon32.a libcommon64.a
+
+libcommon32.a: $(OBJ32) obj32.dir
+ ar -rv $@ $(OBJ32)
+
+libcommon64.a: $(OBJ64) obj64.dir
+ ar -rv $@ $(OBJ64)
+
+obj32.dir:
+ -mkdir obj32
+ touch obj32.dir
+
+obj64.dir:
+ -mkdir obj64
+ touch obj64.dir
+
+obj32/%.o: %.cpp obj32.dir
+ $(CXX) $(CXXFLAGS) -m32 -c $< -o $@
+
+obj64/%.o: %.cpp obj64.dir
+ $(CXX) $(CXXFLAGS) -m64 -c $< -o $@
+
+.PHONY: all clean depend
+
+clean:
+ -rm $(OBJ32) $(OBJ64) libcommon32.a libcommon64.a
+
+depend:
+ $(CXX) -xMMF $(CFLAGS) $(SRCS) >>Makefile.sun
+# makedepend -- $(CFLAGS) -- $(SRCS)
+
+# DO NOT DELETE
+obj32/HostChannel.o obj64/HostChannel.o: Makefile.sun \
+ HostChannel.cpp HostChannel.h Platform.h Message.h \
+ ReturnMessage.h BrowserChannel.h Value.h SessionHandler.h \
+ InvokeMessage.h QuitMessage.h scoped_ptr/scoped_ptr.h
+obj32/LoadModuleMessage.o obj64/LoadModuleMessage.o: Makefile.sun \
+ LoadModuleMessage.cpp LoadModuleMessage.h Message.h \
+ BrowserChannel.h HostChannel.h Platform.h ReturnMessage.h Value.h \
+ SessionHandler.h scoped_ptr/scoped_ptr.h
+obj32/InvokeMessage.o obj64/InvokeMessage.o: Makefile.sun \
+ InvokeMessage.cpp InvokeMessage.h Message.h \
+ BrowserChannel.h Value.h HostChannel.h Platform.h ReturnMessage.h \
+ SessionHandler.h
+obj32/ReturnMessage.o obj64/ReturnMessage.o: Makefile.sun \
+ ReturnMessage.cpp ReturnMessage.h Message.h \
+ BrowserChannel.h Value.h HostChannel.h Platform.h SessionHandler.h
+obj32/ServerMethods.o obj64/ServerMethods.o: Makefile.sun \
+ ServerMethods.cpp ServerMethods.h Value.h \
+ BrowserChannel.h HostChannel.h Platform.h Message.h ReturnMessage.h \
+ SessionHandler.h InvokeMessage.h scoped_ptr/scoped_ptr.h
+obj32/HostChannel.o obj64/HostChannel.o: Makefile.sun \
+ HostChannel.cpp HostChannel.h Platform.h Message.h \
+ ReturnMessage.h BrowserChannel.h Value.h SessionHandler.h \
+ InvokeMessage.h QuitMessage.h scoped_ptr/scoped_ptr.h
+obj32/LoadModuleMessage.o obj64/LoadModuleMessage.o: Makefile.sun \
+ LoadModuleMessage.cpp LoadModuleMessage.h Message.h \
+ BrowserChannel.h HostChannel.h Platform.h ReturnMessage.h Value.h \
+ SessionHandler.h scoped_ptr/scoped_ptr.h
+obj32/InvokeMessage.o obj64/InvokeMessage.o: Makefile.sun \
+ InvokeMessage.cpp InvokeMessage.h Message.h \
+ BrowserChannel.h Value.h HostChannel.h Platform.h ReturnMessage.h \
+ SessionHandler.h
+obj32/InvokeSpecialMessage.o obj64/InvokeSpecialMessage.o: Makefile.sun \
+ InvokeSpecialMessage.cpp InvokeSpecialMessage.h Message.h \
+ BrowserChannel.h Value.h HostChannel.h Platform.h ReturnMessage.h \
+ SessionHandler.h
+obj32/FreeValueMesssage.o obj64/FreeValueMesssage.o: Makefile.sun \
+ FreeValueMesssage.cpp FreeValueMesssage.h Message.h \
+ BrowserChannel.h Value.h HostChannel.h Platform.h ReturnMessage.h \
+ SessionHandler.h
+obj32/ReturnMessage.o obj64/ReturnMessage.o: Makefile.sun \
+ ReturnMessage.cpp ReturnMessage.h Message.h \
+ BrowserChannel.h Value.h HostChannel.h Platform.h SessionHandler.h
+obj32/ServerMethods.o obj64/ServerMethods.o: Makefile.sun \
+ ServerMethods.cpp ServerMethods.h Value.h \
+ BrowserChannel.h HostChannel.h Platform.h Message.h ReturnMessage.h \
+ SessionHandler.h InvokeMessage.h scoped_ptr/scoped_ptr.h
+obj32/Debug.o obj64/Debug.o: Makefile.sun \
+ Debug.cpp Debug.h DebugLevel.h
+obj32/Socket.o obj64/Socket.o: Makefile.sun \
+ Socket.cpp Socket.h Debug.h DebugLevel.h
+obj32/AllowedConnections.o obj64/AllowedConnections.o: Makefile.sun \
+ AllowedConnections.cpp AllowedConnections.h Debug.h DebugLevel.h
diff --git a/plugins/common/Message.h b/plugins/common/Message.h
new file mode 100644
index 0000000..a244e0b
--- /dev/null
+++ b/plugins/common/Message.h
@@ -0,0 +1,28 @@
+#ifndef __MESSAGE_H
+#define __MESSAGE_H
+/*
+ * Copyright 2008 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.
+ */
+
+class Message {
+public:
+ virtual char getType() const = 0;
+ virtual bool isAsynchronous() const {
+ return false;
+ }
+ virtual ~Message() {}
+};
+
+#endif
diff --git a/plugins/common/Platform.h b/plugins/common/Platform.h
new file mode 100644
index 0000000..bbc0334
--- /dev/null
+++ b/plugins/common/Platform.h
@@ -0,0 +1,46 @@
+#ifndef _H_Platform
+#define _H_Platform
+/*
+ * Copyright 2008 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.
+ */
+
+// Platform-specific hacks to enable more shared code elsewhere
+#ifdef _WINDOWS
+typedef __int32 int32_t;
+typedef unsigned __int32 uint32_t;
+typedef __int16 int16_t;
+typedef unsigned __int16 uint16_t;
+typedef __int64 int64_t;
+typedef unsigned __int64 uint64_t;
+typedef long ssize_t;
+
+#define snprintf sprintf_s
+#define SOCKETTYPE SOCKET
+// Bogus conversion from size_t -> unsigned int warnings.
+#pragma warning(disable:4267)
+#else
+#define SOCKETTYPE int
+#endif
+
+// Set the float byte-order if we know it -- see ByteOrder.h FloatByteOrder
+#if defined(i386) || defined(i586) || defined(i686) || defined(_x86)
+#define PLATFORM_FLOAT_ENDIANESS FLOAT_LITTLE_ENDIAN
+#endif
+
+#if defined(__sparc)
+#define PLATFORM_FLOAT_ENDIANESS FLOAT_BIG_ENDIAN
+#endif
+
+#endif
diff --git a/plugins/common/ProtocolVersionMessage.cpp b/plugins/common/ProtocolVersionMessage.cpp
new file mode 100644
index 0000000..e2db3f9
--- /dev/null
+++ b/plugins/common/ProtocolVersionMessage.cpp
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2008 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.
+ */
+
+#include "ProtocolVersionMessage.h"
+#include "HostChannel.h"
+#include "scoped_ptr/scoped_ptr.h"
+
+ProtocolVersionMessage::~ProtocolVersionMessage() {
+}
+
+char ProtocolVersionMessage::getType() const {
+ return TYPE;
+}
+
+/**
+ * Receive a ProtocolVersion message from the server.
+ */
+ProtocolVersionMessage* ProtocolVersionMessage::receive(HostChannel& channel) {
+ int version;
+ if (!channel.readInt(version)) {
+ // TODO(jat): error handling
+ printf("Failed to read version\n");
+ return 0;
+ }
+ return new ProtocolVersionMessage(version);
+}
+
+/**
+ * Send a ProtocolVersion message on the channel.
+ */
+bool ProtocolVersionMessage::send(HostChannel& channel, int version) {
+ if (!channel.sendByte(TYPE)) return false;
+ if (!channel.sendInt(version)) return false;
+ return true;
+}
diff --git a/plugins/common/ProtocolVersionMessage.h b/plugins/common/ProtocolVersionMessage.h
new file mode 100644
index 0000000..db6f770
--- /dev/null
+++ b/plugins/common/ProtocolVersionMessage.h
@@ -0,0 +1,54 @@
+#ifndef __PROTOCOLVERSIONMESSAGE_H
+#define __PROTOCOLVERSIONMESSAGE_H
+/*
+ * Copyright 2009 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.
+ */
+
+#include <string>
+#include "Message.h"
+#include "BrowserChannel.h"
+#include "Value.h"
+
+class HostChannel;
+
+/**
+ * Class representing a ProtocolVersion message received from the server, and a
+ * way to send one.
+ *
+ * This message indicates which version of the protocol the server has chosen
+ * for the remainder of the communication.
+ */
+class ProtocolVersionMessage : public Message {
+public:
+ static const char TYPE = MESSAGE_TYPE_PROTOCOL_VERSION;
+private:
+ int version;
+
+protected:
+ /**
+ * @param version selected protocol version
+ */
+ ProtocolVersionMessage(int version) : version(version) {}
+
+public:
+ ~ProtocolVersionMessage();
+ virtual char getType() const;
+
+ int getVersion() const { return version; }
+
+ static ProtocolVersionMessage* receive(HostChannel& channel);
+ static bool send(HostChannel& channel, int version);
+};
+#endif
diff --git a/plugins/common/QuitMessage.h b/plugins/common/QuitMessage.h
new file mode 100644
index 0000000..f8f9b80
--- /dev/null
+++ b/plugins/common/QuitMessage.h
@@ -0,0 +1,42 @@
+#ifndef __H_QuitMessage
+#define __H_QuitMessage
+/*
+ * Copyright 2008 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.
+ */
+
+#include <string>
+#include "Message.h"
+#include "BrowserChannel.h"
+
+/**
+ * This class represents a Quit message sent to the server, indicating the
+ * channel should be closed down.
+ */
+class QuitMessage : public Message {
+public:
+ static const char TYPE = MESSAGE_TYPE_QUIT;
+private:
+ QuitMessage() {}
+
+public:
+ virtual char getType() const {
+ return TYPE;
+ }
+
+ static bool send(HostChannel& channel) {
+ return channel.sendByte(TYPE);
+ }
+};
+#endif
diff --git a/plugins/common/ReturnMessage.cpp b/plugins/common/ReturnMessage.cpp
new file mode 100644
index 0000000..159d009
--- /dev/null
+++ b/plugins/common/ReturnMessage.cpp
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2008 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.
+ */
+
+#include "ReturnMessage.h"
+#include "HostChannel.h"
+
+char ReturnMessage::getType() const {
+ return TYPE;
+}
+
+ReturnMessage* ReturnMessage::receive(HostChannel& channel) {
+ char isException;
+ if (!channel.readByte(isException)) {
+ // TODO(jat): error handling
+ return 0;
+ }
+ gwt::Value retval;
+ if (!channel.readValue(retval)) {
+ // TODO(jat): error handling
+ return 0;
+ }
+ return new ReturnMessage(isException != 0, retval);
+}
+
+bool ReturnMessage::send(HostChannel& channel, bool isException, const gwt::Value& retval) {
+ if (!channel.sendByte(TYPE)) return false;
+ if (!channel.sendByte(isException ? 1 : 0)) return false;
+ return channel.sendValue(retval);
+}
diff --git a/plugins/common/ReturnMessage.h b/plugins/common/ReturnMessage.h
new file mode 100644
index 0000000..29141ec
--- /dev/null
+++ b/plugins/common/ReturnMessage.h
@@ -0,0 +1,50 @@
+#ifndef __RETURNMESSAGE_H
+#define __RETURNMESSAGE_H
+/*
+ * Copyright 2008 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.
+ */
+
+#include <string>
+#include "Message.h"
+#include "BrowserChannel.h"
+#include "Value.h"
+
+class HostChannel;
+
+/**
+ * Class representing a Return message received from the server, and a way
+ * to send one.
+ *
+ * This message gives the return value of a previous Invoke or LoadModule
+ * message (for the latter, only the exception state is important).
+ */
+class ReturnMessage : public Message {
+ static const char TYPE = MESSAGE_TYPE_RETURN;
+private:
+ bool bisException;
+ gwt::Value retval;
+
+public:
+ ReturnMessage(bool isException, const gwt::Value& retValue) : bisException(isException),
+ retval(retValue) {}
+
+ bool isException() const { return bisException; }
+ const gwt::Value& getReturnValue() const { return retval; }
+ virtual char getType() const;
+
+ static ReturnMessage* receive(HostChannel& channel);
+ static bool send(HostChannel& channel, bool isException, const gwt::Value& retValue);
+};
+#endif
diff --git a/plugins/common/ServerMethods.cpp b/plugins/common/ServerMethods.cpp
new file mode 100644
index 0000000..672b44a
--- /dev/null
+++ b/plugins/common/ServerMethods.cpp
@@ -0,0 +1,149 @@
+/*
+ * Copyright 2008 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.
+ */
+
+#include <string>
+
+#include "Debug.h"
+#include "FreeValueMessage.h"
+#include "HostChannel.h"
+#include "InvokeMessage.h"
+#include "InvokeSpecialMessage.h"
+#include "ReturnMessage.h"
+#include "ServerMethods.h"
+#include "scoped_ptr/scoped_ptr.h"
+
+using std::string;
+
+gwt::Value ServerMethods::getProperty(HostChannel& channel, SessionHandler* handler, int objectRef,
+ int dispatchId) {
+ if (!channel.isConnected()) {
+ Debug::log(Debug::Debugging) << "Ignoring getProperty after disconnect"
+ << Debug::flush;
+ return gwt::Value();
+ }
+ gwt::Value args[2];
+ args[0].setInt(objectRef);
+ args[1].setInt(dispatchId);
+ if (!InvokeSpecialMessage::send(channel, SPECIAL_GET_PROPERTY, 2, args)) {
+ Debug::log(Debug::Error) << " failed to send invoke of GetProperty(disp=" << dispatchId
+ << ", obj=" << objectRef << ")" << Debug::flush;
+ return gwt::Value();
+ }
+ scoped_ptr<ReturnMessage> retMsg(channel.reactToMessagesWhileWaitingForReturn(handler));
+ if (!retMsg.get()) {
+ Debug::log(Debug::Error) << "getProperty: get return value failed for GetProperty(disp="
+ << dispatchId << ", obj=" << objectRef << ")" << Debug::flush;
+ return gwt::Value();
+ }
+ return retMsg->getReturnValue();
+}
+
+int ServerMethods::hasMethod(HostChannel& channel, SessionHandler* handler, int classId,
+ const std::string& name) {
+ if (name != "toString" && name.find("::") == string::npos) {
+ // only JSNI-style names and toString are valid
+ return -1;
+ }
+ if (!channel.isConnected()) {
+ Debug::log(Debug::Debugging) << "Ignoring hasMethod after disconnect"
+ << Debug::flush;
+ return -2;
+ }
+ gwt::Value arg;
+ arg.setString(name);
+ if (!InvokeSpecialMessage::send(channel, SPECIAL_HAS_METHOD, 1, &arg)) {
+ Debug::log(Debug::Error) << "hasMethod: invoke(hasMethod) failed" << Debug::flush;
+ return -2;
+ }
+ scoped_ptr<ReturnMessage> retMsg(channel.reactToMessagesWhileWaitingForReturn(handler));
+ if (!retMsg.get()) {
+ Debug::log(Debug::Error) << "hasMethod: get return value failed" << Debug::flush;
+ return -2;
+ }
+ gwt::Value retval = retMsg->getReturnValue();
+ // TODO(jat): better error handling?
+ return retval.isInt() ? retval.getInt() : -2;
+}
+
+int ServerMethods::hasProperty(HostChannel& channel, SessionHandler* handler, int classId,
+ const std::string& name) {
+ if (name != "toString" && name.find("::") == string::npos) {
+ // only JSNI-style names and toString are valid
+ return -1;
+ }
+ if (!channel.isConnected()) {
+ Debug::log(Debug::Debugging) << "Ignoring hasProperty after disconnect"
+ << Debug::flush;
+ return -2;
+ }
+ gwt::Value arg;
+ arg.setString(name);
+ if (!InvokeSpecialMessage::send(channel, SPECIAL_HAS_PROPERTY, 1, &arg)) {
+ Debug::log(Debug::Error) << "hasProperty: invoke(hasProperty) failed" << Debug::flush;
+ return -2;
+ }
+ scoped_ptr<ReturnMessage> retMsg(channel.reactToMessagesWhileWaitingForReturn(handler));
+ if (!retMsg.get()) {
+ Debug::log(Debug::Error) << "hasProperty: get return value failed" << Debug::flush;
+ return -2;
+ }
+ gwt::Value retval = retMsg->getReturnValue();
+ // TODO(jat): better error handling?
+ return retval.isInt() ? retval.getInt() : -2;
+}
+
+bool ServerMethods::setProperty(HostChannel& channel, SessionHandler* handler, int objectRef,
+ int dispatchId, const gwt::Value& value) {
+ if (!channel.isConnected()) {
+ Debug::log(Debug::Debugging) << "Ignoring setProperty after disconnect"
+ << Debug::flush;
+ return false;
+ }
+ // TODO(jat): error handling?
+ gwt::Value args[3];
+ args[0].setInt(objectRef);
+ args[1].setInt(dispatchId);
+ args[2] = value;
+ if (!InvokeSpecialMessage::send(channel, SPECIAL_SET_PROPERTY, 3, args)) {
+ Debug::log(Debug::Error) << " failed to send invoke of SetProperty(disp=" << dispatchId
+ << ", obj=" << objectRef << ")" << Debug::flush;
+ return false;
+ }
+ scoped_ptr<ReturnMessage> retMsg(channel.reactToMessagesWhileWaitingForReturn(handler));
+ if (!retMsg.get()) {
+ Debug::log(Debug::Error) << "setProperty: get return value failed for SetProperty(disp="
+ << dispatchId << ", obj=" << objectRef << ")" << Debug::flush;
+ return false;
+ }
+ // TODO: use the returned exception?
+ return !retMsg.get()->isException();
+}
+
+bool ServerMethods::freeJava(HostChannel& channel, SessionHandler* handler, int idCount,
+ const int* ids) {
+ // If we are disconnected, assume the server will free all of these anyway.
+ // This deals with the problem of getting finalizers called after the channel is dropped.
+ if (!channel.isConnected()) {
+ Debug::log(Debug::Debugging) << "Ignoring freeJava after disconnect"
+ << Debug::flush;
+ return true;
+ }
+ if (!FreeValueMessage::send(channel, idCount, ids)) {
+ Debug::log(Debug::Error) << " failed to send FreeValues message" << Debug::flush;
+ return false;
+ }
+ return true;
+}
diff --git a/plugins/common/ServerMethods.h b/plugins/common/ServerMethods.h
new file mode 100644
index 0000000..02bf921
--- /dev/null
+++ b/plugins/common/ServerMethods.h
@@ -0,0 +1,78 @@
+#ifndef _H_ServerMethods
+#define _H_ServerMethods
+/*
+ * Copyright 2008 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.
+ */
+
+#include "Value.h"
+
+class HostChannel;
+class SessionHandler;
+
+/**
+ * Encapsulates the methods defined on the special server object.
+ */
+class ServerMethods {
+public:
+ /**
+ * Get the value of a property on an object.
+ *
+ * @param objectRef ID of object to fetch field on
+ * @param dispatchID dispatch ID of field
+ * @return the value of the property, undef if none (or on error)
+ */
+ static gwt::Value getProperty(HostChannel& channel, SessionHandler* handler, int objectRef,
+ int dispatchId);
+
+ /**
+ * Lookup the named method on the specified class.
+ *
+ * @return the dispatch ID (non-negative) of the method if present, or -1 if not.
+ * If an error is encountered, -2 is returned.
+ */
+ static int hasMethod(HostChannel& channel, SessionHandler* handler, int classId,
+ const std::string& name);
+
+ /**
+ * Lookup the named property on the specified class.
+ *
+ * @return the dispatch ID (non-negative) of the property if present, or -1 if not.
+ * If an error is encountered, -2 is returned.
+ */
+ static int hasProperty(HostChannel& channel, SessionHandler* handler, int classId,
+ const std::string& name);
+
+ /**
+ * Set the value of a property on an object.
+ *
+ * @param objectRef ID of object to fetch field on
+ * @param dispatchID dispatch ID of field
+ * @param value value to store in the property
+ * @return false if an error occurred
+ */
+ static bool setProperty(HostChannel& channel, SessionHandler* handler, int objectRef,
+ int dispatchId, const gwt::Value& value);
+
+ /**
+ * Tell the server that the client no longer has any references to the specified
+ * Java object.
+ *
+ * @param objcetRef ID of object to free
+ * @return false if an error occurred
+ */
+ static bool freeJava(HostChannel& channel, SessionHandler* handler, int idCount, const int* ids);
+};
+
+#endif
diff --git a/plugins/common/SessionHandler.h b/plugins/common/SessionHandler.h
new file mode 100644
index 0000000..159f762
--- /dev/null
+++ b/plugins/common/SessionHandler.h
@@ -0,0 +1,111 @@
+#ifndef _H_SessionHandler
+#define _H_SessionHandler
+/*
+ * Copyright 2008 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.
+ */
+
+#include "BrowserChannel.h"
+#include "Value.h"
+
+class HostChannel;
+
+/**
+ * Interface for session-handling needs.
+ *
+ * Note that if this is being "added" onto a class which extends a C structure, the inheritance
+ * chain leading to the plain C object must be first in the inheritance list.
+ *
+ * For example:
+ *
+ * extern "C" {
+ * typedef struct PlainCstruct {
+ * ... data only members here
+ * } PlainCstruct;
+ * };
+ *
+ * class MyWrapper: public PlainCstruct, SessionHandler {
+ * ... virtual functions ok here
+ * };
+ */
+class SessionHandler {
+ friend class HostChannel;
+public:
+ enum SpecialMethodId {
+ HasMethod = SPECIAL_HAS_METHOD,
+ HasProperty = SPECIAL_HAS_PROPERTY,
+ GetProperty = SPECIAL_GET_PROPERTY,
+ SetProperty = SPECIAL_SET_PROPERTY
+ };
+protected:
+ SessionHandler(): alreadyDisconnected(false) {
+ }
+
+ /**
+ * Called by the server socket when it cannot read, write, or flush.
+ */
+ void disconnectDetected() {
+ if (!alreadyDisconnected) {
+ alreadyDisconnected = true;
+ disconnectDetectedImpl();
+ }
+ }
+
+ /**
+ * Implementors should invoke __gwt_disconnected() in the hosted.html window
+ * to "glass" the screen with a disconnect message.
+ */
+ virtual void disconnectDetectedImpl() = 0;
+
+ /**
+ * Report a fatal error -- the channel will be closed after this method
+ * returns.
+ */
+ virtual void fatalError(HostChannel& channel, const std::string& message) = 0;
+
+ virtual void freeValue(HostChannel& channel, int idCount, const int* ids) = 0;
+
+ virtual void loadJsni(HostChannel& channel, const std::string& js) = 0;
+
+ /**
+ * Does not own any of its args -- must copy them if it wants them and should not free the
+ * ones passed in.
+ *
+ * Returns true if an exception occurred.
+ */
+ virtual bool invoke(HostChannel& channel, const gwt::Value& thisObj,
+ const std::string& methodName, int numArgs, const gwt::Value* const args,
+ gwt::Value* returnValue) = 0;
+
+ /**
+ * Invoke a plugin-provided method with the given args. As above, this method does not own
+ * any of its args.
+ *
+ * Returns true if an exception occurred.
+ */
+ virtual bool invokeSpecial(HostChannel& channel, SpecialMethodId method, int numArgs,
+ const gwt::Value* const args, gwt::Value* returnValue) = 0;
+
+ /**
+ * Send any queued up free values back to the server.
+ */
+ virtual void sendFreeValues(HostChannel& channel) = 0;
+
+ virtual ~SessionHandler() {}
+
+private:
+ bool alreadyDisconnected;
+};
+
+#endif
diff --git a/plugins/common/Socket.cpp b/plugins/common/Socket.cpp
new file mode 100644
index 0000000..fd32461
--- /dev/null
+++ b/plugins/common/Socket.cpp
@@ -0,0 +1,174 @@
+/*
+ * Copyright 2008 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.
+ */
+
+#include "Platform.h"
+
+#include <cstdio>
+#include <cstdlib>
+#include <cstring>
+#include <cerrno>
+
+#include "Socket.h"
+
+void Socket::init() {
+#ifdef _WINDOWS
+ // version 2.2 supported on Win95OSR2/WinNT4 and up
+ WORD winsockVers = MAKEWORD(2, 2);
+ WSADATA wsaData;
+ int err = WSAStartup(winsockVers, &wsaData);
+ if (err) {
+ // TODO(jat): report error
+ Debug::log(Debug::Error) << "WSAStartup(vers=2.2): err=" << err << Debug::flush;
+ }
+#endif
+}
+
+bool Socket::connect(const char* host, int port) {
+ Debug::log(Debug::Debugging) << "Socket::connect(host=" << host << ",port=" << port << ")"
+ << Debug::flush;
+ if (isConnected()) {
+ Debug::log(Debug::Error) << "Socket::connect - already connected" << Debug::flush;
+ return false;
+ }
+
+ SOCKETTYPE fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+ if (fd < 0) {
+ Debug::log(Debug::Error) << "Socket::connect - can't get socket" << Debug::flush;
+ return false;
+ }
+#ifdef SO_NOSIGPIPE
+ // On BSD, we need to suppress the SIGPIPE if the remote end disconnects.
+ int option_value = 1;
+ if (setsockopt(fd, SOL_SOCKET, SO_NOSIGPIPE, &option_value, sizeof(int))) {
+ Debug::log(Debug::Error) << "Socket::connect - can't set NOSIGPIPE option" << Debug::flush;
+ return false;
+ }
+#endif
+
+ struct sockaddr_in sockAddr;
+ memset(&sockAddr, 0, static_cast<int>(sizeof(sockAddr)));
+ // check for numeric IP4 addresses first
+ // TODO(jat): handle IPv6 addresses
+ unsigned long numericAddr = inet_addr(host);
+ if (numericAddr != 0xFFFFFFFF) {
+ sockAddr.sin_addr.s_addr = numericAddr;
+ sockAddr.sin_family = AF_INET;
+ } else {
+ struct hostent* hent = gethostbyname(host);
+ if (!hent || !hent->h_addr_list[0]) {
+ Debug::log(Debug::Error) << "Unable to get address for " << host << Debug::flush;
+ return false;
+ }
+ memcpy(&(sockAddr.sin_addr), hent->h_addr_list[0], hent->h_length);
+ sockAddr.sin_family = hent->h_addrtype;
+ }
+ sockAddr.sin_port = htons(port);
+
+ if (::connect(fd, (struct sockaddr*) &sockAddr, sizeof(sockAddr)) < 0) {
+#ifdef _WINDOWS
+ char buf[256];
+ DWORD dwLastError = ::GetLastError();
+ strerror_s(buf, sizeof(buf), dwLastError);
+ Debug::log(Debug::Error) << "Failed to connect to " << host << ":" << port << " -- error code "
+ << dwLastError << Debug::flush;
+ closesocket(fd);
+ ::SetLastError(dwLastError);
+#else
+ Debug::log(Debug::Error) << "Can't connect to " << host << ":" << port << " -- "
+ << strerror(errno) << Debug::flush;
+ close(fd);
+#endif
+ return false;
+ }
+ sock = fd;
+ connected = true;
+ readBufPtr = readValid = readBuf;
+ writeBufPtr = writeBuf;
+#ifdef _WINDOWS
+ Debug::log(Debug::Spam) << " connected" << Debug::flush;
+#else
+ Debug::log(Debug::Spam) << " connected, fd=" << fd << Debug::flush;
+#endif
+ return true;
+}
+
+bool Socket::disconnect(bool doFlush) {
+ if (connected) {
+ Debug::log(Debug::Debugging) << "Disconnecting socket" << Debug::flush;
+ if (doFlush) {
+ flush();
+ }
+ connected = false;
+#ifdef _WINDOWS
+ closesocket(sock);
+#else
+ shutdown(sock, SHUT_RDWR);
+ close(sock);
+#endif
+ }
+ return true;
+}
+
+bool Socket::emptyWriteBuf() {
+ size_t len = writeBufPtr - writeBuf;
+ Debug::log(Debug::Spam) << "Socket::emptyWriteBuf: len=" << len << Debug::flush;
+ ++numWrites;
+ totWriteBytes += len;
+ if (len > maxWriteBytes) {
+ maxWriteBytes = len;
+ }
+ for (char* ptr = writeBuf; len > 0; ) {
+ ssize_t n = send(sock, ptr, len, 0);
+ if (n <= 0) {
+ if (errno == EPIPE) {
+ Debug::log(Debug::Warning) << "Other end of socket disconnected" << Debug::flush;
+ disconnect(false);
+ return false;
+ }
+ Debug::log(Debug::Error) << "Error " << errno << " writing " << len << " bytes to socket"
+ << Debug::flush;
+ return false;
+ }
+ ptr += n;
+ len -= n;
+ }
+ writeBufPtr = writeBuf;
+ return true;
+}
+
+bool Socket::fillReadBuf() {
+ readBufPtr = readBuf;
+ errno = 0;
+ ssize_t n = recv(sock, readBuf, BUF_SIZE, 0);
+ if (n <= 0) {
+ // EOF results in no error
+ if (!errno || errno == EPIPE) {
+ Debug::log(Debug::Warning) << "Other end of socket disconnected" << Debug::flush;
+ disconnect(false);
+ return false;
+ }
+ Debug::log(Debug::Error) << "Error " << errno << " reading " << BUF_SIZE << " bytes from socket"
+ << Debug::flush;
+ return false;
+ }
+ ++numReads;
+ totReadBytes += n;
+ if (static_cast<size_t>(n) > maxReadBytes) {
+ maxReadBytes = n;
+ }
+ readValid = readBuf + n;
+ return true;
+}
diff --git a/plugins/common/Socket.h b/plugins/common/Socket.h
new file mode 100644
index 0000000..90298f6
--- /dev/null
+++ b/plugins/common/Socket.h
@@ -0,0 +1,170 @@
+#ifndef _H_Socket
+#define _H_Socket
+/*
+ * Copyright 2008 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.
+ */
+
+#include "Platform.h"
+#include "Debug.h"
+
+#include <string>
+
+#ifdef _WINDOWS
+#include <winsock2.h>
+#include <ws2tcpip.h>
+#else
+#include <netdb.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <unistd.h>
+#include <sys/time.h>
+#endif
+
+/**
+ * Encapsulates platform dependencies regarding buffered sockets.
+ */
+class Socket {
+private:
+ // Buffer size, chosen to fit in a single packet after TCP/IP overhead.
+ static const int BUF_SIZE = 1400;
+
+ // Can't rely on a sentinel value for the socket descriptor
+ bool connected;
+
+ SOCKETTYPE sock;
+
+ // Read buffer
+ char* readBuf;
+
+ // One bye past end of valid data in readBuf
+ char* readValid;
+
+ // Current read pointer
+ char* readBufPtr;
+
+ // Write buffer
+ char* writeBuf;
+
+ // Current write pointer
+ char* writeBufPtr;
+
+ // Stats
+ unsigned long numReads;
+ unsigned long long totReadBytes;
+ size_t maxReadBytes;
+
+ unsigned long numWrites;
+ unsigned long long totWriteBytes;
+ size_t maxWriteBytes;
+
+private:
+ void init();
+ bool fillReadBuf();
+ bool emptyWriteBuf();
+
+public:
+ Socket() : connected(false), readBuf(new char[BUF_SIZE]), writeBuf(new char[BUF_SIZE]) {
+ readBufPtr = readValid = readBuf;
+ writeBufPtr = writeBuf;
+ numReads = numWrites = 0;
+ maxReadBytes = maxWriteBytes = 0;
+ totReadBytes = totWriteBytes = 0;
+ init();
+ }
+
+ ~Socket() {
+ disconnect();
+#ifdef _WINDOWS
+ if (0) WSACleanup();
+#endif
+ // TODO(jat): LEAK LEAK LEAK
+ // delete[] readBuf;
+ // delete[] writeBuf;
+ Debug::log(Debug::Debugging) << "Socket: #r=" << numReads << ", bytes/read="
+ << (numReads ? totReadBytes / numReads : 0) << ", maxr=" << maxReadBytes << "; #w="
+ << numWrites << ", bytes/write=" << (numWrites ? totWriteBytes / numWrites : 0) << ", maxw="
+ << maxWriteBytes << Debug::flush;
+ }
+
+ /**
+ * Connects this socket to a specified port on a host.
+ *
+ * @param host host name or IP address to connect to
+ * @param port TCP port to connect to
+ * @return true if the connection succeeds
+ */
+ bool connect(const char* host, int port);
+
+ /**
+ * Returns true if the socket is connected.
+ */
+ bool isConnected() const {
+ return connected;
+ }
+
+ /**
+ * Disconnect this socket.
+ *
+ * @param doFlush true (the default value) if the socket should be flushed.
+ * @return true if disconnect succeeds
+ */
+ bool disconnect(bool doFlush = true);
+
+ /**
+ * Read a single byte from the socket.
+ *
+ * @return -1 on error, otherwise unsigned byte read.
+ */
+ int readByte() {
+ if (readBufPtr >= readValid) {
+ if (!fillReadBuf()) {
+ return -1;
+ }
+ }
+ return static_cast<unsigned char>(*readBufPtr++);
+ }
+
+ /**
+ * Write a single byte to the socket.
+ *
+ * @return true on success.
+ */
+ bool writeByte(char c) {
+ if (writeBufPtr >= writeBuf + BUF_SIZE) {
+ if (!emptyWriteBuf()) {
+ return false;
+ }
+ }
+ *writeBufPtr++ = c;
+ return true;
+ }
+
+ /**
+ * Flush any pending writes on the socket.
+ *
+ * @return true on success
+ */
+ bool flush() {
+ if (writeBufPtr > writeBuf) {
+ if (!emptyWriteBuf()) {
+ return false;
+ }
+ }
+ return true;
+ }
+};
+
+#endif
diff --git a/plugins/common/SwitchTransportMessage.cpp b/plugins/common/SwitchTransportMessage.cpp
new file mode 100644
index 0000000..ccb5520
--- /dev/null
+++ b/plugins/common/SwitchTransportMessage.cpp
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2008 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.
+ */
+
+#include "SwitchTransportMessage.h"
+#include "HostChannel.h"
+#include "scoped_ptr/scoped_ptr.h"
+
+SwitchTransportMessage::~SwitchTransportMessage() {
+}
+
+char SwitchTransportMessage::getType() const {
+ return TYPE;
+}
+
+/**
+ * Receive a SwitchTransport message from the server.
+ */
+SwitchTransportMessage* SwitchTransportMessage::receive(HostChannel& channel) {
+ std::string transport;
+ if (!channel.readString(transport)) {
+ // TODO(jat): error handling
+ printf("Failed to read transport\n");
+ return 0;
+ }
+ return new SwitchTransportMessage(transport);
+}
+
+/**
+ * Send a fatal error message on the channel.
+ */
+bool SwitchTransportMessage::send(HostChannel& channel,
+ const std::string& transport) {
+ if (!channel.sendByte(TYPE)) return false;
+ if (!channel.sendString(transport)) return false;
+ return true;
+}
diff --git a/plugins/common/SwitchTransportMessage.h b/plugins/common/SwitchTransportMessage.h
new file mode 100644
index 0000000..0dad82a
--- /dev/null
+++ b/plugins/common/SwitchTransportMessage.h
@@ -0,0 +1,53 @@
+#ifndef __SWITCHTRANSPORTMESSAGE_H
+#define __SWITCHTRANSPORTMESSAGE_H
+/*
+ * Copyright 2009 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.
+ */
+
+#include <string>
+#include "Message.h"
+#include "BrowserChannel.h"
+#include "Value.h"
+
+class HostChannel;
+
+/**
+ * Class representing an SwitchTransport message received from the server, and a
+ * way to send one.
+ *
+ * The SwitchTransport message is sent by the server in response to a
+ * ChooseTransport message, and will select one of the available transports
+ * advertised by the client. The empty string represents the in-band channel,
+ * and is always an acceptable response.
+ */
+class SwitchTransportMessage : public Message {
+public:
+ static const char TYPE = MESSAGE_TYPE_SWITCH_TRANSPORT;
+private:
+ std::string transport;
+
+protected:
+ SwitchTransportMessage(const std::string& transport) : transport(transport) {}
+
+public:
+ ~SwitchTransportMessage();
+ virtual char getType() const;
+
+ const std::string& getTransport() const { return transport; }
+
+ static SwitchTransportMessage* receive(HostChannel& channel);
+ static bool send(HostChannel& channel, const std::string& transport);
+};
+#endif
diff --git a/plugins/common/Value.h b/plugins/common/Value.h
new file mode 100644
index 0000000..ab50f5e
--- /dev/null
+++ b/plugins/common/Value.h
@@ -0,0 +1,399 @@
+#ifndef _H_Value
+#define _H_Value
+/*
+ * Copyright 2008 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.
+ */
+
+#ifndef _WINDOWS
+// TODO(jat): remove; for abort() which should probably go away
+#include <stdlib.h>
+#endif
+
+#include <string>
+
+#include "Debug.h"
+
+#include "BrowserChannel.h"
+
+namespace gwt {
+class Value {
+public:
+ enum ValueType {
+ NULL_TYPE = VALUE_TYPE_NULL,
+ BOOLEAN = VALUE_TYPE_BOOLEAN,
+ BYTE = VALUE_TYPE_BYTE,
+ CHAR = VALUE_TYPE_CHAR,
+ SHORT = VALUE_TYPE_SHORT,
+ INT = VALUE_TYPE_INT,
+ LONG = VALUE_TYPE_LONG,
+ FLOAT = VALUE_TYPE_FLOAT,
+ DOUBLE = VALUE_TYPE_DOUBLE,
+ STRING = VALUE_TYPE_STRING,
+ JAVA_OBJECT = VALUE_TYPE_JAVA_OBJECT,
+ JS_OBJECT = VALUE_TYPE_JS_OBJECT,
+ UNDEFINED = VALUE_TYPE_UNDEFINED
+ };
+
+private:
+ ValueType type;
+ union {
+ bool boolValue;
+ unsigned char byteValue;
+ unsigned short charValue;
+ double doubleValue;
+ float floatValue;
+ int32_t intValue;
+ int64_t longValue;
+ short shortValue;
+ std::string* stringValue;
+ } value;
+
+public:
+ Value() {
+ type = UNDEFINED;
+ }
+
+ Value(const Value& other) {
+ copyValue(other);
+ }
+
+ Value& operator=(const Value& other) {
+ clearOldValue();
+ copyValue(other);
+ return *this;
+ }
+
+ ~Value() {
+ clearOldValue();
+ }
+
+ bool getBoolean() const {
+ assertType(BOOLEAN);
+ return value.boolValue;
+ }
+
+ unsigned char getByte() const {
+ assertType(BYTE);
+ return value.byteValue;
+ }
+
+ unsigned short getChar() const {
+ assertType(CHAR);
+ return value.charValue;
+ }
+
+ double getDouble() const {
+ assertType(DOUBLE);
+ return value.doubleValue;
+ }
+
+ float getFloat() const {
+ assertType(FLOAT);
+ return value.floatValue;
+ }
+
+ int getInt() const {
+ assertType(INT);
+ return value.intValue;
+ }
+
+ int getJavaObjectId() const {
+ assertType(JAVA_OBJECT);
+ return value.intValue;
+ }
+
+ int getJsObjectId() const {
+ assertType(JS_OBJECT);
+ return value.intValue;
+ }
+
+ int64_t getLong() const {
+ assertType(LONG);
+ return value.longValue;
+ }
+
+ short getShort() const {
+ assertType(SHORT);
+ return value.shortValue;
+ }
+
+ const std::string getString() const {
+ assertType(STRING);
+ return std::string(*value.stringValue);
+ }
+
+ ValueType getType() const {
+ return type;
+ }
+
+ bool isBoolean() const {
+ return type == BOOLEAN;
+ }
+
+ bool isByte() const {
+ return type == BYTE;
+ }
+
+ bool isChar() const {
+ return type == CHAR;
+ }
+
+ bool isDouble() const {
+ return type == DOUBLE;
+ }
+
+ bool isFloat() const {
+ return type == FLOAT;
+ }
+
+ bool isInt() const {
+ return type == INT;
+ }
+
+ bool isJavaObject() const {
+ return type == JAVA_OBJECT;
+ }
+
+ bool isJsObject() const {
+ return type == JS_OBJECT;
+ }
+
+ bool isLong() const {
+ return type == LONG;
+ }
+
+ bool isNull() const {
+ return type == NULL_TYPE;
+ }
+
+ bool isNumber() const {
+ switch (type) {
+ case BYTE:
+ case CHAR:
+ case DOUBLE:
+ case FLOAT:
+ case INT:
+ case LONG:
+ case SHORT:
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ bool isPrimitive() const {
+ switch (type) {
+ case BOOLEAN:
+ case BYTE:
+ case CHAR:
+ case DOUBLE:
+ case FLOAT:
+ case INT:
+ case LONG:
+ case SHORT:
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ bool isShort() const {
+ return type == SHORT;
+ }
+
+ bool isString() const {
+ return type == STRING;
+ }
+
+ bool isUndefined() const {
+ return type == UNDEFINED;
+ }
+
+ void setBoolean(bool val) {
+ clearOldValue();
+ type = BOOLEAN;
+ value.boolValue = val;
+ }
+
+ void setByte(unsigned char val) {
+ clearOldValue();
+ type = BYTE;
+ value.byteValue = val;
+ }
+
+ void setChar(unsigned short val) {
+ clearOldValue();
+ type = CHAR;
+ value.charValue = val;
+ }
+
+ void setDouble(double val) {
+ clearOldValue();
+ type = DOUBLE;
+ value.doubleValue = val;
+ }
+
+ void setDouble(const double* val) {
+ clearOldValue();
+ type = DOUBLE;
+ value.doubleValue = *val;
+ }
+
+ void setFloat(float val) {
+ clearOldValue();
+ type = FLOAT;
+ value.floatValue = val;
+ }
+
+ void setInt(int val) {
+ clearOldValue();
+ type = INT;
+ value.intValue = val;
+ }
+
+ void setJavaObject(int objectId) {
+ clearOldValue();
+ type = JAVA_OBJECT;
+ value.intValue = objectId;
+ }
+
+ void setJsObjectId(int val) {
+ clearOldValue();
+ type = JS_OBJECT;
+ value.intValue = val;
+ }
+
+ void setLong(int64_t val) {
+ clearOldValue();
+ type = LONG;
+ value.longValue = val;
+ }
+
+ void setNull() {
+ clearOldValue();
+ type = NULL_TYPE;
+ }
+
+ void setShort(short val) {
+ clearOldValue();
+ type = SHORT;
+ value.shortValue = val;
+ }
+
+ void setString(const char* chars, int len) {
+ setString(std::string(chars, len));
+ }
+
+ void setString(const std::string& val) {
+ clearOldValue();
+ type = STRING;
+ value.stringValue = new std::string(val);
+ }
+
+ void setUndefined() {
+ clearOldValue();
+ type = UNDEFINED;
+ }
+
+ std::string toString() const {
+ char buf[64];
+ switch (type) {
+ case NULL_TYPE:
+ return "null";
+ case BOOLEAN:
+ snprintf(buf, sizeof(buf), "boolean(%s)", getBoolean() ? "true"
+ : "false");
+ return std::string(buf);
+ case BYTE:
+ snprintf(buf, sizeof(buf), "byte(%d)", getByte());
+ return std::string(buf);
+ case CHAR:
+ snprintf(buf, sizeof(buf), "char(%d)", getChar());
+ return std::string(buf);
+ case SHORT:
+ snprintf(buf, sizeof(buf), "short(%d)", getShort());
+ return std::string(buf);
+ case INT:
+ snprintf(buf, sizeof(buf), "int(%d)", getInt());
+ return std::string(buf);
+ case LONG:
+ snprintf(buf, sizeof(buf), "long(%lld)",
+ static_cast<long long>(getLong()));
+ return std::string(buf);
+ case FLOAT:
+ snprintf(buf, sizeof(buf), "float(%g)", getFloat());
+ return std::string(buf);
+ case DOUBLE:
+ snprintf(buf, sizeof(buf), "double(%g)", getDouble());
+ return std::string(buf);
+ case STRING:
+ snprintf(buf, sizeof(buf), "string(%.20s)", getString().c_str());
+ return std::string(buf);
+ case JAVA_OBJECT:
+ snprintf(buf, sizeof(buf), "JavaObj(%d)", getJavaObjectId());
+ return std::string(buf);
+ case JS_OBJECT:
+ snprintf(buf, sizeof(buf), "JsObj(%d)", getJsObjectId());
+ return std::string(buf);
+ case UNDEFINED:
+ return "undefined";
+ default:
+ return "Unknown type";
+ }
+ }
+
+private:
+ void assertType(ValueType reqType) const {
+ if (type != reqType) {
+ Debug::log(Debug::Error) << "Value::assertType - expecting type "
+ << int(reqType) << ", was " << int(type) << Debug::flush;
+ // TODO(jat): is this portable? Should we do something else here?
+ abort();
+ }
+ }
+
+ void clearOldValue() {
+ if (type == STRING) {
+ delete value.stringValue;
+ type = UNDEFINED;
+ }
+ }
+
+ // Precondition: existing value, if any, has been cleared
+ void copyValue(const Value& other) {
+ type = other.type;
+ value = other.value;
+ // handle deep copies of value types that need it
+ switch (type) {
+ case STRING:
+ value.stringValue = new std::string(*value.stringValue);
+ break;
+ default:
+ // no other values need deep copies
+ break;
+ }
+ }
+};
+
+inline Debug::DebugStream& operator<<(Debug::DebugStream& dbg, const Value& val) {
+ if (dbg.isActive()) {
+ dbg << val.toString();
+ }
+ return dbg;
+}
+
+} // namespace gwt
+
+#endif
diff --git a/plugins/common/scoped_ptr/README.google b/plugins/common/scoped_ptr/README.google
new file mode 100644
index 0000000..d513e21
--- /dev/null
+++ b/plugins/common/scoped_ptr/README.google
@@ -0,0 +1,27 @@
+Description
+===========
+
+This is the scoped_ptr from Boost with some additions by Google.
+
+Homepage
+========
+
+http://www.boost.org/
+http://www.boost.org/libs/smart_ptr/scoped_ptr.htm
+
+License
+=======
+
+http://boost.org/LICENSE_1_0.txt
+
+Source files and modifications
+==============================
+
+scoped_ptr_malloc added in by Ray Sidney of Google. When one of these goes
+out of scope, instead of doing a delete or delete[], it calls free().
+scoped_ptr_malloc<char> is likely to see much more use than any other
+specializations.
+
+release() added in by Spencer Kimball of Google. Use this to conditionally
+transfer ownership of a heap-allocated object to the caller, usually on
+method success.
diff --git a/plugins/common/scoped_ptr/scoped_ptr.h b/plugins/common/scoped_ptr/scoped_ptr.h
new file mode 100644
index 0000000..1ae1b96
--- /dev/null
+++ b/plugins/common/scoped_ptr/scoped_ptr.h
@@ -0,0 +1,364 @@
+#ifndef SCOPED_PTR_H
+#define SCOPED_PTR_H
+
+// (C) Copyright Greg Colvin and Beman Dawes 1998, 1999.
+// Copyright (c) 2001, 2002 Peter Dimov
+//
+// Permission is hereby granted, free of charge, to any person or organization
+// obtaining a copy of the software and accompanying documentation covered by
+// this license (the "Software") to use, reproduce, display, distribute,
+// execute, and transmit the Software, and to prepare derivative works of the
+// Software, and to permit third-parties to whom the Software is furnished to
+// do so, all subject to the following:
+//
+// The copyright notices in the Software and this entire statement, including
+// the above license grant, this restriction and the following disclaimer,
+// must be included in all copies of the Software, in whole or in part, and
+// all derivative works of the Software, unless such copies or derivative
+// works are solely in the form of machine-executable object code generated by
+// a source language processor.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
+// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
+// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
+// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+//
+// See http://www.boost.org/libs/smart_ptr/scoped_ptr.htm for documentation.
+//
+//
+// scoped_ptr mimics a built-in pointer except that it guarantees deletion
+// of the object pointed to, either on destruction of the scoped_ptr or via
+// an explicit reset(). scoped_ptr is a simple solution for simple needs;
+// use shared_ptr if your needs are more complex.
+//
+// *** NOTE ***
+// If your scoped_ptr is a class member of class FOO pointing to a
+// forward declared type BAR (as shown below), then at creation (and
+// destruction) of an object of type FOO, BAR must be complete. You can do
+// this by either:
+// - Making all FOO constructors and destructors non-inlined to FOO's class
+// definition, instead placing them in foo.cc below an include of bar.h
+// - Including bar.h before any creation or destruction of any object of
+// type FOO
+// The former is probably the less error-prone method, as shown below.
+//
+// Example:
+//
+// -- foo.h --
+// class BAR;
+//
+// class FOO {
+// public:
+// FOO(); // Required for sources that instantiate class FOO to compile!
+// ~FOO(); // Required for sources that instantiate class FOO to compile!
+//
+// private:
+// scoped_ptr<BAR> bar_;
+// };
+//
+// -- foo.cc --
+// #include "bar.h"
+// #include "foo.h"
+// FOO::FOO() {} // Empty, but must be non-inlined to FOO's class definition.
+// FOO::~FOO() {} // Empty, but must be non-inlined to FOO's class definition.
+//
+// scoped_ptr_malloc added in by Ray Sidney of Google. When one of
+// these goes out of scope, instead of doing a delete or delete[], it
+// calls free(). scoped_ptr_malloc<char> is likely to see much more
+// use than any other specializations.
+//
+// release() added in by Spencer Kimball of Google. Use this to conditionally
+// transfer ownership of a heap-allocated object to the caller, usually on
+// method success.
+
+#include <cstddef> // for std::ptrdiff_t
+#include <assert.h> // for assert
+#include <stdlib.h> // for free() decl
+
+template <typename T>
+class scoped_ptr;
+
+template <typename T>
+class scoped_ptr {
+ private:
+
+ T* ptr;
+
+ // scoped_ptr's must not be copied. We make sure of that by making the
+ // copy constructor prototype private. At the same time, there is no body
+ // for this constructor. Thus, if anything that has access to private
+ // members of scoped_ptr ever (inadvertently) copies a scoped_ptr, the
+ // linker will complain about missing symbols. This is a good thing!
+ scoped_ptr(scoped_ptr const &);
+ scoped_ptr & operator=(scoped_ptr const &);
+
+ public:
+
+ typedef T element_type;
+
+ explicit scoped_ptr(T* p = 0): ptr(p) {}
+
+ ~scoped_ptr() {
+ typedef char type_must_be_complete[sizeof(T)];
+ delete ptr;
+ }
+
+ void reset(T* p = 0) {
+ typedef char type_must_be_complete[sizeof(T)];
+
+ if (ptr != p) {
+ delete ptr;
+ ptr = p;
+ }
+ }
+
+ T& operator*() const {
+ assert(ptr != 0);
+ return *ptr;
+ }
+
+ T* operator->() const {
+ assert(ptr != 0);
+ return ptr;
+ }
+
+ bool operator==(T* p) const {
+ return ptr == p;
+ }
+
+ bool operator!=(T* p) const {
+ return ptr != p;
+ }
+
+ T* get() const {
+ return ptr;
+ }
+
+ void swap(scoped_ptr & b) {
+ T* tmp = b.ptr;
+ b.ptr = ptr;
+ ptr = tmp;
+ }
+
+ T* release() {
+ T* tmp = ptr;
+ ptr = 0;
+ return tmp;
+ }
+
+ private:
+
+ // no reason to use these: each scoped_ptr should have its own object
+ template <typename U> bool operator==(scoped_ptr<U> const& p) const;
+ template <typename U> bool operator!=(scoped_ptr<U> const& p) const;
+};
+
+template<typename T> inline
+void swap(scoped_ptr<T>& a, scoped_ptr<T>& b) {
+ a.swap(b);
+}
+
+template<typename T> inline
+bool operator==(T* p, const scoped_ptr<T>& b) {
+ return p == b.get();
+}
+
+template<typename T> inline
+bool operator!=(T* p, const scoped_ptr<T>& b) {
+ return p != b.get();
+}
+
+// scoped_array extends scoped_ptr to arrays. Deletion of the array pointed to
+// is guaranteed, either on destruction of the scoped_array or via an explicit
+// reset(). Use shared_array or std::vector if your needs are more complex.
+
+template<typename T>
+class scoped_array {
+ private:
+
+ T* ptr;
+
+ scoped_array(scoped_array const &);
+ scoped_array & operator=(scoped_array const &);
+
+ public:
+
+ typedef T element_type;
+
+ explicit scoped_array(T* p = 0) : ptr(p) {}
+
+ ~scoped_array() {
+ typedef char type_must_be_complete[sizeof(T)];
+ delete[] ptr;
+ }
+
+ void reset(T* p = 0) {
+ typedef char type_must_be_complete[sizeof(T)];
+
+ if (ptr != p) {
+ delete [] ptr;
+ ptr = p;
+ }
+ }
+
+ T& operator[](std::ptrdiff_t i) const {
+ assert(ptr != 0);
+ assert(i >= 0);
+ return ptr[i];
+ }
+
+ bool operator==(T* p) const {
+ return ptr == p;
+ }
+
+ bool operator!=(T* p) const {
+ return ptr != p;
+ }
+
+ T* get() const {
+ return ptr;
+ }
+
+ void swap(scoped_array & b) {
+ T* tmp = b.ptr;
+ b.ptr = ptr;
+ ptr = tmp;
+ }
+
+ T* release() {
+ T* tmp = ptr;
+ ptr = 0;
+ return tmp;
+ }
+
+ private:
+
+ // no reason to use these: each scoped_array should have its own object
+ template <typename U> bool operator==(scoped_array<U> const& p) const;
+ template <typename U> bool operator!=(scoped_array<U> const& p) const;
+};
+
+template<class T> inline
+void swap(scoped_array<T>& a, scoped_array<T>& b) {
+ a.swap(b);
+}
+
+template<typename T> inline
+bool operator==(T* p, const scoped_array<T>& b) {
+ return p == b.get();
+}
+
+template<typename T> inline
+bool operator!=(T* p, const scoped_array<T>& b) {
+ return p != b.get();
+}
+
+
+// This class wraps the c library function free() in a class that can be
+// passed as a template argument to scoped_ptr_malloc below.
+class ScopedPtrMallocFree {
+ public:
+ inline void operator()(void* x) const {
+ free(x);
+ }
+};
+
+// scoped_ptr_malloc<> is similar to scoped_ptr<>, but it accepts a
+// second template argument, the functor used to free the object.
+
+template<typename T, typename FreeProc = ScopedPtrMallocFree>
+class scoped_ptr_malloc {
+ private:
+
+ T* ptr;
+
+ scoped_ptr_malloc(scoped_ptr_malloc const &);
+ scoped_ptr_malloc & operator=(scoped_ptr_malloc const &);
+
+ public:
+
+ typedef T element_type;
+
+ explicit scoped_ptr_malloc(T* p = 0): ptr(p) {}
+
+ ~scoped_ptr_malloc() {
+ typedef char type_must_be_complete[sizeof(T)];
+ free_((void*) ptr);
+ }
+
+ void reset(T* p = 0) {
+ typedef char type_must_be_complete[sizeof(T)];
+
+ if (ptr != p) {
+ free_((void*) ptr);
+ ptr = p;
+ }
+ }
+
+ T& operator*() const {
+ assert(ptr != 0);
+ return *ptr;
+ }
+
+ T* operator->() const {
+ assert(ptr != 0);
+ return ptr;
+ }
+
+ bool operator==(T* p) const {
+ return ptr == p;
+ }
+
+ bool operator!=(T* p) const {
+ return ptr != p;
+ }
+
+ T* get() const {
+ return ptr;
+ }
+
+ void swap(scoped_ptr_malloc & b) {
+ T* tmp = b.ptr;
+ b.ptr = ptr;
+ ptr = tmp;
+ }
+
+ T* release() {
+ T* tmp = ptr;
+ ptr = 0;
+ return tmp;
+ }
+
+ private:
+
+ // no reason to use these: each scoped_ptr_malloc should have its own object
+ template <typename U, typename GP>
+ bool operator==(scoped_ptr_malloc<U, GP> const& p) const;
+ template <typename U, typename GP>
+ bool operator!=(scoped_ptr_malloc<U, GP> const& p) const;
+
+ static FreeProc const free_;
+};
+
+template<typename T, typename FP>
+FP const scoped_ptr_malloc<T,FP>::free_ = FP();
+
+template<typename T, typename FP> inline
+void swap(scoped_ptr_malloc<T,FP>& a, scoped_ptr_malloc<T,FP>& b) {
+ a.swap(b);
+}
+
+template<typename T, typename FP> inline
+bool operator==(T* p, const scoped_ptr_malloc<T,FP>& b) {
+ return p == b.get();
+}
+
+template<typename T, typename FP> inline
+bool operator!=(T* p, const scoped_ptr_malloc<T,FP>& b) {
+ return p != b.get();
+}
+
+#endif // #ifndef SCOPED_PTR_H
diff --git a/plugins/common/testing/DebugTest.cpp b/plugins/common/testing/DebugTest.cpp
new file mode 100644
index 0000000..add1357
--- /dev/null
+++ b/plugins/common/testing/DebugTest.cpp
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2008 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.
+ */
+
+// This file exists to verify that the debugging code leaves nothing
+// behind when disabled or at an appropriate level.
+//
+// Compile with, for example, g++ -O3 -D* -S DebugTest.cpp and inspect the DebugTest.s file.
+// where * is GWT_DEBUGDISABLE or GWT_DEBUGLEVEL=Spam (etc)
+//
+// testdebug is a shell script to automate this test
+
+// #define GWT_DEBUGDISABLE
+// #define GWT_DEBUGLEVEL Info
+
+#include "../Debug.h"
+
+void foo(int i) {
+ Debug::log(Debug::Error) << "Error GarbalDeGook" << i << Debug::flush;
+ Debug::log(Debug::Warning) << "Warning GarbalDeGook" << i << Debug::flush;
+ Debug::log(Debug::Info) << "Info GarbalDeGook" << i << Debug::flush;
+ Debug::log(Debug::Debugging) << "Debugging GarbalDeGook" << i << Debug::flush;
+ Debug::log(Debug::Spam) << "Spam GarbalDeGook" << i << Debug::flush;
+ if (Debug::level(Debug::Spam)) {
+ extern int ExpensiveCall();
+ Debug::log(Debug::Spam) << "Filtered spam GarbalDeGook" << ExpensiveCall() << Debug::flush;
+ }
+}
diff --git a/plugins/common/testing/testdebug b/plugins/common/testing/testdebug
new file mode 100755
index 0000000..e2e8ea4
--- /dev/null
+++ b/plugins/common/testing/testdebug
@@ -0,0 +1,61 @@
+#!/bin/sh
+# Copyright 2008 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.
+
+# this verifies that debug code is elided if it is not needed
+
+# The C++ compiler is specified in CXX, and its flags in CXXFLAGS
+# Defaults for GCC are used if not supplied. Note that CXXFLAGS should
+# include optimizations intended to be used. It is assumed that the
+# compiler uses -S to produce assembly output and -o - works to get that
+# output on stdout, and -Dsym=val is used to define preprocessor symbols.
+#
+# Note that debugging symbols should not be included as generally the
+# debugging info contains references to elided calls etc.
+if [ "x$CXX" == "x" ]
+then
+ CXX=g++
+fi
+
+if [ "x$CXXFLAGS" == "x" ]
+then
+ CXXFLAGS=-O3
+else
+ # remove -g if supplied
+ CXXFLAGS=`echo $CXXFLAGS | sed 's/-g\S*//'`
+fi
+
+CMD="$CXX $CXXFLAGS -S -o -"
+
+err=0
+$CMD -DGWT_DEBUGDISABLE DebugTest.cpp | egrep '(GarbalDeGook|ExpensiveCall)' >/dev/null
+if [ $? -eq 0 ]
+then
+ echo "Debug disabled leaves debug code around"
+ err=1
+fi
+$CMD -DGWT_DEBUGLEVEL=Error DebugTest.cpp | egrep '(Warning|ExpensiveCall)' >/dev/null
+if [ $? -eq 0 ]
+then
+ echo "Debug level Error leaves lower-level debug code around"
+ err=1
+fi
+$CMD -DGWT_DEBUGLEVEL=Spam DebugTest.cpp | grep 'ExpensiveCall' >/dev/null
+if [ $? -eq 1 ]
+then
+ echo "Debug level Spam does not include code that should be included"
+ err=1
+fi
+
+exit $err
diff --git a/plugins/config.mk b/plugins/config.mk
new file mode 100644
index 0000000..1e9e244
--- /dev/null
+++ b/plugins/config.mk
@@ -0,0 +1,112 @@
+# Copyright 2009 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.
+
+# This Makefile fragment sets the following make variables according to the
+# current platform:
+# ARCH - the Mozilla architecture name, such as x86, x86_64, ppc, etc
+# FLAG32BIT - 32 or 64
+# MARCH - the Mac architecture, such as i386 or ppc
+# OS - linux, mac, or sun
+# CFLAGS - appropriate C compiler flags for this platform
+# CXXFLAGS - appropriate C++ compiler flags for this platform
+# Also, various stanard make variables are overridden if necessary, such as AR
+#
+# If ARCH is already set, that is used instead of uname -m to get the
+# architecture to build. This can be used to build a 32-bit plugin on a 64-bit
+# platform, for example: make ARCH=x86
+
+ARCH ?= $(shell uname -m)
+
+# default is 32 bits
+FLAG32BIT=32
+
+# Figure out 64-bit platforms, canonicalize ARCH and MARCH
+ifeq ($(ARCH),x86_64)
+FLAG32BIT=64
+endif
+ifeq ($(ARCH),sparc)
+FLAG32BIT=64
+endif
+ifeq ($(ARCH),alpha)
+FLAG32BIT=64
+endif
+ifeq ($(ARCH),ia64)
+FLAG32BIT=64
+endif
+ifeq ($(ARCH),athlon)
+ARCH=x86
+endif
+ifeq ($(ARCH),i386)
+ARCH=x86
+endif
+ifeq ($(ARCH),i486)
+ARCH=x86
+endif
+ifeq ($(ARCH),i586)
+ARCH=x86
+endif
+ifeq ($(ARCH),i686)
+ARCH=x86
+endif
+ifeq ($(ARCH),i86pc)
+ARCH=x86
+endif
+ifeq ($(ARCH),Macintosh)
+ARCH=ppc
+endif
+
+MARCH=$(ARCH)
+ifeq ($(ARCH),x86)
+MARCH=i386
+endif
+
+# Default to Debug off
+DEBUG ?=
+ifeq ($(DEBUG),TRUE)
+DEBUGCFLAGS= -g
+else
+DEBUGCFLAGS=
+endif
+
+# Set OS as well as CFLAGS, CXX, and other common make variables
+ifeq ($(shell uname),Linux)
+OS=linux
+BASECFLAGS= $(DEBUGCFLAGS) -O2 -fPIC $(INC) -rdynamic
+ARCHCFLAGS= -m$(FLAG32BIT)
+ALLARCHCFLAGS= -m$(FLAG32BIT)
+endif
+ifeq ($(shell uname),Darwin)
+OS=mac
+BASECFLAGS= $(DEBUGCFLAGS) -O2 -fPIC $(INC) -D__mac -mmacosx-version-min=10.5 -isysroot /Developer/SDKs/MacOSX10.5.sdk
+ARCHCFLAGS=-arch $(MARCH)
+ALLARCHCFLAGS=-arch i386 -arch ppc -arch x86_64
+AR=libtool
+ARFLAGS=-static -o
+endif
+ifeq ($(shell uname),SunOS)
+OS=sun
+ifeq ($(DEBUG),TRUE)
+DEBUGCFLAGS= -g0
+endif
+#CFLAGS=-fast -g0 -Kpic $(INC) -Bdynamic -noex
+# SunC appears to miscompile Socket::writeByte by not incrementing the
+# buffer pointer, so no optimization for now
+#CFLAGS=-g -Kpic $(INC) -Bdynamic -noex
+BASECFLAGS= $(DEBUGCFLAGS) -Kpic -noex -xO1 -xlibmil -xlibmopt -features=tmplife -xbuiltin=%all -mt $(INC)
+ARCHCFLAGS=
+ALLARCHCFLAGS=
+CXX= CC
+endif
+CFLAGS=$(BASECFLAGS) $(ARCHCFLAGS)
+CXXFLAGS = $(CFLAGS)
diff --git a/plugins/ie/README.txt b/plugins/ie/README.txt
new file mode 100644
index 0000000..f4f030b
--- /dev/null
+++ b/plugins/ie/README.txt
@@ -0,0 +1,17 @@
+GWT devmode plugin for IE
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+To build the plugin, you will need a windows system with Visual Studio 2008 or newer (WSDK 7.0+)
+
+To build:
+1) make sure devenv.exe is in the path
+2) make sure the binaries under $(projectroot)\third_party\java_src\gwt\svn\trunk\plugins\ie\prebuilt are writable.
+3) open a cmd.exe window, go to $(projectroot)\third_party\java_src\gwt\svn\trunk\plugins\ie
+4) run build.cmd
+
+To create msi installer:
+1) go to folder $(projectroot)\third_party\java_src\gwt\svn\trunk\plugins\ie\installer
+2) make sure the msi installers under $(projectroot)\third_party\java_src\gwt\svn\trunk\plugins\ie\prebuilt are writable.
+3) run build.cmd
+
+
diff --git a/plugins/ie/build.cmd b/plugins/ie/build.cmd
new file mode 100755
index 0000000..e3841a4
--- /dev/null
+++ b/plugins/ie/build.cmd
@@ -0,0 +1,18 @@
+@echo off
+setlocal
+echo.
+::check if correct folder
+::check if devenv is in the path
+echo.
+echo building 32 bits
+echo ~~~~~~~~~~~~~~~~
+::pushd oophm\oophm
+devenv /rebuild "Release|Win32" %~dp0\oophm\oophm\oophm.vcproj /out build_win32.log
+echo.
+echo building 64 bits
+echo ~~~~~~~~~~~~~~~~
+devenv /rebuild "Release|x64" %~dp0\oophm\oophm\oophm.vcproj /out build_win64.log
+echo.
+echo Done.
+echo.
+endlocal
diff --git a/plugins/ie/installer/README.txt b/plugins/ie/installer/README.txt
new file mode 100644
index 0000000..b783838
--- /dev/null
+++ b/plugins/ie/installer/README.txt
@@ -0,0 +1,21 @@
+This directory contains the source code for the Windows installer. A new
+installer should be built using the build script every time oophm.dll is
+replaced.
+
+The build script will only work on a Windows system
+
+
+Workflow:
+~~~~~~~~~
+if you build new binaries, do the following:
+
+1) check out ..\prebuilt\*.msi for editing
+
+2) run build <version>, as in: build 1.2.123
+ this will generated all the msis. make sure to look at ..\prebuilt\*.msi
+ to see if they were updated.
+
+4) Test the installation. Yes, make sure it works on x86, x64, it cleans the
+ registry and folder upon uninstall, etc.
+
+
diff --git a/plugins/ie/installer/build.cmd b/plugins/ie/installer/build.cmd
new file mode 100755
index 0000000..203dc90
--- /dev/null
+++ b/plugins/ie/installer/build.cmd
@@ -0,0 +1,79 @@
+@echo off
+setlocal
+if .%1==. goto :usage
+echo.
+echo.
+
+echo Checking if output files are writeable...
+SET WRITEABLE_FILE_ERROR=0
+CALL :CheckWritable "%~dp0..\prebuilt\gwt-dev-plugin-x86.msi"
+CALL :CheckWritable "%~dp0..\prebuilt\gwt-dev-plugin-x64.msi"
+CALL :CheckWritable "%~dp0oophm.wxs"
+IF "%WRITEABLE_FILE_ERROR%"=="1" GOTO :DONE
+
+SET BINARY_DIR=%~dp0..\prebuilt\Win32
+SET BINARY_FILE=oophm.dll
+
+IF NOT EXIST %BINARY_DIR%\%BINARY_FILE% (
+ echo.
+ echo ERROR - Could not find oophm binary under %BINARY_DIR%
+ echo Verify that the build succeeded before trying to create the installer.
+ echo.
+ goto :eof
+)
+
+echo.
+echo 'heating' binary %BINARY_FILE% under %BINARY_DIR% ...
+echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+%~dp0wix\heat.exe file %BINARY_DIR%\%BINARY_FILE% -v -nologo -gg -g1 -dr INSTALLDIR -generate components -directoryid ff -cg oophmDll -out %~dp0oophm.wxs -var var.binDir
+%~dp0wix\sed.exe --in-place=xml "s/Source=\"\$(var\.binDir)\\Win32\\oophm.dll\"/Source=\"\$(var\.binDir)\\oophm.dll\"/g" %~dp0oophm.wxs
+%~dp0wix\sed.exe --in-place=xml "s/Directory Id=\"dir315E0C50682DFB472927FE1254A22F6A\" Name=\"Win32\"/Directory Id=\"dir315E0C50682DFB472927FE1254A22F6A\" Name=\"$(var.platform)\"/g" %~dp0oophm.wxs
+%~dp0wix\sed.exe --in-place=xml "s/<Component /<Component Win64=\"$(var.win64Flag)\" /g" %~dp0oophm.wxs
+%~dp0wix\sed.exe --in-place=xml "s/<Wix xmlns=\"http:\/\/schemas.microsoft.com\/wix\/2006\/wi\">/<Wix xmlns=\"http:\/\/schemas.microsoft.com\/wix\/2006\/wi\">\n\t<\?if $(var.platform)=x64 \?>\n\t<\?define win64Flag=\"yes\" \?>\n\t<\?else \?>\n\t<\?define win64Flag=\"no\" \?>\n\t<\?endif \?>/g" %~dp0oophm.wxs
+%~dp0wix\sed.exe --in-place=xml "s/Root=\"HKCR\"/Root=\"HKMU\"/g" %~dp0oophm.wxs
+
+echo.
+echo building 32 bit installer...
+echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+echo.
+%~dp0wix\candle -nologo -arch x86 -dversion=%1 -dplatform=Win32 -dbinDir=%~dp0\..\prebuilt\Win32\ -dbinary=oophm.dll %~dp0\installer.wxs.xml %~dp0\oophm.wxs
+%~dp0wix\light.exe -nologo oophm.wixobj installer.wxs.wixobj -o ..\prebuilt\gwt-dev-plugin-x86.msi -spdb
+
+echo.
+echo building 64 bit installer...
+echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+echo.
+%~dp0wix\candle -nologo -arch x64 -dversion=%1 -dplatform=x64 -dbinDir=%~dp0\..\prebuilt\x64\ -dbinary=oophm.dll %~dp0\installer.wxs.xml %~dp0\oophm.wxs
+%~dp0wix\light.exe -nologo oophm.wixobj installer.wxs.wixobj -o ..\prebuilt\gwt-dev-plugin-x64.msi -spdb
+
+echo.
+echo Done.
+echo.
+goto :eof
+
+:CheckWritable
+ECHO Checking if %1 is writable...
+SET RW=
+DIR /A:-R %1 1>NUL 2>NUL
+if %ERRORLEVEL% LEQ 0 GOTO :EOF
+ECHO.
+ECHO ERROR: file %1 must be writeable before executing this script.
+ECHO make sure you checked the file for editing.
+ECHO.
+SET WRITEABLE_FILE_ERROR=1
+ECHO %WRITEABLE_FILE_ERROR%
+GOTO :eof
+
+:usage
+echo.
+echo usage: build ^<version^>
+echo where: ^<version^> has the syntax major.minor.build
+echo.
+echo example: build 1.1.3123
+
+:done
+echo.
+echo.
+
+endlocal
+
diff --git a/plugins/ie/installer/generate-wxsfile.cmd b/plugins/ie/installer/generate-wxsfile.cmd
new file mode 100755
index 0000000..d2cf48c
--- /dev/null
+++ b/plugins/ie/installer/generate-wxsfile.cmd
@@ -0,0 +1,30 @@
+@echo OFF
+REM harvest COM settings from COM binary
+setlocal
+echo.
+if .%1==. goto :usage
+echo IMPORTANT: Make sure "%~dp0oophm.wsx" is checked out and writable!
+echo.
+echo 'heating' binary %~nx1 under %~dp1 ...
+echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+pushd %~dp1
+%~dp0wix\heat.exe file .\%~nx1 -v -nologo -gg -g1 -dr INSTALLDIR -generate components -directoryid ff -cg oophmDll -out %~dp0oophm.wxs -var var.binDir
+popd
+%~dp0wix\sed.exe --in-place=xml "s/Source=\"\$(var\.binDir)\\Win32\\oophm.dll\"/Source=\"\$(var\.binDir)\\oophm.dll\"/g" %~dp0oophm.wxs
+%~dp0wix\sed.exe --in-place=xml "s/Directory Id=\"dir315E0C50682DFB472927FE1254A22F6A\" Name=\"Win32\"/Directory Id=\"dir315E0C50682DFB472927FE1254A22F6A\" Name=\"$(var.platform)\"/g" %~dp0oophm.wxs
+%~dp0wix\sed.exe --in-place=xml "s/<Component /<Component Win64=\"$(var.win64Flag)\" /g" %~dp0oophm.wxs
+%~dp0wix\sed.exe --in-place=xml "s/<Wix xmlns=\"http:\/\/schemas.microsoft.com\/wix\/2006\/wi\">/<Wix xmlns=\"http:\/\/schemas.microsoft.com\/wix\/2006\/wi\">\n\t<\?if $(var.platform)=x64 \?>\n\t<\?define win64Flag=\"yes\" \?>\n\t<\?else \?>\n\t<\?define win64Flag=\"no\" \?>\n\t<\?endif \?>/g" %~dp0oophm.wxs
+%~dp0wix\sed.exe --in-place=xml "s/Root=\"HKCR\"/Root=\"HKMU\"/g" %~dp0oophm.wxs
+
+echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+echo Done.
+echo.
+goto :eof
+:usage
+echo.
+echo usage: generate-wsxfile.cmd ^<binary-file-path^>
+echo.
+echo example: generate-wsxfile.cmd ..\prebuilt\Win32\oophm.dll
+echo.
+endlocal
+
diff --git a/plugins/ie/installer/gwt.ico b/plugins/ie/installer/gwt.ico
new file mode 100644
index 0000000..79eb6b8
--- /dev/null
+++ b/plugins/ie/installer/gwt.ico
Binary files differ
diff --git a/plugins/ie/installer/installer.wxs.xml b/plugins/ie/installer/installer.wxs.xml
new file mode 100644
index 0000000..c7c0c7b
--- /dev/null
+++ b/plugins/ie/installer/installer.wxs.xml
@@ -0,0 +1,204 @@
+<?xml version='1.0' encoding='windows-1252'?>
+<Wix
+ xmlns='http://schemas.microsoft.com/wix/2006/wi'>
+
+ <!-- Variables. -->
+ <?define appName = "Google Web Toolkit Developer Plugin for IE" ?>
+ <?define gwtRegKey = "SOFTWARE\Google\Google Web Toolkit\Installer" ?>
+ <?if $(var.platform)=x64 ?>
+ <?define upgradeCode = "53dae7d2-8c28-440f-920b-b2d665ce73b2" ?>
+ <?define win64Flag = "yes" ?>
+ <?define platformFriendlyName="x64" ?>
+ <?else ?>
+ <?define upgradeCode = "9a5e649a-ec63-4c7d-99bf-75adb345e7e5" ?>
+ <?define win64Flag = "no" ?>
+ <?define platformFriendlyName="x86" ?>
+ <?endif ?>
+ <?define updateRegKey = "SOFTWARE\Google\Update\Clients\{$(var.upgradeCode)}" ?>
+
+ <!--
+ The main product to install. We generate a new GUID (*) on each
+ compile to ensure that windows installer completely removes the old
+ version and reinstalls the new version without complaining.
+ -->
+
+ <Product
+ Name='$(var.appName) ($(var.platformFriendlyName))'
+ Id='*'
+ UpgradeCode='$(var.upgradeCode)'
+ Language='1033'
+ Codepage='1252'
+ Version='$(var.version)'
+ Manufacturer='Google'>
+
+ <?if $(var.platform)=x64 ?>
+ <Package
+ Id='*'
+ Keywords='Installer'
+ Description='$(var.appName) ($(var.platformFriendlyName))'
+ Manufacturer='Google'
+ InstallPrivileges='limited'
+ InstallerVersion='200'
+ Languages='1033'
+ Compressed='yes'
+ SummaryCodepage='1252'
+ Platform='x64'
+ />
+ <?else ?>
+ <Package
+ Id='*'
+ Keywords='Installer'
+ Description='$(var.appName) ($(var.platformFriendlyName))'
+ Manufacturer='Google'
+ InstallPrivileges='limited'
+ InstallerVersion='200'
+ Languages='1033'
+ Compressed='yes'
+ SummaryCodepage='1252'
+ />
+ <?endif ?>
+
+ <Media Id='1' Cabinet='product.cab' EmbedCab='yes' />
+
+ <Icon Id="gwt.ico" SourceFile=".\gwt.ico"/>
+
+ <!-- Properties -->
+ <Property Id='REBOOT'>ReallySuppress</Property>
+ <Property Id="ALLUSERS" Secure="yes"></Property>
+ <Property Id="ARPPRODUCTICON" Value="gwt.ico" />
+ <Property Id="ARPCOMMENTS" Value="Google Web Toolkit Developer Plugin for IE ($(var.platformFriendlyName))" />
+ <Property Id="ARPNOMODIFY" Value="1" />
+ <Property Id="ARPNOREPAIR" Value="1" />
+ <Property Id="ARPHELPLINK" Value="http://code.google.com/webtoolkit/" />
+ <Property Id="ARPURLINFOABOUT" Value="http://code.google.com/webtoolkit/" />
+
+ <Upgrade Id='$(var.upgradeCode)'>
+ <UpgradeVersion Property='UPGRADING'
+ OnlyDetect='no'
+ Minimum='0.0.0.0' IncludeMinimum='yes'
+ Maximum='$(var.version)' IncludeMaximum='no' />
+ <UpgradeVersion Property='NEWERVERSIONDETECTED'
+ OnlyDetect='yes'
+ Minimum='$(var.version)' IncludeMinimum='yes' />
+ </Upgrade>
+
+ <InstallExecuteSequence>
+ <LaunchConditions After='AppSearch' />
+ <RemoveExistingProducts After='InstallValidate' />
+ <Custom Action="NewerVersionError" After="FindRelatedProducts">NEWERVERSIONDETECTED</Custom>
+ </InstallExecuteSequence>
+
+ <UI>
+ <Error Id="4000">A newer version of this product is already installed.</Error>
+ </UI>
+
+ <CustomAction Id="NewerVersionError" Error="4000"/>
+
+ <!-- Define the install directory. -->
+ <?if $(var.platform)=x64 ?>
+ <Directory Id='TARGETDIR' Name='SourceDir'>
+ <Directory Id='AppDataFolder' Name='AppData'>
+ <Directory Id='GoogleDir' Name='Google'>
+ <Component Id="RemoveGoogleDir" Guid="*" DiskId="1" Win64="$(var.win64Flag)">
+ <CreateFolder/>
+ <RemoveFolder Id="RemoveGoogleDirFolder" On="uninstall" />
+ <RegistryKey Root="HKMU" Key="$(var.gwtRegKey)" Action="createAndRemoveOnUninstall">
+ <RegistryValue Name="RemoveGoogleDirFolder" Value="" Type="string" KeyPath="yes"/>
+ </RegistryKey>
+ </Component>
+ <Directory Id='GoogleWebToolkitDir' Name='Google Web Toolkit'>
+ <Component Id="RemoveGoogleWebToolkitDir" Guid="*" DiskId="1" Win64="$(var.win64Flag)">
+ <CreateFolder/>
+ <RemoveFolder Id="RemoveGoogleWebToolkitDirFolder" On="uninstall" />
+ <RegistryKey Root="HKMU" Key="$(var.gwtRegKey)" Action="createAndRemoveOnUninstall">
+ <RegistryValue Name="RemoveGoogleWebToolkitDirFolder" Value="" Type="string" KeyPath="yes"/>
+ </RegistryKey>
+ </Component>
+ <Directory Id='DeveloperPluginDir' Name='Developer Plugin'>
+ <Component Id="RemoveDeveloperPluginDir" Guid="*" DiskId="1" Win64="$(var.win64Flag)">
+ <CreateFolder/>
+ <RemoveFolder Id="RemoveDeveloperPluginDirFolder" On="uninstall" />
+ <RegistryKey Root="HKMU" Key="$(var.gwtRegKey)" Action="createAndRemoveOnUninstall">
+ <RegistryValue Name="RemoveDeveloperPluginDirFolder" Value="" Type="string" KeyPath="yes"/>
+ </RegistryKey>
+ </Component>
+ <Directory Id='INSTALLDIR' Name='IE'>
+ <Component Id="RemoveInstallDir" Guid="*" DiskId="1" Win64="$(var.win64Flag)">
+ <CreateFolder/>
+ <RemoveFolder Id="RemoveInstallerDirFolder" On="uninstall" />
+ <RegistryKey Root="HKMU" Key="$(var.gwtRegKey)" Action="createAndRemoveOnUninstall">
+ <RegistryValue Name="RemoveInstallerDirFolder" Value="" Type="string" KeyPath="yes"/>
+ </RegistryKey>
+ </Component>
+ </Directory>
+ </Directory>
+ </Directory>
+ </Directory>
+ </Directory>
+ </Directory>
+ <?else?>
+ <Directory Id='TARGETDIR' Name='SourceDir'>
+ <Directory Id='AppDataFolder' Name='AppData'>
+ <Directory Id='GoogleDir' Name='Google'>
+ <Component Id="RemoveGoogleDir" Guid="*" DiskId="1" Win64="$(var.win64Flag)">
+ <CreateFolder/>
+ <RemoveFolder Id="RemoveGoogleDirFolder" On="uninstall" />
+ <RegistryKey Root="HKMU" Key="$(var.gwtRegKey)" Action="createAndRemoveOnUninstall">
+ <RegistryValue Name="RemoveGoogleDirFolder" Value="" Type="string" KeyPath="yes"/>
+ </RegistryKey>
+ </Component>
+ <Directory Id='GoogleWebToolkitDir' Name='Google Web Toolkit'>
+ <Component Id="RemoveGoogleWebToolkitDir" Guid="*" DiskId="1" Win64="$(var.win64Flag)">
+ <CreateFolder/>
+ <RemoveFolder Id="RemoveGoogleWebToolkitDirFolder" On="uninstall" />
+ <RegistryKey Root="HKMU" Key="$(var.gwtRegKey)" Action="createAndRemoveOnUninstall">
+ <RegistryValue Name="RemoveGoogleWebToolkitDirFolder" Value="" Type="string" KeyPath="yes"/>
+ </RegistryKey>
+ </Component>
+ <Directory Id='DeveloperPluginDir' Name='Developer Plugin'>
+ <Component Id="RemoveDeveloperPluginDir" Guid="*" DiskId="1" Win64="$(var.win64Flag)">
+ <CreateFolder/>
+ <RemoveFolder Id="RemoveDeveloperPluginDirFolder" On="uninstall" />
+ <RegistryKey Root="HKMU" Key="$(var.gwtRegKey)" Action="createAndRemoveOnUninstall">
+ <RegistryValue Name="RemoveDeveloperPluginDirFolder" Value="" Type="string" KeyPath="yes"/>
+ </RegistryKey>
+ </Component>
+ <Directory Id='INSTALLDIR' Name='IE'>
+ <Component Id="RemoveInstallDir" Guid="*" DiskId="1" Win64="$(var.win64Flag)">
+ <CreateFolder/>
+ <RemoveFolder Id="RemoveInstallerDirFolder" On="uninstall" />
+ <RegistryKey Root="HKMU" Key="$(var.gwtRegKey)" Action="createAndRemoveOnUninstall">
+ <RegistryValue Name="RemoveInstallerDirFolder" Value="" Type="string" KeyPath="yes"/>
+ </RegistryKey>
+ </Component>
+ </Directory>
+ </Directory>
+ </Directory>
+ </Directory>
+ </Directory>
+ </Directory>
+ <?endif?>
+
+ <Component Id='registryValues' Directory='INSTALLDIR' Guid='*' >
+ <RegistryKey Root='HKCU' Action='createAndRemoveOnUninstall' Key='$(var.updateRegKey)'>
+ <RegistryValue Name='pv' Value='$(var.version)' Type='string' />
+ <RegistryValue Name='name' Value='$(var.appName) ($(var.platformFriendlyName))' Type='string' />
+ <RegistryValue Name='lang' Value='en' Type='string' />
+ </RegistryKey>
+ </Component>
+
+ <!-- Define the features to install. -->
+ <Feature Id='CompleteFeature' Display='expand' Level='1' Absent='disallow'>
+ <!--
+ Loaded from oophm.wxs.xml, which is generated by the build
+ script.
+ -->
+ <ComponentRef Id='RemoveGoogleDir' />
+ <ComponentRef Id='RemoveGoogleWebToolkitDir' />
+ <ComponentRef Id='RemoveDeveloperPluginDir' />
+ <ComponentRef Id='RemoveInstallDir' />
+ <ComponentGroupRef Id='oophmDll' />
+ <ComponentRef Id='registryValues' />
+ </Feature>
+ </Product>
+</Wix>
diff --git a/plugins/ie/installer/oophm.wxs b/plugins/ie/installer/oophm.wxs
new file mode 100644
index 0000000..4059a54
--- /dev/null
+++ b/plugins/ie/installer/oophm.wxs
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
+ <?if $(var.platform)=x64 ?>
+ <?define win64Flag="yes" ?>
+ <?else ?>
+ <?define win64Flag="no" ?>
+ <?endif ?>
+ <Fragment>
+ <DirectoryRef Id="INSTALLDIR">
+ <Directory Id="dir315E0C50682DFB472927FE1254A22F6A" Name="$(var.platform)" />
+ </DirectoryRef>
+ </Fragment>
+ <Fragment>
+ <ComponentGroup Id="oophmDll">
+ <Component Win64="$(var.win64Flag)" Id="cmpC5076456A3EE2DC3FC2683246BE38AD6" Directory="dir315E0C50682DFB472927FE1254A22F6A" Guid="66F951FF-F3CE-4C41-92EC-886F3A985ADF">
+ <File Id="filEF78EFE99C26E3436EC9C8852A85BE88" KeyPath="yes" Source="$(var.binDir)\oophm.dll">
+ <TypeLib Id="{9259F105-BE55-4BF6-B7CE-D0AA878C1BA6}" Description="oophm 1.0 Type Library" HelpDirectory="dir315E0C50682DFB472927FE1254A22F6A" Language="0" MajorVersion="1" MinorVersion="0">
+ <AppId Description="oophm" Id="{F9365E53-5A14-47F3-BF1D-10CAAB815309}">
+ <Class Id="{1D6156B6-002B-49E7-B5CA-C138FB843B4E}" Context="InprocServer32" Description="plugin Class" ThreadingModel="apartment" Version="1.0" Programmable="yes" Control="yes">
+ <ProgId Id="oophm.plugin.1" Description="plugin Class">
+ <ProgId Id="oophm.plugin" Description="plugin Class" />
+ </ProgId>
+ </Class>
+ </AppId>
+ <Class Id="{1A2A78F4-B5A4-4208-B520-BDDA0A7EC5CB}" Context="InprocServer32" Description="ExceptionCatcher Class" ThreadingModel="apartment" Programmable="yes">
+ <ProgId Id="oophm.ExceptionCatcher.1" Description="ExceptionCatcher Class">
+ <ProgId Id="oophm.ExceptionCatcher" Description="ExceptionCatcher Class" />
+ </ProgId>
+ </Class>
+ <Class Id="{644FD769-8B9D-4AC4-A79E-AAAF5CD751C1}" Context="InprocServer32" Description="JavaObject Class" ThreadingModel="apartment" Programmable="yes">
+ <ProgId Id="oophm.JavaObject.1" Description="JavaObject Class">
+ <ProgId Id="oophm.JavaObject" Description="JavaObject Class" />
+ </ProgId>
+ </Class>
+ <Interface Id="{1C3FBB2D-58C2-426C-A461-E6002F9EE294}" Name="IExceptionCatcher" ProxyStubClassId32="{00020424-0000-0000-C000-000000000046}" />
+ <Interface Id="{58276E45-1F24-4B71-88AC-2A7D0C26CDFF}" Name="IJavaObject" ProxyStubClassId32="{00020424-0000-0000-C000-000000000046}" />
+ <Interface Id="{73607C2E-369B-4055-8020-D7643A59F521}" Name="Iplugin" ProxyStubClassId32="{00020424-0000-0000-C000-000000000046}" />
+ <Interface Id="{AB9B16A0-03E9-481E-ADF5-B00B860A8C3A}" Name="IpluginUI" ProxyStubClassId32="{00020424-0000-0000-C000-000000000046}" />
+ </TypeLib>
+ </File>
+ <RegistryValue Root="HKMU" Key="AppID\oophm.DLL" Name="AppID" Value="{F9365E53-5A14-47F3-BF1D-10CAAB815309}" Type="string" Action="write" />
+ <RegistryValue Root="HKMU" Key="CLSID\{1D6156B6-002B-49E7-B5CA-C138FB843B4E}\MiscStatus\1" Value="131473" Type="string" Action="write" />
+ <RegistryValue Root="HKMU" Key="CLSID\{1D6156B6-002B-49E7-B5CA-C138FB843B4E}\MiscStatus" Value="0" Type="string" Action="write" />
+ <RegistryValue Root="HKMU" Key="CLSID\{1D6156B6-002B-49E7-B5CA-C138FB843B4E}\ToolboxBitmap32" Value="[#filEF78EFE99C26E3436EC9C8852A85BE88], 102" Type="string" Action="write" />
+ </Component>
+ </ComponentGroup>
+ </Fragment>
+ <Fragment>
+ <DirectoryRef Id="dir315E0C50682DFB472927FE1254A22F6A" />
+ </Fragment>
+</Wix>
\ No newline at end of file
diff --git a/plugins/ie/installer/wix/README.txt b/plugins/ie/installer/wix/README.txt
new file mode 100644
index 0000000..846b7eb
--- /dev/null
+++ b/plugins/ie/installer/wix/README.txt
@@ -0,0 +1,10 @@
+
+This folder contains WIX binaries used to build the installer. These files
+were copied as-is from the public website http://wix.codeplex.com/ and are
+here for convenience and to make sure we have the right toolset version.
+
+for more information, license terms, please refer to:
+ http://wix.sourceforge.net/
+ http://wix.codeplex.com/
+ http://wix.codeplex.com/license
+
diff --git a/plugins/ie/installer/wix/WixIIsExtension.dll b/plugins/ie/installer/wix/WixIIsExtension.dll
new file mode 100755
index 0000000..9c3e2a8
--- /dev/null
+++ b/plugins/ie/installer/wix/WixIIsExtension.dll
Binary files differ
diff --git a/plugins/ie/installer/wix/WixUtilExtension.dll b/plugins/ie/installer/wix/WixUtilExtension.dll
new file mode 100755
index 0000000..36eac99
--- /dev/null
+++ b/plugins/ie/installer/wix/WixUtilExtension.dll
Binary files differ
diff --git a/plugins/ie/installer/wix/WixVSExtension.dll b/plugins/ie/installer/wix/WixVSExtension.dll
new file mode 100755
index 0000000..2fa2a1b
--- /dev/null
+++ b/plugins/ie/installer/wix/WixVSExtension.dll
Binary files differ
diff --git a/plugins/ie/installer/wix/candle.exe b/plugins/ie/installer/wix/candle.exe
new file mode 100755
index 0000000..a5be152
--- /dev/null
+++ b/plugins/ie/installer/wix/candle.exe
Binary files differ
diff --git a/plugins/ie/installer/wix/candle.exe.config b/plugins/ie/installer/wix/candle.exe.config
new file mode 100644
index 0000000..bed32a7
--- /dev/null
+++ b/plugins/ie/installer/wix/candle.exe.config
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (c) Microsoft Corporation. All rights reserved.
+-->
+<configuration>
+ <startup useLegacyV2RuntimeActivationPolicy="true">
+ <supportedRuntime version="v4.0" />
+ <supportedRuntime version="v2.0.50727" />
+ </startup>
+</configuration>
diff --git a/plugins/ie/installer/wix/darice.cub b/plugins/ie/installer/wix/darice.cub
new file mode 100644
index 0000000..dab4567
--- /dev/null
+++ b/plugins/ie/installer/wix/darice.cub
Binary files differ
diff --git a/plugins/ie/installer/wix/heat.exe b/plugins/ie/installer/wix/heat.exe
new file mode 100755
index 0000000..e5c9336
--- /dev/null
+++ b/plugins/ie/installer/wix/heat.exe
Binary files differ
diff --git a/plugins/ie/installer/wix/heat.exe.config b/plugins/ie/installer/wix/heat.exe.config
new file mode 100644
index 0000000..5d5aa30
--- /dev/null
+++ b/plugins/ie/installer/wix/heat.exe.config
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (c) Microsoft Corporation. All rights reserved.
+-->
+<configuration>
+ <appSettings>
+ <add key="extensions" value="WixIIsExtension;WixUtilExtension;WixVSExtension"/>
+ </appSettings>
+ <startup useLegacyV2RuntimeActivationPolicy="true">
+ <supportedRuntime version="v4.0" />
+ <supportedRuntime version="v2.0.50727" />
+ </startup>
+</configuration>
diff --git a/plugins/ie/installer/wix/libiconv2.dll b/plugins/ie/installer/wix/libiconv2.dll
new file mode 100755
index 0000000..544dd92
--- /dev/null
+++ b/plugins/ie/installer/wix/libiconv2.dll
Binary files differ
diff --git a/plugins/ie/installer/wix/libintl3.dll b/plugins/ie/installer/wix/libintl3.dll
new file mode 100755
index 0000000..ec11e6b
--- /dev/null
+++ b/plugins/ie/installer/wix/libintl3.dll
Binary files differ
diff --git a/plugins/ie/installer/wix/light.exe b/plugins/ie/installer/wix/light.exe
new file mode 100755
index 0000000..d36e01e
--- /dev/null
+++ b/plugins/ie/installer/wix/light.exe
Binary files differ
diff --git a/plugins/ie/installer/wix/light.exe.config b/plugins/ie/installer/wix/light.exe.config
new file mode 100644
index 0000000..bed32a7
--- /dev/null
+++ b/plugins/ie/installer/wix/light.exe.config
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (c) Microsoft Corporation. All rights reserved.
+-->
+<configuration>
+ <startup useLegacyV2RuntimeActivationPolicy="true">
+ <supportedRuntime version="v4.0" />
+ <supportedRuntime version="v2.0.50727" />
+ </startup>
+</configuration>
diff --git a/plugins/ie/installer/wix/mspatchc.dll b/plugins/ie/installer/wix/mspatchc.dll
new file mode 100755
index 0000000..4720f1a
--- /dev/null
+++ b/plugins/ie/installer/wix/mspatchc.dll
Binary files differ
diff --git a/plugins/ie/installer/wix/regex2.dll b/plugins/ie/installer/wix/regex2.dll
new file mode 100755
index 0000000..f84a847
--- /dev/null
+++ b/plugins/ie/installer/wix/regex2.dll
Binary files differ
diff --git a/plugins/ie/installer/wix/sed.exe b/plugins/ie/installer/wix/sed.exe
new file mode 100755
index 0000000..42c2677
--- /dev/null
+++ b/plugins/ie/installer/wix/sed.exe
Binary files differ
diff --git a/plugins/ie/installer/wix/wconsole.dll b/plugins/ie/installer/wix/wconsole.dll
new file mode 100755
index 0000000..916b492
--- /dev/null
+++ b/plugins/ie/installer/wix/wconsole.dll
Binary files differ
diff --git a/plugins/ie/installer/wix/winterop.dll b/plugins/ie/installer/wix/winterop.dll
new file mode 100755
index 0000000..0385acd
--- /dev/null
+++ b/plugins/ie/installer/wix/winterop.dll
Binary files differ
diff --git a/plugins/ie/installer/wix/wix.dll b/plugins/ie/installer/wix/wix.dll
new file mode 100755
index 0000000..5057e35
--- /dev/null
+++ b/plugins/ie/installer/wix/wix.dll
Binary files differ
diff --git a/plugins/ie/oophm/oophm.sln b/plugins/ie/oophm/oophm.sln
new file mode 100644
index 0000000..7555624
--- /dev/null
+++ b/plugins/ie/oophm/oophm.sln
@@ -0,0 +1,26 @@
+
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "oophm", "oophm\oophm.vcxproj", "{EB69BDFE-9380-4C51-99E8-C3EB25AE36A2}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Debug|x64 = Debug|x64
+ Release|Win32 = Release|Win32
+ Release|x64 = Release|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {EB69BDFE-9380-4C51-99E8-C3EB25AE36A2}.Debug|Win32.ActiveCfg = Debug|Win32
+ {EB69BDFE-9380-4C51-99E8-C3EB25AE36A2}.Debug|Win32.Build.0 = Debug|Win32
+ {EB69BDFE-9380-4C51-99E8-C3EB25AE36A2}.Debug|x64.ActiveCfg = Debug|x64
+ {EB69BDFE-9380-4C51-99E8-C3EB25AE36A2}.Debug|x64.Build.0 = Debug|x64
+ {EB69BDFE-9380-4C51-99E8-C3EB25AE36A2}.Release|Win32.ActiveCfg = Release|Win32
+ {EB69BDFE-9380-4C51-99E8-C3EB25AE36A2}.Release|Win32.Build.0 = Release|Win32
+ {EB69BDFE-9380-4C51-99E8-C3EB25AE36A2}.Release|x64.ActiveCfg = Release|x64
+ {EB69BDFE-9380-4C51-99E8-C3EB25AE36A2}.Release|x64.Build.0 = Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/plugins/ie/oophm/oophm/Constants.h b/plugins/ie/oophm/oophm/Constants.h
new file mode 100644
index 0000000..17c0b9d
--- /dev/null
+++ b/plugins/ie/oophm/oophm/Constants.h
@@ -0,0 +1,22 @@
+#pragma once
+
+#include "stdafx.h"
+
+class Constants
+{
+public:
+ const static LPOLESTR __gwt_disconnected;
+ const static LPOLESTR valueOf;
+ const static LPOLESTR Error;
+ const static _bstr_t JavaScript;
+ const static LPOLESTR __gwt_makeResult;
+ const static LPOLESTR __gwt_makeTearOff;
+};
+
+__declspec(selectany) const LPOLESTR Constants::__gwt_disconnected = L"__gwt_disconnected";
+__declspec(selectany) const LPOLESTR Constants::valueOf = L"valueOf";
+__declspec(selectany) const LPOLESTR Constants::Error = L"Error";
+__declspec(selectany) const _bstr_t Constants::JavaScript = _bstr_t(L"JavaScript");
+__declspec(selectany) const LPOLESTR Constants::__gwt_makeResult = L"__gwt_makeResult";
+__declspec(selectany) const LPOLESTR Constants::__gwt_makeTearOff = L"__gwt_makeTearOff";
+
diff --git a/plugins/ie/oophm/oophm/ExceptionCatcher.cpp b/plugins/ie/oophm/oophm/ExceptionCatcher.cpp
new file mode 100644
index 0000000..44d9ff9
--- /dev/null
+++ b/plugins/ie/oophm/oophm/ExceptionCatcher.cpp
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2008 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.
+ */
+
+// ExceptionCatcher.cpp : Implementation of CExceptionCatcher
+
+#include "stdafx.h"
+#include "Debug.h"
+#include "ExceptionCatcher.h"
+
+// CExceptionCatcher
+
+
+STDMETHODIMP CExceptionCatcher::getException(VARIANT* retVal)
+{
+ *retVal = caughtException.GetVARIANT();
+ return S_OK;
+}
+
+STDMETHODIMP CExceptionCatcher::hasSeenException(BOOL* retVal) {
+ *retVal = hasCaughtException;
+ return S_OK;
+}
+
+STDMETHODIMP CExceptionCatcher::CanHandleException(EXCEPINFO* exInfo, VARIANT* value) {
+ Debug::log(Debug::Debugging) << "Caught an exception from JS function" << Debug::flush;
+ if (hasCaughtException) {
+ Debug::log(Debug::Spam) << "Double-catching exception" << Debug::flush;
+ // We see this if a COM object that called a JavaObject doesn't recognize the
+ // throwing-exception return code; just keep the first exception that we've
+ // seen.
+ return S_OK;
+ }
+ caughtException = value;
+ hasCaughtException = true;
+ return S_OK;
+}
+
+STDMETHODIMP CExceptionCatcher::QueryService(const GUID& guidService, const IID& riid, void** ret) {
+ Debug::log(Debug::Spam) << "QueryService not supported by ExceptionCatcher" << Debug::flush;
+ return E_NOTIMPL;
+}
diff --git a/plugins/ie/oophm/oophm/ExceptionCatcher.h b/plugins/ie/oophm/oophm/ExceptionCatcher.h
new file mode 100644
index 0000000..c1a091c
--- /dev/null
+++ b/plugins/ie/oophm/oophm/ExceptionCatcher.h
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2008 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.
+ */
+
+// ExceptionCatcher.h : Declaration of the CExceptionCatcher
+
+#pragma once
+#include "resource.h" // main symbols
+#include "comutil.h"
+#include "dispex.h"
+#include "oophm_i.h"
+
+
+#if defined(_WIN32_WCE) && !defined(_CE_DCOM) && !defined(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA)
+#error "Single-threaded COM objects are not properly supported on Windows CE platform, such as the Windows Mobile platforms that do not include full DCOM support. Define _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA to force ATL to support creating single-thread COM object's and allow use of it's single-threaded COM object implementations. The threading model in your rgs file was set to 'Free' as that is the only threading model supported in non DCOM Windows CE platforms."
+#endif
+
+
+
+// CExceptionCatcher
+
+class ATL_NO_VTABLE CExceptionCatcher :
+ public CComObjectRootEx<CComSingleThreadModel>,
+ public CComCoClass<CExceptionCatcher, &CLSID_ExceptionCatcher>,
+ public ICanHandleException,
+ public IServiceProvider,
+ public IDispatchImpl<IExceptionCatcher, &IID_IExceptionCatcher, &LIBID_oophmLib, /*wMajor =*/ 1, /*wMinor =*/ 0>
+{
+public:
+ CExceptionCatcher()
+ {
+ }
+
+DECLARE_REGISTRY_RESOURCEID(IDR_EXCEPTIONCATCHER)
+
+
+BEGIN_COM_MAP(CExceptionCatcher)
+ COM_INTERFACE_ENTRY(ICanHandleException)
+ COM_INTERFACE_ENTRY(IServiceProvider)
+ COM_INTERFACE_ENTRY(IExceptionCatcher)
+ COM_INTERFACE_ENTRY(IDispatch)
+END_COM_MAP()
+
+
+
+ DECLARE_PROTECT_FINAL_CONSTRUCT()
+
+ HRESULT FinalConstruct()
+ {
+ hasCaughtException = false;
+ return S_OK;
+ }
+
+ void FinalRelease()
+ {
+ }
+
+public:
+ STDMETHOD(getException)(VARIANT* retVal);
+ STDMETHOD(hasSeenException)(BOOL* ret);
+ STDMETHOD(CanHandleException)(EXCEPINFO* exInfo, VARIANT* value);
+ STDMETHOD(QueryService)(const GUID& guidService, const IID& riid, void** ret);
+private:
+ _variant_t caughtException;
+ bool hasCaughtException;
+};
+
+OBJECT_ENTRY_AUTO(__uuidof(ExceptionCatcher), CExceptionCatcher)
diff --git a/plugins/ie/oophm/oophm/ExceptionCatcher.rgs b/plugins/ie/oophm/oophm/ExceptionCatcher.rgs
new file mode 100644
index 0000000..ba8960b
--- /dev/null
+++ b/plugins/ie/oophm/oophm/ExceptionCatcher.rgs
@@ -0,0 +1,26 @@
+HKCR
+{
+ oophm.ExceptionCatcher.1 = s 'ExceptionCatcher Class'
+ {
+ CLSID = s '{1A2A78F4-B5A4-4208-B520-BDDA0A7EC5CB}'
+ }
+ oophm.ExceptionCatcher = s 'ExceptionCatcher Class'
+ {
+ CLSID = s '{1A2A78F4-B5A4-4208-B520-BDDA0A7EC5CB}'
+ CurVer = s 'oophm.ExceptionCatcher.1'
+ }
+ NoRemove CLSID
+ {
+ ForceRemove {1A2A78F4-B5A4-4208-B520-BDDA0A7EC5CB} = s 'ExceptionCatcher Class'
+ {
+ ProgID = s 'oophm.ExceptionCatcher.1'
+ VersionIndependentProgID = s 'oophm.ExceptionCatcher'
+ ForceRemove 'Programmable'
+ InprocServer32 = s '%MODULE%'
+ {
+ val ThreadingModel = s 'Apartment'
+ }
+ 'TypeLib' = s '{9259F105-BE55-4BF6-B7CE-D0AA878C1BA6}'
+ }
+ }
+}
diff --git a/plugins/ie/oophm/oophm/IESessionHandler.cpp b/plugins/ie/oophm/oophm/IESessionHandler.cpp
new file mode 100644
index 0000000..6e2a653
--- /dev/null
+++ b/plugins/ie/oophm/oophm/IESessionHandler.cpp
@@ -0,0 +1,469 @@
+/*
+ * Copyright 2008 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.
+ */
+
+#include "stdafx.h"
+#include "comutil.h"
+#include "dispex.h"
+#include "ExceptionCatcher.h"
+#include "IESessionHandler.h"
+#include "ServerMethods.h"
+#include "scoped_ptr/scoped_ptr.h"
+#include "IEUtils.h"
+#include "Constants.h"
+
+
+IESessionHandler::IESessionHandler(HostChannel* channel,
+ IHTMLWindow2* window) : SessionData(channel, window, this), jsObjectId(1)
+{
+ // window->put_defaultStatus(L"GWT Developer Plugin active");
+ IEUtils::resetResolver();
+}
+
+IESessionHandler::~IESessionHandler(void) {
+ Debug::log(Debug::Debugging) << "Destroying session handler" << Debug::flush;
+ Debug::log(Debug::Spam) << jsObjectsById.size() << " active JS object referances" << Debug::flush;
+ // Put any remaining JavaObject references into zombie-mode in case
+ // of lingering references
+ Debug::log(Debug::Spam) << javaObjectsById.size() << " active Java object references" << Debug::flush;
+
+ IEUtils::resetResolver();
+ std::map<int, IUnknown*>::iterator it = javaObjectsById.begin();
+ while (it != javaObjectsById.end()) {
+ ((CJavaObject*)it->second)->shutdown();
+ it++;
+ }
+ channel->disconnectFromHost();
+}
+
+void IESessionHandler::disconnectDetectedImpl() {
+ DISPID dispId;
+
+ HRESULT hr = IEUtils::resolveName(window, Constants::__gwt_disconnected, &dispId);
+ if(FAILED(hr)) {
+ Debug::log(Debug::Error) << "Unable to get dispId for __gwt_disconnected" << Debug::flush;
+ return;
+ }
+
+ DISPPARAMS dispParams = {NULL, NULL, 0, 0};
+ CComPtr<IDispatchEx> dispEx;
+ hr = IEUtils::Invoke(getWindow(), dispId, DISPATCH_METHOD, &dispParams, NULL, NULL, NULL);
+ if (FAILED(hr)) {
+ Debug::log(Debug::Error) << "Unable to invoke __gwt_disconnected" << Debug::flush;
+ SYSLOGERROR(L"failed to invoke __gwt_disconnected", L"hr=0x%08x", hr);
+ }
+}
+
+void IESessionHandler::fatalError(HostChannel& channel,
+ const std::string& message) {
+ SYSLOGERROR(L"IESessionHandler::fatalError()", L"%S", message.c_str());
+ Debug::log(Debug::Error) << "Fatal error: " << message << Debug::flush;
+}
+
+void IESessionHandler::freeJavaObject(unsigned int objId) {
+ // Remove the now-defunct object from the lookup table
+ javaObjectsById.erase(objId);
+
+ // and add it to the set of objects to free on the server
+ javaObjectsToFree.insert(objId);
+}
+
+void IESessionHandler::sendFreeValues(HostChannel& channel) {
+ int idCount = javaObjectsToFree.size();
+ if (idCount == 0) {
+ return;
+ }
+
+ Debug::log(Debug::Debugging) << "Freeing " << idCount << " Java objects on server" << Debug::flush;
+ scoped_array<int> ids(new int[idCount]);
+
+ std::set<int>::iterator it = javaObjectsToFree.begin();
+ for (int i = 0; it != javaObjectsToFree.end(); it++) {
+ ids[i++] = *it;
+ }
+
+ if (!ServerMethods::freeJava(channel, this, idCount, ids.get())) {
+ Debug::log(Debug::Error) << "Unable to free Java ids on server" << Debug::flush;
+ }
+
+ javaObjectsToFree.clear();
+}
+
+void IESessionHandler::freeValue(HostChannel& channel, int idCount, const int* ids) {
+ for (int i = 0; i < idCount; i++) {
+ int jsId = ids[i];
+ std::map<int, CComPtr<IUnknown>>::iterator it = jsObjectsById.find(jsId);
+ if (it == jsObjectsById.end()) {
+ Debug::log(Debug::Error) << "Trying to free unknown js id " << jsId << Debug::flush;
+ continue;
+ }
+ jsIdsByObject.erase(it->second);
+ jsObjectsById.erase(it);
+ }
+ Debug::log(Debug::Debugging) << "Freed " << idCount << " JS objects" << Debug::flush;
+}
+
+bool IESessionHandler::invoke(HostChannel& channel, const Value& thisObj,
+ const std::string& methodName, int numArgs,
+ const Value* const args, Value* returnValue)
+{
+ Debug::log(Debug::Debugging) << "Executing method " << methodName <<
+ " on object " << thisObj.toString() << Debug::flush;
+
+ DISPID methodDispId;
+ HRESULT hr = IEUtils::resolveName(window, methodName, &methodDispId);
+ if (FAILED(hr)) {
+ SYSLOGERROR(L"Failed to resolve name to DISPID",
+ L"IESessionHandler::invoke(thisObj=%S, methodName=%S)",
+ thisObj.toString().c_str(), methodName.c_str());
+ Debug::log(Debug::Error) << "Unable to find method " << methodName
+ << " on the window object" <<Debug::flush;
+ makeExceptionValue(*returnValue, "Unable to find named method on window");
+ return true;
+ }
+
+ // Get the JS Function object as an IDispatch
+ // TODO try PROPERTYGET|EXECUTE instead?
+ _variant_t functionObject;
+ DISPPARAMS disparamsNoArgs = {NULL, NULL, 0, 0};
+ hr = IEUtils::Invoke(window, methodDispId, DISPATCH_PROPERTYGET, &disparamsNoArgs,
+ functionObject.GetAddress(), NULL, NULL);
+ if (FAILED(hr)) {
+ Debug::log(Debug::Error) << "Unable to get method " << methodName
+ << Debug::flush;
+ makeExceptionValue(*returnValue, "Unable to get method from window");
+ return true;
+ } else if (functionObject.vt != VT_DISPATCH) {
+ Debug::log(Debug::Error) << "Did not get a VT_DISPATCH, got " <<
+ functionObject.vt << Debug::flush;
+ makeExceptionValue(*returnValue, "Did not get a VT_DISPATCH");
+ return true;
+ }
+
+ // See if it's an IDispatchEx
+ CComPtr<IDispatchEx> ex;
+ if (functionObject.pdispVal->QueryInterface(&ex)) {
+ // Probably not a function
+ Debug::log(Debug::Error) << "Failed to invoke " << methodName <<
+ " which is not an IDispatchEx" << Debug::flush;
+ makeExceptionValue(*returnValue, "Unable to invoke method");
+ return true;
+ }
+
+ // Convert the function arguments
+ // The parameters in the DISPARAMS are backwards
+ // Named parameters are first
+ int jsArgsLen = numArgs + 1;
+ scoped_array<_variant_t> jsargs(new _variant_t[jsArgsLen]);
+ DISPID thisId[] = {DISPID_THIS};
+ makeValueRef(jsargs[0], thisObj);
+ for (int i = 0; i < numArgs; i++) {
+ makeValueRef(jsargs[jsArgsLen - 1 - i], args[i]);
+ }
+ DISPPARAMS callDispParams = {jsargs.get(), thisId, numArgs + 1, 1};
+ EXCEPINFO excepInfo;
+ _variant_t retVal;
+ CComPtr<IExceptionCatcher> catcher;
+ CExceptionCatcher::CreateInstance(&catcher);
+
+ CComPtr<IServiceProvider> serviceProvider;
+ catcher->QueryInterface(&serviceProvider);
+ hr = ex->InvokeEx(DISPID_VALUE, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD,
+ &callDispParams, retVal.GetAddress(), &excepInfo, serviceProvider);
+
+ // There are cases where an exception was thrown and we've caught it, but
+ // the return value from InvokeEx is still S_OK. Thus, we check our
+ // ExceptionCatcher before using the res value to determine failure.
+ BOOL exceptionFlag = false;
+ catcher->hasSeenException(&exceptionFlag);
+ if (exceptionFlag) {
+ VARIANT exceptionVariant;
+ catcher->getException(&exceptionVariant);
+ _variant_t exception(exceptionVariant);
+
+ makeValue(*returnValue, exception);
+ exceptionFlag = true;
+
+ } else if (!SUCCEEDED(hr)) {
+ makeExceptionValue(*returnValue, "Unknown failure");
+ exceptionFlag = true;
+
+ } else {
+ // Success
+ makeValue(*returnValue, retVal);
+ }
+ return exceptionFlag != 0;
+}
+
+bool IESessionHandler::invokeSpecial(HostChannel& channel, SpecialMethodId method, int numArgs,
+ const Value* const args, Value* returnValue)
+{
+ Debug::log(Debug::Error) << "InvokeSpecial is currently unimplemented" << Debug::flush;
+ makeExceptionValue(*returnValue, "InvokeSpecial is currently unimplemented");
+ return true;
+}
+
+
+void IESessionHandler::loadJsni(HostChannel& channel, const std::string& js) {
+ Debug::log(Debug::Spam) << ">>> loadJsni\n" << js << "\n<<< loadJsni" << Debug::flush;
+
+ _variant_t retVal;
+ HRESULT hr = window->execScript(UTF8ToBSTR(js.length(), js.c_str()),
+ Constants::JavaScript, retVal.GetAddress());
+ if (FAILED(hr)) {
+ Debug::log(Debug::Error) << "Unable to evaluate JSNI code" << Debug::flush;
+ }
+}
+
+void IESessionHandler::makeException(_variant_t& in, const char* message) {
+ Debug::log(Debug::Debugging) << "Creating exception variant " <<
+ std::string(message) << Debug::flush;
+
+ SYSLOGERROR(L"IESessionHandler::makeException()", L"exception: %S", message);
+ DISPID dispId;
+ HRESULT hr = IEUtils::resolveName(window, Constants::Error, &dispId);
+ if (FAILED(hr)) {
+ SYSLOGERROR(L"failed to resolve Error object", L"hr=0x%08x", hr);
+ return;
+ }
+
+ DISPPARAMS emptyParams = {NULL, NULL, 0, 0};
+ _variant_t errorConstructor;
+ hr = IEUtils::Invoke(window, dispId, DISPATCH_PROPERTYGET, &emptyParams,
+ errorConstructor.GetAddress(), NULL, NULL);
+ if (FAILED(hr)) {
+ Debug::log(Debug::Error) << "Unable to get Error constructor" << Debug::flush;
+ in.SetString("Unable to get Error constructor");
+ }
+
+ CComPtr<IDispatchEx> ex;
+ hr = errorConstructor.pdispVal->QueryInterface(&ex);
+ if (FAILED(hr)) {
+ Debug::log(Debug::Error) << "Error constructor not IDispatchEx" << Debug::flush;
+ in.SetString("Error constructor not IDispatchEx");
+ }
+
+ _variant_t param = _variant_t(message);
+ DISPPARAMS dispParams = {¶m, NULL, 1, 0};
+
+ hr = ex->InvokeEx(DISPID_VALUE, LOCALE_SYSTEM_DEFAULT, DISPATCH_CONSTRUCT,
+ &dispParams, in.GetAddress(), NULL, NULL);
+
+ if (FAILED(hr)) {
+ Debug::log(Debug::Error) << "Unable to invoke Error constructor" << Debug::flush;
+ in.SetString("Unable to invoke Error constructor");
+ }
+}
+
+void IESessionHandler::makeExceptionValue(Value& in, const char* message) {
+ Debug::log(Debug::Debugging) << "Creating exception value " << std::string(message) << Debug::flush;
+ _variant_t exception;
+ makeException(exception, message);
+ makeValue(in, exception);
+}
+
+void IESessionHandler::makeValue(Value& retVal, const _variant_t& value) {
+ CComPtr<IDispatch> dispObj;
+ CComPtr<IJavaObject> javaObject;
+
+ switch (value.vt) {
+ case VT_EMPTY:
+ retVal.setUndefined();
+ break;
+
+ case VT_NULL:
+ retVal.setNull();
+ break;
+
+ case VT_BOOL:
+ retVal.setBoolean(VARIANT_TRUE == value.boolVal);
+ break;
+
+ case VT_BSTR:
+ retVal.setString(BSTRToUTF8(value.bstrVal));
+ break;
+
+ case VT_I4:
+ retVal.setInt(value.lVal);
+ break;
+
+ case VT_I8:
+ retVal.setLong(value.llVal);
+ break;
+
+ case VT_R4:
+ retVal.setFloat(value.fltVal);
+ break;
+
+ case VT_R8:
+ retVal.setDouble(value.dblVal);
+ break;
+
+ case VT_DISPATCH:
+ dispObj = value.pdispVal;
+
+ if (!dispObj) {
+ // XXX Determine if this is normal operation
+ retVal.setUndefined();
+
+ } else if (!dispObj->QueryInterface(&javaObject)) {
+ // It's one of our Java Object proxies
+ // XXX This casting is a hack
+ retVal.setJavaObject(((CJavaObject*)javaObject.p)->getObjectId());
+
+ } else {
+ _variant_t stringValue;
+ DISPPARAMS emptyParams = {NULL, NULL, 0, 0};
+ DISPID valueOfDispId = -1;
+ // See if it's a wrapped String object by invoking valueOf()
+ HRESULT hr = dispObj->GetIDsOfNames(IID_NULL, (LPOLESTR*)&Constants::valueOf, 1,
+ LOCALE_SYSTEM_DEFAULT, &valueOfDispId);
+ if ((valueOfDispId != -1) &&
+ SUCCEEDED(dispObj->Invoke(valueOfDispId, IID_NULL, LOCALE_SYSTEM_DEFAULT,
+ DISPATCH_METHOD, &emptyParams, stringValue.GetAddress(),
+ NULL, NULL)) &&
+ stringValue.vt == VT_BSTR) {
+ retVal.setString(BSTRToUTF8(stringValue.bstrVal));
+
+ } else {
+ // It's a plain-old JavaScript Object
+
+ // We ask for the IUnknown interface since that's the only
+ // COM interface guaranteed to have object-identity semantics
+ CComPtr<IUnknown> asUnknown;
+ dispObj->QueryInterface(&asUnknown);
+
+ // See if we already know about this object
+ std::map<IUnknown*, int>::iterator it = jsIdsByObject.find(asUnknown);
+ if (it != jsIdsByObject.end()) {
+ retVal.setJsObjectId(it->second);
+
+ } else {
+ // Allocate a new id
+ int objId = ++jsObjectId;
+ jsObjectsById[objId] = asUnknown;
+ jsIdsByObject[asUnknown] = objId;
+ retVal.setJsObjectId(objId);
+ }
+ }
+ }
+ break;
+
+ default:
+ Debug::log(Debug::Error) << "Unhandled variant type " << value.vt << Debug::flush;
+ retVal.setString("Unhandled variant type");
+ }
+}
+
+void IESessionHandler::makeValueRef(_variant_t& retVal, const Value& value) {
+ switch (value.getType()) {
+ case Value::NULL_TYPE:
+ retVal.ChangeType(VT_NULL);
+ break;
+
+ case Value::BOOLEAN:
+ retVal = value.getBoolean();
+ break;
+
+ case Value::BYTE:
+ retVal = value.getByte();
+ break;
+
+ case Value::CHAR:
+ retVal = value.getChar();
+ break;
+
+ case Value::SHORT:
+ retVal = value.getShort();
+ break;
+
+ case Value::INT:
+ retVal = value.getInt();
+ break;
+
+ case Value::LONG:
+ retVal = value.getLong();
+ break;
+
+ case Value::FLOAT:
+ retVal = value.getFloat();
+ break;
+
+ case Value::DOUBLE:
+ retVal = value.getDouble();
+ break;
+
+ case Value::STRING:
+ // The copy-constructor does not correctly handle embedded nulls
+ retVal.bstrVal = UTF8ToBSTR(value.getString().length(),
+ value.getString().c_str()).Detach();
+ retVal.vt = VT_BSTR;
+ break;
+
+ case Value::JAVA_OBJECT:
+ {
+ int javaId = value.getJavaObjectId();
+
+ std::map<int, IUnknown*>::iterator i = javaObjectsById.find(javaId);
+ if (i == javaObjectsById.end()) {
+ CComPtr<IUnknown> target;
+
+ // Create a new instance of the Java object proxy type
+ CJavaObject::CreateInstance(&target);
+
+ // Because we used CreateInstance, we can cast it back to the concrete type
+ // which allows us to pass pointers around, since we're guaranteed that
+ // it is in the same process space
+ ((CJavaObject*)target.p)->initialize(javaId, this);
+ target->QueryInterface(&retVal.pdispVal);
+
+ // Don't artificially increase the lifetime of a Java object proxy by
+ // calling Detach; we want Release to be called.
+ javaObjectsById[javaId] = target;
+
+ // We may have previously released the proxy for the same object id,
+ // but have not yet sent a free message back to the server.
+ javaObjectsToFree.erase(javaId);
+
+ } else {
+ i->second->QueryInterface(&retVal.pdispVal);
+ }
+ retVal.vt = VT_DISPATCH;
+ }
+ break;
+
+ case Value::JS_OBJECT:
+ {
+ int jsId = value.getJsObjectId();
+
+ std::map<int, CComPtr<IUnknown>>::iterator i = jsObjectsById.find(jsId);
+ if (i == jsObjectsById.end()) {
+ Debug::log(Debug::Error) << "Missing jsObject with id " << jsId << Debug::flush;
+
+ } else {
+ i->second->QueryInterface(&retVal.pdispVal);
+ retVal.vt = VT_DISPATCH;
+ }
+ }
+ break;
+
+ case Value::UNDEFINED:
+ retVal.ChangeType(VT_EMPTY);
+ break;
+
+ default:
+ Debug::log(Debug::Error) << "Unknown Value type " << value.toString() << Debug::flush;
+ }
+}
diff --git a/plugins/ie/oophm/oophm/IESessionHandler.h b/plugins/ie/oophm/oophm/IESessionHandler.h
new file mode 100644
index 0000000..2675810
--- /dev/null
+++ b/plugins/ie/oophm/oophm/IESessionHandler.h
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2008 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.
+ */
+
+#pragma once
+#include <map>
+#include <set>
+#include "HostChannel.h"
+#include "JavaObject.h"
+#include "mshtml.h"
+#include "oophm_i.h"
+#include "SessionData.h"
+#include "SessionHandler.h"
+
+class IESessionHandler :
+ public SessionData,
+ public SessionHandler
+{
+public:
+ IESessionHandler(HostChannel* channel, IHTMLWindow2* window);
+ ~IESessionHandler(void);
+ virtual void freeJavaObject(unsigned int objId);
+ virtual void makeValue(Value& value, const _variant_t& in);
+ virtual void makeValueRef(_variant_t& value, const Value& in);
+
+protected:
+ virtual void disconnectDetectedImpl();
+ virtual void fatalError(HostChannel& channel, const std::string& messsage);
+ virtual void freeValue(HostChannel& channel, int idCount, const int* ids);
+ virtual void loadJsni(HostChannel& channel, const std::string& js);
+ virtual bool invoke(HostChannel& channel, const Value& thisObj, const std::string& methodName,
+ int numArgs, const Value* const args, Value* returnValue);
+ virtual bool invokeSpecial(HostChannel& channel, SpecialMethodId method, int numArgs,
+ const Value* const args, Value* returnValue);
+ virtual void sendFreeValues(HostChannel& channel);
+
+
+private:
+ int jsObjectId;
+
+ /*
+ * This must be IUnknown and not IDispatch because the IUnknown
+ * interface is the only COM interface guaranteed to be stable for
+ * any particular instance of an object. It appears as though
+ * Event objects exhibit the multiple-interface behavior.
+ *
+ * Furthermore, this map is not a CComPtr map because we don't
+ * to artificially add to the retain count of the Java objects.
+ */
+ std::map<int, IUnknown*> javaObjectsById;
+ std::set<int> javaObjectsToFree;
+
+ // Same as above; only one map needs to increment reference count.
+ std::map<int, CComPtr<IUnknown>> jsObjectsById;
+ std::map<IUnknown*, int> jsIdsByObject;
+
+ /*
+ * Create a JavaScript Error object with the given message.
+ */
+ void makeException(_variant_t& value, const char* message);
+
+ /*
+ * Create a exception Value that contains the given message.
+ */
+ void makeExceptionValue(Value& value, const char* message);
+};
diff --git a/plugins/ie/oophm/oophm/IEUtils.h b/plugins/ie/oophm/oophm/IEUtils.h
new file mode 100644
index 0000000..8c5dd28
--- /dev/null
+++ b/plugins/ie/oophm/oophm/IEUtils.h
@@ -0,0 +1,178 @@
+/*
+* Copyright 2008 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.
+*/
+
+#pragma once
+#include "stdafx.h"
+#include "comutil.h"
+#include "dispex.h"
+#include "SessionData.h"
+
+#define SYSLOGERROR(MSG,FMT,...) \
+ LPCWSTR msgArr[3] = {NULL, NULL, NULL}; \
+ msgArr[0] = MSG; \
+ WCHAR buffer1[512]; \
+ swprintf(buffer1, sizeof(buffer1)/sizeof(WCHAR), FMT, __VA_ARGS__); \
+ msgArr[1] = buffer1; \
+ WCHAR buffer2[512]; \
+ swprintf(buffer2, sizeof(buffer2)/sizeof(WCHAR), L"function: %S, file: %S, line: %d", __FUNCTION__, __FILE__, __LINE__); \
+ msgArr[2] = buffer2; \
+ IEUtils::WriteToLog((LPCWSTR*)msgArr, 3);
+
+
+typedef HRESULT (*PFNRESOLVENAME)(IDispatch*, LPOLESTR, DISPID*);
+
+//
+// This class is a collection of helper methods specific to IE
+// It finds the appropriate implementation that resolves javascript
+// names regardless of the specific documentMode that browser is
+// running.
+//
+class IEUtils
+{
+ static HANDLE hEventLog;
+ static LPWSTR logSourceName;
+ static PFNRESOLVENAME pfnResolveName;
+
+ //
+ // finds which IDispatch interface is capable of
+ // of 'resolving' names.
+ //
+ static PFNRESOLVENAME getResolveNameFunction(IDispatch* obj)
+ {
+ _variant_t retVal;
+ std::string probeScript("function _FN3E9738B048214100A6D6B750F2230A34() { return null; }");
+ CComQIPtr<IHTMLWindow2> spWindow2(obj);
+ if (!spWindow2) {
+ return &IEUtils::internalResolveNameEx;
+ }
+ LPOLESTR functionName = L"_FN3E9738B048214100A6D6B750F2230A34";
+ HRESULT hr = spWindow2->execScript(UTF8ToBSTR(probeScript.length(), probeScript.c_str()),
+ UTF8ToBSTR(10, "JavaScript"), retVal.GetAddress());
+ if (SUCCEEDED(hr)) {
+ DISPID dispId;
+ hr = internalResolveName(spWindow2, functionName, &dispId);
+ if (SUCCEEDED(hr)) {
+ return &IEUtils::internalResolveName;
+ } else {
+ hr = internalResolveNameEx(spWindow2, functionName, &dispId);
+ if (SUCCEEDED(hr)) {
+ return &IEUtils::internalResolveNameEx;
+ } else {
+ SYSLOGERROR(L"Failed to find a IDispatch Implementation able to resolve names",
+ L"hr=0x%08x", hr);
+ }
+ }
+ }
+ return &IEUtils::internalResolveNameEx;
+ }
+
+ //
+ // resolves 'name' using default IDispatch interface
+ //
+ static HRESULT internalResolveName(IDispatch* obj, LPOLESTR name, DISPID *dispID)
+ {
+ assert(obj != NULL);
+ return obj->GetIDsOfNames(IID_NULL, &name, 1, LOCALE_SYSTEM_DEFAULT, dispID);
+ }
+
+ //
+ // resolves 'name' using IDispatchEx interface
+ //
+ static HRESULT internalResolveNameEx(IDispatch* obj, LPOLESTR name, DISPID *dispID)
+ {
+ assert(obj != NULL);
+ CComQIPtr<IDispatchEx> spDispEx(obj);
+ if (!spDispEx) {
+ return E_FAIL;
+ }
+ return spDispEx->GetIDsOfNames(IID_NULL, &name, 1, LOCALE_SYSTEM_DEFAULT, dispID);
+ }
+
+public:
+
+ static void InitEventLog() {
+ if (NULL == hEventLog) {
+ hEventLog = OpenEventLog(NULL, IEUtils::logSourceName);
+ }
+ }
+
+ static void WriteToLog(LPCWSTR* rgMsg, INT size) {
+ if (NULL != hEventLog) {
+ ReportEvent(hEventLog, EVENTLOG_ERROR_TYPE, 0, 0, NULL, size, 0, rgMsg, NULL);
+ }
+ }
+
+ static void CloseEventLog()
+ {
+ if (NULL != hEventLog) {
+ ::CloseEventLog(hEventLog);
+ }
+ }
+
+ static WCHAR* GetSysErrorMessage(DWORD dwErrorCode)
+ {
+ WCHAR * pMsgBuf = NULL;
+ DWORD dwSize = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM |
+ FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS,
+ NULL, dwErrorCode, 0, (LPTSTR) &pMsgBuf, 0, NULL);
+ if (dwSize) {
+ return pMsgBuf;
+ }
+ return NULL;
+ }
+
+ static HRESULT resolveName(IDispatch* obj, LPOLESTR name, DISPID *dispID)
+ {
+ if (NULL == pfnResolveName) {
+ pfnResolveName = getResolveNameFunction(obj);
+ }
+ assert(NULL != pfnResolveName);
+ return pfnResolveName(obj, name, dispID);
+ }
+
+ static HRESULT resolveName(IDispatch* obj, std::string name, DISPID *dispID)
+ {
+ return resolveName(obj, UTF8ToBSTR(name.length(), name.c_str()), dispID);
+ }
+
+ static void resetResolver()
+ {
+ pfnResolveName = NULL;
+ }
+
+ static HRESULT Invoke(IUnknown* obj,
+ DISPID id,
+ WORD wFlags,
+ DISPPARAMS *pdp,
+ VARIANT *pvarRes,
+ EXCEPINFO *pei,
+ UINT *puArgErr)
+ {
+ HRESULT hr = S_OK;
+ CComQIPtr<IDispatchEx> spDispEx(obj);
+ if (!spDispEx) {
+ return E_FAIL;
+ }
+ hr = spDispEx->Invoke(id, IID_NULL, LOCALE_SYSTEM_DEFAULT, wFlags, pdp, pvarRes, pei, puArgErr);
+ return hr;
+ }
+};
+
+__declspec(selectany) HANDLE IEUtils::hEventLog;
+__declspec(selectany) LPWSTR IEUtils::logSourceName = L"GWT Developer Mode Plugin";
+__declspec(selectany) HRESULT (*IEUtils::pfnResolveName)(IDispatch* object, LPOLESTR name, DISPID *dispID);
+
+
diff --git a/plugins/ie/oophm/oophm/JavaObject.cpp b/plugins/ie/oophm/oophm/JavaObject.cpp
new file mode 100644
index 0000000..fdf87ce
--- /dev/null
+++ b/plugins/ie/oophm/oophm/JavaObject.cpp
@@ -0,0 +1,266 @@
+/*
+ * Copyright 2008 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.
+ */
+
+// JavaObject.cpp : Implementation of CJavaObject
+
+#include "stdafx.h"
+#include "InvokeMessage.h"
+#include "JavaObject.h"
+#include "ReturnMessage.h"
+#include "ServerMethods.h"
+#include "scoped_ptr/scoped_ptr.h"
+#include "IEUtils.h"
+#include "Constants.h"
+//#include "activscp.h"
+
+static const DISPID DISPID_TOSTRING = 1;
+
+// CJavaObject
+STDMETHODIMP CJavaObject::GetDispID(BSTR name, DWORD options, DISPID* dispId){
+ std::string nameString = BSTRToUTF8(name);
+
+ // toString is the only non-numeric dispid we recognize
+ if (nameString == "toString") {
+ *dispId = DISPID_TOSTRING;
+ return S_OK;
+ }
+
+ char* lastChar;
+ int d = strtol(nameString.c_str(), &lastChar, 10);
+
+ if (*lastChar != '\0' || d < 0) {
+ Debug::log(Debug::Error) << "Unable to get dispatch id for " << nameString << Debug::flush;
+ // Set to unknown name in the case of an error
+ *dispId = DISPID_UNKNOWN;
+ return DISP_E_UNKNOWNNAME;
+ }
+ *dispId = d;
+ return S_OK;
+}
+
+STDMETHODIMP CJavaObject::DeleteMemberByName(BSTR,DWORD){
+ return S_FALSE;
+}
+
+STDMETHODIMP CJavaObject::DeleteMemberByDispID(DISPID){
+ return S_FALSE;
+}
+
+STDMETHODIMP CJavaObject::GetMemberProperties(DISPID dispId, DWORD options, DWORD* retVal){
+ Debug::log(Debug::Error) << "Hit unimplemented GetMemberProperties" << Debug::flush;
+ return DISP_E_UNKNOWNNAME;
+}
+
+STDMETHODIMP CJavaObject::GetMemberName(DISPID,BSTR *){
+ Debug::log(Debug::Error) << "Hit unimplemented GetMemberName" << Debug::flush;
+ return DISP_E_UNKNOWNNAME;
+}
+
+STDMETHODIMP CJavaObject::GetNextDispID(DWORD,DISPID,DISPID *){
+ Debug::log(Debug::Error) << "Hit unimplemented GetNextDispID" << Debug::flush;
+ return DISP_E_UNKNOWNNAME;
+}
+
+STDMETHODIMP CJavaObject::GetNameSpaceParent(IUnknown **unk){
+ sessionData->getWindow()->QueryInterface(unk);
+ return S_OK;
+}
+
+STDMETHODIMP CJavaObject::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
+ UINT cNames, LCID lcid, DISPID* rgdispid)
+{
+ USES_CONVERSION;
+ // Stack-allocated
+ return GetDispID(OLE2BSTR(*rgszNames), 0, rgdispid);
+}
+
+STDMETHODIMP CJavaObject::Invoke(DISPID dispidMember, REFIID riid,
+ LCID lcid, WORD wFlags, DISPPARAMS* pdispparams,
+ VARIANT* pvarResult, EXCEPINFO* pexcepinfo,
+ UINT* puArgErr)
+{
+ return InvokeEx(dispidMember, lcid, wFlags, pdispparams, pvarResult,
+ pexcepinfo, NULL);
+}
+
+STDMETHODIMP CJavaObject::InvokeEx(DISPID dispidMember, LCID lcid, WORD wFlags,
+ DISPPARAMS* pdispparams, VARIANT* pvarResult,
+ EXCEPINFO* pexcepinfo,
+ IServiceProvider* pspCaller)
+{
+ Debug::log(Debug::Debugging) << "Invoking " << dispidMember << " on Java object " << objId << Debug::flush;
+
+ if (!sessionData) {
+ // Prevent errors if the object is retained post-disconnect
+ Debug::log(Debug::Warning) << "JavaObject retained beyound session shutdown" << Debug::flush;
+ return DISP_E_MEMBERNOTFOUND;
+ }
+
+ HostChannel* channel = sessionData->getHostChannel();
+ Value thisRef = Value();
+ thisRef.setJavaObject(objId);
+
+ if ((wFlags & DISPATCH_PROPERTYGET) && dispidMember == DISPID_VALUE &&
+ pdispparams->cArgs - pdispparams->cNamedArgs == 0) {
+ // This is an expression like ('' + obj)
+ // raw toString();
+ wFlags = DISPATCH_METHOD;
+ dispidMember = DISPID_TOSTRING;
+ }
+
+ if (wFlags & DISPATCH_METHOD) {
+ Debug::log(Debug::Spam) << "Dispatching method " << dispidMember << " on " << objId << Debug::flush;
+
+ if (!(dispidMember == DISPID_VALUE || dispidMember == DISPID_TOSTRING)) {
+ Debug::log(Debug::Error) << "Cannot dispatch for non-default id: " << dispidMember << Debug::flush;
+ return E_FAIL;
+ }
+ scoped_array<Value> args;
+ Value javaDispatchId;
+ int numArgs;
+
+ if (dispidMember == DISPID_VALUE) {
+ numArgs = pdispparams->cArgs - pdispparams->cNamedArgs - 2;
+ if (numArgs < 0) {
+ // Indicates an error in JSNI rewriting or dispatch code
+ Debug::log(Debug::Error) << "Insufficient number of arguments" << Debug::flush;
+ return E_FAIL;
+ }
+ args.reset(new Value[numArgs]);
+ // The dispatch parameters are backwards
+ sessionData->makeValue(javaDispatchId, pdispparams->rgvarg[pdispparams->cArgs - 1]);
+ sessionData->makeValue(thisRef, pdispparams->rgvarg[pdispparams->cArgs - 2]);
+ for (int i = 0; i < numArgs; i++) {
+ int index = pdispparams->cArgs - 3 - i;
+ VARIANTARG element = pdispparams->rgvarg[index];
+ sessionData->makeValue(args[i], element);
+ }
+ } else if (dispidMember == DISPID_TOSTRING) {
+ // raw toString();
+ numArgs = 0;
+ javaDispatchId.setInt(0);
+ }
+
+ bool isException = false;
+ Value returnValue;
+ if (!InvokeMessage::send(*channel, thisRef, javaDispatchId.getInt(), numArgs, args.get())) {
+ Debug::log(Debug::Error) << "Unable to send method invocation" << Debug::flush;
+ } else {
+ scoped_ptr<ReturnMessage> m(channel->reactToMessagesWhileWaitingForReturn(
+ sessionData->getSessionHandler()));
+
+ if (!m.get()) {
+ Debug::log(Debug::Error) << "Did not receive ReturnMessage" << Debug::flush;
+ } else {
+ if (dispidMember == DISPID_TOSTRING) {
+ // raw toString();
+ if (pvarResult) {
+ // This will be NULL when the caller doesn't care about the return value
+ _variant_t returnVariant;
+ sessionData->makeValueRef(returnVariant, m->getReturnValue());
+ *pvarResult = returnVariant.Detach();
+ }
+ return m->isException() ? E_FAIL : S_OK;
+ }
+ isException = m->isException();
+ returnValue = m->getReturnValue();
+ }
+ }
+
+ DISPID dispId;
+
+ HRESULT hr = IEUtils::resolveName(sessionData->getWindow(), Constants::__gwt_makeResult, &dispId);
+ if (FAILED(hr)) {
+ Debug::log(Debug::Error) << "Unable to get dispId for __gwt_makeResult" << Debug::flush;
+ return E_FAIL;
+ }
+
+ // Call __gwt_makeResult(isException, returnValue)
+ scoped_array<_variant_t> varArgs(new _variant_t[2]);
+ // Args go backwards.
+ varArgs[1] = (isException ? 1 : 0);
+ sessionData->makeValueRef(varArgs[0], returnValue);
+ DISPPARAMS dispParams = {varArgs.get(), NULL, 2, 0};
+ CComPtr<IDispatchEx> dispEx;
+ sessionData->getWindow()->QueryInterface(&dispEx);
+ return dispEx->InvokeEx(dispId, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD,
+ &dispParams, pvarResult, pexcepinfo, pspCaller);
+
+ } else if (wFlags & DISPATCH_PROPERTYGET) {
+ Debug::log(Debug::Spam) << "Getting property " << dispidMember << " on " << objId << Debug::flush;
+
+ if (dispidMember == DISPID_VALUE) {
+ this->QueryInterface(IID_IDispatch, (void**)&pvarResult->pdispVal);
+ pvarResult->vt = VT_DISPATCH;
+
+ } else if (dispidMember == DISPID_TOSTRING) {
+ // Asking for a tear-off of the .toString function
+ Debug::log(Debug::Spam) << "Making .toString tearoff" << Debug::flush;
+
+ // Get a reference to __gwt_makeTearOff
+ DISPID tearOffDispid;
+ HRESULT hr = IEUtils::resolveName(sessionData->getWindow(), Constants::__gwt_makeTearOff, &tearOffDispid);
+ if (FAILED(hr)) {
+ Debug::log(Debug::Error) << "Unable to find __gwt_makeTearOff" << Debug::flush;
+ return E_FAIL;
+ }
+
+ scoped_array<_variant_t> tearOffArgs(new _variant_t[3]);
+ // Parameters are backwards:
+ // __gwt_makeTearOff(proxy, dispId, argCount);
+ tearOffArgs[2] = this; // proxy
+ tearOffArgs[1] = 0; // dispId
+ tearOffArgs[0] = 0; // argCount
+ DISPPARAMS tearOffParams = {tearOffArgs.get(), NULL, 3, 0};
+
+ // Invoke __gwt_makeTearOff
+ hr = IEUtils::Invoke(sessionData->getWindow(), tearOffDispid,DISPATCH_METHOD,
+ &tearOffParams, pvarResult, NULL, 0);
+ if (FAILED(hr)) {
+ Debug::log(Debug::Error) << "Unable to invoke __gwt_makeTearOff" << Debug::flush;
+ return E_FAIL;
+ }
+
+ } else {
+ Value ret = ServerMethods::getProperty(*channel,
+ sessionData->getSessionHandler(), objId, dispidMember);
+
+ if (ret.isUndefined()) {
+ Debug::log(Debug::Error) << "Undefined get from Java object" << Debug::flush;
+ return E_FAIL;
+ }
+
+ _variant_t returnVariant;
+ sessionData->makeValueRef(returnVariant, ret);
+ *pvarResult = returnVariant.Detach();
+ }
+
+ } else if (wFlags & (DISPATCH_PROPERTYPUT | DISPATCH_PROPERTYPUTREF)) {
+ Debug::log(Debug::Spam) << "Setting property " << dispidMember << " on " << objId << Debug::flush;
+
+ Value value;
+ sessionData->makeValue(value, pdispparams->rgvarg[0]);
+
+ ServerMethods::setProperty(*channel, sessionData->getSessionHandler(),
+ objId, dispidMember, value);
+
+ } else {
+ Debug::log(Debug::Error) << "Unsupported invocation " << wFlags << Debug::flush;
+ return DISP_E_MEMBERNOTFOUND;
+ }
+
+ return S_OK;
+}
diff --git a/plugins/ie/oophm/oophm/JavaObject.h b/plugins/ie/oophm/oophm/JavaObject.h
new file mode 100644
index 0000000..cf56fa2
--- /dev/null
+++ b/plugins/ie/oophm/oophm/JavaObject.h
@@ -0,0 +1,105 @@
+/*
+ * Copyright 2008 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.
+ */
+
+// JavaObject.h : Declaration of the CJavaObject
+
+#pragma once
+#include "resource.h" // main symbols
+#include "SessionData.h"
+
+#include "oophm_i.h"
+
+
+#if defined(_WIN32_WCE) && !defined(_CE_DCOM) && !defined(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA)
+#error "Single-threaded COM objects are not properly supported on Windows CE platform, such as the Windows Mobile platforms that do not include full DCOM support. Define _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA to force ATL to support creating single-thread COM object's and allow use of it's single-threaded COM object implementations. The threading model in your rgs file was set to 'Free' as that is the only threading model supported in non DCOM Windows CE platforms."
+#endif
+
+
+
+// CJavaObject
+
+class ATL_NO_VTABLE CJavaObject :
+ public CComObjectRootEx<CComSingleThreadModel>,
+ public CComCoClass<CJavaObject, &CLSID_JavaObject>,
+ public IDispatchImpl<IJavaObject, &IID_IJavaObject, &LIBID_oophmLib, /*wMajor =*/ 1, /*wMinor =*/ 0>
+{
+public:
+ // TODO How can the default constructor be gotten rid of?
+ CJavaObject() : objId(-1) {
+ }
+
+ STDMETHOD(GetIDsOfNames)(REFIID riid, LPOLESTR* rgszNames, UINT cNames,
+ LCID lcid, DISPID* rgdispid);
+
+ STDMETHOD(Invoke)(DISPID dispidMember, REFIID riid,
+ LCID lcid, WORD wFlags, DISPPARAMS* pdispparams, VARIANT* pvarResult,
+ EXCEPINFO* pexcepinfo, UINT* puArgErr);
+
+DECLARE_REGISTRY_RESOURCEID(IDR_JAVAOBJECT)
+
+
+BEGIN_COM_MAP(CJavaObject)
+ COM_INTERFACE_ENTRY(IJavaObject)
+ COM_INTERFACE_ENTRY(IDispatchEx)
+ COM_INTERFACE_ENTRY(IDispatch)
+END_COM_MAP()
+
+
+
+ DECLARE_PROTECT_FINAL_CONSTRUCT()
+
+ HRESULT FinalConstruct()
+ {
+ return S_OK;
+ }
+
+ void FinalRelease()
+ {
+ Debug::log(Debug::Debugging) << "JavaObject " << objId << " released" << Debug::flush;
+ if (sessionData) {
+ // After shutdown, the session data will have been torn down
+ sessionData->freeJavaObject(objId);
+ }
+ }
+
+ unsigned int getObjectId() const {
+ return objId;
+ }
+
+ STDMETHOD(GetDispID)(BSTR,DWORD,DISPID *);
+ STDMETHOD(InvokeEx)(DISPID,LCID,WORD,DISPPARAMS *,VARIANT *,EXCEPINFO *,IServiceProvider *);
+ STDMETHOD(DeleteMemberByName)(BSTR,DWORD);
+ STDMETHOD(DeleteMemberByDispID)(DISPID);
+ STDMETHOD(GetMemberProperties)(DISPID,DWORD,DWORD *);
+ STDMETHOD(GetMemberName)(DISPID,BSTR *);
+ STDMETHOD(GetNextDispID)(DWORD,DISPID,DISPID *);
+ STDMETHOD(GetNameSpaceParent)(IUnknown **);
+
+ void initialize(unsigned int objId, SessionDataRef sessionData) {
+ this->objId = objId;
+ this->sessionData = sessionData;
+ }
+
+ void shutdown() {
+ sessionData = NULL;
+ }
+
+private:
+ unsigned int objId;
+ SessionDataRef sessionData;
+};
+
+OBJECT_ENTRY_AUTO(__uuidof(JavaObject), CJavaObject)
diff --git a/plugins/ie/oophm/oophm/JavaObject.rgs b/plugins/ie/oophm/oophm/JavaObject.rgs
new file mode 100644
index 0000000..f84f142
--- /dev/null
+++ b/plugins/ie/oophm/oophm/JavaObject.rgs
@@ -0,0 +1,26 @@
+HKCR
+{
+ oophm.JavaObject.1 = s 'JavaObject Class'
+ {
+ CLSID = s '{644FD769-8B9D-4AC4-A79E-AAAF5CD751C1}'
+ }
+ oophm.JavaObject = s 'JavaObject Class'
+ {
+ CLSID = s '{644FD769-8B9D-4AC4-A79E-AAAF5CD751C1}'
+ CurVer = s 'oophm.JavaObject.1'
+ }
+ NoRemove CLSID
+ {
+ ForceRemove {644FD769-8B9D-4AC4-A79E-AAAF5CD751C1} = s 'JavaObject Class'
+ {
+ ProgID = s 'oophm.JavaObject.1'
+ VersionIndependentProgID = s 'oophm.JavaObject'
+ ForceRemove 'Programmable'
+ InprocServer32 = s '%MODULE%'
+ {
+ val ThreadingModel = s 'Apartment'
+ }
+ 'TypeLib' = s '{9259F105-BE55-4BF6-B7CE-D0AA878C1BA6}'
+ }
+ }
+}
diff --git a/plugins/ie/oophm/oophm/ReadMe.txt b/plugins/ie/oophm/oophm/ReadMe.txt
new file mode 100644
index 0000000..2e7a437
--- /dev/null
+++ b/plugins/ie/oophm/oophm/ReadMe.txt
@@ -0,0 +1,56 @@
+========================================================================
+ ACTIVE TEMPLATE LIBRARY : oophm Project Overview
+========================================================================
+
+AppWizard has created this oophm project for you to use as the starting point for
+writing your Dynamic Link Library (DLL).
+
+This file contains a summary of what you will find in each of the files that
+make up your project.
+
+oophm.vcproj
+ This is the main project file for VC++ projects generated using an Application Wizard.
+ It contains information about the version of Visual C++ that generated the file, and
+ information about the platforms, configurations, and project features selected with the
+ Application Wizard.
+
+oophm.idl
+ This file contains the IDL definitions of the type library, the interfaces
+ and co-classes defined in your project.
+ This file will be processed by the MIDL compiler to generate:
+ C++ interface definitions and GUID declarations (oophm.h)
+ GUID definitions (oophm_i.c)
+ A type library (oophm.tlb)
+ Marshaling code (oophm_p.c and dlldata.c)
+
+oophm.h
+ This file contains the C++ interface definitions and GUID declarations of the
+ items defined in oophm.idl. It will be regenerated by MIDL during compilation.
+
+oophm.cpp
+ This file contains the object map and the implementation of your DLL's exports.
+
+oophm.rc
+ This is a listing of all of the Microsoft Windows resources that the
+ program uses.
+
+oophm.def
+ This module-definition file provides the linker with information about the exports
+ required by your DLL. It contains exports for:
+ DllGetClassObject
+ DllCanUnloadNow
+ DllRegisterServer
+ DllUnregisterServer
+
+/////////////////////////////////////////////////////////////////////////////
+Other standard files:
+
+StdAfx.h, StdAfx.cpp
+ These files are used to build a precompiled header (PCH) file
+ named oophm.pch and a precompiled types file named StdAfx.obj.
+
+Resource.h
+ This is the standard header file that defines resource IDs.
+
+
+/////////////////////////////////////////////////////////////////////////////
diff --git a/plugins/ie/oophm/oophm/SessionData.h b/plugins/ie/oophm/oophm/SessionData.h
new file mode 100644
index 0000000..ac8fe67
--- /dev/null
+++ b/plugins/ie/oophm/oophm/SessionData.h
@@ -0,0 +1,105 @@
+/*
+ * Copyright 2008 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.
+ */
+
+#pragma once
+#include "stdafx.h"
+#include "comutil.h"
+#include "HostChannel.h"
+#include "Mshtml.h"
+#include "SessionHandler.h"
+#include "scoped_ptr/scoped_ptr.h"
+
+/*
+* Encapsules per-OOPHM-session data.
+*/
+class SessionData {
+public:
+ SessionData(HostChannel* channel,
+ IHTMLWindow2* window,
+ SessionHandler* sessionHandler) : channel(channel),
+ window(window),
+ sessionHandler(sessionHandler) {
+ }
+
+ virtual void freeJavaObject(unsigned int objId)=0;
+
+ HostChannel* getHostChannel() const {
+ return channel.get();
+ }
+
+ SessionHandler* getSessionHandler() const {
+ return sessionHandler;
+ }
+
+ IHTMLWindow2* getWindow() const {
+ return window;
+ }
+
+ /*
+ * Convert a value from the JavaScript into something that can be sent back
+ * to the OOPHM host.
+ */
+ virtual void makeValue(Value& value, const _variant_t& in)=0;
+
+ /*
+ * Convert a value from the OOPHM host into something that can be passed into
+ * the JavaScript execution environment.
+ */
+ virtual void makeValueRef(_variant_t& value, const Value& in)=0;
+
+protected:
+ /*
+ * The communication channel used for the OOPHM session.
+ */
+ scoped_ptr<HostChannel> const channel;
+
+ /*
+ * A reference to the SessionHandler being used in the OOPHM session.
+ */
+ SessionHandler* const sessionHandler;
+
+ CComPtr<IHTMLWindow2> const window;
+};
+typedef SessionData* SessionDataRef;
+
+// TODO move these to a utility header
+
+__inline static std::string BSTRToUTF8(BSTR bstr) {
+ // Need an explict length due to the possibility of embedded nulls
+ int length = SysStringLen(bstr);
+ int numChars = WideCharToMultiByte(CP_UTF8, 0, bstr, length, NULL, 0, NULL, NULL);
+ char* buffer = new char[numChars];
+ int res = WideCharToMultiByte(CP_UTF8, 0, bstr, length, buffer, numChars, NULL, NULL);
+ // TODO assert res == numChars?
+ std::string toReturn = std::string(buffer, res);
+ delete[] buffer;
+ return toReturn;
+}
+
+/*
+ * Convert a utf8-encoded string into a BSTR. The length is explicitly
+ * specified because the incoming string may have embedded null charachers.
+ */
+__inline static _bstr_t UTF8ToBSTR(int length, const char* utf8) {
+ // We explicitly use MultiByteToWideChar to handle embedded nulls
+ int numChars = MultiByteToWideChar(CP_UTF8, 0, utf8, length, NULL, 0);
+ OLECHAR* buffer = new OLECHAR[numChars];
+ int res = MultiByteToWideChar(CP_UTF8, 0, utf8, length, buffer, numChars);
+ // Manually allocate the BSTR to set the length; _bstr_t assumes C-strings
+ _bstr_t toReturn = _bstr_t(SysAllocStringLen(buffer, res), false);
+ delete[] buffer;
+ return toReturn;
+}
diff --git a/plugins/ie/oophm/oophm/dlldata.c b/plugins/ie/oophm/oophm/dlldata.c
new file mode 100644
index 0000000..7b86f60
--- /dev/null
+++ b/plugins/ie/oophm/oophm/dlldata.c
@@ -0,0 +1,38 @@
+/*********************************************************
+ DllData file -- generated by MIDL compiler
+
+ DO NOT ALTER THIS FILE
+
+ This file is regenerated by MIDL on every IDL file compile.
+
+ To completely reconstruct this file, delete it and rerun MIDL
+ on all the IDL files in this DLL, specifying this file for the
+ /dlldata command line option
+
+*********************************************************/
+
+#define PROXY_DELEGATION
+
+#include <rpcproxy.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+EXTERN_PROXY_FILE( oophm )
+
+
+PROXYFILE_LIST_START
+/* Start of list */
+ REFERENCE_PROXY_FILE( oophm ),
+/* End of list */
+PROXYFILE_LIST_END
+
+
+DLLDATA_ROUTINES( aProxyFileList, GET_DLL_CLSID )
+
+#ifdef __cplusplus
+} /*extern "C" */
+#endif
+
+/* end of generated dlldata file */
diff --git a/plugins/ie/oophm/oophm/dlldatax.c b/plugins/ie/oophm/oophm/dlldatax.c
new file mode 100644
index 0000000..8979369
--- /dev/null
+++ b/plugins/ie/oophm/oophm/dlldatax.c
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2008 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.
+ */
+
+// wrapper for dlldata.c
+
+#ifdef _MERGE_PROXYSTUB // merge proxy stub DLL
+
+#define REGISTER_PROXY_DLL //DllRegisterServer, etc.
+
+#define _WIN32_WINNT 0x0500 //for WinNT 4.0 or Win95 with DCOM
+#define USE_STUBLESS_PROXY //defined only with MIDL switch /Oicf
+
+#pragma comment(lib, "rpcns4.lib")
+#pragma comment(lib, "rpcrt4.lib")
+
+#define ENTRY_PREFIX Prx
+
+#include "dlldata.c"
+#include "oophm_p.c"
+
+#endif //_MERGE_PROXYSTUB
diff --git a/plugins/ie/oophm/oophm/dlldatax.h b/plugins/ie/oophm/oophm/dlldatax.h
new file mode 100644
index 0000000..4ce5f66
--- /dev/null
+++ b/plugins/ie/oophm/oophm/dlldatax.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2008 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.
+ */
+
+#pragma once
+
+#ifdef _MERGE_PROXYSTUB
+
+extern "C"
+{
+BOOL WINAPI PrxDllMain(HINSTANCE hInstance, DWORD dwReason,
+ LPVOID lpReserved);
+STDAPI PrxDllCanUnloadNow(void);
+STDAPI PrxDllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv);
+STDAPI PrxDllRegisterServer(void);
+STDAPI PrxDllUnregisterServer(void);
+}
+
+#endif
diff --git a/plugins/ie/oophm/oophm/dllmain.cpp b/plugins/ie/oophm/oophm/dllmain.cpp
new file mode 100644
index 0000000..eaa3ed9
--- /dev/null
+++ b/plugins/ie/oophm/oophm/dllmain.cpp
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2008 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.
+ */
+
+// dllmain.cpp : Implementation of DllMain.
+#include "stdafx.h"
+#include "resource.h"
+#include "oophm_i.h"
+#include "dllmain.h"
+#include "dlldatax.h"
+#include "AllowDialog.h"
+
+CoophmModule _AtlModule;
+
+// DLL Entry Point
+extern "C" BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
+{
+#ifdef _MERGE_PROXYSTUB
+ if (!PrxDllMain(hInstance, dwReason, lpReserved))
+ return FALSE;
+#endif
+ DisableThreadLibraryCalls(hInstance);
+
+ AllowDialog::setHInstance(hInstance);
+
+ return _AtlModule.DllMain(dwReason, lpReserved);
+}
diff --git a/plugins/ie/oophm/oophm/dllmain.h b/plugins/ie/oophm/oophm/dllmain.h
new file mode 100644
index 0000000..6965209
--- /dev/null
+++ b/plugins/ie/oophm/oophm/dllmain.h
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2008 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.
+ */
+
+// dllmain.h : Declaration of module class.
+
+class CoophmModule : public CAtlDllModuleT< CoophmModule >
+{
+public :
+ DECLARE_LIBID(LIBID_oophmLib)
+ DECLARE_REGISTRY_APPID_RESOURCEID(IDR_OOPHM, "{F9365E53-5A14-47F3-BF1D-10CAAB815309}")
+};
+
+extern class CoophmModule _AtlModule;
diff --git a/plugins/ie/oophm/oophm/oophm.aps b/plugins/ie/oophm/oophm/oophm.aps
new file mode 100644
index 0000000..27a7cf6
--- /dev/null
+++ b/plugins/ie/oophm/oophm/oophm.aps
Binary files differ
diff --git a/plugins/ie/oophm/oophm/oophm.cpp b/plugins/ie/oophm/oophm/oophm.cpp
new file mode 100644
index 0000000..b94b12e
--- /dev/null
+++ b/plugins/ie/oophm/oophm/oophm.cpp
@@ -0,0 +1,112 @@
+/*
+ * Copyright 2008 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.
+ */
+
+// oophm.cpp : Implementation of DLL Exports.
+
+
+#include "stdafx.h"
+#include "resource.h"
+#include "oophm_i.h"
+#include "dllmain.h"
+#include "dlldatax.h"
+
+// Used to determine whether the DLL can be unloaded by OLE
+STDAPI DllCanUnloadNow(void)
+{
+#ifdef _MERGE_PROXYSTUB
+ HRESULT hr = PrxDllCanUnloadNow();
+ if (hr != S_OK)
+ return hr;
+#endif
+ return _AtlModule.DllCanUnloadNow();
+}
+
+
+// Returns a class factory to create an object of the requested type
+STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)
+{
+#ifdef _MERGE_PROXYSTUB
+ if (PrxDllGetClassObject(rclsid, riid, ppv) == S_OK)
+ return S_OK;
+#endif
+ return _AtlModule.DllGetClassObject(rclsid, riid, ppv);
+}
+
+
+// DllRegisterServer - Adds entries to the system registry
+STDAPI DllRegisterServer(void)
+{
+ // registers object, typelib and all interfaces in typelib
+ HRESULT hr = _AtlModule.DllRegisterServer();
+#ifdef _MERGE_PROXYSTUB
+ if (FAILED(hr))
+ return hr;
+ hr = PrxDllRegisterServer();
+#endif
+ return hr;
+}
+
+
+// DllUnregisterServer - Removes entries from the system registry
+STDAPI DllUnregisterServer(void)
+{
+ HRESULT hr = _AtlModule.DllUnregisterServer();
+#ifdef _MERGE_PROXYSTUB
+ if (FAILED(hr))
+ return hr;
+ hr = PrxDllRegisterServer();
+ if (FAILED(hr))
+ return hr;
+ hr = PrxDllUnregisterServer();
+#endif
+ return hr;
+}
+
+// DllInstall - Adds/Removes entries to the system registry per user
+// per machine.
+STDAPI DllInstall(BOOL bInstall, LPCWSTR pszCmdLine)
+{
+ HRESULT hr = E_FAIL;
+#if 0
+ // TODO(jat): consider adding this back
+ static const wchar_t szUserSwitch[] = _T("user");
+
+ if (pszCmdLine != NULL)
+ {
+ if (_wcsnicmp(pszCmdLine, szUserSwitch, _countof(szUserSwitch)) == 0)
+ {
+ AtlSetPerUserRegistration(true);
+ }
+ }
+#endif
+
+ if (bInstall)
+ {
+ hr = DllRegisterServer();
+ if (FAILED(hr))
+ {
+ DllUnregisterServer();
+ }
+ }
+ else
+ {
+ hr = DllUnregisterServer();
+ }
+
+ return hr;
+}
+
+
diff --git a/plugins/ie/oophm/oophm/oophm.def b/plugins/ie/oophm/oophm/oophm.def
new file mode 100644
index 0000000..bbb6f99
--- /dev/null
+++ b/plugins/ie/oophm/oophm/oophm.def
@@ -0,0 +1,24 @@
+; Copyright 2008 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.
+
+; oophm.def : Declares the module parameters.
+
+LIBRARY "oophm.DLL"
+
+EXPORTS
+ DllCanUnloadNow PRIVATE
+ DllGetClassObject PRIVATE
+ DllRegisterServer PRIVATE
+ DllUnregisterServer PRIVATE
+ DllInstall PRIVATE
diff --git a/plugins/ie/oophm/oophm/oophm.idl b/plugins/ie/oophm/oophm/oophm.idl
new file mode 100644
index 0000000..662618b
--- /dev/null
+++ b/plugins/ie/oophm/oophm/oophm.idl
@@ -0,0 +1,124 @@
+/*
+ * Copyright 2008 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.
+ */
+
+// oophm.idl : IDL source for oophm
+//
+
+// This file will be processed by the MIDL tool to
+// produce the type library (oophm.tlb) and marshalling code.
+
+#include "olectl.h"
+import "oaidl.idl";
+import "ocidl.idl";
+import "dispex.idl";
+
+// This interface is something of a hack to work around the lack
+// of ICanHandleException being defined by default in the dispex headers
+[
+ object,
+ uuid(c5598e60-b307-11d1-b27d-006008c3fbfb),
+ pointer_default(unique)
+]
+interface ICanHandleException : IUnknown
+{
+ HRESULT CanHandleException([in] EXCEPINFO *pExcepInfo, [in] VARIANT *pvar);
+};
+
+[
+ object,
+ uuid(73607C2E-369B-4055-8020-D7643A59F521),
+ dual,
+ nonextensible,
+ helpstring("Iplugin Interface"),
+ pointer_default(unique)
+]
+interface Iplugin : IDispatch{
+ [id(1), helpstring("OOPHM connect")] HRESULT connect([in] BSTR url, [in] BSTR sessionKey, [in] BSTR hostedServer, [in] BSTR moduleName, [in] BSTR hostedHtmlVersion, [out,retval] VARIANT_BOOL* ret);
+ [id(2), helpstring("method testObject")] HRESULT testObject([out,retval] IDispatch** ret);
+ [id(3), helpstring("OOPHM init")] HRESULT init([in] IDispatch* jsniContext, [out,retval] VARIANT_BOOL* ret);
+};
+
+[
+ object,
+ dual,
+ nonextensible,
+ uuid(AB9B16A0-03E9-481E-ADF5-B00B860A8C3A),
+ helpstring("IpluginUI Interface"),
+ pointer_default(unique)
+]
+interface IpluginUI : IDispatch
+{
+ // Example method that will be called by the HTML
+ HRESULT OnClick([in]IDispatch* pdispBody, [in]VARIANT varColor);
+};
+[
+ object,
+ uuid(58276E45-1F24-4B71-88AC-2A7D0C26CDFF),
+ dual,
+ nonextensible,
+ helpstring("IJavaObject Interface"),
+ pointer_default(unique)
+]
+interface IJavaObject : IDispatchEx{
+};
+[
+ object,
+ uuid(1C3FBB2D-58C2-426C-A461-E6002F9EE294),
+ dual,
+ nonextensible,
+ helpstring("IExceptionCatcher Interface"),
+ pointer_default(unique)
+]
+interface IExceptionCatcher : IDispatch{
+ [id(1), helpstring("method getException")] HRESULT getException([out,retval] VARIANT* retVal);
+ [id(2), helpstring("method hasSeenException")] HRESULT hasSeenException([out,retval] BOOL* retVal);
+};
+[
+ uuid(9259F105-BE55-4BF6-B7CE-D0AA878C1BA6),
+ version(1.0),
+ helpstring("oophm 1.0 Type Library")
+]
+library oophmLib
+{
+ importlib("stdole2.tlb");
+ [
+ uuid(1D6156B6-002B-49E7-B5CA-C138FB843B4E),
+ control,
+ helpstring("plugin Class")
+ ]
+ coclass plugin
+ {
+ [default] interface Iplugin;
+ interface IpluginUI;
+ };
+ [
+ uuid(644FD769-8B9D-4AC4-A79E-AAAF5CD751C1),
+ helpstring("JavaObject Class")
+ ]
+ coclass JavaObject
+ {
+ [default] interface IJavaObject;
+ };
+ [
+ uuid(1A2A78F4-B5A4-4208-B520-BDDA0A7EC5CB),
+ helpstring("ExceptionCatcher Class")
+ ]
+ coclass ExceptionCatcher
+ {
+ [default] interface IExceptionCatcher;
+ interface ICanHandleException;
+ };
+};
diff --git a/plugins/ie/oophm/oophm/oophm.rc b/plugins/ie/oophm/oophm/oophm.rc
new file mode 100644
index 0000000..3665d98
--- /dev/null
+++ b/plugins/ie/oophm/oophm/oophm.rc
@@ -0,0 +1,174 @@
+// Microsoft Visual C++ generated resource script.
+//
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#ifndef APSTUDIO_INVOKED
+#include "targetver.h"
+#endif
+#include "winres.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// English (U.S.) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
+#ifdef _WIN32
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+#pragma code_page(1252)
+#endif //_WIN32
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE
+BEGIN
+ "resource.h\0"
+END
+
+2 TEXTINCLUDE
+BEGIN
+ "#ifndef APSTUDIO_INVOKED\r\n"
+ "#include ""targetver.h""\r\n"
+ "#endif\r\n"
+ "#include ""winres.h""\r\n"
+ "\0"
+END
+
+3 TEXTINCLUDE
+BEGIN
+ "1 TYPELIB ""oophm.tlb""\r\n"
+ "\0"
+END
+
+#endif // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Version
+//
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION 1,2,9570,0
+ PRODUCTVERSION 1,2,9570,0
+ FILEFLAGSMASK 0x3fL
+#ifdef _DEBUG
+ FILEFLAGS 0x1L
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS 0x4L
+ FILETYPE 0x2L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904e4"
+ BEGIN
+ VALUE "CompanyName", "Google Inc."
+ VALUE "FileDescription", "Google Web Toolkit Developer Plugin"
+ VALUE "FileVersion", "1.2.9570.0"
+ VALUE "InternalName", "oophm.dll"
+ VALUE "LegalCopyright", "Copyright 2008 Google Inc. Licensed under the Apache 2.0 license."
+ VALUE "OriginalFilename", "oophm.dll"
+ VALUE "ProductName", "Google Web Toolkit"
+ VALUE "ProductVersion", "1.2.9570.0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1252
+ END
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// REGISTRY
+//
+
+IDR_OOPHM REGISTRY "oophm.rgs"
+IDR_PLUGIN REGISTRY "plugin.rgs"
+IDR_JAVAOBJECT REGISTRY "JavaObject.rgs"
+IDR_EXCEPTIONCATCHER REGISTRY "ExceptionCatcher.rgs"
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog
+//
+
+IDD_ALLOW_DIALOG DIALOGEX 0, 0, 188, 73
+STYLE DS_SYSMODAL | DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_CAPTION
+EXSTYLE WS_EX_TOPMOST
+CAPTION "GWT Plugin Security Alert"
+FONT 10, "Microsoft Sans Serif", 400, 0, 0x0
+BEGIN
+ CONTROL "Remember this decision for this server",IDC_REMEMBER_CHECKBOX,
+ "Button",BS_AUTOCHECKBOX | WS_TABSTOP,30,31,129,10
+ LTEXT "This web server is trying to initiate a GWT Development\r\nMode Connection -- should it be allowed?",IDC_STATIC,10,7,167,19
+ PUSHBUTTON "Allow",IDC_ALLOW_BUTTON,37,50,50,14
+ DEFPUSHBUTTON "Deny",IDCANCEL,100,50,50,14
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// DESIGNINFO
+//
+
+#ifdef APSTUDIO_INVOKED
+GUIDELINES DESIGNINFO
+BEGIN
+ IDD_ALLOW_DIALOG, DIALOG
+ BEGIN
+ LEFTMARGIN, 7
+ RIGHTMARGIN, 181
+ TOPMARGIN, 7
+ BOTTOMMARGIN, 66
+ END
+END
+#endif // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// HTML
+//
+
+IDH_PLUGIN HTML "pluginUI.htm"
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// String Table
+//
+
+STRINGTABLE
+BEGIN
+ IDS_PROJNAME "oophm"
+END
+
+#endif // English (U.S.) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+1 TYPELIB "oophm.tlb"
+
+/////////////////////////////////////////////////////////////////////////////
+#endif // not APSTUDIO_INVOKED
+
diff --git a/plugins/ie/oophm/oophm/oophm.rgs b/plugins/ie/oophm/oophm/oophm.rgs
new file mode 100644
index 0000000..b106174
--- /dev/null
+++ b/plugins/ie/oophm/oophm/oophm.rgs
@@ -0,0 +1,11 @@
+HKCR
+{
+ NoRemove AppID
+ {
+ '%APPID%' = s 'oophm'
+ 'oophm.DLL'
+ {
+ val AppID = s '%APPID%'
+ }
+ }
+}
diff --git a/plugins/ie/oophm/oophm/oophm.vcproj b/plugins/ie/oophm/oophm/oophm.vcproj
new file mode 100644
index 0000000..9014169
--- /dev/null
+++ b/plugins/ie/oophm/oophm/oophm.vcproj
@@ -0,0 +1,860 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="9.00"
+ Name="oophm"
+ ProjectGUID="{EB69BDFE-9380-4C51-99E8-C3EB25AE36A2}"
+ RootNamespace="oophm"
+ Keyword="AtlProj"
+ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ <Platform
+ Name="x64"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(ConfigurationName)32"
+ IntermediateDirectory="$(ConfigurationName)32"
+ ConfigurationType="2"
+ UseOfMFC="1"
+ UseOfATL="1"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="_DEBUG"
+ MkTypLibCompatible="false"
+ TargetEnvironment="1"
+ GenerateStublessProxies="true"
+ TypeLibraryName="$(IntDir)/oophm.tlb"
+ HeaderFileName="oophm_i.h"
+ DLLDataFileName=""
+ InterfaceIdentifierFileName="oophm_i.c"
+ ProxyFileName="oophm_p.c"
+ ValidateParameters="true"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories=""$(ProjectDir)";../../../platform/Win;../../../common"
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;GWT_DEBUGLEVEL=Spam"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ DebugInformationFormat="4"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="_DEBUG"
+ Culture="1033"
+ AdditionalIncludeDirectories="$(IntDir)"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ RegisterOutput="true"
+ IgnoreImportLibrary="true"
+ AdditionalDependencies="comsuppw.lib ws2_32.lib"
+ OutputFile="..\..\prebuilt\$(PlatformName)\$(ProjectName).dll"
+ LinkIncremental="2"
+ ModuleDefinitionFile=".\oophm.def"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|x64"
+ OutputDirectory="$(PlatformName)\$(ConfigurationName)"
+ IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
+ ConfigurationType="2"
+ UseOfMFC="1"
+ UseOfATL="1"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="_DEBUG"
+ MkTypLibCompatible="false"
+ TargetEnvironment="3"
+ GenerateStublessProxies="true"
+ TypeLibraryName="$(IntDir)/oophm.tlb"
+ HeaderFileName="oophm_i.h"
+ DLLDataFileName=""
+ InterfaceIdentifierFileName="oophm_i.c"
+ ProxyFileName="oophm_p.c"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories=""$(ProjectDir)";../../../platform/Win;../../../common"
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;GWT_DEBUGLEVEL=Spam"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="_DEBUG"
+ Culture="1033"
+ AdditionalIncludeDirectories="$(IntDir)"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ IgnoreImportLibrary="true"
+ AdditionalDependencies="comsuppw.lib ws2_32.lib"
+ OutputFile="..\..\prebuilt\$(PlatformName)\$(ProjectName).dll"
+ LinkIncremental="2"
+ ModuleDefinitionFile=".\oophm.def"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(ConfigurationName)32"
+ IntermediateDirectory="$(ConfigurationName)32"
+ ConfigurationType="2"
+ UseOfMFC="1"
+ UseOfATL="1"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="NDEBUG"
+ MkTypLibCompatible="false"
+ TargetEnvironment="1"
+ GenerateStublessProxies="true"
+ TypeLibraryName="$(IntDir)/oophm.tlb"
+ HeaderFileName="oophm_i.h"
+ DLLDataFileName=""
+ InterfaceIdentifierFileName="oophm_i.c"
+ ProxyFileName="oophm_p.c"
+ ValidateParameters="true"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="2"
+ InlineFunctionExpansion="2"
+ EnableIntrinsicFunctions="true"
+ FavorSizeOrSpeed="1"
+ AdditionalIncludeDirectories=""$(ProjectDir)";../../../platform/Win;../../../common"
+ PreprocessorDefinitions="_WINDOWS;GWT_DEBUGDISABLE"
+ RuntimeLibrary="0"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="NDEBUG"
+ Culture="1033"
+ AdditionalIncludeDirectories="$(IntDir)"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ RegisterOutput="true"
+ IgnoreImportLibrary="true"
+ AdditionalDependencies="comsuppw.lib ws2_32.lib"
+ OutputFile="..\..\prebuilt\$(PlatformName)\$(ProjectName).dll"
+ LinkIncremental="1"
+ ModuleDefinitionFile=".\oophm.def"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|x64"
+ OutputDirectory="$(ConfigurationName)64"
+ IntermediateDirectory="$(ConfigurationName)64"
+ ConfigurationType="2"
+ UseOfMFC="1"
+ UseOfATL="1"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="NDEBUG"
+ MkTypLibCompatible="false"
+ TargetEnvironment="3"
+ GenerateStublessProxies="true"
+ TypeLibraryName="$(IntDir)/oophm.tlb"
+ HeaderFileName="oophm_i.h"
+ DLLDataFileName=""
+ InterfaceIdentifierFileName="oophm_i.c"
+ ProxyFileName="oophm_p.c"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="2"
+ InlineFunctionExpansion="2"
+ EnableIntrinsicFunctions="true"
+ FavorSizeOrSpeed="1"
+ AdditionalIncludeDirectories=""$(ProjectDir)";../../../platform/Win;../../../common"
+ PreprocessorDefinitions="_WINDOWS;GWT_DEBUGDISABLE"
+ RuntimeLibrary="0"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="NDEBUG"
+ Culture="1033"
+ AdditionalIncludeDirectories="$(IntDir)"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ IgnoreImportLibrary="true"
+ AdditionalDependencies="comsuppw.lib ws2_32.lib"
+ OutputFile="..\..\prebuilt\$(PlatformName)\$(ProjectName).dll"
+ LinkIncremental="1"
+ ModuleDefinitionFile=".\oophm.def"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\..\..\platform\Win\AllowDialog.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\dlldatax.c"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ CompileAsManaged="0"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|x64"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ CompileAsManaged="0"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ CompileAsManaged="0"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|x64"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ CompileAsManaged="0"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\dllmain.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ CompileAsManaged="0"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|x64"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ CompileAsManaged="0"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ CompileAsManaged="0"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|x64"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ CompileAsManaged="0"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\ExceptionCatcher.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\IESessionHandler.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\JavaObject.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\oophm.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\oophm.def"
+ >
+ </File>
+ <File
+ RelativePath=".\oophm.idl"
+ >
+ </File>
+ <File
+ RelativePath=".\plugin.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\platform\Win\Preferences.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\stdafx.cpp"
+ >
+ </File>
+ <Filter
+ Name="common"
+ >
+ <File
+ RelativePath="..\..\..\common\AllowedConnections.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\common\CheckVersionsMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\common\ChooseTransportMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\common\Debug.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\common\FatalErrorMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\common\FreeValueMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\common\HostChannel.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\common\InvokeMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\common\InvokeSpecialMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\common\LoadJsniMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\common\LoadModuleMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\common\ProtocolVersionMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\common\ReturnMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\common\ServerMethods.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\common\Socket.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\common\SwitchTransportMessage.cpp"
+ >
+ </File>
+ </Filter>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ <File
+ RelativePath="..\..\..\platform\Win\AllowDialog.h"
+ >
+ </File>
+ <File
+ RelativePath=".\Constants.h"
+ >
+ </File>
+ <File
+ RelativePath=".\dlldatax.h"
+ >
+ </File>
+ <File
+ RelativePath=".\dllmain.h"
+ >
+ </File>
+ <File
+ RelativePath=".\ExceptionCatcher.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\common\FatalErrorMessage.h"
+ >
+ </File>
+ <File
+ RelativePath=".\IESessionHandler.h"
+ >
+ </File>
+ <File
+ RelativePath=".\IEUtils.h"
+ >
+ </File>
+ <File
+ RelativePath=".\JavaObject.h"
+ >
+ </File>
+ <File
+ RelativePath=".\plugin.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\platform\Win\Preferences.h"
+ >
+ </File>
+ <File
+ RelativePath=".\Resource.h"
+ >
+ </File>
+ <File
+ RelativePath=".\SessionData.h"
+ >
+ </File>
+ <File
+ RelativePath=".\stdafx.h"
+ >
+ </File>
+ <File
+ RelativePath=".\targetver.h"
+ >
+ </File>
+ <Filter
+ Name="common"
+ >
+ <File
+ RelativePath="..\..\..\common\AllowedConnections.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\common\BrowserChannel.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\common\CheckVersionsMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\common\ChooseTransportMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\common\Debug.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\common\DebugLevel.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\common\FreeValueMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\common\HashMap.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\common\HostChannel.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\common\InvokeMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\common\InvokeSpecialMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\common\LoadJsniMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\common\LoadModuleMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\common\Message.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\common\Platform.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\common\ProtocolVersionMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\common\QuitMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\common\ReturnMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\common\ServerMethods.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\common\SessionHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\common\Socket.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\common\SwitchTransportMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\common\Value.h"
+ >
+ </File>
+ </Filter>
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ >
+ <File
+ RelativePath=".\ExceptionCatcher.rgs"
+ >
+ </File>
+ <File
+ RelativePath=".\JavaObject.rgs"
+ >
+ </File>
+ <File
+ RelativePath=".\oophm.rc"
+ >
+ </File>
+ <File
+ RelativePath=".\oophm.rgs"
+ >
+ </File>
+ <File
+ RelativePath=".\plugin.bmp"
+ >
+ </File>
+ <File
+ RelativePath=".\plugin.rgs"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Generated Files"
+ SourceControlFiles="false"
+ >
+ <File
+ RelativePath=".\oophm_i.c"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ CompileAsManaged="0"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|x64"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ CompileAsManaged="0"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ CompileAsManaged="0"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|x64"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="0"
+ CompileAsManaged="0"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\oophm_i.h"
+ >
+ </File>
+ </Filter>
+ <File
+ RelativePath=".\plugin.htm"
+ DeploymentContent="true"
+ >
+ </File>
+ <File
+ RelativePath=".\pluginUI.htm"
+ DeploymentContent="true"
+ >
+ </File>
+ <File
+ RelativePath=".\ReadMe.txt"
+ >
+ </File>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/plugins/ie/oophm/oophm/oophm.vcxproj b/plugins/ie/oophm/oophm/oophm.vcxproj
new file mode 100644
index 0000000..f073a5d
--- /dev/null
+++ b/plugins/ie/oophm/oophm/oophm.vcxproj
@@ -0,0 +1,397 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{EB69BDFE-9380-4C51-99E8-C3EB25AE36A2}</ProjectGuid>
+ <RootNamespace>oophm</RootNamespace>
+ <Keyword>AtlProj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>Static</UseOfMfc>
+ <UseOfAtl>Static</UseOfAtl>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>Static</UseOfMfc>
+ <UseOfAtl>Static</UseOfAtl>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>Static</UseOfMfc>
+ <UseOfAtl>Static</UseOfAtl>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>Static</UseOfMfc>
+ <UseOfAtl>Static</UseOfAtl>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)32\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)32\</IntDir>
+ <IgnoreImportLibrary Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</IgnoreImportLibrary>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(Platform)\$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(Platform)\$(Configuration)\</IntDir>
+ <IgnoreImportLibrary Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</IgnoreImportLibrary>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)32\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)32\</IntDir>
+ <IgnoreImportLibrary Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</IgnoreImportLibrary>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(Configuration)64\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(Configuration)64\</IntDir>
+ <IgnoreImportLibrary Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</IgnoreImportLibrary>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <Midl>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>false</MkTypLibCompatible>
+ <TargetEnvironment>Win32</TargetEnvironment>
+ <GenerateStublessProxies>true</GenerateStublessProxies>
+ <TypeLibraryName>$(IntDir)oophm.tlb</TypeLibraryName>
+ <HeaderFileName>oophm_i.h</HeaderFileName>
+ <DllDataFileName>
+ </DllDataFileName>
+ <InterfaceIdentifierFileName>oophm_i.c</InterfaceIdentifierFileName>
+ <ProxyFileName>oophm_p.c</ProxyFileName>
+ <ValidateAllParameters>true</ValidateAllParameters>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>$(ProjectDir);../../../platform/Win;../../../common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;GWT_DEBUGLEVEL=Info;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0409</Culture>
+ <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ResourceCompile>
+ <Link>
+ <RegisterOutput>true</RegisterOutput>
+ <AdditionalDependencies>comsuppw.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>..\..\prebuilt\$(Platform)\$(ProjectName).dll</OutputFile>
+ <ModuleDefinitionFile>.\oophm.def</ModuleDefinitionFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Windows</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Midl>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>false</MkTypLibCompatible>
+ <TargetEnvironment>X64</TargetEnvironment>
+ <GenerateStublessProxies>true</GenerateStublessProxies>
+ <TypeLibraryName>$(IntDir)oophm.tlb</TypeLibraryName>
+ <HeaderFileName>oophm_i.h</HeaderFileName>
+ <DllDataFileName>
+ </DllDataFileName>
+ <InterfaceIdentifierFileName>oophm_i.c</InterfaceIdentifierFileName>
+ <ProxyFileName>oophm_p.c</ProxyFileName>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>$(ProjectDir);../../../platform/Win;../../../common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;GWT_DEBUGLEVEL=Spam;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0409</Culture>
+ <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ResourceCompile>
+ <Link>
+ <AdditionalDependencies>comsuppw.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>..\..\prebuilt\$(Platform)\$(ProjectName).dll</OutputFile>
+ <ModuleDefinitionFile>.\oophm.def</ModuleDefinitionFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Windows</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <Midl>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>false</MkTypLibCompatible>
+ <TargetEnvironment>Win32</TargetEnvironment>
+ <GenerateStublessProxies>true</GenerateStublessProxies>
+ <TypeLibraryName>$(IntDir)oophm.tlb</TypeLibraryName>
+ <HeaderFileName>oophm_i.h</HeaderFileName>
+ <DllDataFileName>
+ </DllDataFileName>
+ <InterfaceIdentifierFileName>oophm_i.c</InterfaceIdentifierFileName>
+ <ProxyFileName>oophm_p.c</ProxyFileName>
+ <ValidateAllParameters>true</ValidateAllParameters>
+ </Midl>
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
+ <AdditionalIncludeDirectories>$(ProjectDir);../../../platform/Win;../../../common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_WINDOWS;GWT_DEBUGDISABLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0409</Culture>
+ <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ResourceCompile>
+ <Link>
+ <RegisterOutput>true</RegisterOutput>
+ <AdditionalDependencies>comsuppw.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>..\..\prebuilt\$(Platform)\$(ProjectName).dll</OutputFile>
+ <ModuleDefinitionFile>.\oophm.def</ModuleDefinitionFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Windows</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Midl>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>false</MkTypLibCompatible>
+ <TargetEnvironment>X64</TargetEnvironment>
+ <GenerateStublessProxies>true</GenerateStublessProxies>
+ <TypeLibraryName>$(IntDir)oophm.tlb</TypeLibraryName>
+ <HeaderFileName>oophm_i.h</HeaderFileName>
+ <DllDataFileName>
+ </DllDataFileName>
+ <InterfaceIdentifierFileName>oophm_i.c</InterfaceIdentifierFileName>
+ <ProxyFileName>oophm_p.c</ProxyFileName>
+ </Midl>
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
+ <AdditionalIncludeDirectories>$(ProjectDir);../../../platform/Win;../../../common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_WINDOWS;GWT_DEBUGDISABLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0409</Culture>
+ <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ResourceCompile>
+ <Link>
+ <AdditionalDependencies>comsuppw.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>..\..\prebuilt\$(Platform)\$(ProjectName).dll</OutputFile>
+ <ModuleDefinitionFile>.\oophm.def</ModuleDefinitionFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Windows</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\platform\Win\AllowDialog.cpp" />
+ <ClCompile Include="dlldatax.c">
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ </PrecompiledHeader>
+ <CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</CompileAsManaged>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ </PrecompiledHeader>
+ <CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</CompileAsManaged>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ </PrecompiledHeader>
+ <CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</CompileAsManaged>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ </PrecompiledHeader>
+ <CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</CompileAsManaged>
+ </ClCompile>
+ <ClCompile Include="dllmain.cpp">
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ </PrecompiledHeader>
+ <CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</CompileAsManaged>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ </PrecompiledHeader>
+ <CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</CompileAsManaged>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ </PrecompiledHeader>
+ <CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</CompileAsManaged>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ </PrecompiledHeader>
+ <CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</CompileAsManaged>
+ </ClCompile>
+ <ClCompile Include="ExceptionCatcher.cpp" />
+ <ClCompile Include="IESessionHandler.cpp" />
+ <ClCompile Include="JavaObject.cpp" />
+ <ClCompile Include="oophm.cpp" />
+ <ClCompile Include="plugin.cpp" />
+ <ClCompile Include="..\..\..\platform\Win\Preferences.cpp" />
+ <ClCompile Include="stdafx.cpp" />
+ <ClCompile Include="..\..\..\common\AllowedConnections.cpp" />
+ <ClCompile Include="..\..\..\common\CheckVersionsMessage.cpp" />
+ <ClCompile Include="..\..\..\common\ChooseTransportMessage.cpp" />
+ <ClCompile Include="..\..\..\common\Debug.cpp" />
+ <ClCompile Include="..\..\..\common\FatalErrorMessage.cpp" />
+ <ClCompile Include="..\..\..\common\FreeValueMessage.cpp" />
+ <ClCompile Include="..\..\..\common\HostChannel.cpp" />
+ <ClCompile Include="..\..\..\common\InvokeMessage.cpp" />
+ <ClCompile Include="..\..\..\common\InvokeSpecialMessage.cpp" />
+ <ClCompile Include="..\..\..\common\LoadJsniMessage.cpp" />
+ <ClCompile Include="..\..\..\common\LoadModuleMessage.cpp" />
+ <ClCompile Include="..\..\..\common\ProtocolVersionMessage.cpp" />
+ <ClCompile Include="..\..\..\common\ReturnMessage.cpp" />
+ <ClCompile Include="..\..\..\common\ServerMethods.cpp" />
+ <ClCompile Include="..\..\..\common\Socket.cpp" />
+ <ClCompile Include="..\..\..\common\SwitchTransportMessage.cpp" />
+ <ClCompile Include="oophm_i.c">
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ </PrecompiledHeader>
+ <CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</CompileAsManaged>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ </PrecompiledHeader>
+ <CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</CompileAsManaged>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ </PrecompiledHeader>
+ <CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</CompileAsManaged>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ </PrecompiledHeader>
+ <CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</CompileAsManaged>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="oophm.def" />
+ <None Include="ExceptionCatcher.rgs" />
+ <None Include="JavaObject.rgs" />
+ <None Include="oophm.rgs" />
+ <None Include="plugin.bmp" />
+ <None Include="plugin.rgs" />
+ <None Include="plugin.htm">
+ <DeploymentContent>true</DeploymentContent>
+ </None>
+ <None Include="pluginUI.htm">
+ <DeploymentContent>true</DeploymentContent>
+ </None>
+ <None Include="ReadMe.txt" />
+ </ItemGroup>
+ <ItemGroup>
+ <Midl Include="oophm.idl" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\..\..\platform\Win\AllowDialog.h" />
+ <ClInclude Include="Constants.h" />
+ <ClInclude Include="dlldatax.h" />
+ <ClInclude Include="dllmain.h" />
+ <ClInclude Include="ExceptionCatcher.h" />
+ <ClInclude Include="..\..\..\common\FatalErrorMessage.h" />
+ <ClInclude Include="IESessionHandler.h" />
+ <ClInclude Include="IEUtils.h" />
+ <ClInclude Include="JavaObject.h" />
+ <ClInclude Include="plugin.h" />
+ <ClInclude Include="..\..\..\platform\Win\Preferences.h" />
+ <ClInclude Include="Resource.h" />
+ <ClInclude Include="SessionData.h" />
+ <ClInclude Include="stdafx.h" />
+ <ClInclude Include="targetver.h" />
+ <ClInclude Include="..\..\..\common\AllowedConnections.h" />
+ <ClInclude Include="..\..\..\common\BrowserChannel.h" />
+ <ClInclude Include="..\..\..\common\CheckVersionsMessage.h" />
+ <ClInclude Include="..\..\..\common\ChooseTransportMessage.h" />
+ <ClInclude Include="..\..\..\common\Debug.h" />
+ <ClInclude Include="..\..\..\common\DebugLevel.h" />
+ <ClInclude Include="..\..\..\common\FreeValueMessage.h" />
+ <ClInclude Include="..\..\..\common\HashMap.h" />
+ <ClInclude Include="..\..\..\common\HostChannel.h" />
+ <ClInclude Include="..\..\..\common\InvokeMessage.h" />
+ <ClInclude Include="..\..\..\common\InvokeSpecialMessage.h" />
+ <ClInclude Include="..\..\..\common\LoadJsniMessage.h" />
+ <ClInclude Include="..\..\..\common\LoadModuleMessage.h" />
+ <ClInclude Include="..\..\..\common\Message.h" />
+ <ClInclude Include="..\..\..\common\Platform.h" />
+ <ClInclude Include="..\..\..\common\ProtocolVersionMessage.h" />
+ <ClInclude Include="..\..\..\common\QuitMessage.h" />
+ <ClInclude Include="..\..\..\common\ReturnMessage.h" />
+ <ClInclude Include="..\..\..\common\ServerMethods.h" />
+ <ClInclude Include="..\..\..\common\SessionHandler.h" />
+ <ClInclude Include="..\..\..\common\Socket.h" />
+ <ClInclude Include="..\..\..\common\SwitchTransportMessage.h" />
+ <ClInclude Include="..\..\..\common\Value.h" />
+ <ClInclude Include="oophm_i.h" />
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="oophm.rc" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project>
\ No newline at end of file
diff --git a/plugins/ie/oophm/oophm/oophm.vcxproj.filters b/plugins/ie/oophm/oophm/oophm.vcxproj.filters
new file mode 100644
index 0000000..eba06fa
--- /dev/null
+++ b/plugins/ie/oophm/oophm/oophm.vcxproj.filters
@@ -0,0 +1,262 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+ <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+ </Filter>
+ <Filter Include="Source Files\common">
+ <UniqueIdentifier>{7de3b311-d305-4b06-9891-48808617edcc}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Header Files">
+ <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
+ <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
+ </Filter>
+ <Filter Include="Header Files\common">
+ <UniqueIdentifier>{bdeb57bf-5bd5-432d-8f9a-8160fc4e9e7f}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Resource Files">
+ <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
+ <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav</Extensions>
+ </Filter>
+ <Filter Include="Generated Files">
+ <UniqueIdentifier>{619a202a-99fa-4836-9ee8-ef0dfa42d372}</UniqueIdentifier>
+ <SourceControlFiles>False</SourceControlFiles>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\platform\Win\AllowDialog.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="dlldatax.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="dllmain.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="ExceptionCatcher.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="IESessionHandler.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="JavaObject.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="oophm.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="plugin.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\platform\Win\Preferences.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="stdafx.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\common\AllowedConnections.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\common\CheckVersionsMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\common\ChooseTransportMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\common\Debug.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\common\FatalErrorMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\common\FreeValueMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\common\HostChannel.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\common\InvokeMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\common\InvokeSpecialMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\common\LoadJsniMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\common\LoadModuleMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\common\ProtocolVersionMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\common\ReturnMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\common\ServerMethods.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\common\Socket.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\common\SwitchTransportMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="oophm_i.c">
+ <Filter>Generated Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="oophm.def">
+ <Filter>Source Files</Filter>
+ </None>
+ <None Include="ExceptionCatcher.rgs">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="JavaObject.rgs">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="oophm.rgs">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="plugin.bmp">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="plugin.rgs">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="plugin.htm" />
+ <None Include="pluginUI.htm" />
+ <None Include="ReadMe.txt" />
+ </ItemGroup>
+ <ItemGroup>
+ <Midl Include="oophm.idl">
+ <Filter>Source Files</Filter>
+ </Midl>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\..\..\platform\Win\AllowDialog.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="Constants.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="dlldatax.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="dllmain.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="ExceptionCatcher.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\common\FatalErrorMessage.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="IESessionHandler.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="IEUtils.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="JavaObject.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="plugin.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\platform\Win\Preferences.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="Resource.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="SessionData.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="stdafx.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="targetver.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\common\AllowedConnections.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\common\BrowserChannel.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\common\CheckVersionsMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\common\ChooseTransportMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\common\Debug.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\common\DebugLevel.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\common\FreeValueMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\common\HashMap.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\common\HostChannel.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\common\InvokeMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\common\InvokeSpecialMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\common\LoadJsniMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\common\LoadModuleMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\common\Message.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\common\Platform.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\common\ProtocolVersionMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\common\QuitMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\common\ReturnMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\common\ServerMethods.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\common\SessionHandler.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\common\Socket.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\common\SwitchTransportMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\common\Value.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="oophm_i.h">
+ <Filter>Generated Files</Filter>
+ </ClInclude>
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="oophm.rc">
+ <Filter>Resource Files</Filter>
+ </ResourceCompile>
+ </ItemGroup>
+</Project>
\ No newline at end of file
diff --git a/plugins/ie/oophm/oophm/plugin.bmp b/plugins/ie/oophm/oophm/plugin.bmp
new file mode 100644
index 0000000..1229764
--- /dev/null
+++ b/plugins/ie/oophm/oophm/plugin.bmp
Binary files differ
diff --git a/plugins/ie/oophm/oophm/plugin.cpp b/plugins/ie/oophm/oophm/plugin.cpp
new file mode 100644
index 0000000..9bc4184
--- /dev/null
+++ b/plugins/ie/oophm/oophm/plugin.cpp
@@ -0,0 +1,140 @@
+/*
+ * Copyright 2008 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.
+ */
+
+// plugin.cpp : Implementation of Cplugin
+#include "stdafx.h"
+#include "comutil.h"
+#include "plugin.h"
+#include "BrowserChannel.h"
+#include "JavaObject.h"
+#include "HostChannel.h"
+#include "IESessionHandler.h"
+#include "LoadModuleMessage.h"
+#include "ServerMethods.h"
+#include "AllowedConnections.h"
+#include "Preferences.h"
+#include "AllowDialog.h"
+#include "IEUtils.h"
+
+// Cplugin
+
+STDMETHODIMP Cplugin::connect(BSTR burl, BSTR bsessionKey, BSTR bhostedServer,
+ BSTR bmoduleName, BSTR bhostedHtmlVersion, VARIANT_BOOL* ret)
+{
+ LPOLECLIENTSITE site;
+ IOleContainer* container = NULL;
+ IHTMLDocument2* doc = NULL;
+ IHTMLWindow2* window = NULL;
+
+ this->GetClientSite(&site);
+ site->GetContainer(&container);
+ container->QueryInterface(IID_IHTMLDocument2, (void**)&doc);
+ container->Release();
+
+ doc->get_parentWindow(&window);
+ doc->Release();
+
+ std::string url = BSTRToUTF8(burl);
+ Debug::log(Debug::Debugging) << "OOPHM connect(url=" << url << ")" << Debug::flush;
+ Preferences::loadAccessList();
+ bool allowed = false;
+ std::string webHost = AllowedConnections::getHostFromUrl(url);
+ std::string codeSvr = AllowedConnections::getCodeServerFromUrl(url);
+ if (!AllowedConnections::matchesRule(webHost, codeSvr, &allowed)) {
+ bool remember;
+ allowed = AllowDialog::askUserToAllow(&remember);
+ if (remember) {
+ Preferences::addNewRule(webHost + "/" + codeSvr, !allowed);
+ }
+ }
+ if (!allowed) {
+ *ret = false;
+ return S_OK;
+ }
+
+ std::string hostedServer = BSTRToUTF8(bhostedServer);
+ size_t index = hostedServer.find(':');
+ if (index == std::string::npos) {
+ *ret = false;
+ return S_OK;
+ }
+ std::string hostPart = hostedServer.substr(0, index);
+ std::string portPart = hostedServer.substr(index + 1);
+
+ HostChannel* channel = new HostChannel();
+
+ if (!channel->connectToHost(
+ hostPart.c_str(),
+ atoi(portPart.c_str()))) {
+ *ret = false;
+ DWORD errCode = ::GetLastError();
+ PWCHAR errMsg = IEUtils::GetSysErrorMessage(errCode);
+ SYSLOGERROR(L"GWT Developer Mode plugin failed to connect to code server.",
+ L"URL: %S\nERRORMESSAGE: %sERRORCODE: %d (0x%08X)",
+ url.c_str(), errMsg, errCode, errCode);
+ ::LocalFree(errMsg);
+ return S_OK;
+ }
+
+ sessionHandler.reset(new IESessionHandler(channel, window));
+
+ std::string hostedHtmlVersion = BSTRToUTF8(bhostedHtmlVersion);
+
+ // TODO: add support for a range of protocol versions when we add them
+ if (!channel->init(sessionHandler.get(), BROWSERCHANNEL_PROTOCOL_VERSION,
+ BROWSERCHANNEL_PROTOCOL_VERSION, hostedHtmlVersion)) {
+ *ret = false;
+ return S_OK;
+ }
+
+ // Use the current thread ID as a proxy for tab ID.
+ DWORD threadId = GetCurrentThreadId();
+ char buf[20];
+ snprintf(buf, sizeof(buf), "%lu", threadId);
+ std::string tabKey = buf;
+
+ std::string sessionKey = BSTRToUTF8(bsessionKey);
+ std::string moduleName = BSTRToUTF8(bmoduleName);
+ IOmNavigator* navigator;
+ _bstr_t userAgent;
+
+ window->get_navigator(&navigator);
+ navigator->get_userAgent(userAgent.GetAddress());
+
+ LoadModuleMessage::send(*channel, url, tabKey, sessionKey, moduleName,
+ BSTRToUTF8(userAgent), sessionHandler.get());
+
+ navigator->Release();
+
+ *ret = true;
+ return S_OK;
+}
+
+STDMETHODIMP Cplugin::init(IDispatch* jsniContext, VARIANT_BOOL* ret) {
+ Debug::log(Debug::Debugging) << "OOPHM init called" << Debug::flush;
+ *ret = true;
+ return S_OK;
+}
+
+STDMETHODIMP Cplugin::testObject(IDispatch** ret)
+{
+ IJavaObject* toRet;
+ CJavaObject::CreateInstance(&toRet);
+ *ret = toRet;
+ // TODO: Add your implementation code here
+
+ return S_OK;
+}
diff --git a/plugins/ie/oophm/oophm/plugin.h b/plugins/ie/oophm/oophm/plugin.h
new file mode 100644
index 0000000..d508558
--- /dev/null
+++ b/plugins/ie/oophm/oophm/plugin.h
@@ -0,0 +1,227 @@
+/*
+* Copyright 2008 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.
+*/
+
+// plugin.h : Declaration of the Cplugin
+#pragma once
+#include "resource.h" // main symbols
+#include <atlctl.h>
+#include "oophm_i.h"
+#include "Debug.h"
+#include "IESessionHandler.h"
+#include "IEUtils.h"
+
+#ifdef _WIN32_WCE
+#error "ATL does not support HTML controls for Windows CE."
+#endif
+class ATL_NO_VTABLE CpluginUI :
+ public IDispatchImpl<IpluginUI, &IID_IpluginUI, &LIBID_oophmLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
+ public CComObjectRootEx<CComSingleThreadModel>
+{
+ BEGIN_COM_MAP(CpluginUI)
+ COM_INTERFACE_ENTRY(IpluginUI)
+ COM_INTERFACE_ENTRY(IDispatch)
+ END_COM_MAP()
+ // Iplugin
+public:
+ DECLARE_PROTECT_FINAL_CONSTRUCT()
+
+ HRESULT FinalConstruct()
+ {
+ return S_OK;
+ }
+
+ void FinalRelease()
+ {
+ }
+
+ // Example method called by the HTML to change the <BODY> background color
+ STDMETHOD(OnClick)(IDispatch* pdispBody, VARIANT varColor)
+ {
+ CComQIPtr<IHTMLBodyElement> spBody(pdispBody);
+ if (spBody != NULL)
+ spBody->put_bgColor(varColor);
+ return S_OK;
+ }
+};
+
+
+
+// Cplugin
+class ATL_NO_VTABLE Cplugin :
+ public CComObjectRootEx<CComSingleThreadModel>,
+ public IDispatchImpl<Iplugin, &IID_Iplugin, &LIBID_oophmLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
+ public IPersistStreamInitImpl<Cplugin>,
+ public IOleControlImpl<Cplugin>,
+ public IOleObjectImpl<Cplugin>,
+ public IOleInPlaceActiveObjectImpl<Cplugin>,
+ public IViewObjectExImpl<Cplugin>,
+ public IOleInPlaceObjectWindowlessImpl<Cplugin>,
+ public ISupportErrorInfo,
+ public IPersistStorageImpl<Cplugin>,
+ public ISpecifyPropertyPagesImpl<Cplugin>,
+ public IQuickActivateImpl<Cplugin>,
+ public IObjectSafetyImpl<Cplugin, INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA>,
+#ifndef _WIN32_WCE
+ public IDataObjectImpl<Cplugin>,
+#endif
+ public IProvideClassInfo2Impl<&CLSID_plugin, NULL, &LIBID_oophmLib>,
+#ifdef _WIN32_WCE // IObjectSafety is required on Windows CE for the control to be loaded correctly
+ public IObjectSafetyImpl<Cplugin, INTERFACESAFE_FOR_UNTRUSTED_CALLER>,
+#endif
+ public CComCoClass<Cplugin, &CLSID_plugin>,
+ public CComControl<Cplugin>
+{
+public:
+
+
+ Cplugin()
+ {
+ m_bWindowOnly = TRUE;
+ }
+
+ DECLARE_OLEMISC_STATUS(OLEMISC_RECOMPOSEONRESIZE |
+ OLEMISC_CANTLINKINSIDE |
+ OLEMISC_INSIDEOUT |
+ OLEMISC_ACTIVATEWHENVISIBLE |
+ OLEMISC_SETCLIENTSITEFIRST
+ )
+
+ DECLARE_REGISTRY_RESOURCEID(IDR_PLUGIN)
+
+
+ BEGIN_COM_MAP(Cplugin)
+ COM_INTERFACE_ENTRY(Iplugin)
+ COM_INTERFACE_ENTRY(IDispatch)
+ COM_INTERFACE_ENTRY(IViewObjectEx)
+ COM_INTERFACE_ENTRY(IViewObject2)
+ COM_INTERFACE_ENTRY(IViewObject)
+ COM_INTERFACE_ENTRY(IOleInPlaceObjectWindowless)
+ COM_INTERFACE_ENTRY(IOleInPlaceObject)
+ COM_INTERFACE_ENTRY2(IOleWindow, IOleInPlaceObjectWindowless)
+ COM_INTERFACE_ENTRY(IOleInPlaceActiveObject)
+ COM_INTERFACE_ENTRY(IOleControl)
+ COM_INTERFACE_ENTRY(IOleObject)
+ COM_INTERFACE_ENTRY(IPersistStreamInit)
+ COM_INTERFACE_ENTRY2(IPersist, IPersistStreamInit)
+ COM_INTERFACE_ENTRY(ISupportErrorInfo)
+ COM_INTERFACE_ENTRY(ISpecifyPropertyPages)
+ COM_INTERFACE_ENTRY(IQuickActivate)
+ COM_INTERFACE_ENTRY(IPersistStorage)
+ COM_INTERFACE_ENTRY(IObjectSafety)
+#ifndef _WIN32_WCE
+ COM_INTERFACE_ENTRY(IDataObject)
+#endif
+ COM_INTERFACE_ENTRY(IProvideClassInfo)
+ COM_INTERFACE_ENTRY(IProvideClassInfo2)
+#ifdef _WIN32_WCE // IObjectSafety is required on Windows CE for the control to be loaded correctly
+ COM_INTERFACE_ENTRY_IID(IID_IObjectSafety, IObjectSafety)
+#endif
+ END_COM_MAP()
+
+ BEGIN_PROP_MAP(Cplugin)
+ PROP_DATA_ENTRY("_cx", m_sizeExtent.cx, VT_UI4)
+ PROP_DATA_ENTRY("_cy", m_sizeExtent.cy, VT_UI4)
+ // Example entries
+ // PROP_ENTRY_TYPE("Property Name", dispid, clsid, vtType)
+ // PROP_PAGE(CLSID_StockColorPage)
+ END_PROP_MAP()
+
+
+ BEGIN_MSG_MAP(Cplugin)
+ MESSAGE_HANDLER(WM_CREATE, OnCreate)
+ CHAIN_MSG_MAP(CComControl<Cplugin>)
+ DEFAULT_REFLECTION_HANDLER()
+ END_MSG_MAP()
+ // Handler prototypes:
+ // LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
+ // LRESULT CommandHandler(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
+ // LRESULT NotifyHandler(int idCtrl, LPNMHDR pnmh, BOOL& bHandled);
+
+ // ISupportsErrorInfo
+ STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid)
+ {
+ static const IID* arr[] =
+ {
+ &IID_Iplugin,
+ };
+
+ for (int i=0; i<sizeof(arr)/sizeof(arr[0]); i++)
+ {
+ if (InlineIsEqualGUID(*arr[i], riid))
+ return S_OK;
+ }
+ return S_FALSE;
+ }
+
+ // IViewObjectEx
+ DECLARE_VIEW_STATUS(VIEWSTATUS_SOLIDBKGND | VIEWSTATUS_OPAQUE)
+
+ // Iplugin
+
+ LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
+ {
+ CAxWindow wnd(m_hWnd);
+ wnd.ModifyStyle(0, WS_HSCROLL | WS_VSCROLL);
+ HRESULT hr = wnd.CreateControl(IDH_PLUGIN);
+ if (SUCCEEDED(hr))
+ {
+ CComObject<CpluginUI> *pObject = NULL;
+ hr = CComObject<CpluginUI>::CreateInstance(&pObject);
+ if (SUCCEEDED(hr) && pObject != NULL)
+ hr = wnd.SetExternalDispatch(static_cast<IpluginUI*>(pObject));
+ }
+ if (SUCCEEDED(hr))
+ hr = wnd.QueryControl(IID_IWebBrowser2, (void**)&m_spBrowser);
+ return SUCCEEDED(hr) ? 0 : -1;
+ }
+
+ STDMETHOD(TranslateAccelerator)(LPMSG pMsg)
+ {
+ CComPtr<IOleInPlaceActiveObject> spIOleInPlaceActiveObject;
+
+ HRESULT hr = m_spBrowser->QueryInterface(&spIOleInPlaceActiveObject);
+ if (SUCCEEDED(hr))
+ hr = spIOleInPlaceActiveObject->TranslateAccelerator(pMsg);
+ if (hr != S_OK)
+ hr = IOleInPlaceActiveObjectImpl<Cplugin>::TranslateAccelerator(pMsg);
+
+ return hr;
+ }
+ CComPtr<IWebBrowser2> m_spBrowser;
+
+ DECLARE_PROTECT_FINAL_CONSTRUCT()
+
+ HRESULT FinalConstruct()
+ {
+ IEUtils::InitEventLog();
+ return S_OK;
+ }
+
+ void FinalRelease()
+ {
+ IEUtils::CloseEventLog();
+ Debug::log(Debug::Debugging) << "OOPHM plugin FinalRelease" << Debug::flush;
+ }
+
+ STDMETHOD(connect)(BSTR url, BSTR sessionKey, BSTR hostedServer,
+ BSTR moduleName, BSTR hostedHtmlVersion, VARIANT_BOOL* ret);
+ STDMETHOD(init)(IDispatch* jsniContext, VARIANT_BOOL* ret);
+ STDMETHOD(testObject)(IDispatch** ret);
+private:
+ scoped_ptr<IESessionHandler> sessionHandler;
+};
+
+OBJECT_ENTRY_AUTO(__uuidof(plugin), Cplugin)
diff --git a/plugins/ie/oophm/oophm/plugin.htm b/plugins/ie/oophm/oophm/plugin.htm
new file mode 100644
index 0000000..1dac491
--- /dev/null
+++ b/plugins/ie/oophm/oophm/plugin.htm
@@ -0,0 +1,82 @@
+<HTML>
+<HEAD>
+<TITLE>GWT IE Plugin test page.</TITLE>
+</HEAD>
+<BODY>
+<OBJECT ID="plugin" CLASSID="CLSID:1D6156B6-002B-49E7-B5CA-C138FB843B4E" border="2" width="150" height="150" standby="loading gwt plugin...">
+<div style="color:red; font-family:'Times New Roman'; font-size:20px;">
+<H1>Ooops!!! Failed to load gwt oophm plugin!</H1>
+<a><p>This is was you should have seen...<p>
+<img
+src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAANQAAADUCAIAAABrvJpPAAAAAXNSR0IArs4c6QAAAARnQU1B
+AACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAx8SURBVHhe7Z1da1NLF8fzkSy0n8Vz
+ZfsRCuJTiQVBibS5sNRceNMj9UrbXgoiBlTQm5aqeBARxZtaMCSttr4heuA8/8xkv85uurXZ
+mVkz/3VRkpk1s95+nd2kyV61/yjMgKUM1CzZpVlm4D/CRwisZYDwWUs9DRM+MmAtA4TPWupp
+mPCRAWsZIHzWUk/DhI8MWMsA4bOWehomfGTAWgaK4atRmIGTZaAM0YTvZDnm6iMycFL4yqyn
+jscZ+PHjx/v37z98+LC/v/8pJQcHB3iGn7EcHh5+/vy52+0iG5rGMmkZdvKVWU8djzNA+Dwu
+ruuhET7XK+Sxf4TP4+K6Hhrhc71CHvtH+DwuruuhHQUfXvz2ej385Ktd10so179C+Pb29kDe
+hQsX0vzxrRa5VXbUcxM+Td7Zs2cvXrx47dq1mD/C52gJ5bqVg0+Td+7cucXFxZs3b66vr9+6
+dUvzR/jkVtlRz3PwgbOlpaXV1dU7d+602+1Hjx49efLk4cOHGCd8jpZQrluFJx9QywlPPrkl
+dtdzvtXibm2894zweV9idwMkfO7WxnvPCJ/3JXY3QMLnbm2894zweV9idwMkfO7WxnvPxMDX
+arXm5uZmxyuwCLveQ2ArQBnwLTaby8vLnU7n3/EKLMIurNsqj992ZcCHfzbjm0s/f/7EV5jG
+KbAIu7DuNwS2opMBHy62OPLGiV1sC3Zh3VZ5/LYrBr5fv37how3jF9glfBX9DhC+Y3gmfBWR
+h20lwZf+Crt+vDFTfDOFmQ1T9/iRZ1emarX8UsJH+GYBQfqOCvrx+nStNtV4mp142gBDtel1
+U/2YEbUwv47wEb7fgO/Tp0KKjmeR8FXHWeHOYi67eNcDn2jNyRpOvsnG9nHj243J+PKcU+/v
+MJDpRl9tei27G+zyBUdFUEqCD18wycntM4Dv8lZ+eOsyKDpzWw/3dWIlNZOdivT0VDwX7Un4
+KiJP0gsOQFASPkVRhGTmSX+DZCCDaDwVsUj4qoMu2lnSyWd+tUSdaoZMXt6MVfXZmDzv9Tb1
+sdjrGVPxTNoQT77qIBQD3/fv398Z8vdftdrE/IPU+IP5CcD419+DIf3UFCxSU7FiX98cwSDs
+8m++ivjzDT7g0icypsrEMybVmCJ8FUF21LaS4HtryMppnHz1dm68P1o7vaJG23Wcb4PHWi2e
+NaZMXajz5KuOSEnwvTGkD9Kpejs/PuBLD7frp1JKaipaktZTagra7G6Ej/DNAoLS8L3JIDbg
+L/rDL0NXhJwicqXPH+GrDrb8zmJOvm/fvr22IbDLFxwV8SgJvlc2hPBVRJ6kN5kBgQ32XhE+
+wjf79evXlzYEdnnZrYg/MZddQPCPDSF8FZEn6bJL+KqDwNbOYk6+L1++vLAhsMvLbkV0yoAP
+X17c2dnBB02ej1dgEXb51cmg4Ws2m7hb7+7uLs6hcQoswi6sV5T9wLeVcfKhSAsLCziBxnu3
+jFlYhN3AEakufDHwVZcC7mwrA4TPVuZpV8j3dlkoLzPAk8/LssoIivDJqJOXXhI+L8sqIyjC
+J6NOXnpJ+Lwsq4ygCJ+MOnnpJeHzsqwygiJ8MurkpZeEz8uyygiK8Mmok5deEj4vyyojKMIn
+o05eekn4vCyrjKAIn4w6eekl4fOyrDKCInwy6uSll4TPy7LKCIrwyaiTl14SPi/LKiMowiej
+Tl56Sfi8LKuMoMTA12q15ubmxvyl8ZGYg9twXgYO4/VSBnyLzeby8nKn00Hfb3ECt+E8Qhhv
+ZQVYkwEfblvR7XbRDMhKp/sTGoXbcJ53GzJ/G2TAh8sfDrwTQmBxOZznfdYEw4emy8c0pHd4
+mh2jC/8IEHPyET4Bf8T9pouS4DsoJRszmT5/U1eelVpWqRJPPvEn37GN6lWf+tpU42miua46
+iU+vH7u2UgXC5zt8irMCzBSSdvEjfLLhwxsW+8Nku4EeztNrRSqpqcHDNX0eam01NpDJxnZ6
+hyOm+suhmZotNhxvxY7R4uEz29ynRnTf8K2hOoMm9/1G45Ge6lUerVON7+PJo6cGDc4zy5It
+C1wgfF7Dp7gZCoBiIqemnqaRTQaGTO3lQT/WOOETD19viGxq+DIagwNKX1EnL29iMqemKepP
+RBIrDJnq5eeKjGc8IXyy4UO/3bhBfdGDIf3sVeP7ifkHWJbtZK+eFQh0h0y9S+2nPcnuWuAd
+O0b7Dd8wAI6Cz6AoxU05mAnfb76vnFEX8yYzDo+3w2XQtN5UUhMT9TZm2nWcdadXIp3cUwzH
+mwyZUkp6Py2mbs4JnnziTz6zzX1uRDetP1VvJ+NxH3s9qp6mO9mrgXiFQi96dvRUXy1txdg1
+7ynh8x8+VXMFUEr6qGHsCPgiIKMFaTAHrJpThO8kF9tkrZjLLjp+vxYrbFcu++Sz1eb+1SiE
+8BG+UXD0R3sQPtnwodP4S7EC5/lJZsGfZLbV5v6fUQjhE3/yjQIDO3sQPtnwocH4C7EC53nZ
+lXrZxfcOd3Z28KmU5wIFbsN5fnVSKnzNZnNpaWl3dxdHiDiB23AeIYzmnVmPdpHxJjMSvrCw
+gMNjJPevGPMmcBvOe8TMyEIRA9/IIuZGzmSA8DlTivAcIXzh1dyZiAmfM6UIzxHCF17NnYmY
+8DlTivAcIXzh1dyZiAmfM6UIzxHCF17NnYmY8DlTivAcIXzh1dyZiAmfM6UIzxHCF17NnYmY
+8DlTivAcIXzh1dyZiAmfM6UIzxHCF17NnYmY8DlTivAcIXzh1dyZiAmfM6UIzxHCF17NnYmY
+8DlTivAcIXzh1dyZiAmfM6UIzxEx8LVarbm5uTF/31ubg11YD4+NyiOWAd9is7m8vNzpdNCy
+e/wCu7AOHyqvRmAGZMCHO050u1308bHSqh52YZ13+hn5r4YM+HDtw4FnhTxtFNZ5j7Nw4bPb
+5p4Nc0dOHjYUc/IRvirKb3dPSfAdGLIxY7btm9mI1frTU1eemet+e4QnXxWYSoLvkyH9zvZT
+jaepcdXTPhoyp80tyo0QPsKXJ6WIrtQY4asCmdHtKebkw/sd+4as4eSbbGxnxlNjycO84nYD
+vaGn16KF6ulA8vspHXZrHh1yyU6S4FON6jOS7zc/6GMfNa5Ppoc1plcNyaMlqmM9WpbnDBE+
+wlcEX/4lR4QRdMvAp2hLrdkzBvpGCV/o8PUM0XRtpsc3NUxqLJnOKyqtM7czOtEuyVyyL+EL
+Gj70S041oR88LOxFnzS8T6bzirGOelAgE/MP0ubYrZnw5fErhO9dPFoCvkTZRDs1QvhCh++t
+If2W3xP1dna8XcdhdnoFg8l0XjHRSR5Fu6hW5Wp9IoQvdPhUF/uM5PvNR03rdU971fHefPim
+XT+lLrSDlvbq6UBNr0meRdYIH+Ergs/4g23AVBa+NzFyijoFXKIY4ZhmMmOL8AUNH5p1v7Yn
+bBUeOnx/1GF+NIsIH+EbDUl/sAvhCxo+NOt+aU/YKjx0+Oy0qFdWCR/hs4Yf4QsaPjQYf2FP
+YJ1fIBo5fzI+UoWvLe7s7ODTJc9tCOzCOr86GSh8zWZzaWlpd3cXJ9D4BXZhHT6MPPuBbyjj
+5EORFhYWcPZYuV0G7MJ64KBUEb4Y+KoInnvazQDhs5v/oK0TvqDLbzd4wmc3/0FbJ3xBl99u
+8ITPbv6Dtk74gi6/3eAJn938B22d8AVdfrvBEz67+Q/aOuELuvx2gyd8dvMftHXCF3T57QZP
++OzmP2jrhC/o8tsNnvDZzX/Q1glf0OW3Gzzhs5v/oK0TvqDLbzd4wmc3/0FbJ3xBl99u8ITP
+bv6Dtk74gi6/3eAJn938B22d8AVdfrvBEz67+Q/aeg4+3BPH7PODEfS+Ozw8RL/3breLfOmb
+cJdJXLFS+fVlbFBHaAZy8IGz+fn5/yk5f/78pUuXrl+/vr6+jnHCJ7TE7rpdePJdvXq11Wqt
+rq7evXv38ePHPPncrZ9oz8y/+fSV98aNG/fu3dva2tLkoS88Tz7RhXbReQ1fp9P5+PEjCNMC
+2sDc/fv3Y/IIn4vFk+6Thg+QoYM8zrZYwCKOQPyMR/BqA/dl5AsO6RV3yH8Nn4YMeA0RfUdQ
+wudQ8aS7ouHDVTWHHTjTR11OCJ/0ijvkv4bP5Az3/gd2+JkTwudQ8aS7ouEzITtqhPBJr7hD
+/mv4gFR5Gdl/OAr7y3OQGSiTgTK/Q8P+vVbGBnWYgcIM/Dl8ZVZShxk4YQZKffrghDa4nBko
+zADhIxjWMkD4rKWehgkfGbCWAcJnLfU0TPjIgLUMED5rqadhwkcGrGXg/6d8mklbFhfvAAAA
+AElFTkSuQmCC" /></a>
+</div>
+</OBJECT>
+<script>
+var plugin = document.getElementById("plugin");
+var b = plugin.connect("this", "sucks");
+var obj = plugin.testObject();
+obj.doSomething(42);
+</script>
+</BODY>
+</HTML>
\ No newline at end of file
diff --git a/plugins/ie/oophm/oophm/plugin.rgs b/plugins/ie/oophm/oophm/plugin.rgs
new file mode 100644
index 0000000..e6f868e
--- /dev/null
+++ b/plugins/ie/oophm/oophm/plugin.rgs
@@ -0,0 +1,34 @@
+HKCR
+{
+ oophm.plugin.1 = s 'plugin Class'
+ {
+ CLSID = s '{1D6156B6-002B-49E7-B5CA-C138FB843B4E}'
+ }
+ oophm.plugin = s 'plugin Class'
+ {
+ CLSID = s '{1D6156B6-002B-49E7-B5CA-C138FB843B4E}'
+ CurVer = s 'oophm.plugin.1'
+ }
+ NoRemove CLSID
+ {
+ ForceRemove {1D6156B6-002B-49E7-B5CA-C138FB843B4E} = s 'plugin Class'
+ {
+ ProgID = s 'oophm.plugin.1'
+ VersionIndependentProgID = s 'oophm.plugin'
+ ForceRemove 'Programmable'
+ InprocServer32 = s '%MODULE%'
+ {
+ val ThreadingModel = s 'Apartment'
+ }
+ val AppID = s '%APPID%'
+ ForceRemove 'Control'
+ ForceRemove 'ToolboxBitmap32' = s '%MODULE%, 102'
+ 'MiscStatus' = s '0'
+ {
+ '1' = s '%OLEMISC%'
+ }
+ 'TypeLib' = s '{9259F105-BE55-4BF6-B7CE-D0AA878C1BA6}'
+ 'Version' = s '1.0'
+ }
+ }
+}
diff --git a/plugins/ie/oophm/oophm/pluginUI.htm b/plugins/ie/oophm/oophm/pluginUI.htm
new file mode 100644
index 0000000..7a017d7
--- /dev/null
+++ b/plugins/ie/oophm/oophm/pluginUI.htm
@@ -0,0 +1,11 @@
+<HTML>
+<BODY id=theBody>
+<BUTTON onclick='window.external.OnClick(theBody, "red");'>Red</BUTTON>
+<BR>
+<BR>
+<BUTTON onclick='window.external.OnClick(theBody, "green");'>Green</BUTTON>
+<BR>
+<BR>
+<BUTTON onclick='window.external.OnClick(theBody, "blue");'>Blue</BUTTON>
+</BODY>
+</HTML>
diff --git a/plugins/ie/oophm/oophm/resource.h b/plugins/ie/oophm/oophm/resource.h
new file mode 100644
index 0000000..e0ef5a4
--- /dev/null
+++ b/plugins/ie/oophm/oophm/resource.h
@@ -0,0 +1,24 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Visual C++ generated include file.
+// Used by oophm.rc
+//
+#define IDS_PROJNAME 100
+#define IDR_OOPHM 101
+#define IDR_PLUGIN 103
+#define IDD_ALLOW_DIALOG 103
+#define IDH_PLUGIN 103
+#define IDR_JAVAOBJECT 105
+#define IDR_EXCEPTIONCATCHER 106
+#define IDC_REMEMBER_CHECKBOX 201
+#define IDC_ALLOW_BUTTON 202
+
+// Next default values for new objects
+//
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE 202
+#define _APS_NEXT_COMMAND_VALUE 32768
+#define _APS_NEXT_CONTROL_VALUE 204
+#define _APS_NEXT_SYMED_VALUE 107
+#endif
+#endif
diff --git a/plugins/ie/oophm/oophm/stdafx.cpp b/plugins/ie/oophm/oophm/stdafx.cpp
new file mode 100644
index 0000000..39ac1a3
--- /dev/null
+++ b/plugins/ie/oophm/oophm/stdafx.cpp
@@ -0,0 +1,21 @@
+/*
+ * Copyright 2008 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.
+ */
+
+// stdafx.cpp : source file that includes just the standard includes
+// oophm.pch will be the pre-compiled header
+// stdafx.obj will contain the pre-compiled type information
+
+#include "stdafx.h"
diff --git a/plugins/ie/oophm/oophm/stdafx.h b/plugins/ie/oophm/oophm/stdafx.h
new file mode 100644
index 0000000..b60571c
--- /dev/null
+++ b/plugins/ie/oophm/oophm/stdafx.h
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2008 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.
+ */
+
+// stdafx.h : include file for standard system include files,
+// or project specific include files that are used frequently,
+// but are changed infrequently
+
+#pragma once
+
+#ifndef STRICT
+#define STRICT
+#endif
+
+#include "targetver.h"
+
+#define _ATL_APARTMENT_THREADED
+#define _ATL_NO_AUTOMATIC_NAMESPACE
+
+#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // some CString constructors will be explicit
+
+#include "resource.h"
+#include <atlbase.h>
+#include <atlcom.h>
+#include <atlctl.h>
+
+// We want to bake GUID defs into the app
+#include "initguid.h"
+
+using namespace ATL;
+
+#include <windows.h>
+#include <stdio.h>
+#include <winevt.h>
diff --git a/plugins/ie/oophm/oophm/targetver.h b/plugins/ie/oophm/oophm/targetver.h
new file mode 100644
index 0000000..e33be6a
--- /dev/null
+++ b/plugins/ie/oophm/oophm/targetver.h
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2008 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.
+ */
+
+#pragma once
+
+// The following macros define the minimum required platform. The minimum required platform
+// is the earliest version of Windows, Internet Explorer etc. that has the necessary features to run
+// your application. The macros work by enabling all features available on platform versions up to and
+// including the version specified.
+
+// Modify the following defines if you have to target a platform prior to the ones specified below.
+// Refer to MSDN for the latest info on corresponding values for different platforms.
+#ifndef WINVER // Specifies that the minimum required platform is Windows Vista.
+#define WINVER 0x0501 // Change this to the appropriate value to target other versions of Windows.
+#endif
+
+#ifndef _WIN32_WINNT // Specifies that the minimum required platform is Windows Vista.
+#define _WIN32_WINNT 0x0501 // Change this to the appropriate value to target other versions of Windows.
+#endif
+
+#ifndef _WIN32_WINDOWS // Specifies that the minimum required platform is Windows 98.
+#define _WIN32_WINDOWS 0x0410 // Change this to the appropriate value to target Windows Me or later.
+#endif
+
+#ifndef _WIN32_IE // Specifies that the minimum required platform is Internet Explorer 7.0.
+#define _WIN32_IE 0x0600 // Change this to the appropriate value to target other versions of IE.
+#endif
+
diff --git a/plugins/ie/prebuilt/Win32/oophm.dll b/plugins/ie/prebuilt/Win32/oophm.dll
new file mode 100755
index 0000000..38973b2
--- /dev/null
+++ b/plugins/ie/prebuilt/Win32/oophm.dll
Binary files differ
diff --git a/plugins/ie/prebuilt/gwt-dev-plugin-x64.msi b/plugins/ie/prebuilt/gwt-dev-plugin-x64.msi
new file mode 100755
index 0000000..205ee1f
--- /dev/null
+++ b/plugins/ie/prebuilt/gwt-dev-plugin-x64.msi
Binary files differ
diff --git a/plugins/ie/prebuilt/gwt-dev-plugin-x86.msi b/plugins/ie/prebuilt/gwt-dev-plugin-x86.msi
new file mode 100755
index 0000000..3496298
--- /dev/null
+++ b/plugins/ie/prebuilt/gwt-dev-plugin-x86.msi
Binary files differ
diff --git a/plugins/ie/prebuilt/gwt-dev-plugin.msi b/plugins/ie/prebuilt/gwt-dev-plugin.msi
new file mode 100644
index 0000000..b7e928a
--- /dev/null
+++ b/plugins/ie/prebuilt/gwt-dev-plugin.msi
Binary files differ
diff --git a/plugins/ie/prebuilt/x64/oophm.dll b/plugins/ie/prebuilt/x64/oophm.dll
new file mode 100755
index 0000000..2b7d6bb
--- /dev/null
+++ b/plugins/ie/prebuilt/x64/oophm.dll
Binary files differ
diff --git a/plugins/npapi/DevModeOptions/build.xml b/plugins/npapi/DevModeOptions/build.xml
new file mode 100644
index 0000000..da11701
--- /dev/null
+++ b/plugins/npapi/DevModeOptions/build.xml
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<project name="DevModeOptions" default="prebuilt" basedir=".">
+ <!-- Arguments to gwtc and devmode targets -->
+ <property name="gwt.args" value="" />
+
+ <!-- Configure path to GWT SDK -->
+ <property name="gwt.sdk" location="../../../build/staging/gwt-0.0.0" />
+
+ <path id="project.class.path">
+ <pathelement location="war/WEB-INF/classes"/>
+ <pathelement location="${gwt.sdk}/gwt-user.jar"/>
+ <fileset dir="${gwt.sdk}" includes="gwt-dev*.jar"/>
+ <!-- Add any additional non-server libs (such as JUnit) -->
+ <fileset dir="war/WEB-INF/lib" includes="**/*.jar"/>
+ </path>
+
+ <target name="javac" description="Compile java source to bytecode">
+ <mkdir dir="war/WEB-INF/classes"/>
+ <javac srcdir="src" includes="**" encoding="utf-8"
+ destdir="war/WEB-INF/classes"
+ source="1.5" target="1.5" nowarn="true"
+ debug="true" debuglevel="lines,vars,source">
+ <classpath refid="project.class.path"/>
+ </javac>
+ <copy todir="war/WEB-INF/classes">
+ <fileset dir="src" excludes="**/*.java"/>
+ </copy>
+ </target>
+
+ <target name="gwtc" depends="javac" description="GWT compile to JavaScript (production mode)">
+ <java failonerror="true" fork="true" classname="com.google.gwt.dev.Compiler">
+ <classpath>
+ <pathelement location="src"/>
+ <path refid="project.class.path"/>
+ </classpath>
+ <!-- add jvmarg -Xss16M or similar if you see a StackOverflowError -->
+ <jvmarg value="-Xmx256M"/>
+ <arg line="-war"/>
+ <arg value="war"/>
+ <!-- Additional arguments like -style PRETTY or -logLevel DEBUG -->
+ <arg line="${gwt.args}"/>
+ <arg value="com.google.gwt.devmodeoptions.DevModeOptions"/>
+ </java>
+ </target>
+
+ <target name="devmode" depends="javac" description="Run development mode">
+ <java failonerror="true" fork="true" classname="com.google.gwt.dev.DevMode">
+ <classpath>
+ <pathelement location="src"/>
+ <path refid="project.class.path"/>
+ </classpath>
+ <jvmarg value="-Xmx256M"/>
+ <arg value="-startupUrl"/>
+ <arg value="DevModeOptions.html"/>
+ <arg line="-war"/>
+ <arg value="war"/>
+ <!-- Additional arguments like -style PRETTY or -logLevel DEBUG -->
+ <arg line="${gwt.args}"/>
+ <arg value="com.google.devmodeoptions"/>
+ </java>
+ </target>
+
+ <target name="build" depends="gwtc" description="Build this project">
+ </target>
+
+ <target name="war" depends="build" description="Create a war file">
+ <zip destfile="DevModeOptions.war" basedir="war"/>
+ </target>
+
+ <target name="clean" depends="clean-prebuilt" description="Cleans this project">
+ <delete dir="war/WEB-INF/classes" failonerror="false" />
+ <delete dir="war/DevModeOptions" failonerror="false" />
+ </target>
+
+ <target name="clean-prebuilt" description="Clean the prebuilt copy">
+ <delete file="../prebuilt/gwt-dev-plugin/DevModeOptions.html" />
+ <delete dir="../prebuilt/gwt-dev-plugin/DevModeOptions" />
+ </target>
+
+ <target name="prebuilt" depends="build,clean-prebuilt" description="Copy compiled files into
+ the prebuilt crx directory">
+ <copy todir="../prebuilt/gwt-dev-plugin/DevModeOptions">
+ <fileset dir="war/DevModeOptions" excludes="**/*.java"/>
+ </copy>
+ <copy todir="../prebuilt/gwt-dev-plugin/">
+ <fileset dir="war/">
+ <include name="DevModeOptions.html" />
+ </fileset>
+ </copy>
+ </target>
+</project>
diff --git a/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/DevModeOptions.gwt.xml b/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/DevModeOptions.gwt.xml
new file mode 100644
index 0000000..a53534f
--- /dev/null
+++ b/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/DevModeOptions.gwt.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 0.0.999//EN" "http://google-web-toolkit.googlecode.com/svn/tags/0.0.999/distro-source/core/src/gwt-module.dtd">
+<module rename-to='DevModeOptions'>
+ <!-- Inherit the core Web Toolkit stuff. -->
+ <inherits name='com.google.gwt.user.User' />
+
+ <!-- Specify the app entry point class. -->
+ <entry-point class='com.google.gwt.devmodeoptions.client.DevModeOptions'/>
+
+ <!-- TARGETING WEBKIT ONLY -->
+ <set-property name='user.agent' value='safari' />
+ <add-linker name="xsiframe" />
+
+ <!-- Specify the paths for translatable code -->
+ <source path='client'/>
+</module>
diff --git a/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/DevModeOptions.java b/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/DevModeOptions.java
new file mode 100644
index 0000000..681a173
--- /dev/null
+++ b/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/DevModeOptions.java
@@ -0,0 +1,236 @@
+/*
+ * Copyright 2010 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.devmodeoptions.client;
+
+import com.google.gwt.core.client.EntryPoint;
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+import com.google.gwt.core.client.JsArray;
+import com.google.gwt.dom.client.StyleInjector;
+import com.google.gwt.event.dom.client.ClickEvent;
+import com.google.gwt.event.dom.client.ClickHandler;
+import com.google.gwt.event.dom.client.KeyCodes;
+import com.google.gwt.event.dom.client.KeyPressEvent;
+import com.google.gwt.event.dom.client.KeyPressHandler;
+import com.google.gwt.uibinder.client.UiBinder;
+import com.google.gwt.uibinder.client.UiField;
+import com.google.gwt.user.client.Window.Location;
+import com.google.gwt.user.client.ui.Button;
+import com.google.gwt.user.client.ui.FlexTable;
+import com.google.gwt.user.client.ui.Label;
+import com.google.gwt.user.client.ui.RadioButton;
+import com.google.gwt.user.client.ui.RootLayoutPanel;
+import com.google.gwt.user.client.ui.TextBox;
+import com.google.gwt.user.client.ui.Widget;
+
+/**
+ * The options page for configuring the set of hosts permitted to use the GWT
+ * Developer Plugin.
+ */
+public class DevModeOptions implements EntryPoint {
+
+ interface Binder extends UiBinder<Widget, DevModeOptions> {
+ }
+
+ private static final DevModeOptionsResources bundle = GWT.create(DevModeOptionsResources.class);
+
+ @UiField
+ Button addBtn;
+
+ @UiField
+ Label errorMessage;
+
+ @UiField
+ TextBox hostname;
+
+ @UiField
+ TextBox codeserver;
+
+ JsArray<HostEntry> hosts;
+
+ @UiField
+ RadioButton includeNo;
+
+ @UiField
+ RadioButton includeYes;
+
+ @UiField
+ FlexTable savedHosts;
+
+ public void onModuleLoad() {
+ StyleInjector.inject(bundle.css().getText(), true);
+ RootLayoutPanel.get().add(
+ GWT.<Binder> create(Binder.class).createAndBindUi(this));
+
+ hosts = HostEntryStorage.get().getHostEntries();
+
+ addBtn.addClickHandler(new ClickHandler() {
+ public void onClick(ClickEvent event) {
+ addHost(HostEntry.create(hostname.getText() + "/"
+ + getCodeServer(codeserver),
+ includeYes.getValue()));
+ }
+ });
+
+ hostname.setFocus(true);
+ String host = Location.getParameter("host");
+ if (host != null) {
+ hostname.setText(host);
+ }
+
+ String code = Location.getParameter("codeserver");
+ if (code != null) {
+ codeserver.setText(code);
+ } else {
+ //default for users entering through options
+ codeserver.setText("localhost");
+ }
+
+ hostname.addKeyPressHandler(new KeyPressHandler() {
+ public void onKeyPress(KeyPressEvent event) {
+ if (event.getCharCode() == KeyCodes.KEY_ENTER) {
+ addHost(HostEntry.create(hostname.getText() + "/"
+ + getCodeServer(codeserver),
+ includeYes.getValue()));
+ }
+ }
+ });
+
+ codeserver.addKeyPressHandler(new KeyPressHandler() {
+ public void onKeyPress(KeyPressEvent event) {
+ if (event.getCharCode() == KeyCodes.KEY_ENTER) {
+ addHost(HostEntry.create(hostname.getText() + "/"
+ + getCodeServer(codeserver),
+ includeYes.getValue()));
+ }
+ }
+ });
+
+ savedHosts.setText(0, 0, "Web server");
+ savedHosts.setText(0, 1, "Code server");
+ savedHosts.setText(0, 2, "Include/Exclude");
+ savedHosts.setText(0, 3, "Remove");
+ savedHosts.getCellFormatter().addStyleName(0, 0,
+ bundle.css().savedHostsHeading());
+ savedHosts.getCellFormatter().addStyleName(0, 0, bundle.css().textCol());
+
+ savedHosts.getCellFormatter().addStyleName(0, 1,
+ bundle.css().savedHostsHeading());
+ savedHosts.getCellFormatter().addStyleName(0, 1, bundle.css().textCol());
+
+ savedHosts.getCellFormatter().addStyleName(0, 2,
+ bundle.css().savedHostsHeading());
+
+ savedHosts.getCellFormatter().addStyleName(0, 3,
+ bundle.css().savedHostsHeading());
+
+ for (int i = 0; i < hosts.length(); i++) {
+ displayHost(hosts.get(i));
+ }
+ }
+
+ private void addHost(final HostEntry newHost) {
+ if (newHost.getUrl().length() == 0) {
+ return;
+ }
+
+ boolean alreadyExists = false;
+ for (int i = 0; i < hosts.length() && !alreadyExists; i++) {
+ if (hosts.get(i).isEqual(newHost)) {
+ alreadyExists = true;
+ }
+ }
+
+ if (alreadyExists) {
+ error("Cannot add duplicate host entry for " + newHost.getUrl());
+ return;
+ } else {
+ hosts.push(newHost);
+ clearError();
+ }
+ HostEntryStorage.get().saveEntries(hosts);
+
+ displayHost(newHost);
+
+ codeserver.setText("");
+ hostname.setText("");
+ hostname.setFocus(true);
+ }
+
+ private void clearError() {
+ errorMessage.setText("");
+ }
+
+ private void displayHost(final HostEntry newHost) {
+ int numRows = savedHosts.getRowCount();
+ int col = 0;
+
+ String[] names = newHost.getUrl().split("/");
+
+ savedHosts.insertRow(numRows);
+ savedHosts.setText(numRows, col++, names[0]);
+ savedHosts.setText(numRows, col++, names.length > 1 ? names[1]
+ : "localhost");
+ savedHosts.setText(numRows, col++, newHost.include() ? "Include"
+ : "Exclude");
+ if (newHost.include()) {
+ savedHosts.getCellFormatter().addStyleName(numRows, 0,
+ bundle.css().include());
+ savedHosts.getCellFormatter().addStyleName(numRows, 1,
+ bundle.css().include());
+ savedHosts.getCellFormatter().addStyleName(numRows, 2,
+ bundle.css().include());
+ } else {
+ savedHosts.getCellFormatter().addStyleName(numRows, 0,
+ bundle.css().exclude());
+ savedHosts.getCellFormatter().addStyleName(numRows, 1,
+ bundle.css().exclude());
+ savedHosts.getCellFormatter().addStyleName(numRows, 2,
+ bundle.css().exclude());
+ }
+
+ Button removeHostButton = new Button("x");
+ removeHostButton.addClickHandler(new ClickHandler() {
+ public void onClick(ClickEvent event) {
+ removeHost(newHost);
+ }
+ });
+ savedHosts.setWidget(numRows, col, removeHostButton);
+ }
+
+ private void error(String text) {
+ errorMessage.setText(text);
+ }
+
+ private void removeHost(HostEntry host) {
+ JsArray<HostEntry> newHosts = JavaScriptObject.createArray().cast();
+ for (int index = 0; index < hosts.length(); index++) {
+ if (hosts.get(index).isEqual(host)) {
+ savedHosts.removeRow(index + 1);
+ } else {
+ newHosts.push(hosts.get(index));
+ }
+ }
+
+ hosts = newHosts;
+ HostEntryStorage.get().saveEntries(hosts);
+ }
+
+ private String getCodeServer(TextBox box) {
+ return (box.getText().length() > 0) ? box.getText() : "localhost";
+ }
+
+}
diff --git a/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/DevModeOptions.ui.xml b/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/DevModeOptions.ui.xml
new file mode 100644
index 0000000..1833223
--- /dev/null
+++ b/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/DevModeOptions.ui.xml
@@ -0,0 +1,75 @@
+<!-- Copyright 2010 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 -->
+<!-- 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. License for the specific language governing permissions and -->
+<!-- limitations under the License. -->
+
+<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
+<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
+ xmlns:g="urn:import:com.google.gwt.user.client.ui">
+ <ui:with field='res'
+ type='com.google.gwt.devmodeoptions.client.DevModeOptionsResources' />
+ <g:HTMLPanel styleName="{res.css.mainPanel}">
+ <div>
+ <g:HorizontalPanel>
+ <g:Image resource='{res.gwt64}' styleName="{res.css.logo}" />
+ <g:HTML>
+ <h1> GWT Developer Plugin Options </h1>
+ </g:HTML>
+ </g:HorizontalPanel>
+
+ <g:Label styleName="{res.css.explanation}">
+ The GWT Developer Plugin will open a TCP/IP connection to an arbitrary
+ host/port at the request of a web page. To minimize security risks,
+ by default it will only connect to the local machine. To allow
+ cross-machine debugging, you can add exceptions here -- include the
+ exact host name of the web and code servers you will use for debugging,
+ but do not include any you do not trust.</g:Label>
+
+ <g:Label ui:field="errorMessage" styleName="{res.css.errorMessage}"/>
+
+ <g:Grid>
+ <g:row>
+ <g:customCell>
+ <g:Label styleName="{res.css.important}">Web server</g:Label>
+ </g:customCell>
+ <g:customCell>
+ <g:Label styleName="{res.css.important}">Code server</g:Label>
+ </g:customCell>
+ </g:row>
+ <g:row>
+ <g:customCell>
+ <g:TextBox ui:field="hostname" styleName="{res.css.textBox}" />
+ </g:customCell>
+
+ <g:customCell>
+ <g:TextBox ui:field="codeserver" styleName="{res.css.textBox}" />
+ </g:customCell>
+
+ <g:customCell>
+ <g:Button styleName="{res.css.important}" ui:field="addBtn">Add</g:Button>
+ </g:customCell>
+
+ <g:customCell>
+ <g:RadioButton name="include" ui:field="includeYes"
+ checked="true">Include</g:RadioButton>
+ </g:customCell>
+ <g:customCell>
+ <g:RadioButton name="include" ui:field="includeNo">Exclude</g:RadioButton>
+ </g:customCell>
+ </g:row>
+ </g:Grid>
+
+ <g:FlexTable ui:field="savedHosts" styleName="{res.css.savedHosts}">
+ </g:FlexTable>
+ </div>
+ </g:HTMLPanel>
+
+</ui:UiBinder>
diff --git a/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/DevModeOptionsResources.java b/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/DevModeOptionsResources.java
new file mode 100644
index 0000000..3f17ced
--- /dev/null
+++ b/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/DevModeOptionsResources.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2010 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.devmodeoptions.client;
+
+import com.google.gwt.resources.client.ClientBundle;
+import com.google.gwt.resources.client.CssResource;
+import com.google.gwt.resources.client.ImageResource;
+
+public interface DevModeOptionsResources extends ClientBundle {
+
+ public interface Css extends CssResource {
+ String errorMessage();
+
+ String exclude();
+
+ String explanation();
+
+ String header();
+
+ String important();
+
+ String include();
+
+ String logo();
+
+ String mainPanel();
+
+ String savedHosts();
+
+ String savedHostsHeading();
+
+ String textBox();
+
+ String textCol();
+ }
+
+ @Source("com/google/gwt/devmodeoptions/client/resources/DevModeOptions.css")
+ Css css();
+
+ @Source("com/google/gwt/devmodeoptions/client/resources/gwt128.png")
+ ImageResource gwt128();
+
+ @Source("com/google/gwt/devmodeoptions/client/resources/gwt16.png")
+ ImageResource gwt16();
+
+ @Source("com/google/gwt/devmodeoptions/client/resources/gwt32.png")
+ ImageResource gwt32();
+
+ @Source("com/google/gwt/devmodeoptions/client/resources/gwt48.png")
+ ImageResource gwt48();
+
+ @Source("com/google/gwt/devmodeoptions/client/resources/gwt64.png")
+ ImageResource gwt64();
+
+ @Source("com/google/gwt/devmodeoptions/client/resources/warning.png")
+ ImageResource warning();
+}
diff --git a/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/HostEntry.java b/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/HostEntry.java
new file mode 100644
index 0000000..672a783
--- /dev/null
+++ b/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/HostEntry.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2010 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.devmodeoptions.client;
+
+import com.google.gwt.core.client.JavaScriptObject;
+
+
+public class HostEntry extends JavaScriptObject{
+
+ protected HostEntry() {}
+
+ public static HostEntry create(String url, boolean include) {
+ HostEntry entry = JavaScriptObject.createObject().cast();
+ entry.setUrl(url);
+ entry.setInclude(include);
+ return entry;
+ }
+
+ public final native String getUrl() /*-{
+ return this.url;
+ }-*/;
+
+ public final native void setUrl(String url) /*-{
+ this.url = url;
+ }-*/;
+
+ public final native void setInclude(boolean include) /*-{
+ this.include = include;
+ }-*/;
+
+ public final native boolean include() /*-{
+ return this.include;
+ }-*/;
+
+ public final boolean isEqual(HostEntry host) {
+ return this.getUrl().equals(host.getUrl());
+ }
+}
diff --git a/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/HostEntryStorage.java b/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/HostEntryStorage.java
new file mode 100644
index 0000000..6a7ddc0
--- /dev/null
+++ b/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/HostEntryStorage.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 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.devmodeoptions.client;
+
+import com.google.gwt.core.client.JavaScriptObject;
+import com.google.gwt.core.client.JsArray;
+
+public class HostEntryStorage {
+ private static HostEntryStorage singleton = new HostEntryStorage();
+ private static final String HOST_ENTRY_KEY = "GWT_DEV_HOSTENTRY";
+
+ public static HostEntryStorage get() {
+ return singleton;
+ }
+
+ private final LocalStorage localStorage;
+
+ private HostEntryStorage() {
+ localStorage = getLocalStorage();
+ }
+
+ private static native LocalStorage getLocalStorage() /*-{
+ return $wnd.localStorage;
+ }-*/;
+
+ public JsArray<HostEntry> getHostEntries() {
+ JsArray<HostEntry> entries = localStorage.getItem(HOST_ENTRY_KEY).cast();
+ if (entries == null) {
+ return JavaScriptObject.createArray().cast();
+ } else {
+ return entries;
+ }
+ }
+
+ public void saveEntries(JsArray<HostEntry> entries) {
+ localStorage.setItem(HOST_ENTRY_KEY, entries.cast());
+ }
+
+}
diff --git a/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/LocalStorage.java b/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/LocalStorage.java
new file mode 100644
index 0000000..9e6a6c2
--- /dev/null
+++ b/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/LocalStorage.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2010 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.devmodeoptions.client;
+
+import com.google.gwt.core.client.JavaScriptObject;
+
+/**
+ * Simple wrapper around HTML5 <a
+ * href="http://dev.w3.org/html5/webstorage/#the-localstorage-attribute">local
+ * storage</a> API.
+ */
+public class LocalStorage extends JavaScriptObject {
+ protected LocalStorage() {
+ }
+
+ public final native void clear() /*-{
+ this.clear();
+ }-*/;
+
+ public final native JavaScriptObject getItem(String key) /*-{
+ return JSON.parse(this.getItem(key));
+ }-*/;
+
+ public final native String getKey(int index) /*-{
+ return this.key(index);
+ }-*/;
+
+ public final native int getLength() /*-{
+ return this.length;
+ }-*/;
+
+ public final native String getStringItem(String key) /*-{
+ return this.getItem(key);
+ }-*/;
+
+ public final native void removeItem(String key) /*-{
+ this.removeItem(key);
+ }-*/;
+
+ public final native void setItem(String key, JavaScriptObject dataObject) /*-{
+ // Note, as of FF3.6, gecko does not support storing an object (only strings).
+ this.setItem(key, JSON.stringify(dataObject));
+ }-*/;
+
+ public final native void setStringItem(String key, String dataString) /*-{
+ this.setItem(key, dataString);
+ }-*/;
+}
diff --git a/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/resources/DevModeOptions.css b/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/resources/DevModeOptions.css
new file mode 100644
index 0000000..51d8605
--- /dev/null
+++ b/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/resources/DevModeOptions.css
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2010 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.
+ */
+@def TEXTWIDTH 30em;
+.savedHostsHeading {
+ font-weight: bold;
+}
+
+.savedHosts {
+ border: 2px solid silver;
+ padding: 2px;
+ margin-top: 1.5em;
+}
+
+.include {
+ color: blue;
+}
+
+.exclude {
+ color: IndianRed;
+}
+
+.errorMessage {
+ color: red;
+ font-weight: bold;
+}
+
+.important {
+ font-weight: bold;
+}
+
+.header {
+ font-size: large;
+ font-weight: bold;
+}
+
+.textBox {
+ width: 15em;
+}
+
+.textCol {
+ width: TEXTWIDTH;
+}
+
+.logo {
+ margin-right: 1em;
+}
+
+.mainPanel {
+ margin-left: 2em;
+ margin-top: 2em;
+ font-family: sans-serif;
+ font-size: small;
+ max-width: 50em;
+}
+
+.explanation {
+ margin-top: 1.5em;
+ margin-bottom: 1.5em;
+}
\ No newline at end of file
diff --git a/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/resources/gwt128.png b/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/resources/gwt128.png
new file mode 100644
index 0000000..57e8e01
--- /dev/null
+++ b/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/resources/gwt128.png
Binary files differ
diff --git a/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/resources/gwt16.png b/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/resources/gwt16.png
new file mode 100644
index 0000000..f26096e
--- /dev/null
+++ b/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/resources/gwt16.png
Binary files differ
diff --git a/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/resources/gwt32.png b/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/resources/gwt32.png
new file mode 100644
index 0000000..7ba8270
--- /dev/null
+++ b/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/resources/gwt32.png
Binary files differ
diff --git a/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/resources/gwt48.png b/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/resources/gwt48.png
new file mode 100644
index 0000000..e8a4172
--- /dev/null
+++ b/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/resources/gwt48.png
Binary files differ
diff --git a/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/resources/gwt64.png b/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/resources/gwt64.png
new file mode 100644
index 0000000..922cc88
--- /dev/null
+++ b/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/resources/gwt64.png
Binary files differ
diff --git a/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/resources/warning.png b/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/resources/warning.png
new file mode 100644
index 0000000..55a203b
--- /dev/null
+++ b/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/resources/warning.png
Binary files differ
diff --git a/plugins/npapi/DevModeOptions/war/DevModeOptions.html b/plugins/npapi/DevModeOptions/war/DevModeOptions.html
new file mode 100644
index 0000000..d2132e8
--- /dev/null
+++ b/plugins/npapi/DevModeOptions/war/DevModeOptions.html
@@ -0,0 +1,12 @@
+<!doctype html>
+<html>
+ <head>
+ <meta http-equiv="content-type" content="text/html; charset=UTF-8">
+
+ <title>GWT DevMode Options</title>
+ <script type="text/javascript" language="javascript" src="DevModeOptions/DevModeOptions.nocache.js"></script>
+ </head>
+
+ <body>
+ </body>
+</html>
diff --git a/plugins/npapi/DevModeOptions/war/WEB-INF/classes/marker b/plugins/npapi/DevModeOptions/war/WEB-INF/classes/marker
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/plugins/npapi/DevModeOptions/war/WEB-INF/classes/marker
diff --git a/plugins/npapi/DevModeOptions/war/WEB-INF/lib/marker b/plugins/npapi/DevModeOptions/war/WEB-INF/lib/marker
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/plugins/npapi/DevModeOptions/war/WEB-INF/lib/marker
diff --git a/plugins/npapi/DevModeOptions/war/WEB-INF/web.xml b/plugins/npapi/DevModeOptions/war/WEB-INF/web.xml
new file mode 100644
index 0000000..bd4f348
--- /dev/null
+++ b/plugins/npapi/DevModeOptions/war/WEB-INF/web.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xmlns="http://java.sun.com/xml/ns/javaee"
+xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
+xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
+http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
+</web-app>
diff --git a/plugins/npapi/JavaObject.cpp b/plugins/npapi/JavaObject.cpp
new file mode 100644
index 0000000..adbdbc8
--- /dev/null
+++ b/plugins/npapi/JavaObject.cpp
@@ -0,0 +1,182 @@
+/*
+ * Copyright 2008 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.
+ */
+
+#include "Debug.h"
+
+#include "JavaObject.h"
+#include "Plugin.h"
+#include "NPVariantUtil.h"
+#include "NPVariantWrapper.h"
+
+using std::string;
+
+static string IdentifierName(NPIdentifier name) {
+ string iname;
+ if (NPN_IdentifierIsString(name)) {
+ iname = NPN_UTF8FromIdentifier(name);
+ } else {
+ char buf[50];
+ snprintf(buf, sizeof(buf), "%d", NPN_IntFromIdentifier(name));
+ iname = buf;
+ }
+ return iname;
+}
+
+JavaObject* JavaObject::create(ScriptableInstance* plugin, int id) {
+ Debug::log(Debug::Spam) << "Creating Java object id=" << id;
+ NPClass* npClass = GetNPClass<JavaObject>();
+ NPObject* obj = NPN_CreateObject(plugin->getNPP(), npClass);
+ Debug::log(Debug::Spam) << " addr=" << obj << Debug::flush;
+ JavaObject* jObj = static_cast<JavaObject*>(obj);
+ jObj->setObjectId(id);
+ return jObj;
+}
+
+bool JavaObject::isInstance(NPObject* obj) {
+ return obj->_class == GetNPClass<JavaObject>();
+}
+
+JavaObject::~JavaObject() {
+ if (plugin) {
+ plugin->destroyJavaWrapper(this);
+ } else {
+ Debug::log(Debug::Spam) << "Destroying JavaObject " << objectId << " after plugin destroyed"
+ << Debug::flush;
+ }
+}
+
+bool JavaObject::enumeration(NPIdentifier** propReturn, uint32_t* count) {
+ Debug::log(Debug::Debugging) << "JavaObject::enumeration(" << objectId << ")"
+ << Debug::flush;
+ int n = 1;
+ NPIdentifier* props = static_cast<NPIdentifier*>(NPN_MemAlloc(sizeof(NPIdentifier) * n));
+ props[0] = idID;
+ *propReturn = props;
+ *count = n;
+ return true;
+}
+
+bool JavaObject::getProperty(NPIdentifier prop, NPVariant *result) {
+ if (!plugin) {
+ Debug::log(Debug::Spam) << "Ignoring getProperty on " << objectId << " after plugin destroyed"
+ << Debug::flush;
+ VOID_TO_NPVARIANT(*result);
+ return true;
+ }
+ Debug::log(Debug::Spam) << "JavaObject::getProperty(" << objectId << ")" << Debug::flush;
+ if (NPN_IdentifierIsString(prop)) {
+ if (prop == plugin->toStringID) {
+ return plugin->JavaObject_getToStringTearOff(result);
+ }
+ if (prop == idID) {
+ INT32_TO_NPVARIANT(objectId, *result);
+ return true;
+ }
+ // all other properties are numeric dispatchIDs
+ return false;
+ }
+ int dispId = NPN_IntFromIdentifier(prop);
+ // JavaObject_getProperty will retain the return value if needed.
+ return plugin->JavaObject_getProperty(objectId, dispId, result);
+}
+
+bool JavaObject::hasMethod(NPIdentifier method) {
+ if (!plugin) {
+ Debug::log(Debug::Spam) << "Ignoring hasMethod on " << objectId << " after plugin destroyed"
+ << Debug::flush;
+ return true;
+ }
+ Debug::log(Debug::Spam) << "JavaObject::hasMethod(" << objectId << ", method="
+ << IdentifierName(method) << ")" << Debug::flush;
+ return false;
+// return !NPN_IdentifierIsString(method);
+}
+
+bool JavaObject::hasProperty(NPIdentifier prop) {
+ if (!plugin) {
+ Debug::log(Debug::Spam) << "Ignoring hasProperty on " << objectId << " after plugin destroyed"
+ << Debug::flush;
+ return true;
+ }
+ Debug::log(Debug::Spam) << "JavaObject::hasProperty(" << objectId << ", prop="
+ << IdentifierName(prop) << ")" << Debug::flush;
+ return !NPN_IdentifierIsString(prop) || prop == idID || prop == plugin->toStringID;
+}
+
+bool JavaObject::invokeDefault(const NPVariant *args, uint32_t argCount, NPVariant *result) {
+ if (argCount < 2 || !NPVariantUtil::isInt(args[0])
+ || (!NPVariantUtil::isNull(args[1]) && !NPVariantUtil::isObject(args[1]))) {
+ Debug::log(Debug::Error) << "incorrect arguments to invokeDefault" << Debug::flush;
+ return false;
+ }
+ if (!plugin) {
+ Debug::log(Debug::Spam) << "Ignoring invokeDefault on " << objectId << " after plugin destroyed"
+ << Debug::flush;
+ VOID_TO_NPVARIANT(*result);
+ return true;
+ }
+ Debug::log(Debug::Debugging) << "JavaObject::invokeDefault(" << objectId;
+ for (uint32_t i = 0; i < argCount; ++i) {
+ Debug::log(Debug::Debugging) << ", " << NPVariantProxy::toString(args[i]);
+ }
+ Debug::log(Debug::Debugging) << ")" << Debug::flush;
+ int dispId = NPVariantUtil::getAsInt(args[0]);
+ int objId = objectId;
+ if (!NPVariantUtil::isNull(args[1])) {
+ NPObject* thisObj = NPVariantUtil::getAsObject(args[1]);
+ if (isInstance(thisObj)) {
+ JavaObject* thisJavaObj = static_cast<JavaObject*>(thisObj);
+ objId = thisJavaObj->objectId;
+ }
+ }
+ // JavaObject_invoke will retain the return value if needed.
+ return plugin->JavaObject_invoke(objId, dispId, args + 2, argCount - 2, result);
+}
+
+bool JavaObject::invoke(NPIdentifier name, const NPVariant *args,
+ uint32_t argCount, NPVariant *result) {
+ VOID_TO_NPVARIANT(*result);
+ if (!plugin) {
+ Debug::log(Debug::Spam) << "Ignoring invoke on " << objectId << " after plugin destroyed"
+ << Debug::flush;
+ return true;
+ }
+ string methodName(NPN_UTF8FromIdentifier(name));
+ Debug::log(Debug::Spam) << "JavaObject::invoke(" << objectId << ", method="
+ << methodName << ")" << Debug::flush;
+ if (name == plugin->toStringID) {
+ // -1 is magic and means a raw toString().
+ return plugin->JavaObject_invoke(objectId, -1, args, argCount, result);
+ }
+ // toString is the only method we support invoking directly on a Java wrapper
+ return false;
+}
+
+bool JavaObject::setProperty(NPIdentifier prop, const NPVariant *value) {
+ if (!plugin) {
+ Debug::log(Debug::Spam) << "Ignoring setProperty on " << objectId << " after plugin destroyed"
+ << Debug::flush;
+ return true;
+ }
+ Debug::log(Debug::Spam) << "JavaObject::setProperty(" << objectId << ", val="
+ << NPVariantProxy::toString(*value) << ")" << Debug::flush;
+ if (NPN_IdentifierIsString(prop)) {
+ // any non-numeric properties are read-only
+ return false;
+ }
+ int dispId = NPN_IntFromIdentifier(prop);
+ return plugin->JavaObject_setProperty(objectId, dispId, value);
+}
diff --git a/plugins/npapi/JavaObject.h b/plugins/npapi/JavaObject.h
new file mode 100644
index 0000000..c5dc310
--- /dev/null
+++ b/plugins/npapi/JavaObject.h
@@ -0,0 +1,67 @@
+#ifndef JAVAOBJECT_H_
+#define JAVAOBJECT_H_
+/*
+ * Copyright 2008 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.
+ */
+
+#include <string>
+#include <vector>
+
+#include "mozincludes.h"
+#include "Plugin.h"
+#include "ScriptableInstance.h"
+#include "Debug.h"
+#include "HashMap.h"
+
+class JavaObject : public NPObjectWrapper<JavaObject> {
+ friend class ScriptableInstance;
+private:
+ ScriptableInstance* plugin;
+ int objectId;
+
+ NPIdentifier idID;
+
+public:
+ JavaObject(NPP npp) : NPObjectWrapper<JavaObject>(npp),
+ plugin(reinterpret_cast<Plugin*>(npp->pdata)->getScriptableInstance()),
+ idID(NPN_GetStringIdentifier("id")) {}
+ virtual ~JavaObject();
+ static JavaObject* create(ScriptableInstance* plugin, int id);
+ static bool isInstance(NPObject* obj);
+
+ virtual bool enumeration(NPIdentifier** names, uint32_t* count);
+ virtual bool hasMethod(NPIdentifier name);
+ virtual bool invoke(NPIdentifier name, const NPVariant *args, uint32_t num_args,
+ NPVariant *result);
+ virtual bool invokeDefault(const NPVariant *args, uint32_t num_args, NPVariant *result);
+ virtual bool hasProperty(NPIdentifier name);
+ virtual bool getProperty(NPIdentifier name, NPVariant *result);
+ virtual bool setProperty(NPIdentifier name, const NPVariant *value);
+
+ void setObjectId(int objectId) {
+ this->objectId = objectId;
+ }
+
+ int getObjectId() const {
+ return objectId;
+ }
+private:
+ // Called by a Plugin instance when it is about to be destroyed.
+ void disconnectPlugin() {
+ plugin = 0;
+ }
+};
+
+#endif /*JAVAOBJECT_H_*/
diff --git a/plugins/npapi/LocalObjectTable.cpp b/plugins/npapi/LocalObjectTable.cpp
new file mode 100644
index 0000000..a450381
--- /dev/null
+++ b/plugins/npapi/LocalObjectTable.cpp
@@ -0,0 +1,8 @@
+#include "mozincludes.h"
+#include "LocalObjectTable.h"
+
+LocalObjectTable::~LocalObjectTable() {
+ if (!dontFree) {
+ freeAll();
+ }
+}
diff --git a/plugins/npapi/LocalObjectTable.h b/plugins/npapi/LocalObjectTable.h
new file mode 100644
index 0000000..57a5887
--- /dev/null
+++ b/plugins/npapi/LocalObjectTable.h
@@ -0,0 +1,183 @@
+#ifndef H_LocalObjectTable
+#define H_LocalObjectTable
+/*
+ * Copyright 2008 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.
+ */
+
+#include <map>
+
+#include "Debug.h"
+
+#include "mozincludes.h"
+#include "NPVariantUtil.h"
+
+class LocalObjectTable {
+private:
+ /* The host expects Value objects to have int's for JSO id's, hence the
+ * dual mapping. ObjectMap is for host communication (Value.getJsObjectId)
+ * and the IdMap is for browser communication (NPObject to ID).
+ */
+ typedef std::map<int, NPObject*> ObjectMap;
+ typedef std::map<NPObject*,int> IdMap;
+
+ NPP npp;
+
+ int nextId;
+ ObjectMap objects;
+ IdMap ids;
+ bool dontFree;
+
+ bool jsIdentitySafe;
+
+ const NPIdentifier gwtId;
+
+ void setFree(int id) {
+ NPObject *obj = getById(id);
+ if(!obj) {
+ Debug::log(Debug::Error) << "setFree(id=" << id << "): object not in table"
+ << Debug::flush;
+ return;
+ }
+ ids.erase(obj);
+ objects.erase(id);
+ }
+
+public:
+ LocalObjectTable(NPP npp, bool jsIdentitySafe):
+ nextId(0), dontFree(false), jsIdentitySafe(jsIdentitySafe),
+ gwtId(NPN_GetStringIdentifier("__gwt_ObjectId")) {
+ }
+
+ virtual ~LocalObjectTable();
+
+ /**
+ * Add a new object, which must not be in the table, and return a new id for it.
+ */
+ int add(NPObject* obj) {
+ int id = nextId++;
+ set(id, obj);
+
+ if (!jsIdentitySafe) {
+ NPVariant idVariant;
+ Debug::log(Debug::Debugging) << "LocalObjectTable::set(): setting expando("
+ << id << ")" << Debug::flush;
+ INT32_TO_NPVARIANT(id,idVariant);
+ if (!NPN_SetProperty(npp, obj, gwtId, &idVariant)) {
+ Debug::log(Debug::Error) << "Setting GWT id on object failed" << Debug::flush;
+ }
+ }
+
+ return id;
+ }
+
+ void set(int id, NPObject* obj) {
+ Debug::log(Debug::Debugging) << "LocalObjectTable::set(id=" << id << ",obj=" << (void*)obj
+ << ")" << Debug::flush;
+ if (!jsIdentitySafe) {
+ ObjectMap::iterator it;
+ it = objects.find(id);
+ if( it != objects.end() ) {
+ if (it->second != obj) {
+ //The JSO has changed and we need to update the map, releasing
+ //the old and remembering the new object.
+ ids.erase(it->second);
+ NPN_ReleaseObject(it->second);
+ NPN_RetainObject(obj);
+ } else {
+ //do nothing; object exists and is already mapped
+ return;
+ }
+ } else {
+ //New insertion, retain the object in the table
+ NPN_RetainObject(obj);
+ }
+ } else {
+ //Not dealing with identity hack, retain
+ NPN_RetainObject(obj);
+ }
+ objects[id] = obj;
+ ids[obj] = id;
+
+ // keep track that we hold a reference in the table
+ }
+
+ void free(int id) {
+ Debug::log(Debug::Debugging) << "LocalObjectTable::free(id=" << id << ")" << Debug::flush;
+ ObjectMap::iterator it = objects.find(id);
+ if (it == objects.end()) {
+ Debug::log(Debug::Error) << "Freeing freed object slot " << id << Debug::flush;
+ return;
+ }
+ if (!jsIdentitySafe) {
+ Debug::log(Debug::Debugging) << "removing expando!" << Debug::flush;
+ NPN_RemoveProperty(npp, it->second, gwtId);
+ }
+ setFree(id);
+ if (!dontFree) {
+ NPObject* obj = it->second;
+ NPN_ReleaseObject(obj);
+ }
+ }
+
+ void freeAll() {
+ Debug::log(Debug::Info) << "LocalObjectTable::freeAll()" << Debug::flush;
+ for (ObjectMap::const_iterator it = objects.begin(); it != objects.end(); ++it) {
+ NPObject* obj = it->second;
+ if (!dontFree) {
+ NPN_ReleaseObject(obj);
+ }
+ }
+ objects.clear();
+ }
+
+ NPObject* getById(int id) {
+ ObjectMap::iterator it = objects.find(id);
+ if (it == objects.end()) {
+ Debug::log(Debug::Error) << "LocalObjectTable::get(id=" << id
+ << "): no object found" << Debug::flush;
+ }
+ return it->second;
+ }
+
+ int getObjectId(NPObject* jsObject) {
+ int id = -1;
+ if(!jsIdentitySafe) {
+ NPVariant idVariant;
+ VOID_TO_NPVARIANT(idVariant);
+ Debug::log(Debug::Debugging) << "LocalObjectTable::get(): expando test"
+ << Debug::flush;
+ if (NPN_GetProperty(npp, jsObject, gwtId, &idVariant) &&
+ NPVariantUtil::isInt(idVariant)) {
+ id = NPVariantUtil::getAsInt(idVariant);
+ Debug::log(Debug::Debugging) << "LocalObjectTable::get(): expando: "
+ << id << Debug::flush;
+ set(id, jsObject);
+ }
+ NPN_ReleaseVariantValue(&idVariant);
+ } else {
+ IdMap::iterator it = ids.find(jsObject);
+ if (it != ids.end()) {
+ id = it->second;
+ }
+ }
+ return id;
+ }
+
+ void setDontFree(bool dontFree) {
+ this->dontFree = dontFree;
+ }
+};
+
+#endif
diff --git a/plugins/npapi/Makefile b/plugins/npapi/Makefile
new file mode 100644
index 0000000..43ffd22
--- /dev/null
+++ b/plugins/npapi/Makefile
@@ -0,0 +1,202 @@
+# Copyright 2010 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.
+
+include ../config.mk
+
+ifeq ($(OS),mac)
+RUN_PATH_FLAG = -executable_path
+DLL_SUFFIX = .dylib
+DLLFLAGS = -bundle $(ARCHCFLAGS) -mmacosx-version-min=10.5
+CFLAGS += -DXP_MACOSX $(ARCHCFLAGS)
+CXXFLAGS += -DXP_MACOSX $(ARCHCFLAGS)
+# Mac puts multiple architectures into the same files
+TARGET_PLATFORM = Darwin-gcc3
+CHROME_PATH ?= /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome
+PLATFORM_DIR_SUFFIX = gwtDev.plugin/Contents/MacOS/
+else
+ifeq ($(OS),linux)
+RUN_PATH_FLAG = -rpath-link
+DLL_SUFFIX = .so
+DLLFLAGS = -shared -m$(FLAG32BIT)
+TARGET_PLATFORM = Linux_$(ARCH)-gcc3
+CHROME_PATH ?= /opt/google/chrome/chrome
+else
+endif
+endif
+
+
+export FLAG32BIT
+
+CFLAGS += -DBROWSER_NPAPI -DXP_UNIX -fshort-wchar
+CXXFLAGS = $(CXXONLYFLAGS) $(CFLAGS)
+DIR = $(shell pwd)
+
+DEPEND = g++ -MM -MT'$$(OBJ_OUTDIR)/$(patsubst %.cpp,%.o,$(src))' \
+ -I. -I../common $(src)
+
+COMMON = ../common/libcommon$(FLAG32BIT).a
+
+OBJ_OUTDIR = build/$(TARGET_PLATFORM)
+EXTENSION_OUTDIR = prebuilt/gwt-dev-plugin
+PLATFORM_DIR = $(EXTENSION_OUTDIR)/$(TARGET_PLATFORM)
+PLATFORM_DIR_SUFFIX ?= ""
+
+INSTALLER_CRX = prebuilt/gwt-dev-plugin.crx
+DLL = $(OBJ_OUTDIR)/libGwtDevPlugin$(DLL_SUFFIX)
+GWTDEV_CRX_PEM ?= $(CURDIR)/gwt-dev-plugin.pem
+CHROME_COMMAND = $(CHROME_PATH) --pack-extension=$(CURDIR)/$(EXTENSION_OUTDIR) --no-message-box --user-data-dir=$(CURDIR)/$(OBJ_OUTDIR)/user-data --pack-extension-key=$(GWTDEV_CRX_PEM)
+
+#DLLFLAGS +=
+
+VERSION ?= 1.0.$(shell ./getversion)
+ifeq ($(VERSION), 1.0.)
+$(error You must specify the version if you are not in an svn checkout)
+endif
+
+.PHONY: default all crx lib common clean depend install install-platform \
+ versioned-files devmodeoptions
+
+default:: lib versioned-files devmodeoptions
+
+all:: common lib install-platform crx
+
+lib:: $(OBJ_OUTDIR) $(EXTENSION_OUTDIR) $(DLL)
+crx:: $(EXTENSION_OUTDIR) $(INSTALLER_CRX)
+
+linuxplatforms:
+ $(MAKE) lib ARCH=x86
+ $(MAKE) lib ARCH=x86_64
+
+macplatforms:
+ $(MAKE) lib
+
+HDRS = \
+ LocalObjectTable.h \
+ NPVariantWrapper.h \
+ Plugin.h \
+ ScriptableInstance.h \
+ mozincludes.h \
+ JavaObject.h
+
+SRCS = \
+ main.cpp \
+ Plugin.cpp \
+ LocalObjectTable.cpp \
+ JavaObject.cpp \
+ npn_bindings.cpp \
+ ScriptableInstance.cpp
+
+OBJS = $(patsubst %.cpp,$(OBJ_OUTDIR)/%.o,$(SRCS))
+
+$(OBJS): $(OBJ_OUTDIR)
+
+$(OBJ_OUTDIR)::
+ @mkdir -p $@
+
+$(INSTALLER_CRX): $(GWTDEV_CRX_PEM) $(EXTENSION_OUTDIR) versioned-files
+ $(shell $(CHROME_COMMAND))
+
+versioned-files::
+ sed -e s/GWT_DEV_PLUGIN_VERSION/$(VERSION)/ manifest-template.json >prebuilt/gwt-dev-plugin/manifest.json
+ #sed -e s/GWT_DEV_PLUGIN_VERSION/$(VERSION)/ updates-template.xml >prebuilt/updates.xml
+
+$(DLL): $(OBJS) $(COMMON)
+ $(CXX) -m$(FLAG32BIT) -o $@ $(OBJS) $(COMMON) $(DLLFLAGS)
+ @mkdir -p $(PLATFORM_DIR)
+ cp $(DLL) $(PLATFORM_DIR)/$(PLATFORM_DIR_SUFFIX)
+
+$(OBJ_OUTDIR)/%.o: %.cpp
+ $(CXX) $(CXXFLAGS) -c -o $@ -I. -I../common $<
+
+common $(COMMON):
+ (cd ../common && $(MAKE))
+
+clean:
+ rm -rf build
+
+devmodeoptions:
+ (ant -f DevModeOptions/build.xml prebuilt)
+
+depend: $(OBJ_OUTDIR)
+ ($(foreach src,$(SRCS),$(DEPEND)) true) >>Makefile
+# makedepend -- $(CFLAGS) -- $(SRCS)
+
+# DO NOT DELETE
+$(OBJ_OUTDIR)/main.o $(OBJ_OUTDIR)/Plugin.o \
+ $(OBJ_OUTDIR)/LocalObjectTable.o $(OBJ_OUTDIR)/JavaObject.o \
+ $(OBJ_OUTDIR)/npn_bindings.cpp $(OBJ_OUTDIR)/ScriptableInstance.o: \
+ main.cpp ../common/Debug.h ../common/Platform.h ../common/DebugLevel.h \
+ mozincludes.h npapi/npapi.h npapi/nphostapi.h npapi/npapi.h \
+ npapi/npruntime.h npapi/npruntime.h NPObjectWrapper.h Plugin.h \
+ ../common/HostChannel.h ../common/Debug.h ../common/ByteOrder.h \
+ ../common/Socket.h ../common/Message.h ../common/ReturnMessage.h \
+ ../common/BrowserChannel.h ../common/Value.h ../common/SessionHandler.h \
+ ../common/LoadModuleMessage.h ../common/HostChannel.h LocalObjectTable.h \
+ ../common/SessionHandler.h ../common/HashMap.h ScriptableInstance.h \
+ ../common/scoped_ptr/scoped_ptr.h
+$(OBJ_OUTDIR)/main.o $(OBJ_OUTDIR)/Plugin.o \
+ $(OBJ_OUTDIR)/LocalObjectTable.o $(OBJ_OUTDIR)/JavaObject.o \
+ $(OBJ_OUTDIR)/npn_bindings.cpp $(OBJ_OUTDIR)/ScriptableInstance.o: \
+ Plugin.cpp Plugin.h ../common/Debug.h ../common/Platform.h \
+ ../common/DebugLevel.h mozincludes.h npapi/npapi.h npapi/nphostapi.h \
+ npapi/npapi.h npapi/npruntime.h npapi/npruntime.h NPObjectWrapper.h \
+ ../common/HostChannel.h ../common/Debug.h ../common/ByteOrder.h \
+ ../common/Socket.h ../common/Message.h ../common/ReturnMessage.h \
+ ../common/BrowserChannel.h ../common/Value.h ../common/SessionHandler.h \
+ ../common/LoadModuleMessage.h ../common/HostChannel.h LocalObjectTable.h \
+ ../common/SessionHandler.h ../common/HashMap.h ScriptableInstance.h \
+ ../common/InvokeMessage.h ../common/ReturnMessage.h \
+ ../common/ServerMethods.h ../common/scoped_ptr/scoped_ptr.h \
+ NPVariantWrapper.h ../common/Platform.h ../common/Value.h JavaObject.h
+$(OBJ_OUTDIR)/main.o $(OBJ_OUTDIR)/Plugin.o \
+ $(OBJ_OUTDIR)/LocalObjectTable.o $(OBJ_OUTDIR)/JavaObject.o \
+ $(OBJ_OUTDIR)/npn_bindings.cpp $(OBJ_OUTDIR)/ScriptableInstance.o: \
+ LocalObjectTable.cpp mozincludes.h npapi/npapi.h npapi/nphostapi.h \
+ npapi/npapi.h npapi/npruntime.h npapi/npruntime.h NPObjectWrapper.h \
+ LocalObjectTable.h ../common/Debug.h ../common/Platform.h \
+ ../common/DebugLevel.h
+$(OBJ_OUTDIR)/main.o $(OBJ_OUTDIR)/Plugin.o \
+ $(OBJ_OUTDIR)/LocalObjectTable.o $(OBJ_OUTDIR)/JavaObject.o \
+ $(OBJ_OUTDIR)/npn_bindings.cpp $(OBJ_OUTDIR)/ScriptableInstance.o: \
+ JavaObject.cpp ../common/Debug.h ../common/Platform.h \
+ ../common/DebugLevel.h JavaObject.h mozincludes.h npapi/npapi.h \
+ npapi/nphostapi.h npapi/npapi.h npapi/npruntime.h npapi/npruntime.h \
+ NPObjectWrapper.h Plugin.h ../common/HostChannel.h ../common/Debug.h \
+ ../common/ByteOrder.h ../common/Socket.h ../common/Message.h \
+ ../common/ReturnMessage.h ../common/BrowserChannel.h ../common/Value.h \
+ ../common/SessionHandler.h ../common/LoadModuleMessage.h \
+ ../common/HostChannel.h LocalObjectTable.h ../common/SessionHandler.h \
+ ../common/HashMap.h ScriptableInstance.h NPVariantWrapper.h \
+ ../common/Platform.h ../common/Value.h
+$(OBJ_OUTDIR)/main.o $(OBJ_OUTDIR)/Plugin.o \
+ $(OBJ_OUTDIR)/LocalObjectTable.o $(OBJ_OUTDIR)/JavaObject.o \
+ $(OBJ_OUTDIR)/npn_bindings.cpp $(OBJ_OUTDIR)/ScriptableInstance.o: \
+ npn_bindings.cpp ../common/Debug.h ../common/Platform.h \
+ ../common/DebugLevel.h mozincludes.h npapi/npapi.h npapi/nphostapi.h \
+ npapi/npapi.h npapi/npruntime.h npapi/npruntime.h NPObjectWrapper.h
+$(OBJ_OUTDIR)/main.o $(OBJ_OUTDIR)/Plugin.o \
+ $(OBJ_OUTDIR)/LocalObjectTable.o $(OBJ_OUTDIR)/JavaObject.o \
+ $(OBJ_OUTDIR)/npn_bindings.cpp $(OBJ_OUTDIR)/ScriptableInstance.o: \
+ ScriptableInstance.cpp ScriptableInstance.h ../common/Debug.h \
+ ../common/Platform.h ../common/DebugLevel.h mozincludes.h npapi/npapi.h \
+ npapi/nphostapi.h npapi/npapi.h npapi/npruntime.h npapi/npruntime.h \
+ NPObjectWrapper.h ../common/HostChannel.h ../common/Debug.h \
+ ../common/ByteOrder.h ../common/Socket.h ../common/Message.h \
+ ../common/ReturnMessage.h ../common/BrowserChannel.h ../common/Value.h \
+ ../common/SessionHandler.h ../common/LoadModuleMessage.h \
+ ../common/HostChannel.h LocalObjectTable.h ../common/SessionHandler.h \
+ ../common/HashMap.h ../common/InvokeMessage.h ../common/ReturnMessage.h \
+ ../common/ServerMethods.h ../common/AllowedConnections.h \
+ ../common/scoped_ptr/scoped_ptr.h NPVariantWrapper.h \
+ ../common/Platform.h ../common/Value.h Plugin.h JavaObject.h
diff --git a/plugins/npapi/NPObjectWrapper.h b/plugins/npapi/NPObjectWrapper.h
new file mode 100644
index 0000000..89280fab
--- /dev/null
+++ b/plugins/npapi/NPObjectWrapper.h
@@ -0,0 +1,169 @@
+// Copyright 2007, Google Inc.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice,
+// this list of conditions and the following disclaimer.
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+// this list of conditions and the following disclaimer in the documentation
+// and/or other materials provided with the distribution.
+// 3. Neither the name of Google Inc. nor the names of its contributors may be
+// used to endorse or promote products derived from this software without
+// specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Modified from gears/base/npapi/plugin.h
+
+#ifndef _H_NPObjectWrapper
+#define _H_NPObjectWrapper
+
+#include <cstdio>
+#include "mozincludes.h"
+
+// This is a base class for the bridge between the JavaScript engine and the plugin.
+template<class Wrapper>
+class NPObjectWrapper : public NPObject {
+ public:
+ // NPClass callbacks.
+ static NPObject* Allocate(NPP npp, NPClass *npclass) {
+ Wrapper* obj = new Wrapper(npp);
+ return obj;
+ }
+
+ static void Deallocate(NPObject *npobj) {
+ delete static_cast<Wrapper*>(npobj);
+ }
+
+ static bool Enumeration(NPObject *npobj, NPIdentifier** value,
+ uint32_t *count) {
+ Wrapper* obj = static_cast<Wrapper*>(npobj);
+ return obj->enumeration(value, count);
+ }
+
+ static bool HasMethod(NPObject *npobj, NPIdentifier name) {
+ Wrapper* obj = static_cast<Wrapper*>(npobj);
+ return obj->hasMethod(name);
+ }
+
+ static bool Invoke(NPObject *npobj, NPIdentifier name, const NPVariant *args,
+ uint32_t num_args, NPVariant *result) {
+ Wrapper* obj = static_cast<Wrapper*>(npobj);
+ return obj->invoke(name, args, num_args, result);
+ }
+
+ static bool InvokeDefault(NPObject *npobj, const NPVariant *args,
+ uint32_t num_args, NPVariant *result) {
+ Wrapper* obj = static_cast<Wrapper*>(npobj);
+ return obj->invokeDefault(args, num_args, result);
+ }
+
+ static bool HasProperty(NPObject *npobj, NPIdentifier name) {
+ Wrapper* obj = static_cast<Wrapper*>(npobj);
+ return obj->hasProperty(name);
+ }
+
+ static bool GetProperty(NPObject *npobj, NPIdentifier name,
+ NPVariant *result) {
+ Wrapper* obj = static_cast<Wrapper*>(npobj);
+ return obj->getProperty(name, result);
+ }
+
+ static bool SetProperty(NPObject *npobj, NPIdentifier name,
+ const NPVariant *value) {
+ Wrapper* obj = static_cast<Wrapper*>(npobj);
+ return obj->setProperty(name, value);
+ }
+
+ virtual ~NPObjectWrapper() {}
+
+ /**
+ * *value must be memory allocated with NPN_MemAlloc, as the caller will call NPN_MemFree.
+ */
+ virtual bool enumeration(NPIdentifier** value, uint32_t* count) {
+ return false;
+ }
+
+ /**
+ * Caller must release the result value when it no longer needs it,
+ * so implementation must return an extra refcount.
+ */
+ virtual bool getProperty(NPIdentifier name, NPVariant *result) {
+ return false;
+ }
+
+ virtual bool hasMethod(NPIdentifier name) {
+ return false;
+ }
+
+ virtual bool hasProperty(NPIdentifier name) {
+ return false;
+ }
+
+ /**
+ * Caller must release the result value when it no longer needs it,
+ * so implementation must return an extra refcount.
+ */
+ virtual bool invoke(NPIdentifier name, const NPVariant *args,
+ uint32_t num_args, NPVariant *result) {
+ return false;
+ }
+
+ /**
+ * Caller must release the result value when it no longer needs it,
+ * so implementation must return an extra refcount.
+ */
+ virtual bool invokeDefault(const NPVariant *args, uint32_t num_args,
+ NPVariant *result) {
+ return false;
+ }
+
+ virtual bool setProperty(NPIdentifier name, const NPVariant *value) {
+ return false;
+ }
+
+ protected:
+ NPObjectWrapper(NPP instance) : npp(instance) {}
+
+ public:
+ const NPP getNPP() const {
+ return npp;
+ }
+
+ private:
+ NPP npp;
+ DISALLOW_EVIL_CONSTRUCTORS(NPObjectWrapper);
+};
+
+// Get the NPClass for a NPObject wrapper (the type must derive from NPObjectWrapper).
+template<class Wrapper>
+NPClass* GetNPClass() {
+ static NPClass plugin_class = {
+ NP_CLASS_STRUCT_VERSION,
+ NPObjectWrapper<Wrapper>::Allocate,
+ NPObjectWrapper<Wrapper>::Deallocate,
+ NULL, // Invalidate,
+ NPObjectWrapper<Wrapper>::HasMethod,
+ NPObjectWrapper<Wrapper>::Invoke,
+ NPObjectWrapper<Wrapper>::InvokeDefault,
+ NPObjectWrapper<Wrapper>::HasProperty,
+ NPObjectWrapper<Wrapper>::GetProperty,
+ NPObjectWrapper<Wrapper>::SetProperty,
+ NULL, // RemoveProperty,
+ NPObjectWrapper<Wrapper>::Enumeration,
+ };
+
+ return &plugin_class;
+}
+
+#endif // GEARS_BASE_NPAPI_PLUGIN_H__
diff --git a/plugins/npapi/NPVariantUtil.h b/plugins/npapi/NPVariantUtil.h
new file mode 100644
index 0000000..2ca7ea5
--- /dev/null
+++ b/plugins/npapi/NPVariantUtil.h
@@ -0,0 +1,132 @@
+#ifndef _H_NPVariantUtil
+#define _H_NPVariantUtil
+
+#include "Debug.h"
+#include "mozincludes.h"
+
+/**
+ * Wraps an NPVariant and provides various helper functions
+ */
+class NPVariantUtil {
+public:
+ static int isBoolean(const NPVariant& variant) {
+ return NPVARIANT_IS_BOOLEAN(variant);
+ }
+
+ static bool getAsBoolean(const NPVariant& variant) {
+ return NPVARIANT_TO_BOOLEAN(variant);
+ }
+
+ // Return true if the variant is holding a regular integer or an integral double.
+ static int isInt(const NPVariant& variant) {
+ if (NPVARIANT_IS_INT32(variant)) {
+ return 1;
+ } else if (NPVARIANT_IS_DOUBLE(variant)) {
+ // As of http://trac.webkit.org/changeset/72974 we get doubles for all
+ // numerical variants out of V8.
+ double d = NPVARIANT_TO_DOUBLE(variant);
+ int i = static_cast<int>(d);
+ // Verify that d is an integral value in range.
+ return (d == static_cast<double>(i));
+ } else {
+ return 0;
+ }
+ }
+
+ static int getAsInt(const NPVariant& variant) {
+ if (isInt(variant)) {
+ if (NPVARIANT_IS_INT32(variant)) {
+ return NPVARIANT_TO_INT32(variant);
+ } else if (NPVARIANT_IS_DOUBLE(variant)) {
+ return static_cast<int>(NPVARIANT_TO_DOUBLE(variant));
+ }
+ }
+
+ Debug::log(Debug::Error) << "getAsInt: variant " <<
+ NPVariantUtil::toString(variant) << "not int" << Debug::flush;
+ return 0;
+ }
+
+ static int isNull(const NPVariant& variant) {
+ return NPVARIANT_IS_NULL(variant);
+ }
+
+ static int isObject(const NPVariant& variant) {
+ return NPVARIANT_IS_OBJECT(variant);
+ }
+
+ static NPObject* getAsObject(const NPVariant& variant) {
+ if (NPVARIANT_IS_OBJECT(variant)) {
+ return NPVARIANT_TO_OBJECT(variant);
+ }
+ Debug::log(Debug::Error) << "getAsObject: variant not object" << Debug::flush;
+ return 0;
+ }
+
+ static int isString(const NPVariant& variant) {
+ return NPVARIANT_IS_STRING(variant);
+ }
+
+ static const NPString* getAsNPString(const NPVariant& variant) {
+ if (NPVARIANT_IS_STRING(variant)) {
+ return &NPVARIANT_TO_STRING(variant);
+ }
+ Debug::log(Debug::Error) << "getAsNPString: variant not string" << Debug::flush;
+ return 0;
+ }
+
+ static std::string toString(const NPVariant& variant) {
+ std::string retval;
+ // TODO(jat): remove sprintfs
+ char buf[40];
+ NPObject* npObj;
+ switch (variant.type) {
+ case NPVariantType_Void:
+ retval = "undef";
+ break;
+ case NPVariantType_Null:
+ retval = "null";
+ break;
+ case NPVariantType_Bool:
+ retval = "bool(";
+ retval += (NPVARIANT_TO_BOOLEAN(variant) ? "true" : "false");
+ retval += ')';
+ break;
+ case NPVariantType_Int32:
+ retval = "int(";
+ snprintf(buf, sizeof(buf), "%d)", NPVARIANT_TO_INT32(variant));
+ retval += buf;
+ break;
+ case NPVariantType_Double:
+ retval = "double(";
+ snprintf(buf, sizeof(buf), "%g)", NPVARIANT_TO_DOUBLE(variant));
+ retval += buf;
+ break;
+ case NPVariantType_String:
+ {
+ retval = "string(";
+ NPString str = NPVARIANT_TO_STRING(variant);
+ retval += std::string(str.UTF8Characters, str.UTF8Length);
+ retval += ')';
+ }
+ break;
+ case NPVariantType_Object:
+ npObj = NPVARIANT_TO_OBJECT(variant);
+ snprintf(buf, sizeof(buf), "obj(class=%p, ", npObj->_class);
+ retval = buf;
+ snprintf(buf, sizeof(buf), "count=%d, ", npObj->referenceCount);
+ retval += buf;
+ snprintf(buf, sizeof(buf), "%p)", npObj);
+ retval += buf;
+ break;
+ default:
+ snprintf(buf, sizeof(buf), "Unknown type %d", variant.type);
+ retval = buf;
+ break;
+ }
+ return retval;
+ }
+
+};
+
+#endif
diff --git a/plugins/npapi/NPVariantWrapper.h b/plugins/npapi/NPVariantWrapper.h
new file mode 100644
index 0000000..a1844c5
--- /dev/null
+++ b/plugins/npapi/NPVariantWrapper.h
@@ -0,0 +1,550 @@
+#ifndef _H_NPVariantWrapper
+#define _H_NPVariantWrapper
+
+#include <string>
+#include <ostream>
+
+#ifdef sun
+// Sun's cstring doesn't define strlen/etc
+#include <string.h>
+#endif
+#include <cstring>
+#include <stdio.h>
+
+#include "Debug.h"
+#include "Platform.h"
+
+#include "mozincludes.h"
+#include "NPVariantUtil.h"
+
+#include "Value.h"
+#include "LocalObjectTable.h"
+#include "Plugin.h"
+#include "JavaObject.h"
+
+/**
+ * Contains NPVariantProxy, NPVariantWrapper, and NPVariantArray
+ */
+
+/**
+ * Wraps an NPVariant and provides various conversion functions. The variant
+ * provided retained at create time.
+ */
+class NPVariantProxy {
+ friend class NPVariantArray;
+private:
+ ScriptableInstance& plugin;
+ NPVariant& variant;
+public:
+ NPVariantProxy(ScriptableInstance& plugin, NPVariant& variant)
+ : plugin(plugin), variant(variant)
+ {
+ VOID_TO_NPVARIANT(variant);
+ }
+
+ NPVariantProxy(ScriptableInstance& plugin, NPVariant& variant, bool noinit)
+ : plugin(plugin), variant(variant)
+ {
+ }
+
+ ~NPVariantProxy() {
+ }
+
+ operator NPVariant() const {
+ return variant;
+ }
+
+ const NPVariant* operator->() const {
+ return &variant;
+ }
+
+ const NPVariant* address() const {
+ return &variant;
+ }
+
+ int isBoolean() const {
+ return NPVariantUtil::isBoolean(variant);
+ }
+
+ bool getAsBoolean() const {
+ return NPVariantUtil::getAsBoolean(variant);
+ }
+
+ int isInt() const {
+ return NPVariantUtil::isInt(variant);
+ }
+
+ int getAsInt() const {
+ return NPVariantUtil::getAsInt(variant);
+ }
+
+ int isNull() const {
+ return NPVariantUtil::isNull(variant);
+ }
+
+ int isObject() const {
+ return NPVariantUtil::isObject(variant);
+ }
+
+ NPObject* getAsObject() const {
+ return NPVariantUtil::getAsObject(variant);
+ }
+
+ int isString() const {
+ return NPVariantUtil::isString(variant);
+ }
+
+ const NPString* getAsNPString() const {
+ return NPVariantUtil::getAsNPString(variant);
+ }
+
+ Value getAsValue(ScriptableInstance& scriptInstance, bool unwrapJava = true) const {
+ return getAsValue(variant, scriptInstance, unwrapJava);
+ }
+
+ static Value getAsValue(const NPVariant& variant, ScriptableInstance& scriptInstance,
+ bool unwrapJava = true) {
+ Value val;
+ if (NPVARIANT_IS_VOID(variant)) {
+ val.setUndefined();
+ } else if (NPVARIANT_IS_NULL(variant)) {
+ val.setNull();
+ } else if (NPVARIANT_IS_BOOLEAN(variant)) {
+ val.setBoolean(NPVARIANT_TO_BOOLEAN(variant));
+ } else if (NPVARIANT_IS_INT32(variant)) {
+ val.setInt(NPVARIANT_TO_INT32(variant));
+ } else if (NPVARIANT_IS_DOUBLE(variant)) {
+ val.setDouble(NPVARIANT_TO_DOUBLE(variant));
+ } else if (NPVARIANT_IS_STRING(variant)) {
+ NPString str = NPVARIANT_TO_STRING(variant);
+ val.setString(GetNPStringUTF8Characters(str), GetNPStringUTF8Length(str));
+ } else if (NPVARIANT_IS_OBJECT(variant)) {
+ NPObject* obj = NPVARIANT_TO_OBJECT(variant);
+ if (unwrapJava && JavaObject::isInstance(obj)) {
+ JavaObject* jObj = static_cast<JavaObject*>(obj);
+ val.setJavaObject(jObj->getObjectId());
+ } else {
+ NPVariant result;
+ VOID_TO_NPVARIANT(result);
+ if (scriptInstance.tryGetStringPrimitive(obj, result)) {
+ NPString str = NPVARIANT_TO_STRING(result);
+ val.setString(GetNPStringUTF8Characters(str), GetNPStringUTF8Length(str));
+ release(result);
+ } else {
+ val.setJsObjectId(scriptInstance.getLocalObjectRef(obj));
+ }
+ }
+ } else {
+ Debug::log(Debug::Error) << "Unsupported NPVariant type " << variant.type << Debug::flush;
+ }
+ return val;
+ }
+
+ /**
+ * The incoming variant is not altered, and is not even required to have
+ * its contents retained. Any object will get an extra refcount on it
+ * when copied to this variant, and strings will be copied.
+ */
+ NPVariantProxy& operator=(const NPVariant& newval) {
+ assignFrom(variant, newval);
+ return *this;
+ }
+
+ /**
+ * The incoming variant is not altered, and is not even required to have
+ * its contents retained. Any object will get an extra refcount on it
+ * when copied to this variant, and strings will be copied.
+ */
+ static void assignFrom(NPVariant& variant, const NPVariant& newval) {
+ release(variant);
+ variant = newval;
+ if (NPVARIANT_IS_STRING(newval)) {
+ int n = variant.value.stringValue.UTF8Length;
+ char* strBytes = reinterpret_cast<char*>(NPN_MemAlloc(n));
+ memcpy(strBytes, variant.value.stringValue.UTF8Characters, n);
+ variant.value.stringValue.UTF8Characters = strBytes;
+ } else {
+ retain(variant);
+ }
+ }
+
+ NPVariantProxy& operator=(NPObject* obj) {
+ assignFrom(variant, obj);
+ return *this;
+ }
+
+ static void assignFrom(NPVariant& variant, NPObject* obj) {
+ release(variant);
+ OBJECT_TO_NPVARIANT(obj, variant);
+ retain(variant);
+ }
+
+ // Convenience method for C++ code
+ NPVariantProxy& operator=(int intVal) {
+ assignFrom(variant, intVal);
+ return *this;
+ }
+
+ // Convenience method for C++ code
+ static void assignFrom(NPVariant& variant, int intVal) {
+ NPVariant newvar;
+ INT32_TO_NPVARIANT(intVal, newvar);
+ assignFrom(variant, newvar);
+ }
+
+ // Convenience method for C++ code
+ NPVariantProxy& operator=(const std::string& strval) {
+ assignFrom(variant, strval);
+ return *this;
+ }
+
+ // Convenience method for C++ code
+ static void assignFrom(NPVariant& variant, const std::string& strval) {
+ NPVariant newvar;
+ STDSTRING_TO_NPVARIANT(strval, newvar);
+ assignFrom(variant, newvar);
+ }
+
+ // Convenience method for C++ code
+ NPVariantProxy& operator=(const char* strval) {
+ assignFrom(variant, strval);
+ return *this;
+ }
+
+ // Convenience method for C++ code
+ static void assignFrom(NPVariant& variant, const char* strval) {
+ NPVariant newvar;
+ STRINGZ_TO_NPVARIANT(strval, newvar);
+ assignFrom(variant, newvar);
+ }
+
+ NPVariantProxy& operator=(const Value& newval) {
+ assignFrom(plugin, variant, newval);
+ return *this;
+ }
+
+ static void assignFrom(ScriptableInstance& plugin, NPVariant& variant, const Value& newval) {
+ NPVariant newvar;
+ VOID_TO_NPVARIANT(newvar);
+ if (newval.isBoolean()) {
+ BOOLEAN_TO_NPVARIANT(newval.getBoolean(), newvar);
+ } else if (newval.isByte()) {
+ INT32_TO_NPVARIANT(newval.getByte(), newvar);
+ } else if (newval.isChar()) {
+ INT32_TO_NPVARIANT(newval.getChar(), newvar);
+ } else if (newval.isShort()) {
+ INT32_TO_NPVARIANT(newval.getShort(), newvar);
+ } else if (newval.isInt()) {
+ int value = newval.getInt();
+ // Firefox NPAPI bug: 32-bit ints get mapped to int jsvals, regardless of range.
+ // However, int jsvals are 31 bits, so we need to use a double if the value is
+ // not representable in a 31 bit signed 2's-complement value.
+ if (value >= 0x40000000 || value < -0x40000000) {
+ DOUBLE_TO_NPVARIANT(static_cast<double>(value), newvar);
+ } else {
+ INT32_TO_NPVARIANT(value, newvar);
+ }
+ } else if (newval.isFloat()) {
+ DOUBLE_TO_NPVARIANT(newval.getFloat(), newvar);
+ } else if (newval.isDouble()) {
+ DOUBLE_TO_NPVARIANT(newval.getDouble(), newvar);
+ } else if (newval.isNull()) {
+ NULL_TO_NPVARIANT(newvar);
+ } else if (newval.isUndefined()) {
+ VOID_TO_NPVARIANT(newvar);
+ } else if (newval.isString()) {
+ assignFrom(variant, newval.getString());
+ return;
+ } else if (newval.isJavaObject()) {
+ if (1) {
+ JavaObject* jObj = plugin.createJavaWrapper(newval.getJavaObjectId());
+ NPObject* obj = jObj;
+ OBJECT_TO_NPVARIANT(obj, newvar);
+ } else {
+ VOID_TO_NPVARIANT(newvar);
+ }
+ } else if (newval.isJsObject()) {
+ OBJECT_TO_NPVARIANT(plugin.getLocalObject(newval.getJsObjectId()),
+ newvar);
+ } else {
+ Debug::log(Debug::Error) << "Unsupported NPVariant type " << newval.getType() << Debug::flush;
+ }
+ assignFrom(variant, newvar);
+ }
+
+ std::string toString() const {
+ return toString(variant);
+ }
+
+ static std::string toString(const NPVariant& variant) {
+ std::string retval;
+ // TODO(jat): remove sprintfs
+ char buf[40];
+ NPObject* npObj;
+ switch (variant.type) {
+ case NPVariantType_Void:
+ retval = "undef";
+ break;
+ case NPVariantType_Null:
+ retval = "null";
+ break;
+ case NPVariantType_Bool:
+ retval = "bool(";
+ retval += (NPVARIANT_TO_BOOLEAN(variant) ? "true" : "false");
+ retval += ')';
+ break;
+ case NPVariantType_Int32:
+ retval = "int(";
+ snprintf(buf, sizeof(buf), "%d)", NPVARIANT_TO_INT32(variant));
+ retval += buf;
+ break;
+ case NPVariantType_Double:
+ retval = "double(";
+ snprintf(buf, sizeof(buf), "%g)", NPVARIANT_TO_DOUBLE(variant));
+ retval += buf;
+ break;
+ case NPVariantType_String:
+ {
+ retval = "string(";
+ NPString str = NPVARIANT_TO_STRING(variant);
+ retval += std::string(str.UTF8Characters, str.UTF8Length);
+ retval += ')';
+ }
+ break;
+ case NPVariantType_Object:
+ npObj = NPVARIANT_TO_OBJECT(variant);
+ if (JavaObject::isInstance(npObj)) {
+ JavaObject* javaObj = static_cast<JavaObject*>(npObj);
+ snprintf(buf, sizeof(buf), "javaObj(id=%d, ", javaObj->getObjectId());
+ } else {
+ snprintf(buf, sizeof(buf), "jsObj(class=%p, ", npObj->_class);
+ }
+ retval = buf;
+ snprintf(buf, sizeof(buf), "%p)", npObj);
+ retval += buf;
+ break;
+ default:
+ snprintf(buf, sizeof(buf), "Unknown type %d", variant.type);
+ retval = buf;
+ break;
+ }
+ return retval;
+ }
+
+public:
+ void release() {
+ release(variant);
+ }
+
+ static void release(NPVariant& variant) {
+ NPN_ReleaseVariantValue(&variant);
+ }
+
+ void retain() {
+ retain(variant);
+ }
+
+ static void retain(NPVariant& variant) {
+ if (NPVARIANT_IS_OBJECT(variant)) {
+ NPN_RetainObject(NPVARIANT_TO_OBJECT(variant));
+ }
+ }
+};
+
+inline Debug::DebugStream& operator<<(Debug::DebugStream& dbg, const NPVariant& var) {
+ return dbg << NPVariantProxy::toString(var);
+}
+
+inline Debug::DebugStream& operator<<(Debug::DebugStream& dbg, const NPVariantProxy& var) {
+ return dbg << var.toString();
+}
+
+/**
+ * Variation of NPVariantProxy that provides its own variant and always frees it
+ * when the wrapper goes away.
+ */
+class NPVariantWrapper {
+private:
+ ScriptableInstance& plugin;
+ NPVariant variant;
+public:
+ NPVariantWrapper(ScriptableInstance& plugin) : plugin(plugin) {
+ VOID_TO_NPVARIANT(variant);
+ }
+
+ ~NPVariantWrapper() {
+ release();
+ }
+
+ operator NPVariant() const {
+ return variant;
+ }
+
+ const NPVariant* operator->() const {
+ return &variant;
+ }
+
+ const NPVariant* address() const {
+ return &variant;
+ }
+
+ /**
+ * Get the address for use as a return value. Since the value can be trashed,
+ * we need to release any data we currently hold.
+ */
+ NPVariant* addressForReturn() {
+ NPVariantProxy::release(variant);
+ VOID_TO_NPVARIANT(variant);
+ NPVariantProxy::retain(variant); // does nothing, present for consistency
+ return &variant;
+ }
+
+ bool isBoolean() const {
+ return NPVariantUtil::isBoolean(variant);
+ }
+
+ int isInt() const {
+ return NPVariantUtil::isInt(variant);
+ }
+
+ int isObject() const {
+ return NPVariantUtil::isObject(variant);
+ }
+
+ int isString() const {
+ return NPVariantUtil::isString(variant);
+ }
+
+ bool getAsBoolean() const {
+ return NPVariantUtil::getAsBoolean(variant);
+ }
+
+ int getAsInt() const {
+ return NPVariantUtil::getAsInt(variant);
+ }
+
+ NPObject* getAsObject() const {
+ return NPVariantUtil::getAsObject(variant);
+ }
+
+ const NPString* getAsNPString() const {
+ return NPVariantUtil::getAsNPString(variant);
+ }
+
+ Value getAsValue(ScriptableInstance& scriptInstance, bool unwrapJava = true) const {
+ return NPVariantProxy::getAsValue(variant, scriptInstance, unwrapJava);
+ }
+
+ /**
+ * The incoming variant is not altered, and is not even required to have
+ * its contents retained. Any object will get an extra refcount on it
+ * when copied to this variant, and strings will be copied.
+ */
+ NPVariantWrapper& operator=(const NPVariant& newval) {
+ NPVariantProxy::assignFrom(variant, newval);
+ return *this;
+ }
+
+ NPVariantWrapper& operator=(const Value& newval) {
+ NPVariantProxy::assignFrom(plugin, variant, newval);
+ return *this;
+ }
+
+ NPVariantWrapper& operator=(NPObject* obj) {
+ NPVariantProxy::assignFrom(variant, obj);
+ return *this;
+ }
+
+ // Convenience method for C++ code
+ NPVariantWrapper& operator=(const std::string& strval) {
+ NPVariantProxy::assignFrom(variant, strval);
+ return *this;
+ }
+
+ // Convenience method for C++ code
+ NPVariantWrapper& operator=(const char* strval) {
+ NPVariantProxy::assignFrom(variant, strval);
+ return *this;
+ }
+
+ // Convenience method for C++ code
+ NPVariantWrapper& operator=(int intval) {
+ NPVariantProxy::assignFrom(variant, intval);
+ return *this;
+ }
+
+ void release() {
+ NPVariantProxy::release(variant);
+ }
+
+ void retain() {
+ NPVariantProxy::retain(variant);
+ }
+
+ std::string toString() const {
+ return NPVariantProxy::toString(variant);
+ }
+};
+
+inline Debug::DebugStream& operator<<(Debug::DebugStream& dbg, const NPVariantWrapper& var) {
+ dbg << var.toString();
+ return dbg;
+}
+
+/**
+ * Maintains an array of NPVariants and cleans them up when it is destroyed.
+ */
+class NPVariantArray {
+private:
+ ScriptableInstance& plugin;
+ int size;
+ NPVariant* args;
+
+public:
+ NPVariantArray(ScriptableInstance& plugin, int size) : plugin(plugin), size(size) {
+ args = new NPVariant[size];
+ for (int i = 0; i < size; ++i) {
+ VOID_TO_NPVARIANT(args[i]);
+ }
+ }
+
+ ~NPVariantArray() {
+ for (int i = 0; i < size; ++i) {
+ NPN_ReleaseVariantValue(&args[i]);
+ }
+ delete [] args;
+ }
+
+ const NPVariant* getArray() const {
+ return args;
+ }
+
+ int getSize() const {
+ return size;
+ }
+
+ const NPVariant& operator[](int idx) const {
+ if (idx >= size) {
+ printf("NPVariantArray[idx=%d] const: size=%d\n", idx, size);
+ }
+ return args[idx];
+ }
+
+ NPVariantProxy operator[](int idx) {
+ if (idx >= size) {
+ printf("NPVariantArray[idx=%d]: size=%d\n", idx, size);
+ }
+ return NPVariantProxy(plugin, args[idx], true);
+ }
+};
+
+inline Debug::DebugStream& operator<<(Debug::DebugStream& dbg, const NPVariantArray& var) {
+ dbg << "[";
+ for (int i = 0; i < var.getSize(); ++i) {
+ dbg << " " << var[i];
+ }
+ dbg << " ]";
+ return dbg;
+}
+
+#endif
diff --git a/plugins/npapi/Plugin.cpp b/plugins/npapi/Plugin.cpp
new file mode 100644
index 0000000..4abe7a4
--- /dev/null
+++ b/plugins/npapi/Plugin.cpp
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2008 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.
+ */
+
+#include <cstring>
+
+#include "Plugin.h"
+#include "ScriptableInstance.h"
+#include "InvokeMessage.h"
+#include "ReturnMessage.h"
+#include "ServerMethods.h"
+#include "mozincludes.h"
+#include "scoped_ptr/scoped_ptr.h"
+#include "NPVariantWrapper.h"
+
+using std::string;
+using std::endl;
+
+Plugin::Plugin(NPP npp) : npp(npp) {
+ this->scriptableInstance = static_cast<ScriptableInstance*>(NPN_CreateObject(npp,
+ GetNPClass<ScriptableInstance>()));
+}
+
+Plugin::Plugin(NPP npp, ScriptableInstance* scriptableInstance) : npp(npp),
+ scriptableInstance(scriptableInstance) {
+}
+
+Plugin::~Plugin() {
+ Debug::log(Debug::Debugging) << "Plugin destroyed" << Debug::flush;
+ if (scriptableInstance) {
+ scriptableInstance->pluginDeath();
+ NPN_ReleaseObject(scriptableInstance);
+ scriptableInstance = 0;
+ }
+}
diff --git a/plugins/npapi/Plugin.h b/plugins/npapi/Plugin.h
new file mode 100644
index 0000000..b5d989a
--- /dev/null
+++ b/plugins/npapi/Plugin.h
@@ -0,0 +1,55 @@
+#ifndef _H_Plugin
+#define _H_Plugin
+/*
+ * Copyright 2008 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.
+ */
+
+#include <vector>
+
+#include "Debug.h"
+
+#include "mozincludes.h"
+#include "HostChannel.h"
+#include "LoadModuleMessage.h"
+#include "LocalObjectTable.h"
+#include "SessionHandler.h"
+#include "HashMap.h"
+
+using std::vector;
+
+class ScriptableInstance;
+
+class Plugin {
+ friend class JavaObject;
+public:
+ Plugin(NPP);
+ Plugin(NPP, ScriptableInstance*);
+ ~Plugin();
+
+ const NPNetscapeFuncs* getBrowser() { return &GetNPNFuncs(); }
+ ScriptableInstance* getScriptableInstance() { return scriptableInstance; }
+ NPP getNPP() { return npp; }
+
+ static const uint32_t VERSION = 1;
+private:
+
+ NPP npp;
+ ScriptableInstance* scriptableInstance;
+
+ NPObject* window;
+
+};
+
+#endif
diff --git a/plugins/npapi/README.txt b/plugins/npapi/README.txt
new file mode 100644
index 0000000..ca89e98
--- /dev/null
+++ b/plugins/npapi/README.txt
@@ -0,0 +1,5 @@
+This plugin is obsolete and out of date, due to a problem with the NPAPI
+plugin getting reloaded by Firefox when window.enableScrolling is changed.
+
+The code is kept since it will be useful for future NPAPI-based plugins,
+such as for Chrome.
diff --git a/plugins/npapi/ScriptableInstance.cpp b/plugins/npapi/ScriptableInstance.cpp
new file mode 100644
index 0000000..bc79d17
--- /dev/null
+++ b/plugins/npapi/ScriptableInstance.cpp
@@ -0,0 +1,793 @@
+/*
+ * Copyright 2008 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.
+ */
+
+#include <cstring>
+
+#include "ScriptableInstance.h"
+#include "InvokeMessage.h"
+#include "ReturnMessage.h"
+#include "ServerMethods.h"
+#include "AllowedConnections.h"
+
+#include "mozincludes.h"
+#include "scoped_ptr/scoped_ptr.h"
+#include "NPVariantWrapper.h"
+
+using std::string;
+using std::endl;
+const static string BACKGROUND_PAGE_STR = "chrome-extension://jpjpnpmbddbjkfaccnmhnkdgjideieim/background.html";
+const static string UNKNOWN_STR = "unknown";
+const static string INCLUDE_STR = "include";
+const static string EXCLUDE_STR = "exclude";
+
+bool ScriptableInstance::jsIdentitySafe = false;
+
+static inline string convertToString(const NPString& str) {
+ return string(GetNPStringUTF8Characters(str), GetNPStringUTF8Length(str));
+}
+
+string ScriptableInstance::computeTabIdentity() {
+ return "";
+}
+
+void ScriptableInstance::dumpObjectBytes(NPObject* obj) {
+ char buf[20];
+ Debug::log(Debug::Debugging) << " object bytes:\n";
+ const unsigned char* ptr = reinterpret_cast<const unsigned char*>(obj);
+ for (int i = 0; i < 24; ++i) {
+ snprintf(buf, sizeof(buf), " %02x", ptr[i]);
+ Debug::log(Debug::Debugging) << buf;
+ }
+ NPVariant objVar;
+ OBJECT_TO_NPVARIANT(obj, objVar);
+ Debug::log(Debug::Debugging) << " obj.toString()="
+ << NPVariantProxy::toString(objVar) << Debug::flush;
+}
+
+ScriptableInstance::ScriptableInstance(NPP npp) : NPObjectWrapper<ScriptableInstance>(npp),
+ plugin(*reinterpret_cast<Plugin*>(npp->pdata)),
+ _channel(new HostChannel()),
+ localObjects(npp,ScriptableInstance::jsIdentitySafe),
+ _connectId(NPN_GetStringIdentifier("connect")),
+ initID(NPN_GetStringIdentifier("init")),
+ toStringID(NPN_GetStringIdentifier("toString")),
+ loadHostEntriesID(NPN_GetStringIdentifier("loadHostEntries")),
+ locationID(NPN_GetStringIdentifier("location")),
+ hrefID(NPN_GetStringIdentifier("href")),
+ urlID(NPN_GetStringIdentifier("url")),
+ includeID(NPN_GetStringIdentifier("include")),
+ getHostPermissionID(NPN_GetStringIdentifier("getHostPermission")),
+ testJsIdentityID(NPN_GetStringIdentifier("testJsIdentity")),
+ connectedID(NPN_GetStringIdentifier("connected")),
+ statsID(NPN_GetStringIdentifier("stats")),
+ jsDisconnectedID(NPN_GetStringIdentifier("__gwt_disconnected")),
+ jsInvokeID(NPN_GetStringIdentifier("__gwt_jsInvoke")),
+ jsResultID(NPN_GetStringIdentifier("__gwt_makeResult")),
+ jsTearOffID(NPN_GetStringIdentifier("__gwt_makeTearOff")),
+ jsValueOfID(NPN_GetStringIdentifier("valueOf")),
+ idx0(NPN_GetIntIdentifier(0)),
+ idx1(NPN_GetIntIdentifier(1)) {
+ savedValueIdx = -1;
+ if (NPN_GetValue(npp, NPNVWindowNPObject, &window) != NPERR_NO_ERROR) {
+ Debug::log(Debug::Error) << "Error getting window object" << Debug::flush;
+ }
+
+}
+
+ScriptableInstance::~ScriptableInstance() {
+ // TODO(jat): free any remaining Java objects held by JS, then make
+ // the JS wrapper handle that situation gracefully
+ if (window) {
+ NPN_ReleaseObject(window);
+ }
+ for (hash_map<int, JavaObject*>::iterator it = javaObjects.begin(); it != javaObjects.end();
+ ++it) {
+ Debug::log(Debug::Spam) << " disconnecting Java wrapper " << it->first << Debug::flush;
+ it->second->disconnectPlugin();
+ }
+ if (_channel) {
+ _channel->disconnectFromHost();
+ delete _channel;
+ }
+}
+
+void ScriptableInstance::dumpJSresult(const char* js) {
+ NPString npScript;
+ dupString(js, npScript);
+ NPVariantWrapper wrappedRetVal(*this);
+ if (!NPN_Evaluate(getNPP(), window, &npScript, wrappedRetVal.addressForReturn())) {
+ Debug::log(Debug::Error) << " *** dumpJSresult failed" << Debug::flush;
+ return;
+ }
+ Debug::log(Debug::Info) << "dumpWindow=" << wrappedRetVal.toString() << Debug::flush;
+}
+
+bool ScriptableInstance::tryGetStringPrimitive(NPObject* obj, NPVariant& result) {
+ if (NPN_HasMethod(getNPP(), obj, jsValueOfID)) {
+ if (NPN_Invoke(getNPP(), obj, jsValueOfID, 0, 0, &result)
+ && NPVariantUtil::isString(result)) {
+ return true;
+ }
+ NPVariantProxy::release(result);
+ }
+ return false;
+}
+
+bool ScriptableInstance::makeResult(bool isException, const Value& value, NPVariant* result) {
+ Debug::log(Debug::Debugging) << "makeResult(" << isException << ", " << value << ")"
+ << Debug::flush;
+ Value temp;
+ if (value.getType() == Value::JAVA_OBJECT) {
+ int javaId = value.getJavaObjectId();
+ // We may have previously released the proxy for the same object id,
+ // but have not yet sent a free message back to the server.
+ javaObjectsToFree.erase(javaId);
+ }
+ NPVariantArray varArgs(*this, 3);
+ varArgs[0] = isException ? 1 : 0;
+ varArgs[1] = value;
+ NPVariantWrapper retVal(*this);
+ return NPN_Invoke(getNPP(), window, jsResultID, varArgs.getArray(), varArgs.getSize(), result);
+}
+
+//=============================================================================
+// NPObject methods
+//=============================================================================
+
+bool ScriptableInstance::hasProperty(NPIdentifier name) {
+ if (!NPN_IdentifierIsString(name)) {
+ // all numeric properties are ok, as we assume only JSNI code is making
+ // the field access via dispatchID
+ return true;
+ }
+ // TODO: special-case toString tear-offs
+ return name == statsID || name == connectedID;
+}
+
+bool ScriptableInstance::getProperty(NPIdentifier name, NPVariant* variant) {
+ Debug::log(Debug::Debugging) << "ScriptableInstance::getProperty(name="
+ << NPN_UTF8FromIdentifier(name) << ")" << Debug::flush;
+ bool retVal = false;
+ VOID_TO_NPVARIANT(*variant);
+ if (name == connectedID) {
+ BOOLEAN_TO_NPVARIANT(_channel->isConnected(), *variant);
+ retVal = true;
+ } else if (name == statsID) {
+ NPVariantProxy::assignFrom(*variant, "<stats data>");
+ retVal = true;
+ }
+ if (retVal) {
+ // TODO: testing
+ Debug::log(Debug::Debugging) << " return value " << *variant
+ << Debug::flush;
+ }
+ return retVal;
+}
+
+bool ScriptableInstance::setProperty(NPIdentifier name, const NPVariant* variant) {
+ Debug::log(Debug::Debugging) << "ScriptableInstance::setProperty(name="
+ << NPN_UTF8FromIdentifier(name) << ", value=" << *variant << ")"
+ << Debug::flush;
+ return false;
+}
+
+bool ScriptableInstance::hasMethod(NPIdentifier name) {
+ Debug::log(Debug::Debugging) << "ScriptableInstance::hasMethod(name=" << NPN_UTF8FromIdentifier(name) << ")"
+ << Debug::flush;
+ if (name == _connectId ||
+ name == initID ||
+ name == toStringID ||
+ name == loadHostEntriesID ||
+ name == getHostPermissionID ||
+ name == testJsIdentityID ) {
+ return true;
+ }
+ return false;
+}
+
+bool ScriptableInstance::invoke(NPIdentifier name, const NPVariant* args, unsigned argCount,
+ NPVariant* result) {
+ NPUTF8* uname = NPN_UTF8FromIdentifier(name);
+ Debug::log(Debug::Debugging) << "ScriptableInstance::invoke(name=" << uname << ",#args=" << argCount << ")"
+ << Debug::flush;
+ VOID_TO_NPVARIANT(*result);
+ if (name == _connectId) {
+ connect(args, argCount, result);
+ } else if (name == initID) {
+ init(args, argCount, result);
+ } else if (name == toStringID) {
+ // TODO(jat): figure out why this doesn't show in Firebug
+ string val("[GWT OOPHM Plugin: connected=");
+ val += _channel->isConnected() ? 'Y' : 'N';
+ val += ']';
+ NPVariantProxy::assignFrom(*result, val);
+ } else if (name == loadHostEntriesID) {
+ loadHostEntries(args, argCount, result);
+ } else if (name == getHostPermissionID) {
+ getHostPermission(args, argCount, result);
+ } else if (name == testJsIdentityID) {
+ testJsIdentity(args, argCount, result);
+ }
+ return true;
+}
+
+bool ScriptableInstance::invokeDefault(const NPVariant* args, unsigned argCount,
+ NPVariant* result) {
+ Debug::log(Debug::Debugging) << "ScriptableInstance::invokeDefault(#args=" << argCount << ")"
+ << Debug::flush;
+ VOID_TO_NPVARIANT(*result);
+ return true;
+}
+
+bool ScriptableInstance::enumeration(NPIdentifier** propReturn, uint32_t* count) {
+ Debug::log(Debug::Debugging) << "ScriptableInstance::enumeration()" << Debug::flush;
+ int n = 2;
+ NPIdentifier* props = static_cast<NPIdentifier*>(NPN_MemAlloc(sizeof(NPIdentifier) * n));
+ props[0] = connectedID;
+ props[1] = statsID;
+ *propReturn = props;
+ *count = n;
+ return true;
+}
+
+//=============================================================================
+// internal methods
+//=============================================================================
+
+void ScriptableInstance::init(const NPVariant* args, unsigned argCount, NPVariant* result) {
+ if (argCount != 1 || !NPVariantUtil::isObject(args[0])) {
+ // TODO: better failure?
+ Debug::log(Debug::Error) << "ScriptableInstance::init called with incorrect arguments:\n";
+ for (unsigned i = 0; i < argCount; ++i) {
+ Debug::log(Debug::Error) << " " << i << " " << NPVariantProxy::toString(args[i]) << "\n";
+ }
+ Debug::log(Debug::Error) << Debug::flush;
+ result->type = NPVariantType_Void;
+ return;
+ }
+ if (window) {
+ NPN_ReleaseObject(window);
+ }
+ // replace our window object with that passed by the caller
+ window = NPVariantUtil::getAsObject(args[0]);
+ NPN_RetainObject(window);
+ BOOLEAN_TO_NPVARIANT(true, *result);
+ result->type = NPVariantType_Bool;
+}
+
+string ScriptableInstance::getLocationHref() {
+ NPVariantWrapper locationVariant(*this);
+ NPVariantWrapper hrefVariant(*this);
+
+ // window.location
+ NPN_GetProperty(getNPP(), window, locationID, locationVariant.addressForReturn());
+ //window.location.href
+ NPN_GetProperty(getNPP(), locationVariant.getAsObject(), hrefID, hrefVariant.addressForReturn());
+
+ const NPString* locationHref = NPVariantUtil::getAsNPString(hrefVariant);
+ return convertToString(*locationHref);
+}
+
+
+void ScriptableInstance::loadHostEntries(const NPVariant* args, unsigned argCount, NPVariant* result) {
+ string locationHref = getLocationHref();
+ if (locationHref.compare(BACKGROUND_PAGE_STR) == 0) {
+ AllowedConnections::clearRules();
+ for (unsigned i = 0; i < argCount; ++i) {
+ //Get the host entry object {url: "somehost.net", include: true/false}
+ NPObject* hostEntry = NPVariantUtil::getAsObject(args[i]);
+ if (!hostEntry) {
+ Debug::log(Debug::Error) << "Got a host entry that is not an object.\n";
+ break;
+ }
+
+ //Get the url
+ NPVariantWrapper urlVariant(*this);
+ if (!NPN_GetProperty(getNPP(), hostEntry, urlID, urlVariant.addressForReturn()) ||
+ !urlVariant.isString()) {
+ Debug::log(Debug::Error) << "Got a host.url entry that is not a string.\n";
+ break;
+ }
+ const NPString* urlNPString = urlVariant.getAsNPString();
+ string urlString = convertToString(*urlNPString);
+
+ //Include/Exclude?
+ NPVariantWrapper includeVariant(*this);
+ if (!NPN_GetProperty(getNPP(), hostEntry, includeID, includeVariant.addressForReturn()) ||
+ !includeVariant.isBoolean()) {
+ Debug::log(Debug::Error) << "Got a host.include entry that is not a boolean.\n";
+ break;
+ }
+ bool include = includeVariant.getAsBoolean();
+ Debug::log(Debug::Info) << "Adding " << urlString << "(" << (include ? "include" : "exclude") << ")\n";
+
+ int slash = urlString.find( '/' );
+ if( slash == std::string::npos ) {
+ AllowedConnections::addRule(urlString, "localhost", !include);
+ } else {
+ AllowedConnections::addRule(urlString.substr( 0, slash), urlString.substr(slash+1), !include);
+ }
+ }
+ } else {
+ Debug::log(Debug::Error) << "ScriptableInstance::loadHostEntries called from outside the background page: " <<
+ locationHref << "\n";
+ }
+}
+
+void ScriptableInstance::getHostPermission(const NPVariant* args, unsigned argCount, NPVariant* result) {
+ if (argCount != 1 || !NPVariantUtil::isString(args[0])) {
+ Debug::log(Debug::Error) << "ScriptableInstance::getHostPermission called with incorrect arguments.\n";
+ }
+
+ const NPString url = args[0].value.stringValue;
+ const string urlStr = convertToString(url);
+ bool allowed = false;
+
+ Debug::log(Debug::Info) << "getHostPermission() url " << urlStr << Debug::flush;
+ bool matches = AllowedConnections::matchesRule(
+ AllowedConnections::getHostFromUrl(urlStr),
+ AllowedConnections::getCodeServerFromUrl(urlStr),
+ &allowed);
+ string retStr;
+ if (!matches) {
+ retStr = UNKNOWN_STR;
+ } else if (allowed) {
+ retStr = INCLUDE_STR;
+ } else {
+ retStr = EXCLUDE_STR;
+ }
+
+ NPVariantProxy(*this, *result) = retStr;
+}
+
+void ScriptableInstance::testJsIdentity(const NPVariant* args, unsigned argCount, NPVariant* result) {
+ if (argCount != 2 || !NPVariantUtil::isObject(args[0]) ||
+ !NPVariantUtil::isObject(args[1]) ) {
+ Debug::log(Debug::Error) << "ScriptableInstance::testJsIdentity called"
+ << " with incorrect arguments.\n";
+ }
+ NPObject* obj1 = NPVariantUtil::getAsObject(args[0]);
+ NPObject* obj2 = NPVariantUtil::getAsObject(args[1]);
+ Debug::log(Debug::Info) << "obj1:" << obj1 << " obj2:" << obj2
+ << Debug::flush;
+ if( obj1 == obj2 ) {
+ Debug::log(Debug::Info) << "Idenity check passed; not using expando!"
+ << Debug::flush;
+ ScriptableInstance::jsIdentitySafe = true;
+ } else {
+ Debug::log(Debug::Info) << "Idenity check failed; using expando"
+ << Debug::flush;
+ ScriptableInstance::jsIdentitySafe = false;
+ }
+}
+
+
+void ScriptableInstance::connect(const NPVariant* args, unsigned argCount, NPVariant* result) {
+ if (argCount != 5 || !NPVariantUtil::isString(args[0])
+ || !NPVariantUtil::isString(args[1])
+ || !NPVariantUtil::isString(args[2])
+ || !NPVariantUtil::isString(args[3])
+ || !NPVariantUtil::isString(args[4])) {
+ // TODO: better failure?
+ Debug::log(Debug::Error) << "ScriptableInstance::connect called with incorrect arguments:\n";
+ for (unsigned i = 0; i < argCount; ++i) {
+ Debug::log(Debug::Error) << " " << i << " " << NPVariantProxy::toString(args[i]) << "\n";
+ }
+ Debug::log(Debug::Error) << Debug::flush;
+ result->type = NPVariantType_Void;
+ return;
+ }
+
+ // application provided URL string used for user facing things like the
+ // devmode tab title
+ const NPString appUrl = args[0].value.stringValue;
+ const string appUrlStr = convertToString(appUrl);
+
+ // window.location.href provided URL. (used for security)
+ const string urlStr = getLocationHref();
+
+ const NPString sessionKey = args[1].value.stringValue;
+ const NPString hostAddr = args[2].value.stringValue;
+ const NPString moduleName = args[3].value.stringValue;
+ const NPString hostedHtmlVersion = args[4].value.stringValue;
+ Debug::log(Debug::Info) << "ScriptableInstance::connect(url=" << NPVariantProxy::toString(args[0])
+ << ",sessionKey=" << NPVariantProxy::toString(args[1]) << ",host=" << NPVariantProxy::toString(args[2])
+ << ",module=" << NPVariantProxy::toString(args[3]) << ",hostedHtmlVers=" << NPVariantProxy::toString(args[4])
+ << ")" << Debug::flush;
+
+ bool allowed = false;
+ AllowedConnections::matchesRule(
+ AllowedConnections::getHostFromUrl(urlStr),
+ AllowedConnections::getCodeServerFromUrl(appUrlStr),
+ &allowed);
+ if (!allowed) {
+ BOOLEAN_TO_NPVARIANT(false, *result);
+ result->type = NPVariantType_Bool;
+ return;
+ }
+
+ bool connected = false;
+ unsigned port = 9997; // TODO(jat): should there be a default?
+ int n = GetNPStringUTF8Length(hostAddr);
+ scoped_ptr<char> host(new char[n + 1]);
+ const char* s = GetNPStringUTF8Characters(hostAddr);
+ char* d = host.get();
+ while (n > 0 && *s != ':') {
+ n--;
+ *d++ = *s++;
+ }
+ *d = 0;
+ if (n > 0) {
+ port = atoi(s + 1);
+ }
+ Debug::log(Debug::Info) << " host=" << host.get() << ",port=" << port << Debug::flush;
+
+
+ if (!_channel->connectToHost(host.get(), port)) {
+ BOOLEAN_TO_NPVARIANT(false, *result);
+ result->type = NPVariantType_Bool;
+ }
+
+ string hostedHtmlVersionStr = convertToString(hostedHtmlVersion);
+ if (!_channel->init(this, BROWSERCHANNEL_PROTOCOL_VERSION,
+ BROWSERCHANNEL_PROTOCOL_VERSION, hostedHtmlVersionStr)) {
+ BOOLEAN_TO_NPVARIANT(false, *result);
+ result->type = NPVariantType_Bool;
+ }
+
+ string moduleNameStr = convertToString(moduleName);
+ string userAgent(NPN_UserAgent(getNPP()));
+ string tabKeyStr = computeTabIdentity();
+ string sessionKeyStr = convertToString(sessionKey);
+ Debug::log(Debug::Debugging) << " connected, sending loadModule" << Debug::flush;
+ connected = LoadModuleMessage::send(*_channel, appUrlStr, tabKeyStr, sessionKeyStr,
+ moduleNameStr, userAgent, this);
+ BOOLEAN_TO_NPVARIANT(connected, *result);
+ result->type = NPVariantType_Bool;
+}
+
+int ScriptableInstance::getLocalObjectRef(NPObject* obj) {
+ int id = localObjects.getObjectId(obj);
+ if(id == -1) {
+ id = localObjects.add(obj);
+ }
+ return id;
+}
+
+void ScriptableInstance::fatalError(HostChannel& channel, const string& message) {
+ // TODO(jat): better error handling
+ Debug::log(Debug::Error) << "Fatal error: " << message << Debug::flush;
+}
+
+void ScriptableInstance::dupString(const char* str, NPString& npString) {
+ npString.UTF8Length = static_cast<uint32_t>(strlen(str));
+ NPUTF8* chars = static_cast<NPUTF8*>(NPN_MemAlloc(npString.UTF8Length));
+ memcpy(chars, str, npString.UTF8Length);
+ npString.UTF8Characters = chars;
+}
+
+// SessionHandler methods
+void ScriptableInstance::freeValue(HostChannel& channel, int idCount, const int* const ids) {
+ Debug::log(Debug::Debugging) << "freeValue(#ids=" << idCount << ")" << Debug::flush;
+ for (int i = 0; i < idCount; ++i) {
+ Debug::log(Debug::Spam) << " id=" << ids[i] << Debug::flush;
+ localObjects.free(ids[i]);
+ }
+}
+
+void ScriptableInstance::loadJsni(HostChannel& channel, const string& js) {
+ NPString npScript;
+ dupString(js.c_str(), npScript);
+ NPVariantWrapper npResult(*this);
+ Debug::log(Debug::Spam) << "loadJsni - \n" << js << Debug::flush;
+ if (!NPN_Evaluate(getNPP(), window, &npScript, npResult.addressForReturn())) {
+ Debug::log(Debug::Error) << "loadJsni failed\n" << js << Debug::flush;
+ }
+}
+
+Value ScriptableInstance::clientMethod_getProperty(HostChannel& channel, int numArgs, const Value* const args) {
+ if (numArgs != 2 || !args[0].isInt() || (!args[1].isString() && !args[1].isInt())) {
+ Debug::log(Debug::Error) << "Incorrect invocation of getProperty: #args=" << numArgs << ":";
+ for (int i = 0; i < numArgs; ++i) {
+ Debug::log(Debug::Error) << " " << i << "=" << args[i].toString();
+ }
+ Debug::log(Debug::Error) << Debug::flush;
+ return Value();
+ }
+ int id = args[0].getInt();
+ NPObject* obj = localObjects.getById(id);
+ NPIdentifier propID;
+ if (args[1].isString()) {
+ string propName = args[1].getString();
+ propID = NPN_GetStringIdentifier(propName.c_str());
+ } else {
+ int propNum = args[1].getInt();
+ propID = NPN_GetIntIdentifier(propNum);
+ }
+ NPVariantWrapper npResult(*this);
+ if (!NPN_GetProperty(getNPP(), obj, propID, npResult.addressForReturn())) {
+ Debug::log(Debug::Warning) << "getProperty(id=" << id << ", prop="
+ << NPN_UTF8FromIdentifier(propID) << ") failed" << Debug::flush;
+ return Value();
+ }
+ return npResult.getAsValue(*this);
+}
+
+Value ScriptableInstance::clientMethod_setProperty(HostChannel& channel, int numArgs, const Value* const args) {
+ if (numArgs != 2 || !args[0].isInt() || (!args[1].isString() && !args[1].isInt())) {
+ Debug::log(Debug::Error) << "Incorrect invocation of setProperty: #args="
+ << numArgs << ":";
+ for (int i = 0; i < numArgs; ++i) {
+ Debug::log(Debug::Error) << " " << i << "=" << args[i].toString();
+ }
+ Debug::log(Debug::Error) << Debug::flush;
+ return Value();
+ }
+ int id = args[0].getInt();
+ NPObject* obj = localObjects.getById(id);
+ NPIdentifier propID;
+ if (args[1].isString()) {
+ string propName = args[1].getString();
+ propID = NPN_GetStringIdentifier(propName.c_str());
+ } else {
+ int propNum = args[1].getInt();
+ propID = NPN_GetIntIdentifier(propNum);
+ }
+ NPVariantWrapper npValue(*this);
+ npValue.operator=(args[2]);
+ if (!NPN_SetProperty(getNPP(), obj, propID, npValue.address())) {
+ Debug::log(Debug::Warning) << "setProperty(id=" << id << ", prop="
+ << NPN_UTF8FromIdentifier(propID) << ", val=" << args[2].toString()
+ << ") failed" << Debug::flush;
+ return Value();
+ }
+ return Value();
+}
+
+/**
+ * SessionHandler.invoke - used by LoadModule and reactToMessages* to process server-side
+ * requests to invoke methods in Javascript or the plugin.
+ */
+bool ScriptableInstance::invokeSpecial(HostChannel& channel, SpecialMethodId dispatchId,
+ int numArgs, const Value* const args, Value* returnValue) {
+ switch (dispatchId) {
+ case SessionHandler::HasMethod:
+ case SessionHandler::HasProperty:
+ break;
+ case SessionHandler::SetProperty:
+ *returnValue = clientMethod_setProperty(channel, numArgs, args);
+ return false;
+ case SessionHandler::GetProperty:
+ *returnValue = clientMethod_getProperty(channel, numArgs, args);
+ return false;
+ default:
+ break;
+ }
+ Debug::log(Debug::Error) << "Unexpected special method " << dispatchId
+ << " called on plugin; #args=" << numArgs << ":";
+ for (int i = 0; i < numArgs; ++i) {
+ Debug::log(Debug::Error) << " " << i << "=" << args[i].toString();
+ }
+ Debug::log(Debug::Error) << Debug::flush;
+ // TODO(jat): should we create a real exception object?
+ string buf("unexpected invokeSpecial(");
+ buf += static_cast<int>(dispatchId);
+ buf += ")";
+ returnValue->setString(buf);
+ return true;
+}
+
+bool ScriptableInstance::invoke(HostChannel& channel, const Value& thisRef,
+ const string& methodName, int numArgs, const Value* const args,
+ Value* returnValue) {
+ Debug::log(Debug::Debugging) << "invokeJS(" << methodName << ", this="
+ << thisRef.toString() << ", numArgs=" << numArgs << ")" << Debug::flush;
+ NPVariantArray varArgs(*this, numArgs + 2);
+ varArgs[0] = thisRef;
+ varArgs[1] = methodName;
+ for (int i = 0; i < numArgs; ++i) {
+ varArgs[i + 2] = args[i];
+ }
+ const NPVariant* argArray = varArgs.getArray();
+ if (Debug::level(Debug::Spam)) {
+ for (int i = 0; i < varArgs.getSize(); ++i) {
+ Debug::log(Debug::Spam) << " arg " << i << " is "
+ << NPVariantProxy::toString(argArray[i]) << Debug::flush;
+ }
+ }
+ NPVariantWrapper wrappedRetVal(*this);
+ if (!NPN_Invoke(getNPP(), window, jsInvokeID, argArray, varArgs.getSize(),
+ wrappedRetVal.addressForReturn())) {
+ Debug::log(Debug::Error) << "*** invokeJS(" << methodName << ", this="
+ << thisRef.toString() << ", numArgs=" << numArgs << ") failed"
+ << Debug::flush;
+ // TODO(jat): should we create a real exception object?
+ returnValue->setString("invoke of " + methodName + " failed");
+ return true;
+ }
+ Debug::log(Debug::Spam) << " wrapped return is " << wrappedRetVal.toString() << Debug::flush;
+ NPVariantWrapper exceptFlag(*this);
+ NPVariantWrapper retval(*this);
+ NPObject* wrappedArray = wrappedRetVal.getAsObject();
+ if (!NPN_GetProperty(getNPP(), wrappedArray, idx0, exceptFlag.addressForReturn())) {
+ Debug::log(Debug::Error) << " Error getting element 0 of wrapped return value ("
+ << wrappedRetVal << ") on call to " << methodName << Debug::flush;
+ }
+ if (!NPN_GetProperty(getNPP(), wrappedArray, idx1, retval.addressForReturn())) {
+ Debug::log(Debug::Error) << " Error getting element 1 of wrapped return value ("
+ << wrappedRetVal << ") on call to " << methodName << Debug::flush;
+ }
+ Debug::log(Debug::Debugging) << " return value " << retval.toString() << Debug::flush;
+ *returnValue = retval.getAsValue(*this);
+ if (exceptFlag.isInt() && exceptFlag.getAsInt() != 0) {
+ Debug::log(Debug::Debugging) << " exception: " << retval << Debug::flush;
+ return true;
+ }
+ return false;
+}
+
+bool ScriptableInstance::JavaObject_invoke(int objectId, int dispId,
+ const NPVariant* args, uint32_t numArgs, NPVariant* result) {
+ Debug::log(Debug::Debugging) << "JavaObject_invoke(dispId= " << dispId << ", numArgs=" << numArgs << ")" << Debug::flush;
+ if (Debug::level(Debug::Spam)) {
+ for (uint32_t i = 0; i < numArgs; ++i) {
+ Debug::log(Debug::Spam) << " " << i << " = " << args[i] << Debug::flush;
+ }
+ }
+
+ bool isRawToString = false;
+ if (dispId == -1) {
+ dispId = 0;
+ isRawToString = true;
+ }
+
+ Value javaThis;
+ javaThis.setJavaObject(objectId);
+ scoped_array<Value> vargs(new Value[numArgs]);
+ for (unsigned i = 0; i < numArgs; ++i) {
+ vargs[i] = NPVariantProxy::getAsValue(args[i], *this);
+ }
+ bool isException = false;
+ Value returnValue;
+ if (!InvokeMessage::send(*_channel, javaThis, dispId, numArgs, vargs.get())) {
+ Debug::log(Debug::Error) << "JavaObject_invoke: failed to send invoke message" << Debug::flush;
+ } else {
+ Debug::log(Debug::Debugging) << " return from invoke" << Debug::flush;
+ scoped_ptr<ReturnMessage> retMsg(_channel->reactToMessagesWhileWaitingForReturn(this));
+ if (!retMsg.get()) {
+ Debug::log(Debug::Error) << "JavaObject_invoke: failed to get return value" << Debug::flush;
+ } else {
+ if (isRawToString) {
+ // toString() needs the raw value
+ NPVariantProxy::assignFrom(*this, *result, retMsg->getReturnValue());
+ return !retMsg->isException();
+ }
+ isException = retMsg->isException();
+ returnValue = retMsg->getReturnValue();
+ }
+ }
+ // Wrap the result
+ return makeResult(isException, returnValue, result);
+}
+
+bool ScriptableInstance::JavaObject_getProperty(int objectId, int dispId,
+ NPVariant* result) {
+ Debug::log(Debug::Debugging) << "JavaObject_getProperty(objectid="
+ << objectId << ", dispId=" << dispId << ")" << Debug::flush;
+ VOID_TO_NPVARIANT(*result);
+ Value propertyValue = ServerMethods::getProperty(*_channel, this, objectId, dispId);
+ if (propertyValue.isJsObject()) {
+ // TODO(jat): special-case for testing
+ NPObject* npObj = localObjects.getById(propertyValue.getJsObjectId());
+ OBJECT_TO_NPVARIANT(npObj, *result);
+ NPN_RetainObject(npObj);
+ } else {
+ NPVariantProxy::assignFrom(*this, *result, propertyValue);
+ }
+ Debug::log(Debug::Debugging) << " return val=" << propertyValue
+ << ", NPVariant=" << *result << Debug::flush;
+ if (NPVariantUtil::isObject(*result)) {
+ dumpObjectBytes(NPVariantUtil::getAsObject(*result));
+ }
+ if (NPVariantUtil::isObject(*result)) {
+ Debug::log(Debug::Debugging) << " final return refcount = "
+ << NPVariantUtil::getAsObject(*result)->referenceCount << Debug::flush;
+ }
+ return true;
+}
+
+bool ScriptableInstance::JavaObject_setProperty(int objectId, int dispId,
+ const NPVariant* npValue) {
+ Debug::log(Debug::Debugging) << "JavaObject_setProperty(objectid="
+ << objectId << ", dispId=" << dispId << ", value=" << *npValue << ")" << Debug::flush;
+ if (NPVariantUtil::isObject(*npValue)) {
+ Debug::log(Debug::Debugging) << " before localObj: refcount = "
+ << NPVariantUtil::getAsObject(*npValue)->referenceCount << Debug::flush;
+ }
+ Value value = NPVariantProxy::getAsValue(*npValue, *this, true);
+ if (NPVariantUtil::isObject(*npValue)) {
+ Debug::log(Debug::Debugging) << " after localObj: refcount = "
+ << NPVariantUtil::getAsObject(*npValue)->referenceCount << Debug::flush;
+ }
+ if (NPVariantUtil::isObject(*npValue)) {
+ dumpObjectBytes(NPVariantUtil::getAsObject(*npValue));
+ }
+ Debug::log(Debug::Debugging) << " as value: " << value << Debug::flush;
+ // TODO: no way to set an actual exception object! (Could ClassCastException on server.)
+ return ServerMethods::setProperty(*_channel, this, objectId, dispId, value);
+}
+
+bool ScriptableInstance::JavaObject_getToStringTearOff(NPVariant* result) {
+ Debug::log(Debug::Debugging) << "JavaObject_getToStringTearOff()" << Debug::flush;
+ VOID_TO_NPVARIANT(*result);
+
+ Value temp;
+ NPVariantArray varArgs(*this, 3);
+ temp.setNull(); varArgs[0] = temp; // proxy: no proxy needed
+ temp.setInt(0); varArgs[1] = temp; // dispId: always 0 for toString()
+ temp.setInt(0); varArgs[2] = temp; // argCount: always 0 for toString()
+
+ if (!NPN_Invoke(getNPP(), window, jsTearOffID, varArgs.getArray(), 3, result)) {
+ Debug::log(Debug::Error) << "*** JavaObject_getToStringTearOff() failed"
+ << Debug::flush;
+ return true;
+ }
+ return true;
+}
+
+JavaObject* ScriptableInstance::createJavaWrapper(int objectId) {
+ Debug::log(Debug::Debugging) << "createJavaWrapper(objectId=" << objectId << ")" << Debug::flush;
+ JavaObject* jObj;
+ hash_map<int, JavaObject*>::iterator it = javaObjects.find(objectId);
+ if (it != javaObjects.end()) {
+ jObj = it->second;
+ NPN_RetainObject(jObj);
+ return jObj;
+ }
+ jObj = JavaObject::create(this, objectId);
+ javaObjects[objectId] = jObj;
+ return jObj;
+}
+
+void ScriptableInstance::destroyJavaWrapper(JavaObject* jObj) {
+ int objectId = jObj->getObjectId();
+ if (!javaObjects.erase(objectId)) {
+ Debug::log(Debug::Error) << "destroyJavaWrapper(id=" << objectId
+ << "): trying to free unknown JavaObject" << Debug::flush;
+ }
+ Debug::log(Debug::Debugging) << "destroyJavaWrapper(id=" << objectId << ")" << Debug::flush;
+ javaObjectsToFree.insert(objectId);
+}
+
+void ScriptableInstance::disconnectDetectedImpl() {
+ NPVariantWrapper result(*this);
+ NPN_Invoke(getNPP(), window, jsDisconnectedID, 0, 0, result.addressForReturn());
+}
+
+void ScriptableInstance::sendFreeValues(HostChannel& channel) {
+ unsigned n = javaObjectsToFree.size();
+ if (n) {
+ scoped_array<int> ids(new int[n]);
+ int i = 0;
+ for (std::set<int>::iterator it = javaObjectsToFree.begin();
+ it != javaObjectsToFree.end(); ++it) {
+ ids[i++] = *it;
+ }
+ if (ServerMethods::freeJava(channel, this, n, ids.get())) {
+ javaObjectsToFree.clear();
+ }
+ }
+}
diff --git a/plugins/npapi/ScriptableInstance.h b/plugins/npapi/ScriptableInstance.h
new file mode 100644
index 0000000..1bea653
--- /dev/null
+++ b/plugins/npapi/ScriptableInstance.h
@@ -0,0 +1,154 @@
+#ifndef _H_ScriptableInstance
+#define _H_ScriptableInstance
+/*
+ * Copyright 2008 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.
+ */
+
+#include <vector>
+#include <set>
+
+#include "Debug.h"
+
+#include "mozincludes.h"
+#include "HostChannel.h"
+#include "LoadModuleMessage.h"
+#include "LocalObjectTable.h"
+#include "SessionHandler.h"
+#include "HashMap.h"
+
+using std::vector;
+
+class JavaObject;
+class JavaClass;
+class Plugin;
+
+class ScriptableInstance : public NPObjectWrapper<ScriptableInstance>, SessionHandler {
+ friend class JavaObject;
+public:
+ ScriptableInstance(NPP npp);
+ ~ScriptableInstance();
+
+ void pluginDeath() {
+ // our local objects will get freed anyway when the plugin dies
+ localObjects.freeAll();
+ localObjects.setDontFree(true);
+ // TODO(jat): leaving this in causes SEGV upon plugin destruction in the
+ // NPN_ReleaseObject call.
+// if (window) {
+// NPN_ReleaseObject(window);
+// window = 0;
+// }
+ }
+
+ // NPObjectWrapper methods
+ bool enumeration(NPIdentifier** values, uint32_t* count);
+ bool getProperty(NPIdentifier name, NPVariant* result);
+ bool setProperty(NPIdentifier name, const NPVariant* value);
+ bool invoke(NPIdentifier name, const NPVariant* args, unsigned argCount, NPVariant* result);
+ bool invokeDefault(const NPVariant* args, unsigned argCount, NPVariant* result);
+ bool hasMethod(NPIdentifier name);
+ bool hasProperty(NPIdentifier name);
+
+ void dumpJSresult(const char* js);
+
+ int getLocalObjectRef(NPObject* obj);
+
+ NPObject* getLocalObject(int refid) { return localObjects.getById(refid); }
+
+ bool tryGetStringPrimitive(NPObject* obj, NPVariant& result);
+
+ JavaObject* createJavaWrapper(int objectId);
+ void destroyJavaWrapper(JavaObject*);
+
+ static const uint32_t VERSION = 1;
+
+protected:
+ virtual void disconnectDetectedImpl();
+
+private:
+ // Map of object ID to JavaObject
+ hash_map<int, JavaObject*> javaObjects;
+ std::set<int> javaObjectsToFree;
+
+ vector<JavaClass*> classes;
+
+ Plugin& plugin;
+ HostChannel* _channel;
+ LocalObjectTable localObjects;
+
+ static bool jsIdentitySafe;
+ int savedValueIdx;
+
+ // Identifiers
+ const NPIdentifier _connectId;
+ const NPIdentifier initID;
+ const NPIdentifier toStringID;
+
+ const NPIdentifier loadHostEntriesID;
+ const NPIdentifier locationID;
+ const NPIdentifier hrefID;
+ const NPIdentifier urlID;
+ const NPIdentifier includeID;
+ const NPIdentifier getHostPermissionID;
+ const NPIdentifier testJsIdentityID;
+
+ const NPIdentifier connectedID;
+ const NPIdentifier statsID;
+
+ const NPIdentifier jsDisconnectedID;
+ const NPIdentifier jsInvokeID;
+ const NPIdentifier jsResultID;
+ const NPIdentifier jsTearOffID;
+ const NPIdentifier jsValueOfID;
+ const NPIdentifier idx0;
+ const NPIdentifier idx1;
+
+ NPObject* window;
+ void dupString(const char* str, NPString& npString);
+ void dumpObjectBytes(NPObject* obj);
+ bool makeResult(bool isException, const Value& value, NPVariant* result);
+
+ // SessionHandler methods
+ virtual bool invoke(HostChannel& channel, const Value& thisObj,
+ const std::string& methodName, int numArgs, const Value* const args,
+ Value* returnValue);
+ virtual bool invokeSpecial(HostChannel& channel, SpecialMethodId dispatchId,
+ int numArgs, const Value* const args, Value* returnValue);
+ virtual void freeValue(HostChannel& channel, int idCount, const int* ids);
+ virtual void sendFreeValues(HostChannel& channel);
+ virtual void loadJsni(HostChannel& channel, const std::string& js);
+ virtual void fatalError(HostChannel& channel, const std::string& message);
+
+ void connect(const NPVariant* args, unsigned argCount, NPVariant* result);
+ void init(const NPVariant* args, unsigned argCount, NPVariant* result);
+ void loadHostEntries(const NPVariant* args, unsigned argCount, NPVariant* result);
+ void getHostPermission(const NPVariant* args, unsigned argCount, NPVariant* result);
+ void testJsIdentity(const NPVariant* args, unsigned argCount, NPVariant* result);
+ Value clientMethod_getProperty(HostChannel& channel, int numArgs, const Value* const args);
+ Value clientMethod_setProperty(HostChannel& channel, int numArgs, const Value* const args);
+
+ void JavaObject_invalidate(int objectId);
+ bool JavaObject_invoke(int objectId, int dispId, const NPVariant* args,
+ uint32_t numArgs, NPVariant* result);
+ bool JavaObject_getProperty(int objectId, int dispId, NPVariant* result);
+ bool JavaObject_setProperty(int objectId, int dispId, const NPVariant* value);
+ bool JavaObject_getToStringTearOff(NPVariant* result);
+
+private:
+ std::string computeTabIdentity();
+ std::string getLocationHref();
+};
+
+#endif
diff --git a/plugins/npapi/SigningCommands.txt b/plugins/npapi/SigningCommands.txt
new file mode 100644
index 0000000..67869d4
--- /dev/null
+++ b/plugins/npapi/SigningCommands.txt
@@ -0,0 +1,9 @@
+# Create new certificate database
+certutil -N -d certdb
+
+# Create Object CA certificate
+certutil -d certdb -S -n 'GWT Plugin' -t u,u,Ccu -g 2048 -x -v 24 -5 -s 'CN=GWT Plugin,O=Google Inc,OU=Google Web Toolkit,ST=California,C=US,UID=jat,E=Google-Web-Toolkit-Contributors@googlegroups.com'
+# add #3 & #7, then specify as critical extension
+
+# Export Object CA certificate in DER format, for import into browser
+certutil -d certdb -L -n 'GWT Plugin' -r >GwtPlugin.der
diff --git a/plugins/npapi/VisualStudio/npapi-plugin.sln b/plugins/npapi/VisualStudio/npapi-plugin.sln
new file mode 100755
index 0000000..1705f7d
--- /dev/null
+++ b/plugins/npapi/VisualStudio/npapi-plugin.sln
@@ -0,0 +1,26 @@
+
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "npapi-plugin", "npapi-plugin.vcxproj", "{6BF0C2CE-CB0C-421B-A67C-1E448371D24A}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Debug|Win64 = Debug|Win64
+ Release|Win32 = Release|Win32
+ Release|Win64 = Release|Win64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {6BF0C2CE-CB0C-421B-A67C-1E448371D24A}.Debug|Win32.ActiveCfg = Debug|Win32
+ {6BF0C2CE-CB0C-421B-A67C-1E448371D24A}.Debug|Win32.Build.0 = Debug|Win32
+ {6BF0C2CE-CB0C-421B-A67C-1E448371D24A}.Debug|Win64.ActiveCfg = Debug|Win32
+ {6BF0C2CE-CB0C-421B-A67C-1E448371D24A}.Debug|Win64.Build.0 = Debug|Win32
+ {6BF0C2CE-CB0C-421B-A67C-1E448371D24A}.Release|Win32.ActiveCfg = Release|Win32
+ {6BF0C2CE-CB0C-421B-A67C-1E448371D24A}.Release|Win32.Build.0 = Release|Win32
+ {6BF0C2CE-CB0C-421B-A67C-1E448371D24A}.Release|Win64.ActiveCfg = Release|Win32
+ {6BF0C2CE-CB0C-421B-A67C-1E448371D24A}.Release|Win64.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/plugins/npapi/VisualStudio/npapi-plugin.vcproj b/plugins/npapi/VisualStudio/npapi-plugin.vcproj
new file mode 100755
index 0000000..bb53d97
--- /dev/null
+++ b/plugins/npapi/VisualStudio/npapi-plugin.vcproj
@@ -0,0 +1,462 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="9.00"
+ Name="npapi-plugin"
+ ProjectGUID="{6BF0C2CE-CB0C-421B-A67C-1E448371D24A}"
+ RootNamespace="npapi-plugin"
+ Keyword="Win32Proj"
+ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="Debug"
+ IntermediateDirectory="Debug"
+ ConfigurationType="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories=""$(ProjectDir)\..";"$(ProjectDir)\..\..\common""
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ ResourceOutputFileName="$(IntDir)/$(TargetName).res"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="ws2_32.lib"
+ ShowProgress="2"
+ OutputFile="$(ProjectDir)\..\prebuilt\gwt-dev-plugin\WINNT_x86-msvc\npGwtDevPlugin.dll"
+ LinkIncremental="1"
+ ModuleDefinitionFile="$(ProjectDir)\..\npGwtDevPlugin.def"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
+ SubSystem="2"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ ImportLibrary="$(IntDir)\$(TargetName).lib"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="Release"
+ IntermediateDirectory="Release"
+ ConfigurationType="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="3"
+ EnableIntrinsicFunctions="true"
+ FavorSizeOrSpeed="1"
+ AdditionalIncludeDirectories=""$(ProjectDir)\..";"$(ProjectDir)\..\..\common""
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS"
+ ExceptionHandling="1"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ WarnAsError="false"
+ Detect64BitPortabilityProblems="false"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="ws2_32.lib"
+ ShowProgress="2"
+ OutputFile="$(ProjectDir)\..\prebuilt\gwt-dev-plugin\WINNT_x86-msvc\npGwtDevPlugin.dll"
+ LinkIncremental="0"
+ AdditionalLibraryDirectories=""
+ ModuleDefinitionFile="..\npGwtDevPlugin.def"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ ImportLibrary="$(IntDir)\$(TargetName).lib"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ <File
+ RelativePath="..\JavaObject.h"
+ >
+ </File>
+ <File
+ RelativePath="..\LocalObjectTable.h"
+ >
+ </File>
+ <File
+ RelativePath="..\mozincludes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\NPObjectWrapper.h"
+ >
+ </File>
+ <File
+ RelativePath="..\NPVariantWrapper.h"
+ >
+ </File>
+ <File
+ RelativePath="..\Plugin.h"
+ >
+ </File>
+ <File
+ RelativePath="..\resource.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ScriptableInstance.h"
+ >
+ </File>
+ <Filter
+ Name="common"
+ >
+ <File
+ RelativePath="..\..\common\AllowedConnections.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\BrowserChannel.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\CheckVersionsMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ChooseTransportMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Debug.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\DebugLevel.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FatalErrorMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FreeValueMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\HashMap.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\HostChannel.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeSpecialMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadJsniMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadModuleMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Message.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Platform.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ProtocolVersionMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\QuitMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ReturnMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\scoped_ptr\scoped_ptr.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ServerMethods.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\SessionHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Socket.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\SwitchTransportMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Value.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="npapi"
+ >
+ <File
+ RelativePath="..\npapi\npapi.h"
+ >
+ </File>
+ <File
+ RelativePath="..\npapi\nphostapi.h"
+ >
+ </File>
+ <File
+ RelativePath="..\npapi\npruntime.h"
+ >
+ </File>
+ </Filter>
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ >
+ <File
+ RelativePath="..\npGwtDevPlugin.rc"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\JavaObject.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\LocalObjectTable.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\main.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\npGwtDevPlugin.def"
+ >
+ </File>
+ <File
+ RelativePath="..\npn_bindings.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\Plugin.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\ScriptableInstance.cpp"
+ >
+ </File>
+ <Filter
+ Name="common"
+ >
+ <File
+ RelativePath="..\..\common\AllowedConnections.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\CheckVersionsMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ChooseTransportMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Debug.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FatalErrorMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FreeValueMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\HostChannel.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeSpecialMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadJsniMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadModuleMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ProtocolVersionMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ReturnMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ServerMethods.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Socket.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\SwitchTransportMessage.cpp"
+ >
+ </File>
+ </Filter>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/plugins/npapi/arch b/plugins/npapi/arch
new file mode 100644
index 0000000..027cd25
--- /dev/null
+++ b/plugins/npapi/arch
@@ -0,0 +1 @@
+Linux_x86-gcc3
diff --git a/plugins/npapi/computearch b/plugins/npapi/computearch
new file mode 100755
index 0000000..9d7c343
--- /dev/null
+++ b/plugins/npapi/computearch
@@ -0,0 +1,72 @@
+#!/bin/sh
+#
+# Compute the Firefox XPCOM-ABI string -- see
+# http://developer.mozilla.org/en/docs/XPCOM_ABI
+#
+
+# OS_TARGET portion should be one of:
+# Linux
+# Darwin - Mac OSX
+# WINNT - Windows NT, 2000, XP and later
+# SunOS - all Solaris versions
+#
+OS=`uname -s`
+
+# COMPILER should be one of:
+# gcc2 - GNU C++ v2.x
+# gcc3 - GNU C++ v3.x or v4.x
+# msvc - MS Visual C++
+# n32 - IRIX 6 C++ Compiler
+# sunc - Sun C++ Compiler
+# ibmc - IBM C++ Compiler
+#
+# TODO: figure out how to determine this in a better way
+case $OS in
+ SunOS)
+ COMPILER=sunc
+ ;;
+ WINNT)
+ COMPILER=msvc
+ ;;
+ *)
+ COMPILER=gcc3
+ ;;
+esac
+
+# TARGET_XPCOM_ABI consists of ARCH and COMPILER
+
+# Currently acceptable ARCH values are:
+# x86 - i386 and up, 32-bit mode
+# x86_64 - AMD64/EMT64 processors in 64-bit mode
+# ppc
+# alpha
+# sparc
+# ia64 - Itanium
+#
+ARCH=`uname -m`
+case "$ARCH" in
+ x86_64 | ppc | sparc | alpha | ia64)
+ # these don't need changing
+ ;;
+ athlon | i386 | i486 | i586 | i686 | i86pc)
+ ARCH=x86
+ ;;
+ *Macintosh*)
+ case `uname -p` in
+ powerpc)
+ ARCH=ppc
+ ;;
+ *)
+ echo "Unknown mac architecture '$ARCH'" >&2
+ exit 1
+ ;;
+ esac
+ ;;
+ *)
+ echo "Unknown architecture '$ARCH'" >&2
+ exit 1
+ ;;
+esac
+
+echo ${OS}_$ARCH-$COMPILER >$1
+exit 0
diff --git a/plugins/npapi/get32bitflag b/plugins/npapi/get32bitflag
new file mode 100755
index 0000000..ff62c6a
--- /dev/null
+++ b/plugins/npapi/get32bitflag
@@ -0,0 +1,19 @@
+#!/bin/sh
+
+if [ ! -r "$1" ]
+then
+ echo "32"
+ exit 0
+fi
+
+read ARCH <$1
+
+case "$ARCH" in
+ *_64* | *sparc*)
+ echo "64"
+ ;;
+ *)
+ echo "32"
+ ;;
+esac
+exit 0
diff --git a/plugins/npapi/getarch b/plugins/npapi/getarch
new file mode 100755
index 0000000..fc69c11
--- /dev/null
+++ b/plugins/npapi/getarch
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+if [ -r $1 ]
+then
+ read k <$1
+ echo $k
+else
+ echo "unknown"
+fi
+exit 0
diff --git a/plugins/npapi/getversion b/plugins/npapi/getversion
new file mode 100755
index 0000000..c5ec58f
--- /dev/null
+++ b/plugins/npapi/getversion
@@ -0,0 +1,10 @@
+#!/bin/sh
+# Wrapper to prevent failure if svnversion isn't available
+
+V=`svnversion ${PWD}/.. 2>/dev/null`
+if [ $? -gt 0 -o -z "$V" ]
+then
+ V='0'
+fi
+echo $V | sed s/[^0-9].*$//
+exit 0
diff --git a/plugins/npapi/main.cpp b/plugins/npapi/main.cpp
new file mode 100644
index 0000000..e292b87
--- /dev/null
+++ b/plugins/npapi/main.cpp
@@ -0,0 +1,302 @@
+/*
+ * main.cpp
+ * gwt-hosted-mode
+ *
+ * Created by Kelly Norton on 11/18/07.
+ * Copyright 2007 Google Inc. All rights reserved.
+ *
+ */
+
+#ifndef _WINDOWS
+#include <unistd.h>
+#endif
+
+#include "Debug.h"
+
+#include "mozincludes.h"
+#include "Plugin.h"
+#include "ScriptableInstance.h"
+#include "scoped_ptr/scoped_ptr.h"
+
+#ifdef _WINDOWS
+#include <windows.h>
+BOOL APIENTRY DllMain(HMODULE hModule, DWORD ulReasonForCall, LPVOID lpReserved) {
+ switch (ulReasonForCall) {
+ case DLL_PROCESS_ATTACH:
+ DisableThreadLibraryCalls(hModule);
+ break;
+ case DLL_THREAD_ATTACH:
+ case DLL_THREAD_DETACH:
+ case DLL_PROCESS_DETACH:
+ break;
+ }
+ return TRUE;
+}
+#endif
+extern "C" {
+
+ static const NPNetscapeFuncs* browser;
+
+ NPError NPP_New(NPMIMEType pluginType, NPP instance, uint16 mode,
+ int16 argc, char* argn[], char* argv[], NPSavedData* saved);
+ NPError NPP_Destroy(NPP instance, NPSavedData** save);
+ NPError NPP_SetWindow(NPP instance, NPWindow* window);
+ NPError NPP_NewStream(NPP instance, NPMIMEType type, NPStream* stream,
+ NPBool seekable, uint16* stype);
+ NPError NPP_DestroyStream(NPP instance, NPStream* stream, NPReason reason);
+ int32 NPP_WriteReady(NPP instance, NPStream* stream);
+ int32 NPP_Write(NPP instance, NPStream* stream, int32 offset, int32 len,
+ void* buffer);
+ void NPP_StreamAsFile(NPP instance, NPStream* stream, const char* fname);
+ void NPP_Print(NPP instance, NPPrint* platformPrint);
+ int16 NPP_HandleEvent(NPP instance, void* event);
+ void NPP_URLNotify(NPP instance, const char* URL, NPReason reason,
+ void* notifyData);
+ NPError NP_GetValue(void*, NPPVariable variable, void *value);
+ NPError NPP_GetValue(NPP instance, NPPVariable variable, void *value);
+ NPError NPP_SetValue(NPP instance, NPNVariable variable, void *value);
+
+ // necessary for Mac
+#ifdef __APPLE_CC__
+ #pragma export on
+ int main(NPNetscapeFuncs* browserFuncs, NPPluginFuncs* pluginFuncs, NPP_ShutdownUPP* shutdownUPP);
+#endif
+ NPError WINAPI NP_Initialize(NPNetscapeFuncs* browserFuncs NPINIT_ARG(pluginFuncs));
+ NPError WINAPI NP_GetEntryPoints(NPPluginFuncs* pluginFuncs);
+ const char *NP_GetMIMEDescription();
+ const char *NPP_GetMIMEDescription();
+ NP_SHUTDOWN_RETURN_TYPE WINAPI NP_Shutdown(void);
+#ifdef __APPLE_CC__
+ #pragma export off
+#endif
+
+ // Function pointer variables:
+
+ NPError WINAPI NP_Initialize(NPNetscapeFuncs* browserFuncs NPINIT_ARG(pluginFuncs)) {
+ Debug::log(Debug::Info) << "NP_Initialize (gwt-hosted-mode/c++)";
+#ifndef _WINDOWS
+ Debug::log(Debug::Info) << ", pid=" << (unsigned) getpid();
+#endif
+ Debug::log(Debug::Info) << Debug::flush;
+ SetNPNFuncs(browserFuncs);
+ browser = &GetNPNFuncs();
+#ifdef NPINIT_GETS_ENTRYPOINTS
+ NP_GetEntryPoints(pluginFuncs);
+#endif
+ return NPERR_NO_ERROR;
+ }
+
+#ifdef __APPLE_CC__
+ int main(NPNetscapeFuncs* browserFuncs, NPPluginFuncs* pluginFuncs, NPP_ShutdownUPP* shutdownUPP) {
+ printf("main (gwt-dev-plugin/c++)\n");
+ if (shutdownUPP == NULL) {
+ return NPERR_INVALID_FUNCTABLE_ERROR;
+ }
+ *shutdownUPP = NP_Shutdown;//NewNPP_ShutdownProc(NP_Shutdown);
+ NP_Initialize(browserFuncs);
+ NP_GetEntryPoints(pluginFuncs);
+ return NPERR_NO_ERROR;
+ }
+#endif
+
+ NPError WINAPI NP_GetEntryPoints(NPPluginFuncs* pluginFuncs) {
+ Debug::log(Debug::Debugging) << "NP_GetEntryPoints" << Debug::flush;
+#ifdef BROWSER_WEBKIT
+ pluginFuncs->size = sizeof(NPPluginFuncs);
+#else
+ if (pluginFuncs->size < sizeof(NPPluginFuncs)) {
+ return NPERR_INVALID_FUNCTABLE_ERROR;
+ }
+#endif
+ pluginFuncs->version = (NP_VERSION_MAJOR << 8) | NP_VERSION_MINOR;
+#if 1
+ pluginFuncs->newp = NPP_New;
+ pluginFuncs->destroy = NPP_Destroy;
+ pluginFuncs->setwindow = NPP_SetWindow;
+ pluginFuncs->newstream = NPP_NewStream;
+ pluginFuncs->destroystream = NPP_DestroyStream;
+ pluginFuncs->asfile = NPP_StreamAsFile;
+ pluginFuncs->writeready = NPP_WriteReady;
+#ifdef BROWSER_WEBKIT
+ pluginFuncs->write = reinterpret_cast<NPP_WriteProcPtr>(NPP_Write);
+#else
+ pluginFuncs->write = NPP_Write;
+#endif
+ pluginFuncs->print = NPP_Print;
+ pluginFuncs->event = NPP_HandleEvent;
+ pluginFuncs->urlnotify = NPP_URLNotify;
+ pluginFuncs->getvalue = NPP_GetValue;
+ pluginFuncs->setvalue = NPP_SetValue;
+ pluginFuncs->javaClass = NULL;
+#else
+ pluginFuncs->newp = NewNPP_NewProc(NPP_New);
+ pluginFuncs->destroy = NewNPP_DestroyProc(NPP_Destroy);
+ pluginFuncs->setwindow = NewNPP_SetWindowProc(NPP_SetWindow);
+ pluginFuncs->newstream = NewNPP_NewStreamProc(NPP_NewStream);
+ pluginFuncs->destroystream = NewNPP_DestroyStreamProc(NPP_DestroyStream);
+ pluginFuncs->asfile = NewNPP_StreamAsFileProc(NPP_StreamAsFile);
+ pluginFuncs->writeready = NewNPP_WriteReadyProc(NPP_WriteReady);
+ pluginFuncs->write = NewNPP_WriteProc(NPP_Write);
+ pluginFuncs->print = NewNPP_PrintProc(NPP_Print);
+ pluginFuncs->event = NewNPP_HandleEventProc(NPP_HandleEvent);
+ pluginFuncs->urlnotify = NewNPP_URLNotifyProc(NPP_URLNotify);
+ pluginFuncs->getvalue = NewNPP_GetValueProc(NPP_GetValue);
+ pluginFuncs->setvalue = NewNPP_SetValueProc(NPP_SetValue);
+#endif
+ return NPERR_NO_ERROR;
+ }
+
+ const char *NP_GetMIMEDescription() {
+ Debug::log(Debug::Info) << "NP_GetMIMEDescription: returned mime description" << Debug::flush;
+ return "application/x-gwt-dev-mode::GWT dev-mode plugin;application/x-gwt-hosted-mode::GWT dev-mode plugin";
+ }
+
+ const char *NPP_GetMIMEDescription() {
+ return NP_GetMIMEDescription();
+ }
+
+ NP_SHUTDOWN_RETURN_TYPE WINAPI NP_Shutdown(void) {
+ Debug::log(Debug::Debugging) << "NP_Shutdown" << Debug::flush;
+ return NP_SHUTDOWN_RETURN(NPERR_NO_ERROR);
+ }
+
+ NPError NPP_New(NPMIMEType pluginType, NPP instance, uint16 mode, int16 argc, char* argn[],
+ char* argv[], NPSavedData* saved) {
+ Debug::log(Debug::Info) << "NPP_New(instance=" << instance << ",mode=" << mode << ",argc="
+ << argc << ",args=[";
+ for (int i = 0; i < argc; ++i) {
+ Debug::log(Debug::Info) << (i ? "," : "") << argn[i] << "=" << argv[i];
+ }
+ Debug::log(Debug::Info) << "],saved=" << saved << "): version=" << browser->version
+ << Debug::flush;
+ // Version 14 provides browser->createobject, which we need for npruntime support.
+ if (browser->version < 14) {
+ return NPERR_INVALID_INSTANCE_ERROR;
+ }
+ if (instance == NULL) {
+ return NPERR_INVALID_INSTANCE_ERROR;
+ }
+ Plugin* obj;
+// if (saved) {
+// obj = new Plugin(instance, reinterpret_cast<ScriptableInstance*>(saved));
+// } else {
+ obj = new Plugin(instance);
+// }
+ instance->pdata = obj;
+
+ // Make this a windowless plugin.
+ return NPN_SetValue(instance, NPPVpluginWindowBool, NULL);
+ }
+
+ NPError NPP_Destroy(NPP instance, NPSavedData** save) {
+ Debug::log(Debug::Info) << "NPP_Destroy(instance=" << instance << ")" << Debug::flush;
+ if (instance == NULL) {
+ return NPERR_INVALID_INSTANCE_ERROR;
+ }
+ Plugin* plugin = static_cast<Plugin*>(instance->pdata);
+ if (plugin) {
+ delete plugin;
+ instance->pdata = 0;
+ }
+ return NPERR_NO_ERROR;
+ }
+
+ NPError NPP_SetWindow(NPP instance, NPWindow* window) {
+ Debug::log(Debug::Info) << "NPP_SetWindow(instance=" << instance << ",window=" << window
+ << ")" << Debug::flush;
+ return NPERR_NO_ERROR;
+ }
+
+
+ NPError NPP_NewStream(NPP instance, NPMIMEType type, NPStream* stream, NPBool seekable, uint16* stype) {
+ Debug::log(Debug::Info) << "NPP_NewStream(instance=" << instance << ")" << Debug::flush;
+ *stype = NP_ASFILEONLY;
+ return NPERR_NO_ERROR;
+ }
+
+ NPError NPP_DestroyStream(NPP instance, NPStream* stream, NPReason reason) {
+ Debug::log(Debug::Info) << "NPP_DestroyStream(instance=" << instance << ")" << Debug::flush;
+ return NPERR_NO_ERROR;
+ }
+
+ int32 NPP_WriteReady(NPP instance, NPStream* stream) {
+ Debug::log(Debug::Info) << "NPP_WriteReady(instance=" << instance << ")" << Debug::flush;
+ return 0;
+ }
+
+ int32 NPP_Write(NPP instance, NPStream* stream, int32 offset, int32 len, void* buffer) {
+ Debug::log(Debug::Info) << "NPP_Write(instance=" << instance << ")" << Debug::flush;
+ return 0;
+ }
+
+ void NPP_StreamAsFile(NPP instance, NPStream* stream, const char* fname) {
+ Debug::log(Debug::Info) << "NPP_StreamAsFile(instance=" << instance << ")" << Debug::flush;
+ }
+
+ void NPP_Print(NPP instance, NPPrint* platformPrint) {
+ Debug::log(Debug::Info) << "NPP_Print(instance=" << instance << ")" << Debug::flush;
+ }
+
+ int16 NPP_HandleEvent(NPP instance, void* event) {
+ //Debug::log(Debug::Spam) << "NPP_HandleEvent(instance=" << instance << ")" << Debug::flush;
+ return 0 ;
+ }
+
+ void NPP_URLNotify(NPP instance, const char* url, NPReason reason, void* notifyData) {
+ Debug::log(Debug::Info) << "NPP_URLNotify(instance=" << instance << ")" << Debug::flush;
+ }
+
+ NPObject *NPP_GetScriptableInstance(NPP instance) {
+ Debug::log(Debug::Info) << "NPP_GetScriptableInstance(instance=" << instance << ")" << Debug::flush;
+ if (!instance) {
+ return 0;
+ }
+ Plugin* plugin = static_cast<Plugin*>(instance->pdata);
+ ScriptableInstance* scriptableInstance = plugin->getScriptableInstance();
+ NPN_RetainObject(scriptableInstance); // caller expects it retained.
+ return scriptableInstance;
+ }
+
+ NPError NPP_GetValue(NPP instance, NPPVariable variable, void *value) {
+ Debug::log(Debug::Info) << "NPP_GetValue(instance=" << instance << ",var=" << variable << ")"
+ << Debug::flush;
+ switch (variable) {
+ case NPPVpluginScriptableNPObject:
+ // here the plugin is asked by Mozilla to tell if it is scriptable
+ // we should return a valid interface id and a pointer to
+ // nsScriptablePeer interface which we should have implemented
+ // and which should be defined in the corressponding *.xpt file
+ // in the bin/components folder
+ *static_cast<NPObject**>(value) = NPP_GetScriptableInstance(instance);
+ break;
+ default:
+ // pass other ones to the static version of GetValue
+ return NP_GetValue(0, variable, value);
+ }
+ return NPERR_NO_ERROR;
+ }
+
+ NPError NP_GetValue(void*, NPPVariable variable, void *value) {
+ Debug::log(Debug::Info) << "NP_GetValue(var=" << variable << ")" << Debug::flush;
+ switch (variable) {
+ case NPPVpluginNameString:
+ *static_cast<const char **>(value) = "GWT Development-Mode Plugin";
+ break;
+ case NPPVpluginDescriptionString:
+ *static_cast<const char **>(value) = "Plugin to enable debugging of Google Web Toolkit "
+ "applications in development mode.";
+ break;
+ default:
+ Debug::log(Debug::Info) << "NPP_GetValue(var=" << variable
+ << ") -- unexpected variable type" << Debug::flush;
+ return NPERR_GENERIC_ERROR;
+ }
+ return NPERR_NO_ERROR;
+ }
+
+ NPError NPP_SetValue(NPP instance, NPNVariable variable, void *value) {
+ Debug::log(Debug::Info) << "NPP_SetValue(instance=" << instance << ",var=" << variable << ")"
+ << Debug::flush;
+ return NPERR_NO_ERROR;
+ }
+}
diff --git a/plugins/npapi/manifest-template.json b/plugins/npapi/manifest-template.json
new file mode 100644
index 0000000..9c6a1b8
--- /dev/null
+++ b/plugins/npapi/manifest-template.json
@@ -0,0 +1,30 @@
+{
+ "name": "GWT Developer Plugin",
+ "version": "GWT_DEV_PLUGIN_VERSION",
+ "description": "A plugin to enable debugging with GWT's Development Mode",
+ "update_url": "https://dl-ssl.google.com/gwt/plugins/chrome/updates.xml",
+ "icons": {
+ "16": "gwt16.png",
+ "32": "gwt32.png",
+ "48": "gwt48.png",
+ "64": "gwt64.png",
+ "128": "gwt128.png"
+ },
+ "key": "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDi6RrEy9YllRLM8bGBcIEk5ECAG2z+8ngTz7wwzRAQJpOzDp1Alq8fQFjH0+dzxok4RFLrWKHjxGqvXzWyWyTEo2nY3ScHLN/RoANMs8pl9X6TygRyO+3naqZOtLCrYHfV49JKXnYoFVbY5eBVYxHYY3BHAOKJj9onyAM4UPmMzQIDAQAB",
+ "background_page": "background.html",
+ "options_page" : "DevModeOptions.html",
+ "page_action" : {
+ "default_icon" : "gwt32.png",
+ "default_title" : "GWT Development Mode",
+ "default_popup" : "page_action.html"
+ },
+ "permissions" : [
+ "tabs"
+ ],
+ "plugins": [
+ { "path": "WINNT_x86-msvc/npGwtDevPlugin.dll", "public": true },
+ { "path": "Linux_x86-gcc3/libGwtDevPlugin.so", "public": true },
+ { "path": "Linux_x86_64-gcc3/libGwtDevPlugin.so", "public": true },
+ { "path": "Darwin-gcc3/gwtDev.plugin", "public": true }
+ ]
+}
diff --git a/plugins/npapi/mozincludes.h b/plugins/npapi/mozincludes.h
new file mode 100644
index 0000000..302b2eb
--- /dev/null
+++ b/plugins/npapi/mozincludes.h
@@ -0,0 +1,63 @@
+#ifndef _H_mozincludes
+#define _H_mozincludes
+
+// Defines private prototypes for copy constructor and assigment operator. Do
+// not implement these methods.
+#define DISALLOW_EVIL_CONSTRUCTORS(CLASS) \
+ private: \
+ CLASS(const CLASS&); \
+ CLASS& operator=(const CLASS&)
+
+#include "npapi/npapi.h"
+#include "npapi/nphostapi.h"
+#include "npapi/npruntime.h"
+
+void SetNPNFuncs(NPNetscapeFuncs* npnFuncs);
+const NPNetscapeFuncs& GetNPNFuncs();
+
+#include "NPObjectWrapper.h"
+
+inline const NPUTF8 *GetNPStringUTF8Characters(const NPString &npstr) {
+ return npstr.UTF8Characters;
+}
+
+inline uint32 GetNPStringUTF8Length(const NPString &npstr) {
+ return npstr.UTF8Length;
+}
+
+// Convenience wrappers to make an NPVariant from various string types.
+#define STDSTRING_TO_NPVARIANT(str, var) \
+ STRINGN_TO_NPVARIANT(str.data(), static_cast<uint32_t>(str.length()), var)
+
+#define NPSTRING_TO_NPVARIANT(npstr, var) \
+ STRINGN_TO_NPVARIANT(GetNPStringUTF8Characters(npstr), \
+ GetNPStringUTF8Length(npstr), var)
+
+#ifdef linux
+#define OSCALL /**/
+#define WINAPI /**/
+#define DLLEXP /**/
+#define NPINIT_ARG(argname) , NPPluginFuncs* argname
+#define NPINIT_GETS_ENTRYPOINTS
+#define NP_SHUTDOWN_RETURN_TYPE NPError
+#define NP_SHUTDOWN_RETURN(val) (val)
+#endif
+
+#ifdef _WINDOWS
+#define DLLEXP __declspec(dllexport)
+#define NPINIT_ARG(argname) /**/
+#define NP_SHUTDOWN_RETURN_TYPE NPError
+#define NP_SHUTDOWN_RETURN(val) (val)
+#endif
+
+#ifdef __mac
+#define OSCALL /**/
+#define WINAPI /**/
+#define DLLEXP /**/
+#define NPINIT_ARG(argname) /**/
+#define NP_SHUTDOWN_RETURN_TYPE void
+#define NP_SHUTDOWN_RETURN(val) /**/
+typedef void (* NP_LOADDS NPP_ShutdownUPP)(void); // from npupp.h
+#endif
+
+#endif
diff --git a/plugins/npapi/npGwtDevPlugin.def b/plugins/npapi/npGwtDevPlugin.def
new file mode 100644
index 0000000..5a7d84b
--- /dev/null
+++ b/plugins/npapi/npGwtDevPlugin.def
@@ -0,0 +1,7 @@
+LIBRARY npGwtDevPlugin
+
+EXPORTS
+ NP_GetEntryPoints @1
+ NP_Initialize @2
+ NP_Shutdown @3
+ NP_GetMIMEDescription @4
\ No newline at end of file
diff --git a/plugins/npapi/npGwtDevPlugin.rc b/plugins/npapi/npGwtDevPlugin.rc
new file mode 100644
index 0000000..913b4ea
--- /dev/null
+++ b/plugins/npapi/npGwtDevPlugin.rc
@@ -0,0 +1,111 @@
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+#include "windows.h"
+#include "winres.h"
+#undef APSTUDIO_READONLY_SYMBOLS
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
+#ifdef _WIN32
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+#pragma code_page(1252)
+#endif
+
+1 VERSIONINFO
+ FILEVERSION 0,9,0,0
+ PRODUCTVERSION 0,9,0,0
+ FILEFLAGSMASK 0x3fL
+#ifdef _DEBUG
+ FILEFLAGS 0x1L
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS 0x40004L
+ FILETYPE 0x2L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904e4"
+ BEGIN
+ VALUE "CompanyName", "Google Inc"
+ VALUE "FileDescription", "GWT Development Mode Plugin"
+#if 0
+ VALUE "FileExtents", ""
+#endif
+ VALUE "FileOpenName", "Plugin to allow debugging of GWT applications in hosted mode."
+ VALUE "FileVersion", "0.9.0"
+ VALUE "InternalName", "GWT DMP"
+ VALUE "LegalCopyright", "Copyright © 2009 Google Inc. All rights reserved."
+ VALUE "MIMEType", "application/x-gwt-hosted-mode"
+ VALUE "OriginalFilename", "npOOPHM.dll"
+ VALUE "ProductName", "GWT DMP Plugin"
+ VALUE "ProductVersion", "0.9.0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1252
+ END
+END
+
+#ifdef APSTUDIO_INVOKED
+1 TEXTINCLUDE
+BEGIN
+ "resource.h\0"
+END
+
+2 TEXTINCLUDE
+BEGIN
+ "#include ""mfc/afxres.h""\r\n"
+ "\0"
+END
+
+3 TEXTINCLUDE
+BEGIN
+ "\r\n"
+ "\0"
+END
+
+#endif
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog
+//
+
+IDD_ALLOW_DIALOG DIALOGEX 0, 0, 188, 73
+STYLE DS_SYSMODAL | DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_CAPTION
+EXSTYLE WS_EX_TOPMOST
+CAPTION "GWT Plugin Security Alert"
+FONT 10, "Microsoft Sans Serif", 400, 0, 0x0
+BEGIN
+ CONTROL "Remember this decision for this server",IDC_REMEMBER_CHECKBOX,
+ "Button",BS_AUTOCHECKBOX | WS_TABSTOP,30,31,129,10
+ LTEXT "This web server is trying to initiate a GWT Development\r\nMode Connection -- should it be allowed?",IDC_STATIC,10,7,167,19
+ PUSHBUTTON "Allow",IDC_ALLOW_BUTTON,37,50,50,14
+ DEFPUSHBUTTON "Deny",IDCANCEL,100,50,50,14
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// DESIGNINFO
+//
+
+#ifdef APSTUDIO_INVOKED
+GUIDELINES DESIGNINFO
+BEGIN
+ IDD_ALLOW_DIALOG, DIALOG
+ BEGIN
+ LEFTMARGIN, 7
+ RIGHTMARGIN, 181
+ TOPMARGIN, 7
+ BOTTOMMARGIN, 66
+ END
+END
+#endif // APSTUDIO_INVOKED
+
+#else
+
+#endif
diff --git a/plugins/npapi/npapi/npapi.h b/plugins/npapi/npapi/npapi.h
new file mode 100644
index 0000000..dc37367
--- /dev/null
+++ b/plugins/npapi/npapi/npapi.h
@@ -0,0 +1,801 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (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.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is mozilla.org code.
+ *
+ * The Initial Developer of the Original Code is
+ * Netscape Communications Corporation.
+ * Portions created by the Initial Developer are Copyright (C) 1998
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+
+/*
+ * npapi.h $Revision: 3.48 $
+ * Netscape client plug-in API spec
+ */
+
+#ifndef _NPAPI_H_
+#define _NPAPI_H_
+
+
+// BEGIN GOOGLE GEARS MODIFICATIONS
+
+//#include "gears/base/common/int_types.h"
+// Signed integer types
+typedef signed char int8;
+typedef short int16;
+typedef int int32;
+#ifdef _MSC_VER //_MSC_VER is defined iff the code is compiled by MSVC
+typedef __int64 int64;
+#else
+typedef long long int64;
+#endif /* _MSC_VER */
+
+// Unsigned integer types
+typedef unsigned char uint8;
+typedef unsigned short uint16;
+typedef unsigned int uint32;
+#ifdef _MSC_VER
+typedef unsigned __int64 uint64;
+#else
+typedef unsigned long long uint64;
+#endif /* _MSC_VER */
+
+// END GOOGLE GEARS MODIFICATIONS
+
+
+#ifdef __OS2__
+#pragma pack(1)
+#endif
+
+//#include "prtypes.h"
+/* Copied from xp_core.h */
+/* removed #ifdef for hpux defined in /usr/include/model.h */
+#ifndef _INT16
+#define _INT16
+#endif
+#ifndef _INT32
+#define _INT32
+#endif
+#ifndef _UINT16
+#define _UINT16
+#endif
+#ifndef _UINT32
+#define _UINT32
+#endif
+
+/*
+ * NO_NSPR_10_SUPPORT disables the inclusion
+ * of obsolete/protypes.h, whose int16, uint16,
+ * int32, and uint32 typedefs conflict with those
+ * in this file.
+ */
+#ifndef NO_NSPR_10_SUPPORT
+#define NO_NSPR_10_SUPPORT
+#endif
+#ifdef OJI
+#include "jri.h" /* Java Runtime Interface */
+#endif
+
+#if defined (__OS2__ ) || defined (OS2)
+# ifndef XP_OS2
+# define XP_OS2 1
+# endif /* XP_OS2 */
+#endif /* __OS2__ */
+
+#ifdef _WINDOWS
+// BEGIN GOOGLE MODIFICATIONS
+//#ifdef XP_WIN
+typedef __int32 int32_t;
+typedef unsigned __int32 uint32_t;
+//#include <windows.h>
+//#endif // XP_WIN
+// END GOOGLE MODIFICATIONS
+
+# ifndef XP_WIN
+# define XP_WIN 1
+# endif /* XP_WIN */
+#endif /* _WINDOWS */
+
+#ifdef __MWERKS__
+# define _declspec __declspec
+# ifdef __INTEL__
+# undef NULL
+# ifndef XP_WIN
+# define XP_WIN 1
+# endif /* XP_WIN */
+# endif /* __INTEL__ */
+#endif /* __MWERKS__ */
+
+#ifdef XP_MACOSX
+#include <Carbon/Carbon.h>
+#ifdef __LP64__
+#define NP_NO_QUICKDRAW
+#endif
+#endif
+
+#if defined(XP_UNIX)
+# include <stdio.h>
+# if defined(MOZ_X11)
+# include <X11/Xlib.h>
+# include <X11/Xutil.h>
+# endif
+#endif
+
+/*----------------------------------------------------------------------*/
+/* Plugin Version Constants */
+/*----------------------------------------------------------------------*/
+
+#define NP_VERSION_MAJOR 0
+#define NP_VERSION_MINOR 19
+
+
+/* The OS/2 version of Netscape uses RC_DATA to define the
+ mime types, file extensions, etc that are required.
+ Use a vertical bar to separate types, end types with \0.
+ FileVersion and ProductVersion are 32bit ints, all other
+ entries are strings the MUST be terminated wwith a \0.
+
+AN EXAMPLE:
+
+RCDATA NP_INFO_ProductVersion { 1,0,0,1,}
+
+RCDATA NP_INFO_MIMEType { "video/x-video|",
+ "video/x-flick\0" }
+RCDATA NP_INFO_FileExtents { "avi|",
+ "flc\0" }
+RCDATA NP_INFO_FileOpenName{ "MMOS2 video player(*.avi)|",
+ "MMOS2 Flc/Fli player(*.flc)\0" }
+
+RCDATA NP_INFO_FileVersion { 1,0,0,1 }
+RCDATA NP_INFO_CompanyName { "Netscape Communications\0" }
+RCDATA NP_INFO_FileDescription { "NPAVI32 Extension DLL\0"
+RCDATA NP_INFO_InternalName { "NPAVI32\0" )
+RCDATA NP_INFO_LegalCopyright { "Copyright Netscape Communications \251 1996\0"
+RCDATA NP_INFO_OriginalFilename { "NVAPI32.DLL" }
+RCDATA NP_INFO_ProductName { "NPAVI32 Dynamic Link Library\0" }
+
+*/
+
+
+/* RC_DATA types for version info - required */
+#define NP_INFO_ProductVersion 1
+#define NP_INFO_MIMEType 2
+#define NP_INFO_FileOpenName 3
+#define NP_INFO_FileExtents 4
+
+/* RC_DATA types for version info - used if found */
+#define NP_INFO_FileDescription 5
+#define NP_INFO_ProductName 6
+
+/* RC_DATA types for version info - optional */
+#define NP_INFO_CompanyName 7
+#define NP_INFO_FileVersion 8
+#define NP_INFO_InternalName 9
+#define NP_INFO_LegalCopyright 10
+#define NP_INFO_OriginalFilename 11
+
+#ifndef RC_INVOKED
+
+
+
+/*----------------------------------------------------------------------*/
+/* Definition of Basic Types */
+/*----------------------------------------------------------------------*/
+
+#ifndef _UINT16
+typedef unsigned short uint16;
+#endif
+
+#ifndef _UINT32
+# if defined(__alpha) || defined(__amd64__) || defined(__x86_64__)
+typedef unsigned int uint32;
+# else /* __alpha */
+typedef unsigned long uint32;
+# endif /* __alpha */
+#endif
+
+/*
+ * AIX defines these in sys/inttypes.h included from sys/types.h
+ */
+#ifndef AIX
+#ifndef _INT16
+typedef short int16;
+#endif
+
+#ifndef _INT32
+# if defined(__alpha) || defined(__amd64__) || defined(__x86_64__)
+typedef int int32;
+# else /* __alpha */
+typedef long int32;
+# endif /* __alpha */
+#endif
+#endif
+
+#ifndef FALSE
+#define FALSE (0)
+#endif
+#ifndef TRUE
+#define TRUE (1)
+#endif
+#ifndef NULL
+#define NULL (0L)
+#endif
+
+#ifdef XP_MACOSX
+typedef enum {
+#ifndef NP_NO_QUICKDRAW
+ NPDrawingModelQuickDraw = 0,
+#endif
+ NPDrawingModelCoreGraphics = 1
+} NPDrawingModel;
+#endif
+
+typedef unsigned char NPBool;
+typedef int16 NPError;
+typedef int16 NPReason;
+typedef char* NPMIMEType;
+
+
+
+/*----------------------------------------------------------------------*/
+/* Structures and definitions */
+/*----------------------------------------------------------------------*/
+
+/*
+ * NPP is a plug-in's opaque instance handle
+ */
+typedef struct _NPP
+{
+ void* pdata; /* plug-in private data */
+ void* ndata; /* netscape private data */
+} NPP_t;
+
+typedef NPP_t* NPP;
+
+
+typedef struct _NPStream
+{
+ void* pdata; /* plug-in private data */
+ void* ndata; /* netscape private data */
+ const char* url;
+ uint32 end;
+ uint32 lastmodified;
+ void* notifyData;
+ const char* headers; /* Response headers from host.
+ * Exists only for >= NPVERS_HAS_RESPONSE_HEADERS.
+ * Used for HTTP only; NULL for non-HTTP.
+ * Available from NPP_NewStream onwards.
+ * Plugin should copy this data before storing it.
+ * Includes HTTP status line and all headers,
+ * preferably verbatim as received from server,
+ * headers formatted as in HTTP ("Header: Value"),
+ * and newlines (\n, NOT \r\n) separating lines.
+ * Terminated by \n\0 (NOT \n\n\0). */
+} NPStream;
+
+
+typedef struct _NPByteRange
+{
+ int32 offset; /* negative offset means from the end */
+ uint32 length;
+ struct _NPByteRange* next;
+} NPByteRange;
+
+
+typedef struct _NPSavedData
+{
+ int32 len;
+ void* buf;
+} NPSavedData;
+
+
+typedef struct _NPRect
+{
+ uint16 top;
+ uint16 left;
+ uint16 bottom;
+ uint16 right;
+} NPRect;
+
+typedef struct _NPSize
+{
+ int32 width;
+ int32 height;
+} NPSize;
+
+#ifdef XP_UNIX
+/*
+ * Unix specific structures and definitions
+ */
+
+/*
+ * Callback Structures.
+ *
+ * These are used to pass additional platform specific information.
+ */
+enum {
+ NP_SETWINDOW = 1,
+ NP_PRINT
+};
+
+typedef struct
+{
+ int32 type;
+} NPAnyCallbackStruct;
+
+typedef struct
+{
+ int32 type;
+#ifdef MOZ_X11
+ Display* display;
+ Visual* visual;
+ Colormap colormap;
+ unsigned int depth;
+#endif
+} NPSetWindowCallbackStruct;
+
+typedef struct
+{
+ int32 type;
+ FILE* fp;
+} NPPrintCallbackStruct;
+
+#endif /* XP_UNIX */
+
+
+/*
+ * The following masks are applied on certain platforms to NPNV and
+ * NPPV selectors that pass around pointers to COM interfaces. Newer
+ * compilers on some platforms may generate vtables that are not
+ * compatible with older compilers. To prevent older plugins from
+ * not understanding a new browser's ABI, these masks change the
+ * values of those selectors on those platforms. To remain backwards
+ * compatible with differenet versions of the browser, plugins can
+ * use these masks to dynamically determine and use the correct C++
+ * ABI that the browser is expecting. This does not apply to Windows
+ * as Microsoft's COM ABI will likely not change.
+ */
+
+#define NP_ABI_GCC3_MASK 0x10000000
+/*
+ * gcc 3.x generated vtables on UNIX and OSX are incompatible with
+ * previous compilers.
+ */
+#if (defined (XP_UNIX) && defined(__GNUC__) && (__GNUC__ >= 3))
+#define _NP_ABI_MIXIN_FOR_GCC3 NP_ABI_GCC3_MASK
+#else
+#define _NP_ABI_MIXIN_FOR_GCC3 0
+#endif
+
+
+#define NP_ABI_MACHO_MASK 0x01000000
+/*
+ * On OSX, the Mach-O executable format is significantly
+ * different than CFM. In addition to having a different
+ * C++ ABI, it also has has different C calling convention.
+ * You must use glue code when calling between CFM and
+ * Mach-O C functions.
+ */
+#if (defined(TARGET_RT_MAC_MACHO))
+#define _NP_ABI_MIXIN_FOR_MACHO NP_ABI_MACHO_MASK
+#else
+#define _NP_ABI_MIXIN_FOR_MACHO 0
+#endif
+
+
+#define NP_ABI_MASK (_NP_ABI_MIXIN_FOR_GCC3 | _NP_ABI_MIXIN_FOR_MACHO)
+
+/*
+ * List of variable names for which NPP_GetValue shall be implemented
+ */
+typedef enum {
+ NPPVpluginNameString = 1,
+ NPPVpluginDescriptionString,
+ NPPVpluginWindowBool,
+ NPPVpluginTransparentBool,
+ NPPVjavaClass, /* Not implemented in Mozilla 1.0 */
+ NPPVpluginWindowSize,
+ NPPVpluginTimerInterval,
+
+ NPPVpluginScriptableInstance = (10 | NP_ABI_MASK),
+ NPPVpluginScriptableIID = 11,
+
+ /* Introduced in Mozilla 0.9.9 */
+ NPPVjavascriptPushCallerBool = 12,
+
+ /* Introduced in Mozilla 1.0 */
+ NPPVpluginKeepLibraryInMemory = 13,
+ NPPVpluginNeedsXEmbed = 14,
+
+ /* Get the NPObject for scripting the plugin. Introduced in Firefox
+ * 1.0 (NPAPI minor version 14).
+ */
+ NPPVpluginScriptableNPObject = 15,
+
+ /* Get the plugin value (as \0-terminated UTF-8 string data) for
+ * form submission if the plugin is part of a form. Use
+ * NPN_MemAlloc() to allocate memory for the string data. Introduced
+ * in Mozilla 1.8b2 (NPAPI minor version 15).
+ */
+ NPPVformValue = 16
+#ifdef XP_MACOSX
+ /* Used for negotiating drawing models */
+ , NPPVpluginDrawingModel = 1000
+#endif
+} NPPVariable;
+
+/*
+ * List of variable names for which NPN_GetValue is implemented by Mozilla
+ */
+typedef enum {
+ NPNVxDisplay = 1,
+ NPNVxtAppContext,
+ NPNVnetscapeWindow,
+ NPNVjavascriptEnabledBool,
+ NPNVasdEnabledBool,
+ NPNVisOfflineBool,
+
+ /* 10 and over are available on Mozilla builds starting with 0.9.4 */
+ NPNVserviceManager = (10 | NP_ABI_MASK),
+ NPNVDOMElement = (11 | NP_ABI_MASK), /* available in Mozilla 1.2 */
+ NPNVDOMWindow = (12 | NP_ABI_MASK),
+ NPNVToolkit = (13 | NP_ABI_MASK),
+ NPNVSupportsXEmbedBool = 14,
+
+ /* Get the NPObject wrapper for the browser window. */
+ NPNVWindowNPObject = 15,
+
+ /* Get the NPObject wrapper for the plugins DOM element. */
+ NPNVPluginElementNPObject = 16,
+
+ NPNVSupportsWindowless = 17
+
+#ifdef XP_MACOSX
+ /* Used for negotiating drawing models */
+ , NPNVpluginDrawingModel = 1000
+#ifndef NP_NO_QUICKDRAW
+ , NPNVsupportsQuickDrawBool = 2000
+#endif
+ , NPNVsupportsCoreGraphicsBool = 2001
+#endif
+} NPNVariable;
+
+/*
+ * The type of Tookkit the widgets use
+ */
+typedef enum {
+ NPNVGtk12 = 1,
+ NPNVGtk2
+} NPNToolkitType;
+
+/*
+ * The type of a NPWindow - it specifies the type of the data structure
+ * returned in the window field.
+ */
+typedef enum {
+ NPWindowTypeWindow = 1,
+ NPWindowTypeDrawable
+} NPWindowType;
+
+typedef struct _NPWindow
+{
+ void* window; /* Platform specific window handle */
+ /* OS/2: x - Position of bottom left corner */
+ /* OS/2: y - relative to visible netscape window */
+ int32 x; /* Position of top left corner relative */
+ int32 y; /* to a netscape page. */
+ uint32 width; /* Maximum window size */
+ uint32 height;
+ NPRect clipRect; /* Clipping rectangle in port coordinates */
+ /* Used by MAC only. */
+#if defined(XP_UNIX) && !defined(XP_MACOSX)
+ void * ws_info; /* Platform-dependent additonal data */
+#endif /* XP_UNIX */
+ NPWindowType type; /* Is this a window or a drawable? */
+} NPWindow;
+
+
+typedef struct _NPFullPrint
+{
+ NPBool pluginPrinted;/* Set TRUE if plugin handled fullscreen printing */
+ NPBool printOne; /* TRUE if plugin should print one copy to default printer */
+ void* platformPrint; /* Platform-specific printing info */
+} NPFullPrint;
+
+typedef struct _NPEmbedPrint
+{
+ NPWindow window;
+ void* platformPrint; /* Platform-specific printing info */
+} NPEmbedPrint;
+
+typedef struct _NPPrint
+{
+ uint16 mode; /* NP_FULL or NP_EMBED */
+ union
+ {
+ NPFullPrint fullPrint; /* if mode is NP_FULL */
+ NPEmbedPrint embedPrint; /* if mode is NP_EMBED */
+ } print;
+} NPPrint;
+
+#ifdef XP_MACOSX
+typedef EventRecord NPEvent;
+#elif defined(XP_WIN)
+typedef struct _NPEvent
+{
+ uint16 event;
+ uint32 wParam;
+ uint32 lParam;
+} NPEvent;
+#elif defined(XP_OS2)
+typedef struct _NPEvent
+{
+ uint32 event;
+ uint32 wParam;
+ uint32 lParam;
+} NPEvent;
+#elif defined (XP_UNIX) && defined(MOZ_X11)
+typedef XEvent NPEvent;
+#else
+typedef void* NPEvent;
+#endif /* XP_MACOSX */
+
+#ifdef XP_MACOSX
+typedef void* NPRegion;
+#ifndef NP_NO_QUICKDRAW
+typedef RgnHandle NPQDRegion;
+#endif
+typedef CGPathRef NPCGRegion;
+#elif defined(XP_WIN)
+//typedef HRGN NPRegion;
+typedef int NPRegion;
+#elif defined(XP_UNIX) && defined(MOZ_X11)
+typedef Region NPRegion;
+#else
+typedef void *NPRegion;
+#endif /* XP_MACOSX */
+
+#ifdef XP_MACOSX
+/*
+ * Mac-specific structures and definitions.
+ */
+
+typedef struct NP_Port
+{
+ CGrafPtr port; /* Grafport */
+ int32 portx; /* position inside the topmost window */
+ int32 porty;
+} NP_Port;
+
+typedef struct NP_CGContext
+{
+ CGContextRef context;
+ WindowRef window;
+} NP_CGContext;
+
+/*
+ * Non-standard event types that can be passed to HandleEvent
+ */
+
+enum NPEventType {
+ NPEventType_GetFocusEvent = (osEvt + 16),
+ NPEventType_LoseFocusEvent,
+ NPEventType_AdjustCursorEvent,
+ NPEventType_MenuCommandEvent,
+ NPEventType_ClippingChangedEvent,
+ NPEventType_ScrollingBeginsEvent = 1000,
+ NPEventType_ScrollingEndsEvent
+};
+
+#ifdef OBSOLETE
+#define getFocusEvent (osEvt + 16)
+#define loseFocusEvent (osEvt + 17)
+#define adjustCursorEvent (osEvt + 18)
+#endif
+#endif /* XP_MACOSX */
+
+/*
+ * Values for mode passed to NPP_New:
+ */
+#define NP_EMBED 1
+#define NP_FULL 2
+
+/*
+ * Values for stream type passed to NPP_NewStream:
+ */
+#define NP_NORMAL 1
+#define NP_SEEK 2
+#define NP_ASFILE 3
+#define NP_ASFILEONLY 4
+
+#define NP_MAXREADY (((unsigned)(~0)<<1)>>1)
+
+
+/*----------------------------------------------------------------------*/
+/* Error and Reason Code definitions */
+/*----------------------------------------------------------------------*/
+
+/*
+ * Values of type NPError:
+ */
+#define NPERR_BASE 0
+#define NPERR_NO_ERROR (NPERR_BASE + 0)
+#define NPERR_GENERIC_ERROR (NPERR_BASE + 1)
+#define NPERR_INVALID_INSTANCE_ERROR (NPERR_BASE + 2)
+#define NPERR_INVALID_FUNCTABLE_ERROR (NPERR_BASE + 3)
+#define NPERR_MODULE_LOAD_FAILED_ERROR (NPERR_BASE + 4)
+#define NPERR_OUT_OF_MEMORY_ERROR (NPERR_BASE + 5)
+#define NPERR_INVALID_PLUGIN_ERROR (NPERR_BASE + 6)
+#define NPERR_INVALID_PLUGIN_DIR_ERROR (NPERR_BASE + 7)
+#define NPERR_INCOMPATIBLE_VERSION_ERROR (NPERR_BASE + 8)
+#define NPERR_INVALID_PARAM (NPERR_BASE + 9)
+#define NPERR_INVALID_URL (NPERR_BASE + 10)
+#define NPERR_FILE_NOT_FOUND (NPERR_BASE + 11)
+#define NPERR_NO_DATA (NPERR_BASE + 12)
+#define NPERR_STREAM_NOT_SEEKABLE (NPERR_BASE + 13)
+
+/*
+ * Values of type NPReason:
+ */
+#define NPRES_BASE 0
+#define NPRES_DONE (NPRES_BASE + 0)
+#define NPRES_NETWORK_ERR (NPRES_BASE + 1)
+#define NPRES_USER_BREAK (NPRES_BASE + 2)
+
+/*
+ * Don't use these obsolete error codes any more.
+ */
+#define NP_NOERR NP_NOERR_is_obsolete_use_NPERR_NO_ERROR
+#define NP_EINVAL NP_EINVAL_is_obsolete_use_NPERR_GENERIC_ERROR
+#define NP_EABORT NP_EABORT_is_obsolete_use_NPRES_USER_BREAK
+
+/*
+ * Version feature information
+ */
+#define NPVERS_HAS_STREAMOUTPUT 8
+#define NPVERS_HAS_NOTIFICATION 9
+#define NPVERS_HAS_LIVECONNECT 9
+#define NPVERS_WIN16_HAS_LIVECONNECT 9
+#define NPVERS_68K_HAS_LIVECONNECT 11
+#define NPVERS_HAS_WINDOWLESS 11
+#define NPVERS_HAS_XPCONNECT_SCRIPTING 13
+#define NPVERS_HAS_NPRUNTIME_SCRIPTING 14
+#define NPVERS_HAS_FORM_VALUES 15
+#define NPVERS_HAS_POPUPS_ENABLED_STATE 16
+#define NPVERS_HAS_RESPONSE_HEADERS 17
+#define NPVERS_HAS_NPOBJECT_ENUM 18
+#define NPVERS_HAS_PLUGIN_THREAD_ASYNC_CALL 19
+
+/*----------------------------------------------------------------------*/
+/* Function Prototypes */
+/*----------------------------------------------------------------------*/
+
+#if defined(_WINDOWS) && !defined(WIN32)
+#define NP_LOADDS _loadds
+#else
+#if defined(__OS2__)
+#define NP_LOADDS _System
+#else
+#define NP_LOADDS
+#endif
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * NPP_* functions are provided by the plugin and called by the navigator.
+ */
+
+#ifdef XP_UNIX
+const char* NPP_GetMIMEDescription(void);
+#endif /* XP_UNIX */
+
+NPError NP_LOADDS NPP_Initialize(void);
+void NP_LOADDS NPP_Shutdown(void);
+NPError NP_LOADDS NPP_New(NPMIMEType pluginType, NPP instance,
+ uint16 mode, int16 argc, char* argn[],
+ char* argv[], NPSavedData* saved);
+NPError NP_LOADDS NPP_Destroy(NPP instance, NPSavedData** save);
+NPError NP_LOADDS NPP_SetWindow(NPP instance, NPWindow* window);
+NPError NP_LOADDS NPP_NewStream(NPP instance, NPMIMEType type,
+ NPStream* stream, NPBool seekable,
+ uint16* stype);
+NPError NP_LOADDS NPP_DestroyStream(NPP instance, NPStream* stream,
+ NPReason reason);
+int32 NP_LOADDS NPP_WriteReady(NPP instance, NPStream* stream);
+int32 NP_LOADDS NPP_Write(NPP instance, NPStream* stream, int32 offset,
+ int32 len, void* buffer);
+void NP_LOADDS NPP_StreamAsFile(NPP instance, NPStream* stream,
+ const char* fname);
+void NP_LOADDS NPP_Print(NPP instance, NPPrint* platformPrint);
+int16 NP_LOADDS NPP_HandleEvent(NPP instance, void* event);
+void NP_LOADDS NPP_URLNotify(NPP instance, const char* url,
+ NPReason reason, void* notifyData);
+#ifdef OJI
+jref NP_LOADDS NPP_GetJavaClass(void);
+#endif
+NPError NP_LOADDS NPP_GetValue(NPP instance, NPPVariable variable, void *value);
+NPError NP_LOADDS NPP_SetValue(NPP instance, NPNVariable variable, void *value);
+
+/*
+ * NPN_* functions are provided by the navigator and called by the plugin.
+ */
+void NP_LOADDS NPN_Version(int* plugin_major, int* plugin_minor,
+ int* netscape_major, int* netscape_minor);
+NPError NP_LOADDS NPN_GetURLNotify(NPP instance, const char* url,
+ const char* target, void* notifyData);
+NPError NP_LOADDS NPN_GetURL(NPP instance, const char* url,
+ const char* target);
+NPError NP_LOADDS NPN_PostURLNotify(NPP instance, const char* url,
+ const char* target, uint32 len,
+ const char* buf, NPBool file,
+ void* notifyData);
+NPError NP_LOADDS NPN_PostURL(NPP instance, const char* url,
+ const char* target, uint32 len,
+ const char* buf, NPBool file);
+NPError NP_LOADDS NPN_RequestRead(NPStream* stream, NPByteRange* rangeList);
+NPError NP_LOADDS NPN_NewStream(NPP instance, NPMIMEType type,
+ const char* target, NPStream** stream);
+int32 NP_LOADDS NPN_Write(NPP instance, NPStream* stream, int32 len, void* buffer);
+NPError NP_LOADDS NPN_DestroyStream(NPP instance, NPStream* stream, NPReason reason);
+void NP_LOADDS NPN_Status(NPP instance, const char* message);
+const char* NP_LOADDS NPN_UserAgent(NPP instance);
+void* NP_LOADDS NPN_MemAlloc(uint32 size);
+void NP_LOADDS NPN_MemFree(void* ptr);
+uint32 NP_LOADDS NPN_MemFlush(uint32 size);
+void NP_LOADDS NPN_ReloadPlugins(NPBool reloadPages);
+#ifdef OJI
+JRIEnv* NP_LOADDS NPN_GetJavaEnv(void);
+jref NP_LOADDS NPN_GetJavaPeer(NPP instance);
+#endif
+NPError NP_LOADDS NPN_GetValue(NPP instance, NPNVariable variable, void *value);
+NPError NP_LOADDS NPN_SetValue(NPP instance, NPPVariable variable, void *value);
+void NP_LOADDS NPN_InvalidateRect(NPP instance, NPRect *invalidRect);
+void NP_LOADDS NPN_InvalidateRegion(NPP instance, NPRegion invalidRegion);
+void NP_LOADDS NPN_ForceRedraw(NPP instance);
+void NP_LOADDS NPN_PushPopupsEnabledState(NPP instance, NPBool enabled);
+void NP_LOADDS NPN_PopPopupsEnabledState(NPP instance);
+void NP_LOADDS NPN_PluginThreadAsyncCall(NPP instance,
+ void (*func) (void *),
+ void *userData);
+
+#ifdef __cplusplus
+} /* end extern "C" */
+#endif
+
+#endif /* RC_INVOKED */
+#ifdef __OS2__
+#pragma pack()
+#endif
+
+#endif /* _NPAPI_H_ */
diff --git a/plugins/npapi/npapi/nphostapi.h b/plugins/npapi/npapi/nphostapi.h
new file mode 100644
index 0000000..2794dee
--- /dev/null
+++ b/plugins/npapi/npapi/nphostapi.h
@@ -0,0 +1,289 @@
+// Copyright 2006 Google Inc. All Rights Reserved.
+
+#ifndef _NPHOSTAPI_H_
+#define _NPHOSTAPI_H_
+
+#include "npapi.h"
+#include "npruntime.h"
+
+// BEGIN GOOGLE GEARS MODIFICATIONS
+
+#ifndef STDCALL
+#ifdef WIN32
+//#define STDCALL WINAPI
+#define STDCALL __stdcall
+#else
+#define STDCALL
+#endif // WIN32
+#endif // STDCALL
+
+// END GOOGLE GEARS MODIFICATIONS
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+//
+// NPAPI NPP Function Pointers
+//
+typedef NPError (*NPP_NewProcPtr)(NPMIMEType pluginType,
+ NPP instance,
+ uint16 mode,
+ int16 argc,
+ char* argn[],
+ char* argv[],
+ NPSavedData* saved);
+typedef NPError (*NPP_DestroyProcPtr)(NPP instance,
+ NPSavedData** save);
+typedef NPError (*NPP_SetWindowProcPtr)(NPP instance,
+ NPWindow* window);
+typedef NPError (*NPP_NewStreamProcPtr)(NPP instance,
+ NPMIMEType type,
+ NPStream* stream,
+ NPBool seekable,
+ uint16* stype);
+typedef NPError (*NPP_DestroyStreamProcPtr)(NPP instance,
+ NPStream* stream,
+ NPReason reason);
+typedef int32 (*NPP_WriteReadyProcPtr)(NPP instance,
+ NPStream* stream);
+typedef int32 (*NPP_WriteProcPtr)(NPP instance,
+ NPStream* stream,
+ int32 offset,
+ int32 len,
+ void* buffer);
+typedef void (*NPP_StreamAsFileProcPtr)(NPP instance,
+ NPStream* stream,
+ const char* fname);
+typedef void (*NPP_PrintProcPtr)(NPP instance,
+ NPPrint* platformPrint);
+typedef int16 (*NPP_HandleEventProcPtr)(NPP instance,
+ void* event);
+typedef void (*NPP_URLNotifyProcPtr)(NPP instance,
+ const char* url,
+ NPReason reason,
+ void* notifyData);
+typedef void* JRIGlobalRef; //not using this right now
+typedef NPError (*NPP_GetValueProcPtr)(NPP instance,
+ NPPVariable variable,
+ void *ret_alue);
+typedef NPError (*NPP_SetValueProcPtr)(NPP instance,
+ NPNVariable variable,
+ void *ret_alue);
+
+//
+// NPAPI NPN Function Pointers
+//
+typedef NPError (*NPN_GetURLProcPtr)(NPP instance,
+ const char* URL,
+ const char* window);
+typedef NPError (*NPN_PostURLProcPtr)(NPP instance,
+ const char* URL,
+ const char* window,
+ uint32 len,
+ const char* buf,
+ NPBool file);
+typedef NPError (*NPN_RequestReadProcPtr)(NPStream* stream,
+ NPByteRange* rangeList);
+typedef NPError (*NPN_NewStreamProcPtr)(NPP instance,
+ NPMIMEType type,
+ const char* window,
+ NPStream** stream);
+typedef int32 (*NPN_WriteProcPtr)(NPP instance,
+ NPStream* stream,
+ int32 len,
+ void* buffer);
+typedef NPError (*NPN_DestroyStreamProcPtr)(NPP instance,
+ NPStream* stream,
+ NPReason reason);
+typedef void (*NPN_StatusProcPtr)(NPP instance,
+ const char* message);
+typedef const char* (*NPN_UserAgentProcPtr)(NPP instance);
+typedef void* (*NPN_MemAllocProcPtr)(uint32 size);
+typedef void (*NPN_MemFreeProcPtr)(void* ptr);
+typedef uint32 (*NPN_MemFlushProcPtr)(uint32 size);
+typedef void (*NPN_ReloadPluginsProcPtr)(NPBool reloadPages);
+
+typedef void* (*NPN_GetJavaEnvProcPtr)(void);
+typedef void* (*NPN_GetJavaPeerProcPtr)(NPP instance);
+
+typedef NPError (*NPN_GetURLNotifyProcPtr)(NPP instance,
+ const char* URL,
+ const char* window,
+ void* notifyData);
+typedef NPError (*NPN_PostURLNotifyProcPtr)(NPP instance,
+ const char* URL,
+ const char* window,
+ uint32 len,
+ const char* buf,
+ NPBool file,
+ void* notifyData);
+typedef NPError (*NPN_GetValueProcPtr)(NPP instance,
+ NPNVariable variable,
+ void *ret_value);
+typedef NPError (*NPN_SetValueProcPtr)(NPP instance,
+ NPPVariable variable,
+ void *value);
+typedef void (*NPN_InvalidateRectProcPtr)(NPP instance,
+ NPRect *rect);
+typedef void (*NPN_InvalidateRegionProcPtr)(NPP instance,
+ NPRegion region);
+typedef void (*NPN_ForceRedrawProcPtr)(NPP instance);
+
+typedef void (*NPN_ReleaseVariantValueProcPtr) (NPVariant *variant);
+
+typedef NPIdentifier (*NPN_GetStringIdentifierProcPtr) (const NPUTF8 *name);
+typedef void (*NPN_GetStringIdentifiersProcPtr) (const NPUTF8 **names,
+ int32_t nameCount,
+ NPIdentifier *identifiers);
+typedef NPIdentifier (*NPN_GetIntIdentifierProcPtr) (int32_t intid);
+typedef int32_t (*NPN_IntFromIdentifierProcPtr) (NPIdentifier identifier);
+typedef bool (*NPN_IdentifierIsStringProcPtr) (NPIdentifier identifier);
+typedef NPUTF8 * (*NPN_UTF8FromIdentifierProcPtr) (NPIdentifier identifier);
+
+typedef NPObject* (*NPN_CreateObjectProcPtr) (NPP,
+ NPClass *aClass);
+typedef NPObject* (*NPN_RetainObjectProcPtr) (NPObject *obj);
+typedef void (*NPN_ReleaseObjectProcPtr) (NPObject *obj);
+typedef bool (*NPN_InvokeProcPtr) (NPP npp,
+ NPObject *obj,
+ NPIdentifier methodName,
+ const NPVariant *args,
+ unsigned argCount,
+ NPVariant *result);
+typedef bool (*NPN_InvokeDefaultProcPtr) (NPP npp,
+ NPObject *obj,
+ const NPVariant *args,
+ unsigned argCount,
+ NPVariant *result);
+typedef bool (*NPN_EvaluateProcPtr) (NPP npp,
+ NPObject *obj,
+ NPString *script,
+ NPVariant *result);
+typedef bool (*NPN_GetPropertyProcPtr) (NPP npp,
+ NPObject *obj,
+ NPIdentifier propertyName,
+ NPVariant *result);
+typedef bool (*NPN_SetPropertyProcPtr) (NPP npp,
+ NPObject *obj,
+ NPIdentifier propertyName,
+ const NPVariant *value);
+typedef bool (*NPN_HasPropertyProcPtr) (NPP,
+ NPObject *npobj,
+ NPIdentifier propertyName);
+typedef bool (*NPN_HasMethodProcPtr) (NPP npp,
+ NPObject *npobj,
+ NPIdentifier methodName);
+typedef bool (*NPN_RemovePropertyProcPtr) (NPP npp,
+ NPObject *obj,
+ NPIdentifier propertyName);
+typedef void (*NPN_SetExceptionProcPtr) (NPObject *obj,
+ const NPUTF8 *message);
+typedef void (*NPN_PushPopupsEnabledStateProcPtr)(NPP npp,
+ NPBool enabled);
+typedef void (*NPN_PopPopupsEnabledStateProcPtr)(NPP npp);
+typedef bool (*NPN_EnumerateProcPtr)(NPP npp,
+ NPObject *obj,
+ NPIdentifier **identifier,
+ uint32_t *count);
+typedef void (*NPN_PluginThreadAsyncCallProcPtr)(NPP instance,
+ void (*func)(void *),
+ void *userData);
+typedef bool (*NPN_ConstructProcPtr)(NPP npp,
+ NPObject* obj,
+ const NPVariant *args,
+ uint32_t argCount,
+ NPVariant *result);
+
+//
+// NPAPI Function table of NPP functions (functions provided by plugin to host)
+//
+typedef struct _NPPluginFuncs {
+ unsigned short size;
+ unsigned short version;
+ NPP_NewProcPtr newp;
+ NPP_DestroyProcPtr destroy;
+ NPP_SetWindowProcPtr setwindow;
+ NPP_NewStreamProcPtr newstream;
+ NPP_DestroyStreamProcPtr destroystream;
+ NPP_StreamAsFileProcPtr asfile;
+ NPP_WriteReadyProcPtr writeready;
+ NPP_WriteProcPtr write;
+ NPP_PrintProcPtr print;
+ NPP_HandleEventProcPtr event;
+ NPP_URLNotifyProcPtr urlnotify;
+ JRIGlobalRef javaClass;
+ NPP_GetValueProcPtr getvalue;
+ NPP_SetValueProcPtr setvalue;
+} NPPluginFuncs;
+
+//
+// NPAPI Function table NPN functions (functions provided by host to plugin)
+//
+typedef struct _NPNetscapeFuncs {
+ uint16 size;
+ uint16 version;
+ NPN_GetURLProcPtr geturl;
+ NPN_PostURLProcPtr posturl;
+ NPN_RequestReadProcPtr requestread;
+ NPN_NewStreamProcPtr newstream;
+ NPN_WriteProcPtr write;
+ NPN_DestroyStreamProcPtr destroystream;
+ NPN_StatusProcPtr status;
+ NPN_UserAgentProcPtr uagent;
+ NPN_MemAllocProcPtr memalloc;
+ NPN_MemFreeProcPtr memfree;
+ NPN_MemFlushProcPtr memflush;
+ NPN_ReloadPluginsProcPtr reloadplugins;
+ NPN_GetJavaEnvProcPtr getJavaEnv;
+ NPN_GetJavaPeerProcPtr getJavaPeer;
+ NPN_GetURLNotifyProcPtr geturlnotify;
+ NPN_PostURLNotifyProcPtr posturlnotify;
+ NPN_GetValueProcPtr getvalue;
+ NPN_SetValueProcPtr setvalue;
+ NPN_InvalidateRectProcPtr invalidaterect;
+ NPN_InvalidateRegionProcPtr invalidateregion;
+ NPN_ForceRedrawProcPtr forceredraw;
+
+ NPN_GetStringIdentifierProcPtr getstringidentifier;
+ NPN_GetStringIdentifiersProcPtr getstringidentifiers;
+ NPN_GetIntIdentifierProcPtr getintidentifier;
+ NPN_IdentifierIsStringProcPtr identifierisstring;
+ NPN_UTF8FromIdentifierProcPtr utf8fromidentifier;
+ NPN_IntFromIdentifierProcPtr intfromidentifier;
+ NPN_CreateObjectProcPtr createobject;
+ NPN_RetainObjectProcPtr retainobject;
+ NPN_ReleaseObjectProcPtr releaseobject;
+ NPN_InvokeProcPtr invoke;
+ NPN_InvokeDefaultProcPtr invokeDefault;
+ NPN_EvaluateProcPtr evaluate;
+ NPN_GetPropertyProcPtr getproperty;
+ NPN_SetPropertyProcPtr setproperty;
+ NPN_RemovePropertyProcPtr removeproperty;
+ NPN_HasPropertyProcPtr hasproperty;
+ NPN_HasMethodProcPtr hasmethod;
+ NPN_ReleaseVariantValueProcPtr releasevariantvalue;
+ NPN_SetExceptionProcPtr setexception;
+ NPN_PushPopupsEnabledStateProcPtr pushpopupsenabledstate;
+ NPN_PopPopupsEnabledStateProcPtr poppopupsenabledstate;
+ // comment these out since they aren't provided by Firefox 1.5 and
+ // we don't currently use them anyway.
+// NPN_EnumerateProcPtr enumerate;
+// NPN_PluginThreadAsyncCallProcPtr pluginthreadasynccall;
+// NPN_ConstructProcPtr construct;
+} NPNetscapeFuncs;
+
+//
+// NPAPI DLL entry points
+//
+
+typedef NPError (STDCALL * NP_InitializeFunc)(NPNetscapeFuncs* pFuncs);
+typedef NPError (STDCALL * NP_GetEntryPointsFunc)(NPPluginFuncs* pFuncs);
+typedef NPError (STDCALL * NP_ShutdownFunc)(void);
+
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
+
+#endif // _NPHOSTAPI_H_
diff --git a/plugins/npapi/npapi/npruntime.h b/plugins/npapi/npapi/npruntime.h
new file mode 100644
index 0000000..21b8089
--- /dev/null
+++ b/plugins/npapi/npapi/npruntime.h
@@ -0,0 +1,380 @@
+/*
+ * Copyright (C) 2004, Apple Computer, Inc. and The Mozilla Foundation.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the names of Apple Computer, Inc. ("Apple") or The Mozilla
+ * Foundation ("Mozilla") nor the names of their contributors may be used
+ * to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE, MOZILLA AND THEIR CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE, MOZILLA OR
+ * THEIR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Revision 1 (March 4, 2004):
+ * Initial proposal.
+ *
+ * Revision 2 (March 10, 2004):
+ * All calls into script were made asynchronous. Results are
+ * provided via the NPScriptResultFunctionPtr callback.
+ *
+ * Revision 3 (March 10, 2004):
+ * Corrected comments to not refer to class retain/release FunctionPtrs.
+ *
+ * Revision 4 (March 11, 2004):
+ * Added additional convenience NPN_SetExceptionWithUTF8().
+ * Changed NPHasPropertyFunctionPtr and NPHasMethodFunctionPtr to take NPClass
+ * pointers instead of NPObject pointers.
+ * Added NPIsValidIdentifier().
+ *
+ * Revision 5 (March 17, 2004):
+ * Added context parameter to result callbacks from ScriptObject functions.
+ *
+ * Revision 6 (March 29, 2004):
+ * Renamed functions implemented by user agent to NPN_*. Removed _ from
+ * type names.
+ * Renamed "JavaScript" types to "Script".
+ *
+ * Revision 7 (April 21, 2004):
+ * NPIdentifier becomes a void*, was int32_t
+ * Remove NP_IsValidIdentifier, renamed NP_IdentifierFromUTF8 to NP_GetIdentifier
+ * Added NPVariant and modified functions to use this new type.
+ *
+ * Revision 8 (July 9, 2004):
+ * Updated to joint Apple-Mozilla license.
+ *
+ * Revision 9 (August 12, 2004):
+ * Changed NPVariantType enum values to form PVariantType_XXX
+ * Added NPP arguments to NPObject functions.
+ * Replaced NPVariant functions with macros.
+ */
+#ifndef _NP_RUNTIME_H_
+#define _NP_RUNTIME_H_
+
+
+// BEGIN GOOGLE GEARS MODIFICATIONS
+
+//#include "gears/base/common/int_types.h"
+#include "npapi.h"
+
+typedef uint32 uint32_t;
+typedef int32 int32_t;
+#ifndef sun
+typedef uint8 uint8_t;
+typedef int8 int8_t;
+typedef uint16 uint16_t;
+typedef int16 int16_t;
+// MODIFIED(jat)
+#ifndef __LP64__
+typedef int64 int64_t;
+typedef uint64 uint64_t;
+#endif
+#endif
+
+// END GOOGLE GEARS MODIFICATIONS
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ This API is used to facilitate binding code written in C to script
+ objects. The API in this header does not assume the presence of a
+ user agent. That is, it can be used to bind C code to scripting
+ environments outside of the context of a user agent.
+
+ However, the normal use of the this API is in the context of a
+ scripting environment running in a browser or other user agent.
+ In particular it is used to support the extended Netscape
+ script-ability API for plugins (NP-SAP). NP-SAP is an extension
+ of the Netscape plugin API. As such we have adopted the use of
+ the "NP" prefix for this API.
+
+ The following NP{N|P}Variables were added to the Netscape plugin
+ API (in npapi.h):
+
+ NPNVWindowNPObject
+ NPNVPluginElementNPObject
+ NPPVpluginScriptableNPObject
+
+ These variables are exposed through NPN_GetValue() and
+ NPP_GetValue() (respectively) and are used to establish the
+ initial binding between the user agent and native code. The DOM
+ objects in the user agent can be examined and manipulated using
+ the NPN_ functions that operate on NPObjects described in this
+ header.
+
+ To the extent possible the assumptions about the scripting
+ language used by the scripting environment have been minimized.
+*/
+
+
+/*
+ Objects (non-primitive data) passed between 'C' and script is
+ always wrapped in an NPObject. The 'interface' of an NPObject is
+ described by an NPClass.
+*/
+typedef struct NPObject NPObject;
+typedef struct NPClass NPClass;
+
+typedef char NPUTF8;
+typedef struct _NPString {
+ const NPUTF8 *UTF8Characters;
+ uint32_t UTF8Length;
+} NPString;
+
+typedef enum {
+ NPVariantType_Void,
+ NPVariantType_Null,
+ NPVariantType_Bool,
+ NPVariantType_Int32,
+ NPVariantType_Double,
+ NPVariantType_String,
+ NPVariantType_Object
+} NPVariantType;
+
+typedef struct _NPVariant {
+ NPVariantType type;
+ union {
+ bool boolValue;
+ int32_t intValue;
+ double doubleValue;
+ NPString stringValue;
+ NPObject *objectValue;
+ } value;
+} NPVariant;
+
+/*
+ NPN_ReleaseVariantValue is called on all 'out' parameters references.
+ Specifically it is called on variants that are resultant out parameters
+ in NPGetPropertyFunctionPtr and NPInvokeFunctionPtr. Resultant variants
+ from these two functions should be initialized using the
+ NPN_InitializeVariantXXX() functions.
+
+ After calling NPReleaseVariantValue, the type of the variant will
+ be set to NPVariantUndefinedType.
+*/
+void NPN_ReleaseVariantValue (NPVariant *variant);
+
+#define NPVARIANT_IS_VOID(_v) ((_v).type == NPVariantType_Void)
+#define NPVARIANT_IS_NULL(_v) ((_v).type == NPVariantType_Null)
+#define NPVARIANT_IS_BOOLEAN(_v) ((_v).type == NPVariantType_Bool)
+#define NPVARIANT_IS_INT32(_v) ((_v).type == NPVariantType_Int32)
+#define NPVARIANT_IS_DOUBLE(_v) ((_v).type == NPVariantType_Double)
+#define NPVARIANT_IS_STRING(_v) ((_v).type == NPVariantType_String)
+#define NPVARIANT_IS_OBJECT(_v) ((_v).type == NPVariantType_Object)
+
+#define NPVARIANT_TO_BOOLEAN(_v) ((_v).value.boolValue)
+#define NPVARIANT_TO_INT32(_v) ((_v).value.intValue)
+#define NPVARIANT_TO_DOUBLE(_v) ((_v).value.doubleValue)
+#define NPVARIANT_TO_STRING(_v) ((_v).value.stringValue)
+#define NPVARIANT_TO_OBJECT(_v) ((_v).value.objectValue)
+
+#define NP_BEGIN_MACRO do {
+#define NP_END_MACRO } while (0)
+
+#define VOID_TO_NPVARIANT(_v) NP_BEGIN_MACRO (_v).type = NPVariantType_Void; (_v).value.objectValue = NULL; NP_END_MACRO
+#define NULL_TO_NPVARIANT(_v) NP_BEGIN_MACRO (_v).type = NPVariantType_Null; (_v).value.objectValue = NULL; NP_END_MACRO
+#define BOOLEAN_TO_NPVARIANT(_val, _v) NP_BEGIN_MACRO (_v).type = NPVariantType_Bool; (_v).value.boolValue = !!(_val); NP_END_MACRO
+#define INT32_TO_NPVARIANT(_val, _v) NP_BEGIN_MACRO (_v).type = NPVariantType_Int32; (_v).value.intValue = _val; NP_END_MACRO
+#define DOUBLE_TO_NPVARIANT(_val, _v) NP_BEGIN_MACRO (_v).type = NPVariantType_Double; (_v).value.doubleValue = _val; NP_END_MACRO
+#define STRINGZ_TO_NPVARIANT(_val, _v) NP_BEGIN_MACRO (_v).type = NPVariantType_String; NPString _str = { _val, strlen(_val) }; (_v).value.stringValue = _str; NP_END_MACRO
+#define STRINGN_TO_NPVARIANT(_val, _len, _v) NP_BEGIN_MACRO (_v).type = NPVariantType_String; NPString _str = { _val, _len }; (_v).value.stringValue = _str; NP_END_MACRO
+#define OBJECT_TO_NPVARIANT(_val, _v) NP_BEGIN_MACRO (_v).type = NPVariantType_Object; (_v).value.objectValue = _val; NP_END_MACRO
+
+/*
+ Type mappings (JavaScript types have been used for illustration
+ purposes):
+
+ JavaScript to C (NPVariant with type:)
+ undefined NPVariantType_Void
+ null NPVariantType_Null
+ Boolean NPVariantType_Bool
+ Number NPVariantType_Double or NPVariantType_Int32
+ String NPVariantType_String
+ Object NPVariantType_Object
+
+ C (NPVariant with type:) to JavaScript
+ NPVariantType_Void undefined
+ NPVariantType_Null null
+ NPVariantType_Bool Boolean
+ NPVariantType_Int32 Number
+ NPVariantType_Double Number
+ NPVariantType_String String
+ NPVariantType_Object Object
+*/
+
+typedef void *NPIdentifier;
+
+/*
+ NPObjects have methods and properties. Methods and properties are
+ identified with NPIdentifiers. These identifiers may be reflected
+ in script. NPIdentifiers can be either strings or integers, IOW,
+ methods and properties can be identified by either strings or
+ integers (i.e. foo["bar"] vs foo[1]). NPIdentifiers can be
+ compared using ==. In case of any errors, the requested
+ NPIdentifier(s) will be NULL.
+*/
+NPIdentifier NPN_GetStringIdentifier(const NPUTF8 *name);
+void NPN_GetStringIdentifiers(const NPUTF8 **names, int32_t nameCount, NPIdentifier *identifiers);
+NPIdentifier NPN_GetIntIdentifier(int32_t intid);
+bool NPN_IdentifierIsString(NPIdentifier identifier);
+
+/*
+ The NPUTF8 returned from NPN_UTF8FromIdentifier SHOULD be freed.
+*/
+NPUTF8 *NPN_UTF8FromIdentifier(NPIdentifier identifier);
+
+/*
+ Get the integer represented by identifier. If identifier is not an
+ integer identifier, the behaviour is undefined.
+*/
+int32_t NPN_IntFromIdentifier(NPIdentifier identifier);
+
+/*
+ NPObject behavior is implemented using the following set of
+ callback functions.
+
+ The NPVariant *result argument of these functions (where
+ applicable) should be released using NPN_ReleaseVariantValue().
+*/
+typedef NPObject *(*NPAllocateFunctionPtr)(NPP npp, NPClass *aClass);
+typedef void (*NPDeallocateFunctionPtr)(NPObject *obj);
+typedef void (*NPInvalidateFunctionPtr)(NPObject *obj);
+typedef bool (*NPHasMethodFunctionPtr)(NPObject *obj, NPIdentifier name);
+typedef bool (*NPInvokeFunctionPtr)(NPObject *obj, NPIdentifier name, const NPVariant *args, uint32_t argCount, NPVariant *result);
+typedef bool (*NPInvokeDefaultFunctionPtr)(NPObject *npobj, const NPVariant *args, uint32_t argCount, NPVariant *result);
+typedef bool (*NPHasPropertyFunctionPtr)(NPObject *obj, NPIdentifier name);
+typedef bool (*NPGetPropertyFunctionPtr)(NPObject *obj, NPIdentifier name, NPVariant *result);
+typedef bool (*NPSetPropertyFunctionPtr)(NPObject *obj, NPIdentifier name, const NPVariant *value);
+typedef bool (*NPRemovePropertyFunctionPtr)(NPObject *npobj, NPIdentifier name);
+typedef bool (*NPEnumerationFunctionPtr)(NPObject *npobj, NPIdentifier **value, uint32_t *count);
+
+/*
+ NPObjects returned by create have a reference count of one. It is the caller's responsibility
+ to release the returned object.
+
+ NPInvokeFunctionPtr function may return false to indicate a the method could not be invoked.
+
+ NPGetPropertyFunctionPtr and NPSetPropertyFunctionPtr may return false to indicate a property doesn't
+ exist.
+
+ NPInvalidateFunctionPtr is called by the scripting environment when the native code is
+ shutdown. Any attempt to message a NPObject instance after the invalidate
+ callback has been called will result in undefined behavior, even if the
+ native code is still retaining those NPObject instances.
+ (The runtime will typically return immediately, with 0 or NULL, from an attempt to
+ dispatch to a NPObject, but this behavior should not be depended upon.)
+
+ The NPEnumerationFunctionPtr function may pass an array of
+ NPIdentifiers back to the caller. The callee allocs the memory of
+ the array using NPN_MemAlloc(), and it's the caller's responsibility
+ to release it using NPN_MemFree().
+*/
+struct NPClass
+{
+ uint32_t structVersion;
+ NPAllocateFunctionPtr allocate;
+ NPDeallocateFunctionPtr deallocate;
+ NPInvalidateFunctionPtr invalidate;
+ NPHasMethodFunctionPtr hasMethod;
+ NPInvokeFunctionPtr invoke;
+ NPInvokeDefaultFunctionPtr invokeDefault;
+ NPHasPropertyFunctionPtr hasProperty;
+ NPGetPropertyFunctionPtr getProperty;
+ NPSetPropertyFunctionPtr setProperty;
+ NPRemovePropertyFunctionPtr removeProperty;
+ NPEnumerationFunctionPtr enumerate;
+};
+
+#define NP_CLASS_STRUCT_VERSION 2
+#define NP_CLASS_STRUCT_VERSION_ENUM 2
+#define NP_CLASS_STRUCT_VERSION_HAS_ENUM(npclass) \
+ ((npclass)->structVersion >= NP_CLASS_STRUCT_VERSION_ENUM)
+
+struct NPObject {
+ NPClass *_class;
+ uint32_t referenceCount;
+ // Additional space may be allocated here by types of NPObjects
+};
+
+/*
+ If the class has an allocate function, NPN_CreateObject invokes that function,
+ otherwise a NPObject is allocated and returned. If a class has an allocate
+ function it is the responsibility of that implementation to set the initial retain
+ count to 1.
+*/
+NPObject *NPN_CreateObject(NPP npp, NPClass *aClass);
+
+/*
+ Increment the NPObject's reference count.
+*/
+NPObject *NPN_RetainObject (NPObject *obj);
+
+/*
+ Decremented the NPObject's reference count. If the reference
+ count goes to zero, the class's destroy function is invoke if
+ specified, otherwise the object is freed directly.
+*/
+void NPN_ReleaseObject (NPObject *obj);
+
+/*
+ Functions to access script objects represented by NPObject.
+
+ Calls to script objects are synchronous. If a function returns a
+ value, it will be supplied via the result NPVariant
+ argument. Successful calls will return true, false will be
+ returned in case of an error.
+
+ Calls made from plugin code to script must be made from the thread
+ on which the plugin was initialized.
+*/
+bool NPN_Invoke(NPP npp, NPObject *npobj, NPIdentifier methodName, const NPVariant *args, uint32_t argCount, NPVariant *result);
+bool NPN_InvokeDefault(NPP npp, NPObject *npobj, const NPVariant *args, uint32_t argCount, NPVariant *result);
+bool NPN_Evaluate(NPP npp, NPObject *npobj, NPString *script, NPVariant *result);
+bool NPN_GetProperty(NPP npp, NPObject *npobj, NPIdentifier propertyName, NPVariant *result);
+bool NPN_SetProperty(NPP npp, NPObject *npobj, NPIdentifier propertyName, const NPVariant *value);
+bool NPN_RemoveProperty(NPP npp, NPObject *npobj, NPIdentifier propertyName);
+bool NPN_HasProperty(NPP npp, NPObject *npobj, NPIdentifier propertyName);
+bool NPN_HasMethod(NPP npp, NPObject *npobj, NPIdentifier methodName);
+bool NPN_Enumerate(NPP npp, NPObject *npobj, NPIdentifier **identifier, uint32_t *count);
+
+// BEGIN GOOGLE MODIFICATIONS
+
+void* NPP_GetJavaClass(void);
+void* NPN_GetJavaEnv(void);
+void* NPN_GetJavaPeer(NPP instance);
+void NPN_PluginThreadAsyncCall(NPP id, void (*func)(void *), void *userData);
+bool NPN_Construct(NPP npp, NPObject* obj, const NPVariant *args, uint32_t argCount, NPVariant *result);
+
+// END GOOGLE MODIFICATIONS
+
+/*
+ NPN_SetException may be called to trigger a script exception upon return
+ from entry points into NPObjects.
+*/
+void NPN_SetException (NPObject *obj, const NPUTF8 *message);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/plugins/npapi/npn_bindings.cpp b/plugins/npapi/npn_bindings.cpp
new file mode 100644
index 0000000..b47b7af
--- /dev/null
+++ b/plugins/npapi/npn_bindings.cpp
@@ -0,0 +1,381 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: NPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Netscape Public License
+ * Version 1.1 (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.mozilla.org/NPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is mozilla.org code.
+ *
+ * The Initial Developer of the Original Code is
+ * Netscape Communications Corporation.
+ * Portions created by the Initial Developer are Copyright (C) 1998
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the NPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the NPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+////////////////////////////////////////////////////////////
+//
+// Implementation of Netscape entry points (NPN_*), which are the functions
+// the plugin calls to talk to the browser.
+//
+
+#include "Debug.h"
+
+// Sun's cstring doesn't declare memcpy
+#include <string.h>
+//#include <cstring>
+
+#include "mozincludes.h"
+//#include "gears/base/common/base_class.h"
+//#include "gears/base/common/thread_locals.h"
+//#include "gears/base/npapi/module.h"
+
+#ifndef HIBYTE
+#define HIBYTE(x) ((((uint32)(x)) & 0xff00) >> 8)
+#endif
+
+#ifndef LOBYTE
+#define LOBYTE(W) ((W) & 0xFF)
+#endif
+
+static NPNetscapeFuncs npn_funcs;
+
+void SetNPNFuncs(NPNetscapeFuncs* npnFuncs) {
+ // Since we can't rely on the pointer remaining valid, we need to
+ // copy the function pointers.
+ int size = sizeof(NPNetscapeFuncs);
+ if (size > npnFuncs->size) {
+ Debug::log(Debug::Warning) << "*** Warning: NPNetscapeFuncs supplied by "
+ "browser is smaller than expected: " << npnFuncs->size << " vs " << size
+ << Debug::flush;
+ size = npnFuncs->size;
+ }
+ memcpy(&npn_funcs, npnFuncs, size);
+}
+
+const NPNetscapeFuncs &GetNPNFuncs() {
+ return npn_funcs;
+}
+
+void NPN_Version(int* plugin_major, int* plugin_minor,
+ int* netscape_major, int* netscape_minor)
+{
+ const NPNetscapeFuncs &funcs = GetNPNFuncs();
+ *plugin_major = NP_VERSION_MAJOR;
+ *plugin_minor = NP_VERSION_MINOR;
+ *netscape_major = HIBYTE(funcs.version);
+ *netscape_minor = LOBYTE(funcs.version);
+}
+
+NPError NPN_GetURLNotify(NPP instance, const char *url, const char *target,
+ void* notifyData)
+{
+ const NPNetscapeFuncs &funcs = GetNPNFuncs();
+ int navMinorVers = funcs.version & 0xFF;
+ NPError rv = NPERR_NO_ERROR;
+
+ if (navMinorVers >= NPVERS_HAS_NOTIFICATION)
+ rv = funcs.geturlnotify(instance, url, target, notifyData);
+ else
+ rv = NPERR_INCOMPATIBLE_VERSION_ERROR;
+
+ return rv;
+}
+
+NPError NPN_GetURL(NPP instance, const char *url, const char *target)
+{
+ NPError rv = GetNPNFuncs().geturl(instance, url, target);
+ return rv;
+}
+
+NPError NPN_PostURLNotify(NPP instance, const char* url, const char* window,
+ uint32 len, const char* buf, NPBool file,
+ void* notifyData)
+{
+ const NPNetscapeFuncs &funcs = GetNPNFuncs();
+ int navMinorVers = funcs.version & 0xFF;
+ NPError rv = NPERR_NO_ERROR;
+
+ if (navMinorVers >= NPVERS_HAS_NOTIFICATION) {
+ rv = funcs.posturlnotify(instance, url, window, len, buf, file, notifyData);
+ } else {
+ rv = NPERR_INCOMPATIBLE_VERSION_ERROR;
+ }
+
+ return rv;
+}
+
+NPError NPN_PostURL(NPP instance, const char* url, const char* window,
+ uint32 len, const char* buf, NPBool file)
+{
+ NPError rv = GetNPNFuncs().posturl(instance, url, window, len, buf, file);
+ return rv;
+}
+
+NPError NPN_RequestRead(NPStream* stream, NPByteRange* rangeList)
+{
+ NPError rv = GetNPNFuncs().requestread(stream, rangeList);
+ return rv;
+}
+
+NPError NPN_NewStream(NPP instance, NPMIMEType type, const char* target,
+ NPStream** stream)
+{
+ const NPNetscapeFuncs &funcs = GetNPNFuncs();
+ int navMinorVersion = funcs.version & 0xFF;
+
+ NPError rv = NPERR_NO_ERROR;
+
+ if ( navMinorVersion >= NPVERS_HAS_STREAMOUTPUT )
+ rv = funcs.newstream(instance, type, target, stream);
+ else
+ rv = NPERR_INCOMPATIBLE_VERSION_ERROR;
+
+ return rv;
+}
+
+int32 NPN_Write(NPP instance, NPStream *stream, int32 len, void *buffer)
+{
+ const NPNetscapeFuncs &funcs = GetNPNFuncs();
+ int navMinorVersion = funcs.version & 0xFF;
+ int32 rv = 0;
+
+ if ( navMinorVersion >= NPVERS_HAS_STREAMOUTPUT )
+ rv = funcs.write(instance, stream, len, buffer);
+ else
+ rv = -1;
+
+ return rv;
+}
+
+NPError NPN_DestroyStream(NPP instance, NPStream* stream, NPError reason)
+{
+ const NPNetscapeFuncs &funcs = GetNPNFuncs();
+ int navMinorVersion = funcs.version & 0xFF;
+ NPError rv = NPERR_NO_ERROR;
+
+ if ( navMinorVersion >= NPVERS_HAS_STREAMOUTPUT )
+ rv = funcs.destroystream(instance, stream, reason);
+ else
+ rv = NPERR_INCOMPATIBLE_VERSION_ERROR;
+
+ return rv;
+}
+
+void NPN_Status(NPP instance, const char *message)
+{
+ GetNPNFuncs().status(instance, message);
+}
+
+const char* NPN_UserAgent(NPP instance)
+{
+ const char * rv = NULL;
+ rv = GetNPNFuncs().uagent(instance);
+ return rv;
+}
+
+void* NPN_MemAlloc(uint32 size)
+{
+ void * rv = NULL;
+ rv = GetNPNFuncs().memalloc(size);
+ return rv;
+}
+
+void NPN_MemFree(void* ptr)
+{
+ GetNPNFuncs().memfree(ptr);
+}
+
+uint32 NPN_MemFlush(uint32 size)
+{
+ uint32 rv = GetNPNFuncs().memflush(size);
+ return rv;
+}
+
+void NPN_ReloadPlugins(NPBool reloadPages)
+{
+ GetNPNFuncs().reloadplugins(reloadPages);
+}
+
+NPError NPN_GetValue(NPP instance, NPNVariable variable, void *value)
+{
+ NPError rv = GetNPNFuncs().getvalue(instance, variable, value);
+ return rv;
+}
+
+NPError NPN_SetValue(NPP instance, NPPVariable variable, void *value)
+{
+ NPError rv = GetNPNFuncs().setvalue(instance, variable, value);
+ return rv;
+}
+
+void NPN_InvalidateRect(NPP instance, NPRect *invalidRect)
+{
+ GetNPNFuncs().invalidaterect(instance, invalidRect);
+}
+
+void NPN_InvalidateRegion(NPP instance, NPRegion invalidRegion)
+{
+ GetNPNFuncs().invalidateregion(instance, invalidRegion);
+}
+
+void NPN_ForceRedraw(NPP instance)
+{
+ GetNPNFuncs().forceredraw(instance);
+}
+
+NPIdentifier NPN_GetStringIdentifier(const NPUTF8 *name)
+{
+ return GetNPNFuncs().getstringidentifier(name);
+}
+
+void NPN_GetStringIdentifiers(const NPUTF8 **names, int32_t nameCount,
+ NPIdentifier *identifiers)
+{
+ return GetNPNFuncs().getstringidentifiers(names, nameCount, identifiers);
+}
+
+NPIdentifier NPN_GetIntIdentifier(int32_t intid)
+{
+ return GetNPNFuncs().getintidentifier(intid);
+}
+
+bool NPN_IdentifierIsString(NPIdentifier identifier)
+{
+ return GetNPNFuncs().identifierisstring(identifier);
+}
+
+NPUTF8 *NPN_UTF8FromIdentifier(NPIdentifier identifier)
+{
+ return GetNPNFuncs().utf8fromidentifier(identifier);
+}
+
+// On WebKit under OSX, the intfromidentifier field of the structure isn't
+// filled in (see WebNetscapePluginPackage.m#526 in WebKit source tree).
+// At this time this function isn't called from our code, so for now comment it
+// out.
+//
+int32_t NPN_IntFromIdentifier(NPIdentifier identifier)
+{
+ return GetNPNFuncs().intfromidentifier(identifier);
+}
+
+NPObject *NPN_CreateObject(NPP npp, NPClass *aClass)
+{
+ return GetNPNFuncs().createobject(npp, aClass);
+}
+
+NPObject *NPN_RetainObject(NPObject *obj)
+{
+ return GetNPNFuncs().retainobject(obj);
+}
+
+void NPN_ReleaseObject(NPObject *obj)
+{
+ return GetNPNFuncs().releaseobject(obj);
+}
+
+bool NPN_Invoke(NPP npp, NPObject* obj, NPIdentifier methodName,
+ const NPVariant *args, uint32_t argCount, NPVariant *result)
+{
+ return GetNPNFuncs().invoke(npp, obj, methodName, args, argCount, result);
+}
+
+bool NPN_InvokeDefault(NPP npp, NPObject* obj, const NPVariant *args,
+ uint32_t argCount, NPVariant *result)
+{
+ return GetNPNFuncs().invokeDefault(npp, obj, args, argCount, result);
+}
+
+bool NPN_Evaluate(NPP npp, NPObject* obj, NPString *script,
+ NPVariant *result)
+{
+ return GetNPNFuncs().evaluate(npp, obj, script, result);
+}
+
+bool NPN_GetProperty(NPP npp, NPObject* obj, NPIdentifier propertyName,
+ NPVariant *result)
+{
+// Workaround for bug in WebKit: GetProperty() fails when attempting to
+// read a null value from an array, however it fills in the variant structure
+// correctly.
+// The workaround is to chek if GetProprety() touches the variant structure,
+// if so, we assume it succeeded.
+#ifdef BROWSER_WEBKIT
+ result->type = static_cast<NPVariantType>(-1);
+
+ bool ret = GetNPNFuncs().getproperty(npp, obj, propertyName, result);
+
+ if (result->type != -1 && !ret) {
+ ret = true;
+ }
+ return ret;
+#else
+ return GetNPNFuncs().getproperty(npp, obj, propertyName, result);
+#endif
+}
+
+bool NPN_SetProperty(NPP npp, NPObject* obj, NPIdentifier propertyName,
+ const NPVariant *value)
+{
+ return GetNPNFuncs().setproperty(npp, obj, propertyName, value);
+}
+
+bool NPN_RemoveProperty(NPP npp, NPObject* obj, NPIdentifier propertyName)
+{
+ return GetNPNFuncs().removeproperty(npp, obj, propertyName);
+}
+
+#ifdef BROWSER_WEBKIT
+// This field of NPN functions isn't filled in by WebKit on OSX.
+#else
+bool NPN_HasProperty(NPP npp, NPObject* obj, NPIdentifier propertyName)
+{
+ return GetNPNFuncs().hasproperty(npp, obj, propertyName);
+}
+#endif
+
+#ifdef BROWSER_WEBKIT
+// This field of NPN functions isn't filled in by WebKit on OSX.
+#else
+bool NPN_HasMethod(NPP npp, NPObject* obj, NPIdentifier methodName)
+{
+ return GetNPNFuncs().hasmethod(npp, obj, methodName);
+}
+#endif
+
+void NPN_ReleaseVariantValue(NPVariant *variant)
+{
+ GetNPNFuncs().releasevariantvalue(variant);
+}
+
+#ifdef BROWSER_WEBKIT
+// This function is buggy in WebKit, see
+// http://bugs.webkit.org/show_bug.cgi?id=16829
+#else
+void NPN_SetException(NPObject* obj, const NPUTF8 *message)
+{
+ GetNPNFuncs().setexception(obj, message);
+}
+#endif
diff --git a/plugins/npapi/prebuilt/gwt-dev-plugin.crx b/plugins/npapi/prebuilt/gwt-dev-plugin.crx
new file mode 100644
index 0000000..9417939
--- /dev/null
+++ b/plugins/npapi/prebuilt/gwt-dev-plugin.crx
Binary files differ
diff --git a/plugins/npapi/prebuilt/gwt-dev-plugin/Darwin-gcc3/gwtDev.plugin/Contents/Info.plist b/plugins/npapi/prebuilt/gwt-dev-plugin/Darwin-gcc3/gwtDev.plugin/Contents/Info.plist
new file mode 100644
index 0000000..4df9097
--- /dev/null
+++ b/plugins/npapi/prebuilt/gwt-dev-plugin/Darwin-gcc3/gwtDev.plugin/Contents/Info.plist
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+ <dict>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>English</string>
+ <key>CFBundleExecutable</key>
+ <string>libGwtDevPlugin.dylib</string>
+ <key>CFBundleGetInfoString</key>
+ <string>Copyright 2010 Google, Inc.</string>
+ <key>CFBundleIdentifier</key>
+ <string>com.google.gwt.devmode-npapi-plugin</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundleName</key>
+ <string>GWT Devmode NPAPI Plugin</string>
+ <key>CFBundlePackageType</key>
+ <string>BRPL</string>
+ <key>CFBundleShortVersionString</key>
+ <string>1.0</string>
+ <key>CFBundleSignature</key>
+ <string>????</string>
+ <key>CFBundleVersion</key>
+ <string>1.0</string>
+ <key>CFPlugInDynamicRegisterFunction</key>
+ <string></string>
+ <key>CFPlugInDynamicRegistration</key>
+ <string>NO</string>
+ <key>WebPluginDescription</key>
+ <string>Plugin to allow debugging of GWT applications in DevMode</string>
+ <key>WebPluginMIMETypes</key>
+ <dict>
+ <key>application/x-gwt-hosted-mode</key>
+ <dict>
+ <key>WebPluginTypeDescription</key>
+ <string>GWT DevMode</string>
+ </dict>
+ </dict>
+ <key>WebPluginName</key>
+ <string>GWT DevMode Plugin</string>
+ </dict>
+</plist>
+
diff --git a/plugins/npapi/prebuilt/gwt-dev-plugin/Darwin-gcc3/gwtDev.plugin/Contents/MacOS/libGwtDevPlugin.dylib b/plugins/npapi/prebuilt/gwt-dev-plugin/Darwin-gcc3/gwtDev.plugin/Contents/MacOS/libGwtDevPlugin.dylib
new file mode 100755
index 0000000..b089cef
--- /dev/null
+++ b/plugins/npapi/prebuilt/gwt-dev-plugin/Darwin-gcc3/gwtDev.plugin/Contents/MacOS/libGwtDevPlugin.dylib
Binary files differ
diff --git a/plugins/npapi/prebuilt/gwt-dev-plugin/LICENSE.txt b/plugins/npapi/prebuilt/gwt-dev-plugin/LICENSE.txt
new file mode 100644
index 0000000..326366d
--- /dev/null
+++ b/plugins/npapi/prebuilt/gwt-dev-plugin/LICENSE.txt
@@ -0,0 +1,13 @@
+Copyright 2008 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.
diff --git a/plugins/npapi/prebuilt/gwt-dev-plugin/Linux_x86-gcc3/libGwtDevPlugin.so b/plugins/npapi/prebuilt/gwt-dev-plugin/Linux_x86-gcc3/libGwtDevPlugin.so
new file mode 100755
index 0000000..a25d124
--- /dev/null
+++ b/plugins/npapi/prebuilt/gwt-dev-plugin/Linux_x86-gcc3/libGwtDevPlugin.so
Binary files differ
diff --git a/plugins/npapi/prebuilt/gwt-dev-plugin/Linux_x86_64-gcc3/libGwtDevPlugin.so b/plugins/npapi/prebuilt/gwt-dev-plugin/Linux_x86_64-gcc3/libGwtDevPlugin.so
new file mode 100755
index 0000000..c0e4546
--- /dev/null
+++ b/plugins/npapi/prebuilt/gwt-dev-plugin/Linux_x86_64-gcc3/libGwtDevPlugin.so
Binary files differ
diff --git a/plugins/npapi/prebuilt/gwt-dev-plugin/WINNT_x86-msvc/npGwtDevPlugin.dll b/plugins/npapi/prebuilt/gwt-dev-plugin/WINNT_x86-msvc/npGwtDevPlugin.dll
new file mode 100755
index 0000000..cbc3f58
--- /dev/null
+++ b/plugins/npapi/prebuilt/gwt-dev-plugin/WINNT_x86-msvc/npGwtDevPlugin.dll
Binary files differ
diff --git a/plugins/npapi/prebuilt/gwt-dev-plugin/background.html b/plugins/npapi/prebuilt/gwt-dev-plugin/background.html
new file mode 100644
index 0000000..73f674d
--- /dev/null
+++ b/plugins/npapi/prebuilt/gwt-dev-plugin/background.html
@@ -0,0 +1,93 @@
+<html>
+<head>
+</head>
+
+<embed id="pluginEmbed" type="application/x-gwt-hosted-mode" width="10"
+height="10">
+</embed>
+
+
+<script>
+var plugin = document.getElementById('pluginEmbed');
+var disabledIcon = 'gwt32-gray.png';
+var enabledIcon = 'gwt32.png';
+
+
+function getHostFromUrl(url) {
+ var hostname = '';
+ var idx = url.indexOf('://');
+ if (idx >= 0) {
+ idx += 3;
+ hostname = url.substring(idx);
+ }
+ idx = hostname.indexOf('/');
+ if (idx >= 0) {
+ hostname = hostname.substring(0,idx);
+ }
+ idx = hostname.indexOf('@');
+ if( idx >= 0)
+ {
+ hostname = hostname.substring(idx+1);
+ }
+ idx = hostname.indexOf(':');
+ if (idx >= 0) {
+ hostname = hostname.substring(0,idx);
+ }
+ return hostname;
+}
+
+function getCodeServerFromUrl(url) {
+ var idx = url.indexOf('?');
+ if (idx < 0) {
+ return '';
+ }
+ url = url.substring(idx+1);
+ idx = url.indexOf('gwt.codesvr=');
+ if( idx < 0 ) {
+ return '';
+ }
+ url = url.substring(idx+12);
+ var colon = url.indexOf(':');
+ var amp = url.indexOf('&');
+ if( amp < 0 || colon < amp ) {
+ amp = colon;
+ }
+ return amp < 0 ? url : url.substring(0,amp);
+}
+
+function devModeTabListener(tabId, changeInfo, tab) {
+ var search = tab.url.slice(tab.url.indexOf('?'));
+ if (search.indexOf('gwt.codesvr=') >= 0 || search.indexOf('gwt.hosted=') >= 0) {
+ var permission = plugin.getHostPermission(tab.url);
+ var host = getHostFromUrl(tab.url);
+ var code = getCodeServerFromUrl(tab.url);
+ var popup = 'page_action.html';
+ var icon = null;
+ console.log("got permission " + permission + " for host " + host + '/ code ' + code);
+
+ var idObject = {};
+ plugin.testJsIdentity( idObject, idObject );
+
+ if (permission == 'include') {
+ icon = enabledIcon;
+ } else if (permission == 'exclude') {
+ icon = disabledIcon;
+ } else if (permission == 'unknown') {
+ icon = disabledIcon;
+ }
+ popup += "?permission=" + permission + "&host=" + host + "&codeserver=" + code;
+ chrome.pageAction.setIcon({'tabId' : tabId, 'path' : icon});
+ chrome.pageAction.setPopup({'tabId' : tabId, 'popup' : popup});
+ chrome.pageAction.show(tabId);
+
+ var hostEntries = window.localStorage.getItem('GWT_DEV_HOSTENTRY') || [];
+ console.log("loading hostentries: " + hostEntries);
+ plugin.loadHostEntries.apply(plugin, JSON.parse(hostEntries));
+ } else {
+ chrome.pageAction.hide(tabId);
+ }
+};
+
+chrome.tabs.onUpdated.addListener(devModeTabListener);
+</script>
+</html>
diff --git a/plugins/npapi/prebuilt/gwt-dev-plugin/gwt128.png b/plugins/npapi/prebuilt/gwt-dev-plugin/gwt128.png
new file mode 100644
index 0000000..57e8e01
--- /dev/null
+++ b/plugins/npapi/prebuilt/gwt-dev-plugin/gwt128.png
Binary files differ
diff --git a/plugins/npapi/prebuilt/gwt-dev-plugin/gwt16.png b/plugins/npapi/prebuilt/gwt-dev-plugin/gwt16.png
new file mode 100644
index 0000000..f26096e
--- /dev/null
+++ b/plugins/npapi/prebuilt/gwt-dev-plugin/gwt16.png
Binary files differ
diff --git a/plugins/npapi/prebuilt/gwt-dev-plugin/gwt32-gray.png b/plugins/npapi/prebuilt/gwt-dev-plugin/gwt32-gray.png
new file mode 100644
index 0000000..d02689e
--- /dev/null
+++ b/plugins/npapi/prebuilt/gwt-dev-plugin/gwt32-gray.png
Binary files differ
diff --git a/plugins/npapi/prebuilt/gwt-dev-plugin/gwt32.png b/plugins/npapi/prebuilt/gwt-dev-plugin/gwt32.png
new file mode 100644
index 0000000..7ba8270
--- /dev/null
+++ b/plugins/npapi/prebuilt/gwt-dev-plugin/gwt32.png
Binary files differ
diff --git a/plugins/npapi/prebuilt/gwt-dev-plugin/gwt48.png b/plugins/npapi/prebuilt/gwt-dev-plugin/gwt48.png
new file mode 100644
index 0000000..e8a4172
--- /dev/null
+++ b/plugins/npapi/prebuilt/gwt-dev-plugin/gwt48.png
Binary files differ
diff --git a/plugins/npapi/prebuilt/gwt-dev-plugin/gwt64.png b/plugins/npapi/prebuilt/gwt-dev-plugin/gwt64.png
new file mode 100644
index 0000000..922cc88
--- /dev/null
+++ b/plugins/npapi/prebuilt/gwt-dev-plugin/gwt64.png
Binary files differ
diff --git a/plugins/npapi/prebuilt/gwt-dev-plugin/manifest.json b/plugins/npapi/prebuilt/gwt-dev-plugin/manifest.json
new file mode 100644
index 0000000..a60ccf8
--- /dev/null
+++ b/plugins/npapi/prebuilt/gwt-dev-plugin/manifest.json
@@ -0,0 +1,30 @@
+{
+ "name": "GWT Developer Plugin",
+ "version": "1.0.10242",
+ "description": "A plugin to enable debugging with GWT's Development Mode",
+ "update_url": "https://dl-ssl.google.com/gwt/plugins/chrome/updates.xml",
+ "icons": {
+ "16": "gwt16.png",
+ "32": "gwt32.png",
+ "48": "gwt48.png",
+ "64": "gwt64.png",
+ "128": "gwt128.png"
+ },
+ "key": "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDi6RrEy9YllRLM8bGBcIEk5ECAG2z+8ngTz7wwzRAQJpOzDp1Alq8fQFjH0+dzxok4RFLrWKHjxGqvXzWyWyTEo2nY3ScHLN/RoANMs8pl9X6TygRyO+3naqZOtLCrYHfV49JKXnYoFVbY5eBVYxHYY3BHAOKJj9onyAM4UPmMzQIDAQAB",
+ "background_page": "background.html",
+ "options_page" : "DevModeOptions.html",
+ "page_action" : {
+ "default_icon" : "gwt32.png",
+ "default_title" : "GWT Development Mode",
+ "default_popup" : "page_action.html"
+ },
+ "permissions" : [
+ "tabs"
+ ],
+ "plugins": [
+ { "path": "WINNT_x86-msvc/npGwtDevPlugin.dll", "public": true },
+ { "path": "Linux_x86-gcc3/libGwtDevPlugin.so", "public": true },
+ { "path": "Linux_x86_64-gcc3/libGwtDevPlugin.so", "public": true },
+ { "path": "Darwin-gcc3/gwtDev.plugin", "public": true }
+ ]
+}
diff --git a/plugins/npapi/prebuilt/gwt-dev-plugin/page_action.html b/plugins/npapi/prebuilt/gwt-dev-plugin/page_action.html
new file mode 100644
index 0000000..4094828
--- /dev/null
+++ b/plugins/npapi/prebuilt/gwt-dev-plugin/page_action.html
@@ -0,0 +1,48 @@
+<head>
+ <style>
+ body {
+ width: 20em;
+ }
+ </style>
+ <script>
+ function getParam(key) {
+ var idx = window.location.search.indexOf(key + "=");
+ var value = '';
+ if (idx >= 0) {
+ idx += key.length + 1;
+ value = window.location.search.substring(idx).split('&')[0];
+ }
+ return value;
+ }
+
+ function init() {
+ var permission = getParam('permission');
+ var host = getParam('host');
+ var code = getParam('codeserver');
+ var message='';
+
+ if (permission == 'include') {
+ message = 'The web and code server (' + host + '/' + code + ') is allowed to use the plugin';
+ } else if (permission == 'exclude') {
+ message = 'The web and code server (' + host + '/' + code + ') has been been blacklisted.';
+ } else if (permission == 'unknown') {
+ message = 'The web and code server (' + host + '/' + code + ') is unknown to the plugin.';
+ }
+
+ document.getElementById('message').innerText = message;
+ }
+
+ function updateConfiguration() {
+ var url = 'DevModeOptions.html?host=' + getParam('host') + '&codeserver=' + getParam('codeserver');
+ url = chrome.extension.getURL(url);
+ chrome.tabs.create({'url' : url});
+ }
+ </script>
+</head>
+<body onload='javascript:init()'>
+ <h3>GWT Developer Plugin</h3>
+ <div id='message'></div>
+ <br/>
+ <button onclick= "updateConfiguration()">Update Your Configuration</button>
+ </p>
+</body>
diff --git a/plugins/npapi/prebuilt/gwt-dev-plugin/warning.png b/plugins/npapi/prebuilt/gwt-dev-plugin/warning.png
new file mode 100644
index 0000000..55a203b
--- /dev/null
+++ b/plugins/npapi/prebuilt/gwt-dev-plugin/warning.png
Binary files differ
diff --git a/plugins/npapi/resource.h b/plugins/npapi/resource.h
new file mode 100644
index 0000000..bd2d338
--- /dev/null
+++ b/plugins/npapi/resource.h
@@ -0,0 +1,23 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Visual C++ generated include file.
+// Used by npOOPHM.rc
+//
+#define IDD_MAIN 101
+#define IDC_BUTTON_GO 1002
+#define IDC_STATIC_UA 1003
+#define IDC_BUTTON1 1005
+#define IDC_BUTTON_DONT 1005
+#define IDD_ALLOW_DIALOG 103
+#define IDC_REMEMBER_CHECKBOX 201
+#define IDC_ALLOW_BUTTON 202
+
+// Next default values for new objects
+//
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE 102
+#define _APS_NEXT_COMMAND_VALUE 40001
+#define _APS_NEXT_CONTROL_VALUE 1006
+#define _APS_NEXT_SYMED_VALUE 101
+#endif
+#endif
diff --git a/plugins/npapi/test.html b/plugins/npapi/test.html
new file mode 100644
index 0000000..e55d25e
--- /dev/null
+++ b/plugins/npapi/test.html
@@ -0,0 +1,110 @@
+<html>
+<head>
+<title>OOPHM test page</title>
+<script>
+var $wnd = window,$doc = document;
+var $moduleBase = 'file:///home/jat/s/gwt-oophm/plugins/firefox/';
+
+// fake property provider
+function __gwt_getProperty(prop) {
+ return "gecko1_8";
+}
+
+// wrapper to call JS methods, which we need both to be able to supply a
+// different this for method lookup and to get the exception back
+function __gwt_jsWrapper(method, methodlookup, thisref) {
+ try {
+ var args = Array.prototype.slice.call(arguments, 3);
+// console.log("calling " + method + " on " + methodlookup + " (this=" + thisref + "), args are ",
+// args);
+ var ret = methodlookup[method].apply(thisref, args);
+// console.log("successful; returned ", ret);
+ return [0, ret];
+ } catch (e) {
+ try {
+// console.log("methodlookup[method]=", methodlookup[method] ?
+// methodlookup[method].toString() : methodlookup[method]);
+// console.log("failed; exception ", e);
+ } catch (e2) {
+// console.log("exception " + e2 + " logging original exception");
+ }
+ return [1, e];
+ }
+}
+
+function __gwt_initHandlers(resize, beforeunload, unload) {
+ console.log("initHandlers called", resize, beforeunload, unload);
+ var $wnd = window
+ , oldOnResize = $wnd.onresize
+ , oldOnBeforeUnload = $wnd.onbeforeunload
+ , oldOnUnload = $wnd.onunload
+ ;
+
+ $wnd.onresize = function(evt) {
+ try {
+ resize();
+ } finally {
+ oldOnResize && oldOnResize(evt);
+ }
+ };
+
+ $wnd.onbeforeunload = function(evt) {
+ var ret, oldRet;
+ try {
+ ret = beforeunload();
+ } finally {
+ oldRet = oldOnBeforeUnload && oldOnBeforeUnload(evt);
+ }
+ // Avoid returning null as IE6 will coerce it into a string.
+ // Ensure that "" gets returned properly.
+ if (ret != null) {
+ return ret;
+ }
+ if (oldRet != null) {
+ return oldRet;
+ }
+ // returns undefined.
+ };
+
+ $wnd.onunload = function(evt) {
+ try {
+ unload();
+ } finally {
+ oldOnUnload && oldOnUnload(evt);
+ }
+ };
+};
+
+// fire up plugin
+window.onload = function() {
+ var plugin = document.getElementById('plugin');
+ var connectTo = "localhost:9997";
+ var module = "com.google.gwt.sample.kitchensink.KitchenSink";
+ var idx = location.search.indexOf("gwt.hosted=");
+ if (idx >= 0) {
+ var amp = location.search.indexOf("&", idx);
+ if (amp >= 0) {
+ connectTo = location.search.substring(idx + 11, amp);
+ } else {
+ connectTo = location.search.substring(idx + 11);
+ }
+ }
+ var idx = location.search.indexOf("gwt.module=");
+ if (idx >= 0) {
+ var amp = location.search.indexOf("&", idx);
+ if (amp >= 0) {
+ module = location.search.substring(idx + 11, amp);
+ } else {
+ module = location.search.substring(idx + 11);
+ }
+ }
+ plugin.connect(connectTo, module)
+ || alert("failed to connect");
+};
+</script>
+</head>
+<body>
+<embed id="plugin" type="application/x-gwt-hosted-mode" width="10"
+ height="10"/>
+</body>
+</html>
diff --git a/plugins/npapi/version b/plugins/npapi/version
new file mode 100644
index 0000000..4c00d4e
--- /dev/null
+++ b/plugins/npapi/version
@@ -0,0 +1 @@
+0.0.0.20090326025214
diff --git a/plugins/platform/Win/AllowDialog.cpp b/plugins/platform/Win/AllowDialog.cpp
new file mode 100644
index 0000000..6e5672b
--- /dev/null
+++ b/plugins/platform/Win/AllowDialog.cpp
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2009 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.
+ */
+
+#include "AllowDialog.h"
+#include "Debug.h"
+#include "resource.h"
+
+HINSTANCE AllowDialog::hInstance;
+
+static BOOL CALLBACK allowDialogProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam) {
+ if (message != WM_COMMAND) {
+ return false;
+ }
+ bool allowed;
+ switch (LOWORD(wParam)) {
+ case IDCANCEL:
+ allowed = false;
+ break;
+ case IDC_ALLOW_BUTTON:
+ allowed = true;
+ break;
+ default:
+ // ignore anything but buttons which close the dialog
+ return false;
+ }
+ bool remember = IsDlgButtonChecked(hwndDlg, IDC_REMEMBER_CHECKBOX) == BST_CHECKED;
+ int returnVal = (allowed ? 1 : 0) + (remember ? 2 : 0);
+ EndDialog(hwndDlg, (INT_PTR) returnVal);
+ return true;
+}
+
+void AllowDialog::setHInstance(HINSTANCE hInstance) {
+ AllowDialog::hInstance = hInstance;
+}
+
+bool AllowDialog::askUserToAllow(bool* remember) {
+ int result = (int) DialogBox(hInstance, MAKEINTRESOURCE(IDD_ALLOW_DIALOG),
+ NULL, (DLGPROC) allowDialogProc);
+ *remember = (result & 2) != 0;
+ return (result & 1) != 0;
+}
diff --git a/plugins/platform/Win/AllowDialog.h b/plugins/platform/Win/AllowDialog.h
new file mode 100644
index 0000000..93f9438
--- /dev/null
+++ b/plugins/platform/Win/AllowDialog.h
@@ -0,0 +1,42 @@
+#ifndef _H_AllowDialog
+#define _H_AllowDialog
+/*
+ * Copyright 2009 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.
+ */
+
+#ifdef _WINDOWS
+#include <windows.h>
+#include <winnt.h>
+#include <windef.h>
+
+class AllowDialog {
+public:
+ static void setHInstance(HINSTANCE hInstance);
+
+ /**
+ * Ask the user if a connection should be allowed.
+ *
+ * @param remember *remember is set to true if the user asked us to remember this decision,
+ * false otherwise
+ * @return return true if this connection should be allowed
+ */
+ static bool askUserToAllow(bool* remember);
+
+private:
+ static HINSTANCE hInstance;
+};
+#endif
+
+#endif
diff --git a/plugins/platform/Win/Preferences.cpp b/plugins/platform/Win/Preferences.cpp
new file mode 100644
index 0000000..7eeb381
--- /dev/null
+++ b/plugins/platform/Win/Preferences.cpp
@@ -0,0 +1,100 @@
+/*
+ * Copyright 2009 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.
+ */
+
+#include <windows.h>
+#include <winnt.h>
+#include <winreg.h>
+#include "Debug.h"
+#include "Preferences.h"
+#include "AllowedConnections.h"
+
+#define REG_ACCESS_LIST "SOFTWARE\\Google\\Google Web Toolkit\\gwt-dev-plugin.accessList"
+
+/**
+ * Return a null-terminated string containing the access list.
+ *
+ * @param HKEY registry key for the access list value
+ * @return null-terminated string containing the access list (an empty string
+ * if the value does not exist) -- caller is responsible for freeing with
+ * delete[]
+ */
+static char* getAccessList(HKEY keyHandle) {
+ char *buf;
+ DWORD len = 512;
+ while(true) {
+ buf = new char[len];
+ int cc = RegQueryValueExA(keyHandle, NULL, 0, NULL, (LPBYTE) buf, &len);
+ if (cc == ERROR_SUCCESS) {
+ break;
+ } else if (cc == ERROR_FILE_NOT_FOUND) {
+ // special handling if the value doesn't exist
+ len = 0;
+ break;
+ } else if (cc != ERROR_MORE_DATA) {
+ // log unexpected errors
+ Debug::log(Debug::Error) << "Unable to load access list from registry: "
+ << cc << Debug::flush;
+ len = 0;
+ break;
+ }
+ // Buffer wasn't big enough, so make it bigger and try again
+ delete [] buf;
+ len *= 2;
+ }
+ buf[len] = 0;
+ return buf;
+}
+
+void Preferences::addNewRule(const std::string& pattern, bool exclude) {
+ HKEY keyHandle;
+ if (RegCreateKeyExA(HKEY_CURRENT_USER, REG_ACCESS_LIST, 0, 0,
+ REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &keyHandle, NULL)
+ != ERROR_SUCCESS) {
+ return;
+ }
+ char *buf = getAccessList(keyHandle);
+ std::string pref(buf);
+ delete [] buf;
+ if (pref.length() > 0) {
+ pref += ',';
+ }
+ if (exclude) {
+ pref += '!';
+ }
+ pref += pattern;
+ int cc = RegSetValueExA(keyHandle, NULL, 0, REG_SZ, (LPBYTE) pref.c_str(),
+ pref.length() + 1);
+ if (cc != ERROR_SUCCESS) {
+ Debug::log(Debug::Error) << "Unable to store access list in registry: "
+ << cc << Debug::flush;
+ }
+ RegCloseKey(keyHandle);
+}
+
+void Preferences::loadAccessList() {
+ // TODO(jat): can Reg* routines throw exceptions? If so, we need to make
+ // this exception safe about closing the key hendle and freeing the buffer.
+ HKEY keyHandle;
+ if (RegCreateKeyExA(HKEY_CURRENT_USER, REG_ACCESS_LIST, 0, 0,
+ REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &keyHandle, NULL)
+ != ERROR_SUCCESS) {
+ return;
+ }
+ char *buf = getAccessList(keyHandle);
+ AllowedConnections::initFromAccessList(buf);
+ delete [] buf;
+ RegCloseKey(keyHandle);
+}
diff --git a/plugins/platform/Win/Preferences.h b/plugins/platform/Win/Preferences.h
new file mode 100644
index 0000000..f4fc49b
--- /dev/null
+++ b/plugins/platform/Win/Preferences.h
@@ -0,0 +1,34 @@
+#ifndef _H_Preferences
+#define _H_Preferences
+/*
+ * Copyright 2009 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.
+ */
+
+#include <string>
+
+/**
+ * Deal with getting/storing/updating preferences in the Windows registry.
+ */
+class Preferences {
+private:
+ // prevent instantiation
+ Preferences() {}
+
+public:
+ static void loadAccessList();
+ static void addNewRule(const std::string& pattern, bool exclude);
+};
+
+#endif
diff --git a/plugins/webkit/Browser/AppController.h b/plugins/webkit/Browser/AppController.h
new file mode 100644
index 0000000..2d4747f
--- /dev/null
+++ b/plugins/webkit/Browser/AppController.h
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2008 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.
+ */
+
+#import <Cocoa/Cocoa.h>
+#import <WebKit/WebKit.h>
+
+@interface AppController : NSObject
+{
+ IBOutlet WebView *webview;
+}
+- (IBAction)newWindow:(id)sender;
+@end
diff --git a/plugins/webkit/Browser/AppController.m b/plugins/webkit/Browser/AppController.m
new file mode 100644
index 0000000..046a507
--- /dev/null
+++ b/plugins/webkit/Browser/AppController.m
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2008 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.
+ */
+
+#import "AppController.h"
+#import "BrowserWindow.h"
+
+@implementation AppController
+- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
+ NSLog(@"%s", __PRETTY_FUNCTION__);
+
+ if (![WebView canShowMIMEType:@"application/x-gwt-hosted-mode"]) {
+ NSLog(@"plugin not available");
+ exit(-1);
+ }
+ NSString* str = @"http://localhost:8888/com.google.gwt.dev.jjs.CompilerSuite.JUnit/junit.html?gwt.hosted=localhost:9997";
+// NSString* str = @"http://localhost:8888/com.google.gwt.user.RPCSuite.JUnit/junit.html?gwt.hosted=localhost:9997";
+// NSString* str = @"http://localhost:8888/com.google.gwt.user.User.JUnit/junit.html?gwt.hosted=localhost:9997";
+ [webview setUIDelegate:self];
+ [webview setShouldCloseWithWindow: YES];
+ [[webview mainFrame] loadRequest: [NSURLRequest requestWithURL:[NSURL URLWithString:str]]];
+}
+
+- (IBAction)newWindow:(id)sender {
+ NSLog(@"Action received");
+ NSRect r;
+ r.origin.x = 100;
+ r.origin.y = 100;
+ r.size.height = 500;
+ r.size.width = 500;
+
+ WebView* webView = [[WebView alloc] initWithFrame:r];
+ NSString* str = @"http://localhost:8888/com.google.gwt.sample.kitchensink.KitchenSink/KitchenSink.html?gwt.hosted=localhost:9997";
+ [webView setUIDelegate:self];
+ [webView setShouldCloseWithWindow: YES];
+ [[webView mainFrame] loadRequest: [NSURLRequest requestWithURL:[NSURL URLWithString:str]]];
+
+ NSWindow* wnd = [[BrowserWindow alloc] initWithContentRect:r styleMask:NSResizableWindowMask|NSClosableWindowMask backing:NSBackingStoreBuffered defer:NO];
+ [wnd setContentView:webView];
+ [wnd makeKeyAndOrderFront:self];
+}
+
+- (void)webView:(WebView *)sender windowScriptObjectAvailable:(WebScriptObject *)windowScriptObject {
+ NSLog(@"%s", __PRETTY_FUNCTION__);
+}
+
+@end
diff --git a/plugins/webkit/Browser/Browser-Info.plist b/plugins/webkit/Browser/Browser-Info.plist
new file mode 100644
index 0000000..c597e30
--- /dev/null
+++ b/plugins/webkit/Browser/Browser-Info.plist
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>English</string>
+ <key>CFBundleExecutable</key>
+ <string>${EXECUTABLE_NAME}</string>
+ <key>CFBundleIconFile</key>
+ <string>gwtlogo</string>
+ <key>CFBundleIdentifier</key>
+ <string>com.google.gwt.oophm.browser</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+ <key>CFBundleSignature</key>
+ <string>????</string>
+ <key>CFBundleVersion</key>
+ <string>1.0</string>
+ <key>NSMainNibFile</key>
+ <string>browser.nib</string>
+ <key>NSPrincipalClass</key>
+ <string>NSApplication</string>
+</dict>
+</plist>
diff --git a/plugins/webkit/Browser/BrowserWindow.h b/plugins/webkit/Browser/BrowserWindow.h
new file mode 100644
index 0000000..18664ed
--- /dev/null
+++ b/plugins/webkit/Browser/BrowserWindow.h
@@ -0,0 +1,23 @@
+/*
+ * Copyright 2008 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.
+ */
+
+#import <Cocoa/Cocoa.h>
+
+@interface BrowserWindow : NSWindow {
+
+}
+
+@end
diff --git a/plugins/webkit/Browser/BrowserWindow.m b/plugins/webkit/Browser/BrowserWindow.m
new file mode 100644
index 0000000..c822886
--- /dev/null
+++ b/plugins/webkit/Browser/BrowserWindow.m
@@ -0,0 +1,21 @@
+/*
+ * Copyright 2008 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.
+ */
+
+#import "BrowserWindow.h"
+
+@implementation BrowserWindow
+
+@end
diff --git a/plugins/webkit/Browser/browser.nib/classes.nib b/plugins/webkit/Browser/browser.nib/classes.nib
new file mode 100644
index 0000000..af71aad
--- /dev/null
+++ b/plugins/webkit/Browser/browser.nib/classes.nib
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>IBClasses</key>
+ <array>
+ <dict>
+ <key>CLASS</key>
+ <string>BrowserWindow</string>
+ <key>LANGUAGE</key>
+ <string>ObjC</string>
+ <key>SUPERCLASS</key>
+ <string>NSWindow</string>
+ </dict>
+ <dict>
+ <key>ACTIONS</key>
+ <dict>
+ <key>toggleAutomaticLinkDetection</key>
+ <string>id</string>
+ <key>toggleAutomaticQuoteSubstitution</key>
+ <string>id</string>
+ <key>toggleGrammarChecking</key>
+ <string>id</string>
+ <key>toggleSmartInsertDelete</key>
+ <string>id</string>
+ </dict>
+ <key>CLASS</key>
+ <string>FirstResponder</string>
+ <key>LANGUAGE</key>
+ <string>ObjC</string>
+ <key>SUPERCLASS</key>
+ <string>NSObject</string>
+ </dict>
+ <dict>
+ <key>ACTIONS</key>
+ <dict>
+ <key>newWindow</key>
+ <string>id</string>
+ </dict>
+ <key>CLASS</key>
+ <string>AppController</string>
+ <key>LANGUAGE</key>
+ <string>ObjC</string>
+ <key>OUTLETS</key>
+ <dict>
+ <key>webview</key>
+ <string>WebView</string>
+ </dict>
+ <key>SUPERCLASS</key>
+ <string>NSObject</string>
+ </dict>
+ </array>
+ <key>IBVersion</key>
+ <string>1</string>
+</dict>
+</plist>
diff --git a/plugins/webkit/Browser/browser.nib/info.nib b/plugins/webkit/Browser/browser.nib/info.nib
new file mode 100644
index 0000000..6271e8e
--- /dev/null
+++ b/plugins/webkit/Browser/browser.nib/info.nib
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>IBFramework Version</key>
+ <string>629</string>
+ <key>IBLastKnownRelativeProjectPath</key>
+ <string>../../oophm.xcodeproj</string>
+ <key>IBOldestOS</key>
+ <integer>5</integer>
+ <key>IBOpenObjects</key>
+ <array/>
+ <key>IBSystem Version</key>
+ <string>9C7010</string>
+ <key>targetFramework</key>
+ <string>IBCocoaFramework</string>
+</dict>
+</plist>
diff --git a/plugins/webkit/Browser/browser.nib/keyedobjects.nib b/plugins/webkit/Browser/browser.nib/keyedobjects.nib
new file mode 100644
index 0000000..7691b0d
--- /dev/null
+++ b/plugins/webkit/Browser/browser.nib/keyedobjects.nib
Binary files differ
diff --git a/plugins/webkit/Browser/main.m b/plugins/webkit/Browser/main.m
new file mode 100644
index 0000000..f1a7cba
--- /dev/null
+++ b/plugins/webkit/Browser/main.m
@@ -0,0 +1,22 @@
+/*
+ * Copyright 2008 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.
+ */
+
+#import <Cocoa/Cocoa.h>
+
+int main(int argc, char *argv[])
+{
+ return NSApplicationMain(argc, (const char **) argv);
+}
diff --git a/plugins/webkit/Core/ObjectFunctions.cpp b/plugins/webkit/Core/ObjectFunctions.cpp
new file mode 100644
index 0000000..a0a4a73
--- /dev/null
+++ b/plugins/webkit/Core/ObjectFunctions.cpp
@@ -0,0 +1,100 @@
+/*
+ * Copyright 2008 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.
+ */
+
+#include "ObjectFunctions.h"
+#include "WebScriptSessionHandler.h"
+#include "scoped_ptr.h"
+
+JSValueRef JavaObjectCallAsFunction(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject,
+ size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) {
+ TrackingDataRef tracker = static_cast<TrackingDataRef>(JSObjectGetPrivate(function));
+ WebScriptSessionHandler* sessionHandler = static_cast<WebScriptSessionHandler*>(tracker->getSessionData());
+
+ *exception = NULL;
+ int dispatchId = JSValueToNumber(ctx, arguments[0], exception);
+ if (*exception) {
+ return JSValueMakeUndefined(ctx);
+ }
+
+ bool explicitThis = JSValueToBoolean(ctx, arguments[1]);
+ if (explicitThis) {
+ thisObject = JSValueToObject(ctx, arguments[1], exception);
+ if (*exception) {
+ return JSValueMakeUndefined(ctx);
+ }
+ } else {
+ thisObject = function;
+ }
+
+ return sessionHandler->javaFunctionCallbackImpl(dispatchId, thisObject,
+ argumentCount - 2, &arguments[2], exception);
+}
+
+/*
+ * Static-dispatch function to clean up a Java object proxy. This will
+ * deallocate the TrackingData as well as remove the objectId mapping. This
+ * function is called from JavaScriptCore as well as ~WebScriptSessionHandler.
+ *
+ * The JavaScriptCore documentation indicates that finalizers may be called
+ * from any thread, so we can't see javaFree messages directly from this
+ * method. Instead, we'll accumulate a list of ids to free.
+ */
+void JavaObjectFinalize (JSObjectRef object) {
+ TrackingDataRef tracker = static_cast<TrackingDataRef>(JSObjectGetPrivate(object));
+ if (!tracker) {
+ // The tracker may have already been deleted in ~WebScriptSessionHandler()
+ return;
+ }
+ Debug::log(Debug::Spam) << "Finalizing Java object " << tracker->getObjectId() << Debug::flush;
+ JSObjectSetPrivate(object, NULL);
+ int id = tracker->getObjectId();
+ WebScriptSessionHandler* sessionHandler = static_cast<WebScriptSessionHandler*>(tracker->getSessionData());
+ delete tracker;
+ sessionHandler->javaObjectFinalizeImpl(id);
+}
+
+/*
+ * Static-dispatch function to check for the presence of a property on a Java
+ * object proxy.
+ */
+bool JavaObjectHasProperty (JSContextRef ctx, JSObjectRef object, JSStringRef propertyName) {
+ TrackingDataRef tracker = static_cast<TrackingDataRef>(JSObjectGetPrivate(object));
+ WebScriptSessionHandler* sessionHandler = static_cast<WebScriptSessionHandler*>(tracker->getSessionData());
+ return sessionHandler->javaObjectHasPropertyImpl(tracker, object, propertyName);
+}
+
+/*
+ * Static-dispatch function to retrieve the value of a property on a Java
+ * object proxy.
+ */
+JSValueRef JavaObjectGetProperty (JSContextRef ctx, JSObjectRef object,
+ JSStringRef propertyName, JSValueRef* exception) {
+ TrackingDataRef tracker = static_cast<TrackingDataRef>(JSObjectGetPrivate(object));
+ WebScriptSessionHandler* sessionHandler = static_cast<WebScriptSessionHandler*>(tracker->getSessionData());
+ return sessionHandler->javaObjectGetPropertyImpl(tracker, object, propertyName, exception);
+}
+
+/*
+ * Static-dispatch function to set the value of a property an a Java object
+ * proxy.
+ */
+bool JavaObjectSetProperty (JSContextRef ctx, JSObjectRef object,
+ JSStringRef propertyName, JSValueRef value,
+ JSValueRef* exception) {
+ TrackingDataRef tracker = static_cast<TrackingDataRef>(JSObjectGetPrivate(object));
+ WebScriptSessionHandler* sessionHandler = static_cast<WebScriptSessionHandler*>(tracker->getSessionData());
+ return sessionHandler->javaObjectSetPropertyImpl(tracker, object, propertyName, value, exception);
+}
diff --git a/plugins/webkit/Core/ObjectFunctions.h b/plugins/webkit/Core/ObjectFunctions.h
new file mode 100644
index 0000000..176218e
--- /dev/null
+++ b/plugins/webkit/Core/ObjectFunctions.h
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2008 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.
+ */
+
+#include "JavaScriptCore/JavaScriptCore.h"
+
+/*
+ * Handle JSNI function invocations.
+ */
+JSValueRef JavaObjectCallAsFunction(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject,
+ size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception);
+
+/*
+ * Static-dispatch function to clean up a Java object proxy. This will
+ * deallocate the TrackingData as well as remove the objectId mapping. This
+ * function is called from JavaScriptCore as well as ~WebScriptSessionHandler.
+ *
+ * The JavaScriptCore documentation indicates that finalizers may be called
+ * from any thread, so we can't see javaFree messages directly from this
+ * method. Instead, we'll accumulate a list of ids to free.
+ */
+void JavaObjectFinalize (JSObjectRef object);
+
+/*
+ * Static-dispatch function to check for the presence of a property on a Java
+ * object proxy.
+ */
+bool JavaObjectHasProperty (JSContextRef ctx, JSObjectRef object, JSStringRef propertyName);
+
+/*
+ * Static-dispatch function to retrieve the value of a property on a Java
+ * object proxy.
+ */
+JSValueRef JavaObjectGetProperty (JSContextRef ctx, JSObjectRef object,
+ JSStringRef propertyName, JSValueRef* exception);
+
+/*
+ * Static-dispatch function to set the value of a property an a Java object
+ * proxy.
+ */
+bool JavaObjectSetProperty (JSContextRef ctx, JSObjectRef object,
+ JSStringRef propertyName, JSValueRef value,
+ JSValueRef* exception);
\ No newline at end of file
diff --git a/plugins/webkit/Core/SessionData.h b/plugins/webkit/Core/SessionData.h
new file mode 100644
index 0000000..9f60ddf
--- /dev/null
+++ b/plugins/webkit/Core/SessionData.h
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2008 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.
+ */
+
+#import "HostChannel.h"
+#import "JavaScriptCore/JavaScriptCore.h"
+#import "SessionHandler.h"
+
+/*
+ * Encapsules per-OOPHM-session data.
+ */
+class SessionData {
+public:
+ SessionData(HostChannel* channel, JSGlobalContextRef contextRef,
+ SessionHandler* sessionHandler) : channel(channel),
+ contextRef(contextRef),
+ sessionHandler(sessionHandler) {
+ }
+
+ JSGlobalContextRef getContext() const {
+ return contextRef;
+ }
+
+ HostChannel* getHostChannel() const {
+ return channel;
+ }
+
+ SessionHandler* getSessionHandler() const {
+ return sessionHandler;
+ }
+
+protected:
+ /*
+ * The communication channel used for the OOPHM session.
+ */
+ HostChannel* const channel;
+
+ /*
+ * The JavaScriptCore interpreter instance.
+ */
+ JSGlobalContextRef const contextRef;
+
+ /*
+ * A reference to the SessionHandler being used in the OOPHM session.
+ */
+ SessionHandler* const sessionHandler;
+};
+typedef SessionData* SessionDataRef;
\ No newline at end of file
diff --git a/plugins/webkit/Core/TrackingData.h b/plugins/webkit/Core/TrackingData.h
new file mode 100644
index 0000000..de19f00
--- /dev/null
+++ b/plugins/webkit/Core/TrackingData.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2008 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.
+ */
+
+#import "SessionData.h"
+
+/*
+ * This class encapsulates per-object information to determine how to dispatch
+ * a given JSObjectRef that is a Java object proxy. Instances of
+ * this class are intended to be stored in the private data area provided
+ * by JSObjectRef.
+ */
+class TrackingData {
+public:
+ /*
+ * Constructor for Java object proxies.
+ */
+ TrackingData(const SessionDataRef sessionData, const unsigned objId) :
+ objId(objId), sessionData(sessionData) {
+ }
+
+ const unsigned getObjectId() const {
+ return objId;
+ }
+
+ SessionDataRef getSessionData() const {
+ return sessionData;
+ }
+
+private:
+ /*
+ * The tracking number assigned to the object.
+ */
+ const unsigned objId;
+
+ /*
+ * A reference to the per-OOPHM-session data.
+ */
+ SessionDataRef const sessionData;
+};
+typedef const TrackingData* TrackingDataRef;
diff --git a/plugins/webkit/Core/WebScriptSessionHandler.cpp b/plugins/webkit/Core/WebScriptSessionHandler.cpp
new file mode 100644
index 0000000..1a1e972
--- /dev/null
+++ b/plugins/webkit/Core/WebScriptSessionHandler.cpp
@@ -0,0 +1,727 @@
+/*
+ * Copyright 2008 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.
+ */
+
+#import "WebScriptSessionHandler.h"
+#import "InvokeMessage.h"
+#import "ObjectFunctions.h"
+#import "ServerMethods.h"
+#import "TrackingData.h"
+#import "scoped_ptr.h"
+
+
+WebScriptSessionHandler::WebScriptSessionHandler(HostChannel* channel,
+ JSGlobalContextRef contextRef,
+ CrashHandlerRef crashHandler) :
+SessionData(channel, contextRef, this), jsObjectId(1), crashHandler(crashHandler) {
+
+ JSClassDefinition def = kJSClassDefinitionEmpty;
+ def.className = "JavaObject";
+ def.hasProperty = JavaObjectHasProperty;
+ def.callAsFunction = JavaObjectCallAsFunction;
+ def.finalize = JavaObjectFinalize;
+ def.getProperty = JavaObjectGetProperty;
+ def.setProperty = JavaObjectSetProperty;
+ javaObjectWrapperClass = JSClassCreate(&def);
+ JSClassRetain(javaObjectWrapperClass);
+
+ // Get the String constructor function to tell Strings from other Objects
+ JSStringRef stringString = JSStringCreateWithUTF8CString("String");
+ JSValueRef stringConstructorValue = JSObjectGetProperty(contextRef,
+ JSContextGetGlobalObject(contextRef),
+ stringString, NULL);
+ stringConstructor = JSValueToObject(contextRef, stringConstructorValue, NULL);
+ JSValueProtect(contextRef, stringConstructor);
+ JSStringRelease(stringString);
+
+ // Call out to the utility __gwt_makeResult function to create the return array
+ JSStringRef makeResultString = JSStringCreateWithUTF8CString("__gwt_makeResult");
+ JSValueRef makeResultValue = JSObjectGetProperty(contextRef, JSContextGetGlobalObject(contextRef), makeResultString, NULL);
+ JSStringRelease(makeResultString);
+
+ if (!JSValueIsObject(contextRef, makeResultValue)) {
+ crashHandler->crash(__PRETTY_FUNCTION__, "Could not find __gwt_makeResult");
+ } else {
+ makeResultFunction = JSValueToObject(contextRef, makeResultValue, NULL);
+ JSValueProtect(contextRef, makeResultFunction);
+ }
+
+ pthread_mutexattr_t mutexAttrs;
+ pthread_mutexattr_init(&mutexAttrs);
+ // This behaves basically like the Java synchronized keyword
+ pthread_mutexattr_settype(&mutexAttrs, PTHREAD_MUTEX_RECURSIVE);
+ pthread_mutex_init(&javaObjectsLock, &mutexAttrs);
+ pthread_mutexattr_destroy(&mutexAttrs);
+}
+
+WebScriptSessionHandler::~WebScriptSessionHandler() {
+ std::map<int, JSObjectRef>::iterator i;
+
+ pthread_mutex_lock(&javaObjectsLock);
+ while ((i = javaObjectsById.begin()) != javaObjectsById.end()) {
+ JavaObjectFinalize(i->second);
+ }
+ pthread_mutex_unlock(&javaObjectsLock);
+
+ for (i = jsObjectsById.begin(); i != jsObjectsById.end(); i++) {
+ JSObjectRef ref = i->second;
+ delete static_cast<TrackingDataRef>(JSObjectGetPrivate(ref));
+ JSObjectSetPrivate(ref, NULL);
+ JSValueUnprotect(contextRef, i->second);
+ }
+
+ JSClassRelease(javaObjectWrapperClass);
+
+ JSValueUnprotect(contextRef, stringConstructor);
+ JSValueUnprotect(contextRef, makeResultFunction);
+
+ JSGarbageCollect(contextRef);
+ pthread_mutex_destroy(&javaObjectsLock);
+}
+
+void WebScriptSessionHandler::disconnectDetectedImpl() {
+ crashHandler->crash(__PRETTY_FUNCTION__, "Server disconnect detected");
+}
+
+void WebScriptSessionHandler::fatalError(HostChannel& channel,
+ const std::string& message) {
+ // TODO: better way of reporting error?
+ Debug::log(Debug::Error) << "Fatal error: " << message << Debug::flush;
+}
+
+void WebScriptSessionHandler::sendFreeValues(HostChannel& channel) {
+ pthread_mutex_lock(&javaObjectsLock);
+ int idCount = javaObjectsToFree.size();
+ if (idCount == 0) {
+ pthread_mutex_unlock(&javaObjectsLock);
+ return;
+ }
+
+ int ids[idCount];
+ std::set<int>::iterator it = javaObjectsToFree.begin();
+ for (int i = 0; i < idCount; it++) {
+ ids[i++] = *it;
+ }
+ if (!ServerMethods::freeJava(channel, this, idCount, ids)) {
+ Debug::log(Debug::Error) << "Unable to free Java ids" << Debug::flush;
+ } else {
+ Debug::log(Debug::Debugging) << "Freed " << idCount << " Java ids" << Debug::flush;
+ }
+ javaObjectsToFree.clear();
+ pthread_mutex_unlock(&javaObjectsLock);
+}
+
+void WebScriptSessionHandler::freeValue(HostChannel& channel, int idCount, const int* ids) {
+ Debug::log(Debug::Spam) << "freeValue freeing " << idCount << " js objects" << Debug::flush;
+ if (idCount == 0) {
+ return;
+ }
+
+ for (int i = 0; i < idCount; i++) {
+ int objId = ids[i];
+
+ std::map<int, JSObjectRef>::iterator x = jsObjectsById.find(objId);
+ if (x == jsObjectsById.end()) {
+ Debug::log(Debug::Error) << "Unknown object id " << objId << Debug::flush;
+ continue;
+ }
+
+ JSObjectRef ref = x->second;
+ jsObjectsById.erase(objId);
+ jsIdsByObject.erase(ref);
+ JSValueUnprotect(contextRef, ref);
+ }
+ Debug::log(Debug::Debugging) << "Freed " << idCount << " JS objects" << Debug::flush;
+}
+
+void WebScriptSessionHandler::initiateAutodestructSequence(const char* functionName, const char* message) {
+ crashHandler->crash(functionName, message);
+}
+
+bool WebScriptSessionHandler::invoke(HostChannel& channel, const Value& thisObj,
+ const std::string& methodName,
+ int numArgs, const Value* args, Value* returnValue) {
+ Debug::log(Debug::Spam) << "invoke " << methodName << Debug::flush;
+
+ JSValueRef argsJS[numArgs];
+ JSValueRef localException = NULL;
+ JSStringRef methodNameJS = JSStringCreateWithUTF8CString(methodName.c_str());
+ JSObjectRef thisObjJs;
+
+ if (thisObj.isNull()) {
+ thisObjJs = JSContextGetGlobalObject(contextRef);
+ } else {
+ thisObjJs = (JSObjectRef) makeValueRef(thisObj);
+ }
+
+ JSValueRef functionValueJS = JSObjectGetProperty(contextRef, JSContextGetGlobalObject(contextRef),
+ methodNameJS, &localException);
+ JSStringRelease(methodNameJS);
+
+ if (!JSValueIsObject(contextRef, functionValueJS)) {
+ char message[512];
+ snprintf(message, sizeof(message), "Could not find method for property name %s on %s", methodName.c_str(), thisObj.toString().c_str());
+ makeExceptionValue(*returnValue, message);
+ return true;
+ }
+
+ JSObjectRef functionJS = JSValueToObject(contextRef, functionValueJS,
+ &localException);
+ if (localException) {
+ makeValue(*returnValue, localException);
+ return true;
+ }
+
+ // Convert the arguments
+ for (int i = 0; i < numArgs; i++) {
+ argsJS[i] = makeValueRef(args[i]);
+ }
+
+ JSValueRef retVal = JSObjectCallAsFunction(contextRef, functionJS,
+ thisObjJs, numArgs, argsJS,
+ &localException);
+
+ if (localException) {
+ Debug::log(Debug::Spam) << "Returning exception to server" << Debug::flush;
+ makeValue(*returnValue, localException);
+ return true;
+ } else {
+ makeValue(*returnValue, retVal);
+ return false;
+ }
+}
+
+bool WebScriptSessionHandler::invokeSpecial(HostChannel& channel, SpecialMethodId method, int numArgs,
+ const Value* const args, Value* returnValue) {
+ Debug::log(Debug::Spam) << "invokeSpecial " << method << Debug::flush;
+ switch (method) {
+ case GetProperty:
+ {
+ int objId = args[0].getInt();
+ std::map<int, JSObjectRef>::iterator i = jsObjectsById.find(objId);
+ if (i == jsObjectsById.end()) {
+ char message[50];
+ snprintf(message, sizeof(message), "Unknown object id %i", objId);
+ makeExceptionValue(*returnValue, message);
+ return true;
+ }
+
+ JSObjectRef jsObj = i->second;
+ if (args[1].isString()) {
+ JSStringRef asString = JSValueToStringCopy(contextRef, jsObj, NULL);
+ int maxLength = JSStringGetMaximumUTF8CStringSize(asString);
+ scoped_array<char> asChars(new char[maxLength]);
+ JSStringGetUTF8CString(asString, asChars.get(), maxLength);
+
+ JSValueRef localException = NULL;
+ JSStringRef str = JSStringCreateWithUTF8CString(args[1].getString().c_str());
+ JSValueRef value = JSObjectGetProperty(contextRef, jsObj, str, &localException);
+ JSStringRelease(str);
+ if (localException) {
+ makeValue(*returnValue, localException);
+ return true;
+ } else {
+ makeValue(*returnValue, value);
+ return false;
+ }
+ } else if (args[1].isInt()) {
+ JSValueRef localException = NULL;
+ JSValueRef value = JSObjectGetPropertyAtIndex(contextRef, jsObj, args[1].getInt(), &localException);
+
+ if (localException) {
+ makeValue(*returnValue, localException);
+ return true;
+ } else {
+ makeValue(*returnValue, value);
+ return false;
+ }
+ } else {
+ char message[50];
+ snprintf(message, sizeof(message), "Unhandled argument type %s for getProperty", args[1].toString().c_str());
+ makeExceptionValue(*returnValue, message);
+ return true;
+ }
+ }
+ default:
+ Debug::log(Debug::Error) << "Unhandled invokeSpecial " << method << Debug::flush;
+ makeExceptionValue(*returnValue, "Unhandled invokeSpecial");
+ return true;
+ }
+}
+
+JSValueRef WebScriptSessionHandler::javaFunctionCallbackImpl (int dispatchId,
+ JSObjectRef thisObject,
+ size_t argumentCount,
+ const JSValueRef arguments[],
+ JSValueRef* exception){
+ /*
+ * NB: Because throwing exceptions in JavaScriptCore is trivial, we don't rely
+ * on any special return values to indicate that an exception is thrown, we'll simply
+ * throw the exception.
+ */
+ Debug::log(Debug::Debugging) << "Java method " << dispatchId << " invoked" << Debug::flush;
+
+ JSValueRef toReturn;
+ if (crashHandler->hasCrashed()) {
+ Debug::log(Debug::Debugging) << "Not executing method since we have crashed" << Debug::flush;
+ toReturn = JSValueMakeUndefined(contextRef);
+ } else {
+ /*
+ * If a JS function is evaluated without an meaningful this object or the global
+ * object is implicitly used as the this object, we'll assume that the
+ * Java-derived method is static, and send a null this object to the server
+ */
+ Value thisValue;
+ if (JSValueIsEqual(contextRef, thisObject, JSContextGetGlobalObject(contextRef), NULL)) {
+ thisValue = Value();
+ thisValue.setNull();
+ } else {
+ makeValue(thisValue, thisObject);
+ }
+
+ // Argument conversion is straightforward
+ Value *args = new Value[argumentCount];
+ for (int i = 0; i < argumentCount; i++) {
+ makeValue(args[i], arguments[i]);
+ }
+
+ bool status = InvokeMessage::send(*channel, thisValue, dispatchId,
+ argumentCount, args);
+ delete[] args;
+ if (!status) {
+ initiateAutodestructSequence(__PRETTY_FUNCTION__, "Unable to send invocation message");
+ *exception = makeException("Unable to send invocation message");
+ return JSValueMakeUndefined(contextRef);
+ }
+
+ scoped_ptr<ReturnMessage> ret(channel->reactToMessagesWhileWaitingForReturn(sessionHandler));
+
+ if (!ret.get()) {
+ initiateAutodestructSequence(__PRETTY_FUNCTION__, "Unable to receive return message");
+ *exception = makeException("Unable to receive return message");
+ return JSValueMakeUndefined(contextRef);
+ }
+
+ Value v = ret->getReturnValue();
+
+ if (ret->isException()) {
+ *exception = makeValueRef(v);
+ toReturn = JSValueMakeUndefined(contextRef);
+ } else {
+ toReturn = makeValueRef(v);
+ }
+ }
+
+ JSValueRef makeResultArguments[] = {JSValueMakeBoolean(contextRef, false), toReturn};
+ return JSObjectCallAsFunction(contextRef, makeResultFunction, NULL, 2, makeResultArguments, exception);
+}
+
+void WebScriptSessionHandler::javaObjectFinalizeImpl(int objId) {
+ if (pthread_mutex_lock(&javaObjectsLock)) {
+ Debug::log(Debug::Error) << "Unable to acquire javaObjectsLock in thread " << pthread_self() << " " << __PRETTY_FUNCTION__ << Debug::flush;
+ initiateAutodestructSequence(__PRETTY_FUNCTION__, "Unable to acquire javaObjectsLock");
+ return;
+ }
+ javaObjectsById.erase(objId);
+ javaObjectsToFree.insert(objId);
+ if (pthread_mutex_unlock(&javaObjectsLock)) {
+ Debug::log(Debug::Error) << "Unable to release javaObjectsLock in thread " << pthread_self() << " " << __PRETTY_FUNCTION__ << Debug::flush;
+ initiateAutodestructSequence(__PRETTY_FUNCTION__, "Unable to release javaObjectsLock");
+ }
+}
+
+JSValueRef WebScriptSessionHandler::javaObjectGetPropertyImpl (TrackingDataRef tracker, JSObjectRef object,
+ JSStringRef propertyName, JSValueRef* exception) {
+ *exception = NULL;
+
+ if (crashHandler->hasCrashed()) {
+ Debug::log(Debug::Debugging) << "Not executing since we have crashed" << Debug::flush;
+ return JSValueMakeUndefined(contextRef);
+ }
+
+ // Convert the name
+ int maxLength = JSStringGetMaximumUTF8CStringSize(propertyName);
+ scoped_array<char> propertyNameChars(new char[maxLength]);
+ JSStringGetUTF8CString(propertyName, propertyNameChars.get(), maxLength);
+ JSValueRef toReturn;
+
+ if (!strcmp(propertyNameChars.get(), "toString")) {
+ // We'll call out to the JSNI tear-off support function
+ JSStringRef tearOffName =JSStringCreateWithUTF8CString("__gwt_makeTearOff");
+ JSValueRef makeTearOffValue = JSObjectGetProperty(contextRef, JSContextGetGlobalObject(contextRef), tearOffName, exception);
+ JSStringRelease(tearOffName);
+ if (*exception) {
+ return JSValueMakeUndefined(contextRef);
+ }
+
+ JSObjectRef makeTearOff = JSValueToObject(contextRef, makeTearOffValue, exception);
+ if (*exception) {
+ return JSValueMakeUndefined(contextRef);
+ }
+
+ JSValueRef arguments[3];
+ arguments[0] = object;
+ arguments[1] = JSValueMakeNumber(contextRef, 0);
+ arguments[2] = JSValueMakeNumber(contextRef, 0);
+ toReturn = JSObjectCallAsFunction(contextRef, makeTearOff, JSContextGetGlobalObject(contextRef), 3, arguments, exception);
+ } else {
+ char* endptr;
+ int dispatchId = strtol(propertyNameChars.get(), &endptr, 10);
+
+ if (*endptr != '\0') {
+ Debug::log(Debug::Error) << "Unable to parse dispatch id " << propertyNameChars.get() << Debug::flush;
+ *exception = makeException("Unable to parse dispatch id");
+ } else if (dispatchId < 0) {
+ Debug::log(Debug::Error) << "Dispatch ids may not be negative" << Debug::flush;
+ *exception = makeException("Dispatch ids may not be negative");
+ } else {
+ Value v = ServerMethods::getProperty(*channel, this, tracker->getObjectId(), dispatchId);
+ toReturn = makeValueRef(v);
+ }
+ }
+
+ return toReturn;
+}
+
+bool WebScriptSessionHandler::javaObjectHasPropertyImpl (TrackingDataRef tracker, JSObjectRef object, JSStringRef propertyName) {
+ // The property name must either be "toString" or a number
+ int maxLength = JSStringGetMaximumUTF8CStringSize(propertyName);
+ scoped_array<char> propertyNameChars(new char[maxLength]);
+ JSStringGetUTF8CString(propertyName, propertyNameChars.get(), maxLength);
+ if (!strcmp(propertyNameChars.get(), "toString")) {
+ return true;
+ }
+
+ char* endptr;
+ int dispatchId = strtol(propertyNameChars.get(), &endptr, 10);
+
+ if (*endptr != '\0') {
+ return false;
+ } else if (dispatchId < 0) {
+ return false;
+ } else {
+ return true;
+ }
+}
+
+bool WebScriptSessionHandler::javaObjectSetPropertyImpl (TrackingDataRef tracker, JSObjectRef object,
+ JSStringRef propertyName, JSValueRef jsValue,
+ JSValueRef* exception) {
+
+ if (crashHandler->hasCrashed()) {
+ Debug::log(Debug::Debugging) << "Not executing since we have crashed" << Debug::flush;
+ return true;
+ }
+
+ int maxLength = JSStringGetMaximumUTF8CStringSize(propertyName);
+ scoped_array<char> propertyNameChars(new char[maxLength]);
+ JSStringGetUTF8CString(propertyName, propertyNameChars.get(), maxLength);
+ Value value;
+
+ char* endptr;
+ int dispatchId = strtol(propertyNameChars.get(), &endptr, 10);
+
+ if (*endptr != '\0') {
+ // TODO Figure out the right policy here; when we throw a Java object, JSCore wants to
+ // add expandos to record stack information. It would be possible to map the limited
+ // number of properties into a synthetic causal exception in the exception being thrown.
+ } else if (dispatchId < 0) {
+ // Do nothing.
+ Debug::log(Debug::Error) << "Dispatch ids may not be negative" << Debug::flush;
+ *exception = makeException("Dispatch ids may not be negative");
+ } else {
+
+ makeValue(value, jsValue);
+
+ if (!ServerMethods::setProperty(*channel, this, tracker->getObjectId(), dispatchId, value)) {
+ char message[50];
+ snprintf(message, sizeof(message), "Unable to set value object %i dispatchId %i", tracker->getObjectId(), dispatchId);
+ *exception = makeException(message);
+ }
+ }
+
+ // true means to not try to follow the prototype chain; not an indication of success
+ return true;
+}
+
+void WebScriptSessionHandler::loadJsni(HostChannel& channel, const std::string& js) {
+ Debug::log(Debug::Spam) << "loadJsni " << js << Debug::flush;
+ JSValueRef localException = NULL;
+
+ JSStringRef script = JSStringCreateWithUTF8CString(js.c_str());
+ JSEvaluateScript(contextRef, script, NULL, NULL, NULL, &localException);
+ JSStringRelease(script);
+
+ if (localException) {
+ // TODO Exception handling
+ Debug::log(Debug::Error) << "Exception thrown during loadJsni" << Debug::flush;
+ } else {
+ Debug::log(Debug::Spam) << "Success" << Debug::flush;
+ }
+}
+
+JSValueRef WebScriptSessionHandler::makeException(const char* message) {
+ JSValueRef localException = NULL;
+ JSObjectRef global = JSContextGetGlobalObject(contextRef);
+
+ JSStringRef errorName = JSStringCreateWithUTF8CString("Error");
+ JSValueRef errorValue = JSObjectGetProperty(contextRef, global, errorName, &localException);
+ JSStringRelease(errorName);
+
+ if (!JSValueIsObject(contextRef, errorValue)) {
+ initiateAutodestructSequence(__PRETTY_FUNCTION__, "Could not get reference to Error");
+ return JSValueMakeUndefined(contextRef);
+ }
+
+ JSObjectRef errorObject = (JSObjectRef) errorValue;
+
+ if (!JSObjectIsFunction(contextRef, errorObject)) {
+ initiateAutodestructSequence(__PRETTY_FUNCTION__, "Error was not a function");
+ return JSValueMakeUndefined(contextRef);
+ }
+
+ JSValueRef args[1];
+ JSStringRef messageJs = JSStringCreateWithUTF8CString(message);
+ args[0] = JSValueMakeString(contextRef, messageJs);
+ JSStringRelease(messageJs);
+
+ return JSObjectCallAsConstructor(contextRef, errorObject, 1, args, &localException);
+}
+
+void WebScriptSessionHandler::makeExceptionValue(Value& value, const char* message) {
+ makeValue(value, makeException(message));
+}
+
+JSObjectRef WebScriptSessionHandler::makeJavaWrapper(int objId) {
+ Debug::log(Debug::Spam) << "Creating wrapper for Java object " << objId << Debug::flush;
+
+ TrackingDataRef data = new TrackingData(this, objId);
+ return JSObjectMake(contextRef, javaObjectWrapperClass,
+ const_cast<TrackingData*>(data));
+}
+
+JSValueRef WebScriptSessionHandler::makeValueRef(const Value& v) {
+ std::map<int, JSObjectRef>::iterator i;
+ switch (v.getType()) {
+ case Value::NULL_TYPE:
+ return JSValueMakeNull(contextRef);
+
+ case Value::BOOLEAN:
+ return JSValueMakeBoolean(contextRef, v.getBoolean());
+
+ case Value::BYTE:
+ return JSValueMakeNumber(contextRef, v.getByte());
+
+ case Value::CHAR:
+ return JSValueMakeNumber(contextRef, v.getChar());
+
+ case Value::SHORT:
+ return JSValueMakeNumber(contextRef, v.getShort());
+
+ case Value::INT:
+ return JSValueMakeNumber(contextRef, v.getInt());
+
+ case Value::LONG:
+ return JSValueMakeNumber(contextRef, v.getLong());
+
+ case Value::FLOAT:
+ return JSValueMakeNumber(contextRef, v.getFloat());
+
+ case Value::DOUBLE:
+ return JSValueMakeNumber(contextRef, v.getDouble());
+
+ case Value::STRING:
+ {
+ std::string stringValue = v.getString();
+
+ // We need to handle the conversion ourselves to be able to get both
+ // UTF8 encoding as well as explicit control over the length of the string
+ // due to the possibility of null characters being part of the data
+ CFStringRef cfString = CFStringCreateWithBytesNoCopy(NULL, (UInt8*)stringValue.data(),
+ stringValue.length(), kCFStringEncodingUTF8,
+ false, kCFAllocatorNull);
+ JSStringRef stringRef = JSStringCreateWithCFString(cfString);
+ JSValueRef toReturn = JSValueMakeString(contextRef, stringRef);
+ JSStringRelease(stringRef);
+ CFRelease(cfString);
+ return toReturn;
+ }
+
+ case Value::JAVA_OBJECT:
+ {
+ unsigned javaId = v.getJavaObjectId();
+ JSObjectRef ref;
+
+ pthread_mutex_lock(&javaObjectsLock);
+ i = javaObjectsById.find(javaId);
+
+ /*
+ * It's possible that we've already finalized the JsObjectRef that
+ * represented the object with the given id. If so, we must remove it
+ * from the list of finalized object ids to avoid prematurely freeing
+ * the object on the server.
+ */
+ javaObjectsToFree.erase(javaId);
+
+ if (i == javaObjectsById.end()) {
+ /*
+ * We don't call JSValueProtect so that the JavaObject peer can be
+ * garbage-collected during the lifetime of the program. Object
+ * identity is maintained as long as the object hasn't been finalized.
+ * If it had been finalized, then there wouldn't be an object to use
+ * as a basis for identity comparison.
+ *
+ * NB: The act of creating the wrapper may trigger a GC.
+ */
+ ref = makeJavaWrapper(javaId);
+
+ javaObjectsById[javaId] = ref;
+
+ } else {
+ ref = i->second;
+ }
+ pthread_mutex_unlock(&javaObjectsLock);
+
+
+ return ref;
+ }
+
+ case Value::JS_OBJECT:
+ {
+ int jsId = v.getJsObjectId();
+
+ i = jsObjectsById.find(jsId);
+ if (i == jsObjectsById.end()) {
+ char errMsg[50];
+ snprintf(errMsg, sizeof(errMsg), "Missing JsObject with id %i", jsId);
+ return makeException(errMsg);
+
+ } else {
+ return i->second;
+ }
+ }
+
+ case Value::UNDEFINED:
+ return JSValueMakeUndefined(contextRef);
+
+ default:
+ {
+ char message[50];
+ snprintf(message, sizeof(message), "Could not convert %s", v.toString().c_str());
+ initiateAutodestructSequence(__PRETTY_FUNCTION__, message);
+ return makeException(message);
+ }
+ }
+}
+
+bool WebScriptSessionHandler::makeValue(Value& ret, JSValueRef v) {
+ JSValueRef localException = NULL;
+
+ if (JSValueIsNull(contextRef, v)) {
+ ret.setNull();
+
+ } else if (JSValueIsUndefined(contextRef, v)) {
+ ret.setUndefined();
+
+ } else if (JSValueIsBoolean(contextRef, v)) {
+ ret.setBoolean(JSValueToBoolean(contextRef, v));
+
+ } else if (JSValueIsNumber(contextRef, v)) {
+ double d = JSValueToNumber(contextRef, v, &localException);
+ int i = round(d);
+ if (i == d) {
+ ret.setInt(i);
+ } else {
+ ret.setDouble(d);
+ }
+
+ } else if (JSValueIsString(contextRef, v) ||
+ JSValueIsInstanceOfConstructor(contextRef, v, stringConstructor, &localException)) {
+ return makeValueFromString(ret, v);
+
+ } else if (JSValueIsObjectOfClass(contextRef, v, javaObjectWrapperClass)) {
+ // It's one of our Java object proxies
+ JSObjectRef objectRef = JSValueToObject(contextRef, v, &localException);
+
+ if (!localException) {
+ TrackingDataRef tracker = (TrackingDataRef) JSObjectGetPrivate(objectRef);
+ int objId = tracker->getObjectId();
+ ret.setJavaObject(objId);
+ Debug::log(Debug::Spam) << "Made a Java object Value " << objId << Debug::flush;
+ }
+
+ } else if (JSValueIsObject(contextRef, v)) {
+ JSObjectRef objectRef = JSValueToObject(contextRef, v, &localException);
+ if (!localException) {
+ /*
+ * Then this is just a plain-old JavaScript Object. Because JSCore
+ * doesn't retain private data for objects derived from the built-in
+ * Object type, we'll simply revert to using a pair of maps to provide
+ * a 1:1 mapping of JSObjectRefs and ints.
+ */
+ std::map<JSObjectRef, int>::iterator i = jsIdsByObject.find(objectRef);
+ if (i != jsIdsByObject.end()) {
+ // We've seen the object before
+ ret.setJsObjectId(i->second);
+ } else {
+ // Allocate a new id
+ int objId = ++jsObjectId;
+ JSValueProtect(contextRef, objectRef);
+
+ jsObjectsById[objId] = objectRef;
+ jsIdsByObject[objectRef] = objId;
+
+ ret.setJsObjectId(objId);
+ Debug::log(Debug::Spam) << "Made JS Value " << objId << Debug::flush;
+ }
+ }
+ } else {
+ Debug::log(Debug::Error) << "Unhandled JSValueRef -> Value conversion in plugin" << Debug::flush;
+ ret.setString("Unhandled JSValueRef -> Value conversion in plugin");
+ }
+
+ if (localException) {
+ makeValue(ret, localException);
+ return true;
+ } else {
+ return false;
+ }
+}
+
+bool WebScriptSessionHandler::makeValueFromString(Value& ret, JSValueRef value) {
+ JSValueRef localException = NULL;
+
+ JSStringRef jsString = JSValueToStringCopy(contextRef, value, &localException);
+ if (localException) {
+ makeValue(ret, localException);
+ return true;
+ }
+
+ CFStringRef cfString = JSStringCopyCFString(NULL, jsString);
+ JSStringRelease(jsString);
+
+ CFIndex cfLength = CFStringGetLength(cfString);
+ CFIndex maxLength = CFStringGetMaximumSizeForEncoding(cfLength, kCFStringEncodingUTF8);
+ scoped_array<char> utf8(new char[maxLength]);
+
+ CFIndex numBytes;
+ CFStringGetBytes(cfString, CFRangeMake(0, cfLength), kCFStringEncodingUTF8,
+ 0, false, (UInt8*) utf8.get(), maxLength, &numBytes);
+ CFRelease(cfString);
+
+ ret.setString(utf8.get(), numBytes);
+ Debug::log(Debug::Spam) << "Made a string Value " << ret.getString() << Debug::flush;
+ return false;
+}
diff --git a/plugins/webkit/Core/WebScriptSessionHandler.h b/plugins/webkit/Core/WebScriptSessionHandler.h
new file mode 100644
index 0000000..5e05385
--- /dev/null
+++ b/plugins/webkit/Core/WebScriptSessionHandler.h
@@ -0,0 +1,157 @@
+/*
+ * Copyright 2008 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.
+ */
+
+#include <map>
+#include <set>
+#import "Debug.h"
+#import "HostChannel.h"
+#import "JavaScriptCore/JavaScriptCore.h"
+#import "pthread.h"
+#import "TrackingData.h"
+
+class CrashHandler {
+public:
+ virtual void crash(const char* functionName, const char* message) = 0;
+ virtual bool hasCrashed() = 0;
+};
+typedef CrashHandler* CrashHandlerRef;
+
+/*
+ * This comprises the guts of the JavaScriptCore-specific code and is
+ * responsible for message dispatch and value conversion. This class should
+ * be portable to any runtime that uses JavaScriptCore.
+ */
+class WebScriptSessionHandler : public SessionHandler, public SessionData {
+public:
+ WebScriptSessionHandler(HostChannel* channel, JSGlobalContextRef contextRef,
+ CrashHandler* crashHandler);
+
+ /*
+ * Invoking the destructor will perform a clean shutdown of the OOPHM session.
+ */
+ ~WebScriptSessionHandler();
+
+ /*
+ * This is a panic method for shutting down the OOPHM debugging session due
+ * to unrecoverable errors.
+ */
+ void initiateAutodestructSequence(const char* functionName, const char* message);
+
+ /*
+ * Invoke a Java method.
+ */
+ JSValueRef javaFunctionCallbackImpl(int dispatchId,
+ JSObjectRef thisObject,
+ size_t argumentCount,
+ const JSValueRef arguments[],
+ JSValueRef* exception);
+
+ /*
+ * Finalize a Javo object proxy.
+ */
+ void javaObjectFinalizeImpl(int objId);
+
+ /*
+ * Determine if a Java class has a named property.
+ */
+ bool javaObjectHasPropertyImpl(TrackingDataRef tracker, JSObjectRef object,
+ JSStringRef propertyName);
+
+ /*
+ * Obtain the value of named property of an object.
+ */
+ JSValueRef javaObjectGetPropertyImpl(TrackingDataRef tracker, JSObjectRef object,
+ JSStringRef propertyName, JSValueRef* exception);
+
+ /*
+ * Set the value of a named property on a Java object.
+ */
+ bool javaObjectSetPropertyImpl(TrackingDataRef tracker, JSObjectRef object,
+ JSStringRef propertyName, JSValueRef value,
+ JSValueRef* exception);
+
+ /*
+ * Create a JavaScript Error object with the given message.
+ */
+ JSValueRef makeException(const char* message);
+
+protected:
+ virtual void disconnectDetectedImpl();
+ virtual void fatalError(HostChannel& channel, const std::string& message);
+ virtual void freeValue(HostChannel& channel, int idCount, const int* ids);
+ virtual void loadJsni(HostChannel& channel, const std::string& js);
+ virtual bool invoke(HostChannel& channel, const Value& thisObj, const std::string& methodName,
+ int numArgs, const Value* const args, Value* returnValue);
+ virtual bool invokeSpecial(HostChannel& channel, SpecialMethodId method, int numArgs,
+ const Value* const args, Value* returnValue);
+ virtual void sendFreeValues(HostChannel& channel);
+
+private:
+ CrashHandlerRef const crashHandler;
+ int jsObjectId;
+ std::map<int, JSObjectRef> javaObjectsById;
+ std::set<int> javaObjectsToFree;
+ pthread_mutex_t javaObjectsLock;
+ std::map<int, JSObjectRef> jsObjectsById;
+ std::map<JSObjectRef, int> jsIdsByObject;
+ JSClassRef javaObjectWrapperClass;
+
+ /* A reference to __gwt_makeResult, which we use constantly */
+ JSObjectRef makeResultFunction;
+
+ /* The String() function */
+ JSObjectRef stringConstructor;
+
+ /*
+ * Free server-side references.
+ */
+ void freeJavaObjects();
+
+ /*
+ * Create a exception Value that contains the given message.
+ */
+ void makeExceptionValue(Value& value, const char* message);
+
+ /*
+ * Create a Java object proxy to be passed into the JavaScript execution
+ * environment.
+ */
+ JSObjectRef makeJavaWrapper(int objId);
+
+ /*
+ * Convert a value from the JavaScript into something that can be sent back
+ * to the OOPHM host.
+ *
+ * Returns true if an exception was encountered.
+ */
+ bool makeValue(Value& ret, JSValueRef value);
+
+ /*
+ * Convert a string-like object to something that can be sent back to the OOPHM
+ * host.
+ *
+ * Returns true if an exception was encountered.
+ */
+ bool makeValueFromString(Value& ret, JSValueRef value);
+
+ /*
+ * Convert a value from the OOPHM host into something that can be passed into
+ * the JavaScript execution environment.
+ */
+ JSValueRef makeValueRef(const Value& value);
+};
+typedef WebScriptSessionHandler* WebScriptSessionHandlerRef;
+
diff --git a/plugins/webkit/English.lproj/InfoPlist.strings b/plugins/webkit/English.lproj/InfoPlist.strings
new file mode 100644
index 0000000..92beb1a
--- /dev/null
+++ b/plugins/webkit/English.lproj/InfoPlist.strings
@@ -0,0 +1,3 @@
+/* Localized versions of Info.plist keys */
+
+NSHumanReadableCopyright = "© Google Inc, 2008";
diff --git a/plugins/webkit/Info.plist b/plugins/webkit/Info.plist
new file mode 100644
index 0000000..79fa629
--- /dev/null
+++ b/plugins/webkit/Info.plist
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>English</string>
+ <key>CFBundleExecutable</key>
+ <string>${EXECUTABLE_NAME}</string>
+ <key>CFBundleIconFile</key>
+ <string>gwtlogo</string>
+ <key>CFBundleIdentifier</key>
+ <string>com.google.gwt.plugin</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundleName</key>
+ <string>${PRODUCT_NAME}</string>
+ <key>CFBundlePackageType</key>
+ <string>WBPL</string>
+ <key>CFBundleSignature</key>
+ <string>????</string>
+ <key>CFBundleVersion</key>
+ <string>0.9</string>
+ <key>NSPrincipalClass</key>
+ <string>OophmPlugin</string>
+ <key>WebPluginDescription</key>
+ <string>Google Web Toolkit Developer Plugin</string>
+ <key>WebPluginMIMETypes</key>
+ <dict>
+ <key>application/x-gwt-dev-mode</key>
+ <dict>
+ <key>WebPluginTypeDescription</key>
+ <string>Google Web Toolkit Development Mode</string>
+ </dict>
+ <key>application/x-gwt-hosted-mode</key>
+ <dict>
+ <key>WebPluginTypeDescription</key>
+ <string>Google Web Toolkit Development Mode (Legacy)</string>
+ </dict>
+ </dict>
+ <key>WebPluginName</key>
+ <string>${PRODUCT_NAME}</string>
+</dict>
+</plist>
diff --git a/plugins/webkit/Plugin/Debug.mm b/plugins/webkit/Plugin/Debug.mm
new file mode 100644
index 0000000..6cc8edf
--- /dev/null
+++ b/plugins/webkit/Plugin/Debug.mm
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2008 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.
+ */
+
+#include <Debug.h>
+
+static NSMutableString* const buffer = [[NSMutableString alloc] initWithCapacity:1024];
+
+Debug::DebugStream& Debug::flush(Debug::DebugStream& dbg) {
+ Debug::logFinish();
+ return dbg;
+}
+
+void Debug::logStart(Debug::LogLevel level) {
+}
+
+void Debug::logFinish() {
+ NSLog(buffer);
+ [buffer setString:@""];
+}
+
+void Debug::logString(const char* str) {
+ [buffer appendString:[NSString stringWithUTF8String:str]];
+}
diff --git a/plugins/webkit/Plugin/English.lproj/crash.html b/plugins/webkit/Plugin/English.lproj/crash.html
new file mode 100644
index 0000000..dbf47e0
--- /dev/null
+++ b/plugins/webkit/Plugin/English.lproj/crash.html
@@ -0,0 +1,43 @@
+<html>
+<head>
+<title>GWT Development Mode Failure</title>
+<style>
+* {
+ font-family: sans-serif;
+}
+
+h1 {
+ background: blue;
+ color: white;
+ padding: 0.25em
+}
+
+#r {
+ width:100%;
+ white-space: pre-wrap;
+ font-family: monospace;
+}
+
+</style>
+</head>
+<body>
+
+<h1>GWT Development Mode Failure</h1>
+
+<p>The development mode plugin encountered a fatal error—did you stop your code server?</p>
+
+<p>You can try to restart your web application by <a href='javascript:window.location.reload()'>reloading this page</a>.</p>
+
+<hr/>
+
+<div id="r" wrap="off">
+__MESSAGE__
+
+System version: __SYSTEM_VERSION__
+
+__USER_AGENT__
+
+Compilation time: __DATE__ __TIME__
+</textarea>
+</body>
+</html>
diff --git a/plugins/webkit/Plugin/NSMutableString+HtmlReplacement.h b/plugins/webkit/Plugin/NSMutableString+HtmlReplacement.h
new file mode 100644
index 0000000..57da6e3
--- /dev/null
+++ b/plugins/webkit/Plugin/NSMutableString+HtmlReplacement.h
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2008 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.
+ */
+
+#import <Cocoa/Cocoa.h>
+#import "GTMNSString+HTML.h"
+
+/*
+ * This adds a convenience method to add HTML-escaped text to an NSMutableString.
+ */
+@interface NSMutableString (NSMutableStringWithHtmlReplacement)
+- (void)replacePattern:(NSString*)pattern
+ withStringLiteral:(NSString*)replacement;
+@end
diff --git a/plugins/webkit/Plugin/NSMutableString+HtmlReplacement.m b/plugins/webkit/Plugin/NSMutableString+HtmlReplacement.m
new file mode 100644
index 0000000..ed0f62b
--- /dev/null
+++ b/plugins/webkit/Plugin/NSMutableString+HtmlReplacement.m
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2008 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.
+ */
+
+#import "NSMutableString+HtmlReplacement.h"
+
+@implementation NSMutableString (NSMutableStringWithHtmlReplacement)
+- (void)replacePattern:(NSString*)pattern
+ withStringLiteral:(NSString*)replacement {
+ [self replaceOccurrencesOfString:pattern
+ withString:[replacement gtm_stringByEscapingForHTML]
+ options:NSLiteralSearch
+ range:NSMakeRange(0, [self length])];
+}
+@end
diff --git a/plugins/webkit/Plugin/OophmPlugin.h b/plugins/webkit/Plugin/OophmPlugin.h
new file mode 100644
index 0000000..96d0ed3
--- /dev/null
+++ b/plugins/webkit/Plugin/OophmPlugin.h
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2008 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.
+ */
+
+#import <Cocoa/Cocoa.h>
+#import <WebKit/WebKit.h>
+#import <WebKit/WebPlugin.h>
+#import "Debug.h"
+#import "OophmWebScriptObject.h"
+#import "SlowScriptProxy.h"
+#import "WebFrameNonTigerHeaders.h"
+
+/*
+ * This provides the entrypoint for the WebKit plugin. This class performs
+ * any necessary environmental configuration and provides the scripting object
+ * that represents the plugin in the JavaScript environment.
+ */
+@interface OophmPlugin : NSView <WebPlugInViewFactory> {
+@private
+ OophmWebScriptObject* _scriptObject;
+ id _slowScriptProxy;
+}
+
+/*
+ * Defined by the WebPlugInViewFactory protocol to construct an instance of
+ * the plugin.
+ */
++ (NSView *)plugInViewWithArguments:(NSDictionary *)arguments;
+- (void)dealloc;
+
+/*
+ * Called by plugInViewWithArguments to initialize the instance of the plugin.
+ */
+- (id)initWithArguments:(NSDictionary *)arguments;
+
+/*
+ * Specified by the WebPlugIn informal protocol to obtain an object whose
+ * methods will be exposed to the scripting environment.
+ */
+- (id)objectForWebScript;
+
+/*
+ * Defined by WebPlugIn and called when the plugin should shut down.
+ */
+- (void)webPlugInDestroy;
+@end
diff --git a/plugins/webkit/Plugin/OophmPlugin.mm b/plugins/webkit/Plugin/OophmPlugin.mm
new file mode 100644
index 0000000..b4c3338
--- /dev/null
+++ b/plugins/webkit/Plugin/OophmPlugin.mm
@@ -0,0 +1,108 @@
+/*
+ * Copyright 2008 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.
+ */
+
+#import "OophmPlugin.h"
+#import "OophmWebScriptObject.h"
+#import "SlowScriptProxy.h"
+
+@interface OophmPlugin (Private)
+/* Tell GoogleSoftwareUpdate the plugin is being used */
+- (void)recordActive;
+@end
+
+@implementation OophmPlugin
++ (NSView *)plugInViewWithArguments:(NSDictionary *)arguments {
+ return [[[OophmPlugin alloc] initWithArguments: arguments] autorelease];
+}
+
+- (void)dealloc {
+ Debug::log(Debug::Info) << "Plugin deallocated" << Debug::flush;
+ [super dealloc];
+}
+
+- (id)initWithArguments:(NSDictionary *)arguments {
+ Debug::log(Debug::Info) << "Plugin starting" << Debug::flush;
+ self = [super initWithFrame: NSZeroRect];
+ if (!self) {
+ return nil;
+ }
+
+ id container = [[arguments objectForKey:WebPlugInContainerKey] retain];
+ WebFrame* frame = [container webFrame];
+ JSGlobalContextRef contextRef = [frame globalContext];
+ _scriptObject = [[OophmWebScriptObject scriptObjectWithContext:contextRef withWebView:[frame webView]] retain];
+
+ /*
+ * Install a proxy to prevent slow script warnings from being shown by hijacking
+ * the message sent to the original UIDelegate. We could also use this to prevent
+ * window.alert and window.prompt from blocking test code.
+ */
+ WebView* view = [frame webView];
+ _slowScriptProxy = [[SlowScriptProxy alloc] initWithWebView: view];
+ if ([_slowScriptProxy respondsToSelector:@selector(webView:setStatusText:)]) {
+ [_slowScriptProxy webView:view setStatusText:@"GWT Developer Plugin Active"];
+ }
+
+ [self recordActive];
+
+ return self;
+}
+
+- (id)objectForWebScript {
+ return _scriptObject;
+}
+
+- (void)webPlugInDestroy {
+ Debug::log(Debug::Info) << "Destroying plugin" << Debug::flush;
+ [_scriptObject release];
+ _scriptObject = nil;
+
+ if ([_slowScriptProxy respondsToSelector:@selector(webView:setStatusText:)]) {
+ [_slowScriptProxy webView:[_slowScriptProxy webView]
+ setStatusText:@"GWT OOPHM Session Ended"];
+ }
+ [_slowScriptProxy release];
+ _slowScriptProxy = nil;
+}
+@end
+
+@implementation OophmPlugin (Private)
+// Touch a file in ~/Library/Google/GoogleSoftwareUpdate/Actives
+- (void)recordActive {
+ NSFileManager* manager = [[NSFileManager alloc] init];
+ [manager autorelease];
+ NSError* error = NULL;
+
+ NSString* activesDirectory = [NSHomeDirectory() stringByAppendingPathComponent:@"Library/Google/GoogleSoftwareUpdate/Actives"];
+ Debug::log(Debug::Info) << "Ensuring directory " << [activesDirectory UTF8String] << Debug::flush;
+ if (![manager createDirectoryAtPath:activesDirectory withIntermediateDirectories:YES attributes:nil error:&error]) {
+ Debug::log(Debug::Error) << "Unable to create actives directory " << [activesDirectory UTF8String] <<
+ ": " << [[error localizedDescription] UTF8String] << Debug::flush;
+ return;
+ }
+
+ // Add the product id
+ NSString* file = [activesDirectory stringByAppendingPathComponent:@"com.google.gwt.dev.plugin.safari"];
+
+ // Create an empty file using an empty NSData object
+ if (![manager createFileAtPath:file contents:[NSData data] attributes:nil]) {
+ Debug::log(Debug::Error) << "Unable to create actives file" << Debug::flush;
+ return;
+ }
+
+ Debug::log(Debug::Info) << "Created actives file " << [file UTF8String] << Debug::flush;
+}
+@end
\ No newline at end of file
diff --git a/plugins/webkit/Plugin/OophmWebScriptObject.h b/plugins/webkit/Plugin/OophmWebScriptObject.h
new file mode 100644
index 0000000..ee435d5
--- /dev/null
+++ b/plugins/webkit/Plugin/OophmWebScriptObject.h
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2008 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.
+ */
+
+#import <JavaScriptCore/JavaScriptCore.h>
+#import "HostChannel.h"
+#import "WebScriptSessionHandler.h"
+
+@interface OophmWebScriptObject : NSObject {
+@private
+ JSGlobalContextRef _contextRef;
+ CrashHandlerRef _crashHandler;
+ BOOL _hasCrashed;
+ HostChannel* _hostChannel;
+ WebScriptSessionHandlerRef _sessionHandler;
+ WebView* _webView;
+}
++ (void)initialize;
++ (BOOL)isSelectorExcludedFromWebScript: (SEL)selector;
++ (OophmWebScriptObject*)scriptObjectWithContext: (JSGlobalContextRef)context
+ withWebView: (WebView*) webView;
++ (NSString*)webScriptNameForSelector: (SEL)selector;
+- (BOOL)initForWebScriptWithJsniContext: (WebScriptObject*) jsniContext;
+- (BOOL)connectWithUrl: (NSString*) url
+ withSessionKey: (NSString*) sessionKey
+ withHost: (NSString*) host
+ withModuleName: (NSString*) moduleName
+ withHostedHtmlVersion: (NSString*) hostedHtmlVersion;
+- (void)crashWithMessage: (NSString*)message;
+- (void)dealloc;
+- (void)finalizeForWebScript;
+@end
+
diff --git a/plugins/webkit/Plugin/OophmWebScriptObject.mm b/plugins/webkit/Plugin/OophmWebScriptObject.mm
new file mode 100644
index 0000000..040b766
--- /dev/null
+++ b/plugins/webkit/Plugin/OophmWebScriptObject.mm
@@ -0,0 +1,420 @@
+/*
+ * Copyright 2008 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.
+ */
+
+#include <map>
+#import <JavaScriptCore/JavaScriptCore.h>
+#import <WebKit/WebKit.h>
+#import "BrowserChannel.h"
+#import "Debug.h"
+#import "GTMSystemVersion.h"
+#import "NSMutableString+HtmlReplacement.h"
+#import "LoadModuleMessage.h"
+#import "OophmWebScriptObject.h"
+#import "SessionHandler.h"
+#import "AllowedConnections.h"
+
+/*
+ * This is a helper shim to bridge crash events from the core cpp code to the
+ * objc plugin and UI layer.
+ */
+class PluginCrashHandler : public CrashHandler {
+public:
+ PluginCrashHandler(OophmWebScriptObject* obj) : obj(obj) {
+ }
+
+ virtual void crash(const char* functionName, const char* message) {
+ Debug::log(Debug::Error) << "Crashing with message: "<< message << Debug::flush;
+ NSString* str = [NSString stringWithFormat:@"%s\n\n%s", message, functionName];
+ [obj crashWithMessage:str];
+ }
+ virtual bool hasCrashed();
+private:
+ OophmWebScriptObject* const obj;
+};
+
+@interface OophmWebScriptObject (Private)
++ (void)logAndThrowString: (NSString*)message;
+- (void)addAllowedHost: (NSString*)host;
+- (BOOL)hasCrashed;
+- (void)connectAlertDidEnd: (NSAlert*)alert
+ returnCode: (int)returnCode
+ contextInfo: (void*)contextInfo;
+- (BOOL)doConnectWithUrl: (NSString*) url
+ withSessionKey: (NSString*) sessionKey
+ withHost: (NSString*) host
+ withModule: (NSString*) moduleName
+ withHostedHtmlVersion: (NSString*) hostedHtmlVersion;
+
+@end
+
+// This is declared here so that we can access the category method
+bool PluginCrashHandler::hasCrashed() {
+ return [obj hasCrashed] ? true : false;
+}
+
+@implementation OophmWebScriptObject
++ (void)initialize {
+ // Add the plugin's bundle name to the user defaults search path
+ NSBundle* pluginBundle = [NSBundle bundleForClass:[OophmWebScriptObject class]];
+ NSString* bundleIdentifier = [pluginBundle bundleIdentifier];
+ NSUserDefaults* shared = [NSUserDefaults standardUserDefaults];
+ [shared addSuiteNamed:bundleIdentifier];
+}
+
++ (BOOL)isSelectorExcludedFromWebScript:(SEL)selector {
+ if (selector == @selector(initForWebScriptWithJsniContext:)) {
+ return NO;
+ } else if (selector == @selector(connectWithUrl:withSessionKey:withHost:withModuleName:withHostedHtmlVersion:)) {
+ return NO;
+ } else if (selector == @selector(crashWithMessage:)) {
+ return NO;
+ }
+
+ return YES;
+}
+
++ (OophmWebScriptObject*)scriptObjectWithContext: (JSGlobalContextRef) context
+ withWebView: (WebView*) webView {
+ JSGlobalContextRetain(context);
+ OophmWebScriptObject* obj = [[[OophmWebScriptObject alloc] init] autorelease];
+ obj->_contextRef = context;
+ obj->_webView = [webView retain];
+ return obj;
+}
+
++ (NSString*)webScriptNameForSelector: (SEL)selector {
+ if (selector == @selector(initForWebScriptWithJsniContext:)) {
+ return @"init";
+ } else if (selector == @selector(connectWithUrl:withSessionKey:withHost:withModuleName:withHostedHtmlVersion:)) {
+ return @"connect";
+ } else if (selector == @selector(crashWithMessage:)) {
+ return @"crash";
+ }
+ return nil;
+}
+
+// Simply return true to indicate the plugin was successfully loaded and
+// reachable.
+- (BOOL)initForWebScriptWithJsniContext: (WebScriptObject*) jsniContext {
+ return YES;
+}
+
+- (BOOL)connectWithUrl: (NSString*) url
+ withSessionKey: (NSString*) sessionKey
+ withHost: (NSString*) host
+ withModuleName: (NSString*) moduleName
+ withHostedHtmlVersion: (NSString*) hostedHtmlVersion {
+
+ NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
+
+ // See if authentication has been bypassed
+ if ([defaults boolForKey:@"allowAll"]) {
+ return [self doConnectWithUrl:url withSessionKey:sessionKey withHost:host
+ withModule:moduleName withHostedHtmlVersion:hostedHtmlVersion];
+ }
+
+ // TODO(jat): do this only once, refactor to a separate method
+ NSArray* allowedHosts = [defaults arrayForKey:@"allowedHosts"];
+ if (allowedHosts != nil) {
+ AllowedConnections::clearRules();
+ int n = [allowedHosts count];
+ for (int i = 0; i < n; ++i) {
+ NSString* entry = [allowedHosts objectAtIndex:i];
+ std::string hostName = [entry UTF8String];
+ std::string codeServer = "localhost";
+ int len = hostName.length();
+ bool exclude = false;
+ if (len > 0) {
+ if (len > 1 && hostName[0] == '!') {
+ exclude = true;
+ hostName = hostName.substr(1);
+ }
+ int slash = hostName.find("/");
+ if( slash > 0 && slash != std::string::npos ) {
+ codeServer = hostName.substr(slash+1);
+ hostName = hostName.substr(0,slash);
+ }
+ AllowedConnections::addRule(hostName, codeServer, exclude);
+ }
+ }
+ }
+
+ const std::string urlStr = [url UTF8String];
+ bool allowed = false;
+
+ if (AllowedConnections::matchesRule(AllowedConnections::getHostFromUrl(urlStr),
+ AllowedConnections::getCodeServerFromUrl(urlStr),
+ &allowed) )
+ {
+ if (allowed) {
+ return [self doConnectWithUrl:url withSessionKey:sessionKey withHost:host
+ withModule:moduleName withHostedHtmlVersion:hostedHtmlVersion];
+ } else {
+ return YES;
+ }
+ }
+
+ // Otherwise, bring up an alert dialog
+ // TODO(jat): add an include/exclude option, currently treat as only include
+ NSAlert* alert = [NSAlert alertWithMessageText:@"Initiate development mode session"
+ defaultButton:@"Deny"
+ alternateButton:nil
+ otherButton:@"Allow"
+ informativeTextWithFormat:@"The current web-page would like to initiate a development-mode connection to %@", host];
+
+ if ([alert respondsToSelector:@selector(setShowsSuppressionButton:)]) {
+ [alert setShowsSuppressionButton:YES];
+ [[alert suppressionButton] setTitle:@"Remember this decision for this server"];
+ } else {
+ [[alert addButtonWithTitle:@"Always allow"] setTag:NSAlertAlternateReturn];
+ }
+
+ NSBundle* bundle = [NSBundle bundleForClass:[OophmWebScriptObject class]];
+ NSArray* contextArray = [[NSArray arrayWithObjects:[url retain],
+ [sessionKey retain], [host retain], [moduleName retain],
+ [hostedHtmlVersion retain], nil] retain];
+ NSString* imagePath = [bundle pathForImageResource:@"gwtlogo"];
+ if (imagePath != nil) {
+ NSImage* img = [[[NSImage alloc] initByReferencingFile:imagePath] autorelease];
+ [alert setIcon:img];
+ }
+
+ [alert beginSheetModalForWindow:[_webView hostWindow]
+ modalDelegate:self
+ didEndSelector:@selector(connectAlertDidEnd:returnCode:contextInfo:)
+ contextInfo:contextArray];
+ return YES;
+}
+
+- (void)crashWithMessage: (NSString*)message {
+ if (self->_hasCrashed) {
+ return;
+ }
+ self->_hasCrashed = YES;
+
+#ifdef GWT_DEBUGDISABLE
+ // We'll call out to the JS support function
+ JSGlobalContextRef contextRef = self->_contextRef;
+ JSStringRef disconnectedName = JSStringCreateWithUTF8CString("__gwt_disconnected");
+ JSValueRef disconnected = JSObjectGetProperty(contextRef, JSContextGetGlobalObject(contextRef), disconnectedName, NULL);
+ JSStringRelease(disconnectedName);
+
+ if (JSValueIsObject(contextRef, disconnected)) {
+ // Found hosted.html's crash support
+ JSObjectRef disconnectedFunction = JSValueToObject(contextRef, disconnected, NULL);
+ JSValueRef exception = NULL;
+ JSObjectCallAsFunction(contextRef, disconnectedFunction, JSContextGetGlobalObject(contextRef), 0, NULL, &exception);
+ if (!exception) {
+ // Couldn't invoke the crash handler.
+ return;
+ }
+ }
+#endif //GWT_DEBUGDISABLE
+
+ // Use a simple crash page built into the bundle
+ NSBundle* oophmBundle = [NSBundle bundleForClass:[self class]];
+ NSString* path = [oophmBundle pathForResource:@"crash" ofType:@"html"];
+ NSMutableString* crashPage = [NSMutableString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
+ [crashPage replacePattern:@"__MESSAGE__" withStringLiteral:message];
+
+ long major, minor, bugFix;
+ [GTMSystemVersion getMajor:&major minor:&minor bugFix:&bugFix];
+ NSString* systemVersion = [NSString stringWithFormat:@"%i.%i.%i", major, minor, bugFix];
+ [crashPage replacePattern:@"__SYSTEM_VERSION__" withStringLiteral:systemVersion];
+
+ NSString* ua = [_webView userAgentForURL:[NSURL URLWithString:@"about:blank"]];
+ [crashPage replacePattern:@"__USER_AGENT__" withStringLiteral:ua];
+
+ [crashPage replacePattern:@"__DATE__"
+ withStringLiteral:[NSString stringWithUTF8String:__DATE__]];
+ [crashPage replacePattern:@"__TIME__"
+ withStringLiteral:[NSString stringWithUTF8String:__TIME__]];
+
+ NSURL* currentUrl = [[[[_webView mainFrame] dataSource] response] URL];
+
+ [[_webView mainFrame] loadAlternateHTMLString:crashPage
+ baseURL:[NSURL fileURLWithPath:path]
+ forUnreachableURL:currentUrl];
+}
+
+- (void)dealloc {
+ [_webView release];
+ delete _crashHandler;
+ [super dealloc];
+}
+
+- (void)finalizeForWebScript {
+ Debug::log(Debug::Info) << "Finalizing OophmWebScriptObject" << Debug::flush;
+
+ // Disable any lingering JS proxy objects
+ _hasCrashed = true;
+
+ // Free memory
+ delete _sessionHandler;
+
+ if (_hostChannel) {
+ _hostChannel->disconnectFromHost();
+ delete _hostChannel;
+ _hostChannel = NULL;
+ }
+
+ if (_contextRef) {
+ JSGlobalContextRelease(_contextRef);
+ _contextRef = NULL;
+ }
+}
+@end
+
+@implementation OophmWebScriptObject (Private)
++ (void)logAndThrowString:(NSString*)message {
+ Debug::log(Debug::Info) << "Throwing exception from WSO: " << message << Debug::flush;
+ [WebScriptObject throwException:message];
+}
+
+- (void)addAllowedHost:(NSString*)host {
+ /*
+ * This is more complicated than usual because we're not using the
+ * application's default persestent domain. Instead, we use a plugin-specific
+ * domain.
+ */
+ NSBundle* pluginBundle = [NSBundle bundleForClass:[OophmWebScriptObject class]];
+ NSString* bundleIdentifier = [pluginBundle bundleIdentifier];
+
+ NSUserDefaults* shared = [NSUserDefaults standardUserDefaults];
+ NSDictionary* pluginDict = [shared persistentDomainForName:bundleIdentifier];
+ NSArray* allowedHosts = [pluginDict objectForKey:@"allowedHosts"];
+
+ //TODO(codefu): don't add duplicates
+
+ NSMutableArray* mutableHosts = [NSMutableArray arrayWithArray:allowedHosts];
+ NSMutableDictionary* mutableDict = [NSMutableDictionary dictionaryWithDictionary:pluginDict];
+ [mutableHosts addObject:host];
+ [mutableDict setObject:mutableHosts forKey:@"allowedHosts"];
+ [shared setPersistentDomain:mutableDict forName:bundleIdentifier];
+ [shared synchronize];
+}
+
+- (BOOL)hasCrashed{
+ return self->_hasCrashed;
+}
+
+- (void)connectAlertDidEnd:(NSAlert *)alert
+ returnCode:(int)returnCode
+ contextInfo:(void *)contextInfo {
+ NSArray* contextArray = (NSArray*) contextInfo;
+ NSString* url = [[contextArray objectAtIndex:0] autorelease];
+ NSString* sessionKey = [[contextArray objectAtIndex:1] autorelease];
+ NSString* host = [[contextArray objectAtIndex:2] autorelease];
+ NSString* moduleName = [[contextArray objectAtIndex:3] autorelease];
+ NSString* hostedHtmlVersion = [[contextArray objectAtIndex:4] autorelease];
+ [contextArray release];
+
+ if (returnCode == NSAlertDefaultReturn) {
+ //TODO(codefu): save the host/codesvr as excluded ("!host")
+ // should this require a check to verify that one is
+ // not already whitelisted?
+ // currently: ignore exclude, re-show the modal popup on webpage reload
+ return;
+ } else if (returnCode == NSAlertAlternateReturn ||
+ [alert respondsToSelector:@selector(suppressionButton)] &&
+ [[alert suppressionButton] state] == NSOnState) {
+ // TODO(jat): simplify, handle errors
+ // Get the host part of the URL and store that
+ NSString* host = [NSString stringWithFormat: @"%@/%@",
+ [[[[[[url componentsSeparatedByString:@"://"]
+ objectAtIndex:1] componentsSeparatedByString:@"/"] objectAtIndex:0]
+ componentsSeparatedByString:@":"] objectAtIndex:0],
+ [[[[[[url componentsSeparatedByString:@"gwt.codesvr="]
+ objectAtIndex:1] componentsSeparatedByString:@"&"] objectAtIndex:0]
+ componentsSeparatedByString:@":"] objectAtIndex:0]];
+ [self addAllowedHost:host];
+ }
+
+ [self doConnectWithUrl:url withSessionKey:sessionKey withHost:host
+ withModule:moduleName withHostedHtmlVersion:hostedHtmlVersion];
+}
+
+- (BOOL)doConnectWithUrl: (NSString*) url
+ withSessionKey: (NSString*) sessionKey
+ withHost: (NSString*) host
+ withModule: (NSString*) moduleName
+ withHostedHtmlVersion: (NSString*) hostedHtmlVersion {
+ Debug::log(Debug::Debugging) << "connect : " << [host UTF8String] << " " <<
+ [moduleName UTF8String] << Debug::flush;
+
+ if (_hostChannel != NULL) {
+ [OophmWebScriptObject logAndThrowString:@"Already connected"];
+ return NO;
+ }
+
+ NSArray *parts = [host componentsSeparatedByString:@":"];
+ if ([parts count] != 2) {
+ [OophmWebScriptObject logAndThrowString:
+ [NSString stringWithFormat:@"Incorrect format for host string %i",
+ [parts count]]];
+ return NO;
+ }
+
+ NSString *hostPart = [parts objectAtIndex:0];
+ NSString *portPart = [parts objectAtIndex:1];
+
+ Debug::log(Debug::Debugging) << "Extracted host: " << [hostPart UTF8String] <<
+ " and port: " << [portPart UTF8String] << Debug::flush;
+
+ char *hostAsChars = const_cast<char*>([hostPart UTF8String]);
+ unsigned portAsInt = [portPart intValue];
+
+ _hostChannel = new HostChannel();
+ if (!_hostChannel->connectToHost(hostAsChars, portAsInt)) {
+ [OophmWebScriptObject logAndThrowString:@"HostChannel failed to connect"];
+ delete _hostChannel;
+ _hostChannel = NULL;
+ return NO;
+ }
+
+ _crashHandler = new PluginCrashHandler(self);
+ _sessionHandler = new WebScriptSessionHandler(_hostChannel, _contextRef, _crashHandler);
+
+ std::string hostedHtmlVersionStr([hostedHtmlVersion UTF8String]);
+ // TODO: add support for a range of protocol versions when more are added.
+ if (!_hostChannel->init(_sessionHandler, BROWSERCHANNEL_PROTOCOL_VERSION,
+ BROWSERCHANNEL_PROTOCOL_VERSION, hostedHtmlVersionStr)) {
+ [OophmWebScriptObject logAndThrowString:@"HostChannel failed to initialize"];
+ _hostChannel->disconnectFromHost();
+ delete _hostChannel;
+ _hostChannel = NULL;
+ return NO;
+ }
+
+ const std::string urlStr = [url UTF8String];
+ // TODO(jat): add support for tab identity
+ const std::string tabKeyStr = "";
+ const std::string sessionKeyStr = [sessionKey UTF8String];
+ const std::string moduleNameStr = [moduleName UTF8String];
+
+ if (!LoadModuleMessage::send(*_hostChannel, urlStr, tabKeyStr,
+ sessionKeyStr, moduleNameStr,
+ "Safari DMP", _sessionHandler)) {
+ _hostChannel->disconnectFromHost();
+ delete _hostChannel;
+ _hostChannel = NULL;
+ [OophmWebScriptObject logAndThrowString:@"Unable to load module"];
+ return NO;
+ }
+
+ return YES;
+}
+@end
diff --git a/plugins/webkit/Plugin/SlowScriptProxy.h b/plugins/webkit/Plugin/SlowScriptProxy.h
new file mode 100644
index 0000000..f46ab94
--- /dev/null
+++ b/plugins/webkit/Plugin/SlowScriptProxy.h
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2008 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.
+ */
+
+#import <Cocoa/Cocoa.h>
+#import <WebKit/WebKit.h>
+
+/*
+ * This NSProxy is used to prevent slow-script warnings from surfacing in the
+ * web browser. This is something of a hack since the message that we want
+ * to override isn't public, but there's no way to directly reset the slow-scipt
+ * timer either.
+ */
+@interface SlowScriptProxy : NSProxy {
+@private
+ id _target;
+ WebView* _webView;
+}
+
+/*
+ * This will restore the original UIDelegate.
+ */
+- (void)dealloc;
+
+/*
+ * The proxy object will install itself as the UIDelegate on the given webView.
+ */
+- (id)initWithWebView: (WebView*)webView;
+
+/*
+ * Just delegates the invocation to the original UIDelegate.
+ */
+- (void)forwardInvocation:(NSInvocation *)anInvocation;
+
+/*
+ * Just delegates the invocation to the original UIDelegate.
+ */
+- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector;
+
+/*
+ * The WebView to which the proxy object has attached itself.
+ */
+- (WebView*)webView;
+
+/*
+ * This is the message that we want to intercept.
+ */
+- (BOOL)webViewShouldInterruptJavaScript:(WebView *)sender;
+@end
diff --git a/plugins/webkit/Plugin/SlowScriptProxy.m b/plugins/webkit/Plugin/SlowScriptProxy.m
new file mode 100644
index 0000000..8798ada
--- /dev/null
+++ b/plugins/webkit/Plugin/SlowScriptProxy.m
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2008 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.
+ */
+
+#import "SlowScriptProxy.h"
+
+@implementation SlowScriptProxy
+- (id)initWithWebView:(WebView*)webView {
+ _target = [[webView UIDelegate] retain];
+ _webView = [webView retain];
+ [_webView setUIDelegate:self];
+ return self;
+}
+
+- (void)dealloc {
+ // Restore the original delegate
+ [_webView setUIDelegate:_target];
+ [_webView release];
+ [_target release];
+ [super dealloc];
+}
+
+- (void)forwardInvocation:(NSInvocation *)anInvocation {
+ [anInvocation setTarget:_target];
+ [anInvocation invoke];
+}
+
+- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector {
+ return [_target methodSignatureForSelector:aSelector];
+}
+
+- (WebView*)webView {
+ return _webView;
+}
+
+- (BOOL)webViewShouldInterruptJavaScript:(WebView *)sender {
+ // TODO: (robertvawter) What do we want to do with repeated invocations?
+ return NO;
+}
+
+@end
diff --git a/plugins/webkit/Plugin/WebFrameNonTigerHeaders.h b/plugins/webkit/Plugin/WebFrameNonTigerHeaders.h
new file mode 100644
index 0000000..975ea6d
--- /dev/null
+++ b/plugins/webkit/Plugin/WebFrameNonTigerHeaders.h
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2008 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.
+ */
+
+#import <JavaScriptCore/JavaScriptCore.h>
+
+/*!
+ * The headers in Tiger don't include the globalContext method.
+ */
+@interface WebFrame (NonTigerHeaders)
+- (JSGlobalContextRef) globalContext;
+@end
\ No newline at end of file
diff --git a/plugins/webkit/build.xml b/plugins/webkit/build.xml
new file mode 100755
index 0000000..34fee9e
--- /dev/null
+++ b/plugins/webkit/build.xml
@@ -0,0 +1,18 @@
+<project name="webkit" default="build" basedir=".">
+ <property name="plugin.root" value="webkit" />
+ <import file="../common.ant.xml" />
+
+ <target name="build" description="Copy compiled plugin to the output folder">
+ <mkdir dir="${gwt.build.out}/plugins" />
+ <mkdir dir="${gwt.build.out}/plugins/webkit" />
+ <copy todir="${gwt.build.out}/plugins/webkit">
+ <fileset file="prebuilt/oophm.dmg" />
+ </copy>
+ </target>
+
+ <target name="test" description="Run any tests">
+ </target>
+
+ <target name="checkstyle" description="Static style analysis">
+ </target>
+</project>
diff --git a/plugins/webkit/gwtlogo.icns b/plugins/webkit/gwtlogo.icns
new file mode 100644
index 0000000..6a593df
--- /dev/null
+++ b/plugins/webkit/gwtlogo.icns
Binary files differ
diff --git a/plugins/webkit/oophm.xcodeproj/project.pbxproj b/plugins/webkit/oophm.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..7cc225d
--- /dev/null
+++ b/plugins/webkit/oophm.xcodeproj/project.pbxproj
@@ -0,0 +1,786 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 45;
+ objects = {
+
+/* Begin PBXAggregateTarget section */
+ 48547E030DD882170047AC8A /* symlinks */ = {
+ isa = PBXAggregateTarget;
+ buildConfigurationList = 48547E080DD8823B0047AC8A /* Build configuration list for PBXAggregateTarget "symlinks" */;
+ buildPhases = (
+ 48547E020DD882170047AC8A /* Make symlink */,
+ );
+ comments = "This will create a symlink in ~/Library/Internet Plug-Ins to the plugin";
+ dependencies = (
+ 48547E070DD8821D0047AC8A /* PBXTargetDependency */,
+ );
+ name = symlinks;
+ productName = oophm.symlink;
+ };
+/* End PBXAggregateTarget section */
+
+/* Begin PBXBuildFile section */
+ 45283765103BCCB100153ABF /* CheckVersionsMessage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 45283764103BCCB100153ABF /* CheckVersionsMessage.cpp */; };
+ 4528376F103BCCDF00153ABF /* ChooseTransportMessage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 45283767103BCCDF00153ABF /* ChooseTransportMessage.cpp */; };
+ 45283770103BCCDF00153ABF /* FatalErrorMessage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 45283769103BCCDF00153ABF /* FatalErrorMessage.cpp */; };
+ 45283771103BCCDF00153ABF /* ProtocolVersionMessage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4528376B103BCCDF00153ABF /* ProtocolVersionMessage.cpp */; };
+ 45283772103BCCDF00153ABF /* SwitchTransportMessage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4528376D103BCCDF00153ABF /* SwitchTransportMessage.cpp */; };
+ 480DDCAA0E381E22000711F4 /* AppController.m in Sources */ = {isa = PBXBuildFile; fileRef = 48A23BB50DD0E688004EF5CA /* AppController.m */; };
+ 480DDCAB0E381E23000711F4 /* BrowserWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 48A23C770DD0F545004EF5CA /* BrowserWindow.m */; };
+ 480DDCAC0E381E28000711F4 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 48A23BB60DD0E688004EF5CA /* main.m */; };
+ 48108DDF0E2C15BD007FA76C /* AllowedConnections.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 48108DDB0E2C15BD007FA76C /* AllowedConnections.cpp */; };
+ 48108DE00E2C15BD007FA76C /* Socket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 48108DDD0E2C15BD007FA76C /* Socket.cpp */; };
+ 48338DDF0E4A2CA7008ACF0F /* oophm_bypass.plist in Resources */ = {isa = PBXBuildFile; fileRef = 48338DDB0E4A2C49008ACF0F /* oophm_bypass.plist */; };
+ 48420D410DD51A3D001F3839 /* GTMNSString+HTML.m in Sources */ = {isa = PBXBuildFile; fileRef = 48420D3E0DD51A3D001F3839 /* GTMNSString+HTML.m */; };
+ 4851A9D50DD1198300C577B2 /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 48FD98A00DC62FD800E011A2 /* JavaScriptCore.framework */; };
+ 48547F000DD889DA0047AC8A /* GTMSystemVersion.m in Sources */ = {isa = PBXBuildFile; fileRef = 48547EFF0DD889DA0047AC8A /* GTMSystemVersion.m */; };
+ 48547F4B0DD88D110047AC8A /* NSMutableString+HtmlReplacement.m in Sources */ = {isa = PBXBuildFile; fileRef = 48547F4A0DD88D110047AC8A /* NSMutableString+HtmlReplacement.m */; };
+ 485505ED0DCD475C0009536F /* SlowScriptProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 485505EC0DCD475C0009536F /* SlowScriptProxy.m */; };
+ 4856DF890DCF95B8000BF47C /* HostChannel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4856DF750DCF95B8000BF47C /* HostChannel.cpp */; };
+ 4856DF8A0DCF95B8000BF47C /* InvokeMessage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4856DF770DCF95B8000BF47C /* InvokeMessage.cpp */; };
+ 4856DF8B0DCF95B8000BF47C /* LoadModuleMessage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4856DF790DCF95B8000BF47C /* LoadModuleMessage.cpp */; };
+ 4856DF8E0DCF95B8000BF47C /* ReturnMessage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4856DF7F0DCF95B8000BF47C /* ReturnMessage.cpp */; };
+ 4856DF8F0DCF95B8000BF47C /* README.google in Resources */ = {isa = PBXBuildFile; fileRef = 4856DF820DCF95B8000BF47C /* README.google */; };
+ 4856DF900DCF95B8000BF47C /* ServerMethods.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4856DF840DCF95B8000BF47C /* ServerMethods.cpp */; };
+ 485CCFF00DDDDEA400AEE666 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 485CCFEF0DDDDEA400AEE666 /* CoreFoundation.framework */; };
+ 485CD0AA0DDDEAF300AEE666 /* Debug.mm in Sources */ = {isa = PBXBuildFile; fileRef = 485CD0A90DDDEAF300AEE666 /* Debug.mm */; };
+ 486DA8F50DD22BD50065980B /* crash.html in Resources */ = {isa = PBXBuildFile; fileRef = 486DA8F40DD22BD50065980B /* crash.html */; };
+ 48A237D10DCFB46D004EF5CA /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7ADFEA557BF11CA2CBB /* Cocoa.framework */; };
+ 48A23BC60DD0E6EE004EF5CA /* browser.nib in Resources */ = {isa = PBXBuildFile; fileRef = 48A23BC50DD0E6EE004EF5CA /* browser.nib */; };
+ 48A23BE00DD0E8B1004EF5CA /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 48FD98A10DC62FD800E011A2 /* WebKit.framework */; };
+ 48A23BE10DD0E8B6004EF5CA /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7ADFEA557BF11CA2CBB /* Cocoa.framework */; };
+ 48A23C510DD0F2D6004EF5CA /* Browser-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 48A23C500DD0F2D6004EF5CA /* Browser-Info.plist */; };
+ 48A23C530DD0F302004EF5CA /* gwtlogo.icns in Resources */ = {isa = PBXBuildFile; fileRef = 48C4D72D0DCA2B6900C34919 /* gwtlogo.icns */; };
+ 48ABDDC50DCBA04800B0159A /* WebScriptSessionHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 48ABDDC40DCBA04800B0159A /* WebScriptSessionHandler.cpp */; };
+ 48C4D72E0DCA2B6900C34919 /* gwtlogo.icns in Resources */ = {isa = PBXBuildFile; fileRef = 48C4D72D0DCA2B6900C34919 /* gwtlogo.icns */; };
+ 48C9EA4A0E37863700E691C6 /* FreeValueMessage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 48C9EA440E37863700E691C6 /* FreeValueMessage.cpp */; };
+ 48C9EA4B0E37863700E691C6 /* InvokeSpecialMessage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 48C9EA460E37863700E691C6 /* InvokeSpecialMessage.cpp */; };
+ 48C9EA4C0E37863700E691C6 /* LoadJsniMessage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 48C9EA480E37863700E691C6 /* LoadJsniMessage.cpp */; };
+ 48EF692D0E318E200050F5D6 /* ObjectFunctions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 48EF692C0E318E200050F5D6 /* ObjectFunctions.cpp */; };
+ 48FD98900DC62E7400E011A2 /* OophmPlugin.mm in Sources */ = {isa = PBXBuildFile; fileRef = 48FD988F0DC62E7400E011A2 /* OophmPlugin.mm */; };
+ 48FD98A20DC62FD800E011A2 /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 48FD98A00DC62FD800E011A2 /* JavaScriptCore.framework */; };
+ 48FD98A30DC62FD800E011A2 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 48FD98A10DC62FD800E011A2 /* WebKit.framework */; };
+ 48FD99540DC6349F00E011A2 /* OophmWebScriptObject.mm in Sources */ = {isa = PBXBuildFile; fileRef = 48FD99530DC6349F00E011A2 /* OophmWebScriptObject.mm */; };
+ 8D5B49B0048680CD000E48DA /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C167DFE841241C02AAC07 /* InfoPlist.strings */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+ 48547E060DD8821D0047AC8A /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 089C1669FE841209C02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 8D5B49AC048680CD000E48DA;
+ remoteInfo = oophm;
+ };
+ 485CD0C40DDDED1700AEE666 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 089C1669FE841209C02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 48547E030DD882170047AC8A;
+ remoteInfo = symlinks;
+ };
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXFileReference section */
+ 089C1672FE841209C02AAC07 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = "<absolute>"; };
+ 089C167EFE841241C02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+ 089C167FFE841241C02AAC07 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = "<absolute>"; };
+ 1058C7ADFEA557BF11CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = "<absolute>"; };
+ 32DBCF630370AF2F00C91783 /* oophm_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = oophm_Prefix.pch; sourceTree = "<group>"; };
+ 45283764103BCCB100153ABF /* CheckVersionsMessage.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = CheckVersionsMessage.cpp; sourceTree = "<group>"; };
+ 45283766103BCCDF00153ABF /* CheckVersionsMessage.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = CheckVersionsMessage.h; sourceTree = "<group>"; };
+ 45283767103BCCDF00153ABF /* ChooseTransportMessage.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = ChooseTransportMessage.cpp; sourceTree = "<group>"; };
+ 45283768103BCCDF00153ABF /* ChooseTransportMessage.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = ChooseTransportMessage.h; sourceTree = "<group>"; };
+ 45283769103BCCDF00153ABF /* FatalErrorMessage.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = FatalErrorMessage.cpp; sourceTree = "<group>"; };
+ 4528376A103BCCDF00153ABF /* FatalErrorMessage.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = FatalErrorMessage.h; sourceTree = "<group>"; };
+ 4528376B103BCCDF00153ABF /* ProtocolVersionMessage.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = ProtocolVersionMessage.cpp; sourceTree = "<group>"; };
+ 4528376C103BCCDF00153ABF /* ProtocolVersionMessage.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = ProtocolVersionMessage.h; sourceTree = "<group>"; };
+ 4528376D103BCCDF00153ABF /* SwitchTransportMessage.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = SwitchTransportMessage.cpp; sourceTree = "<group>"; };
+ 4528376E103BCCDF00153ABF /* SwitchTransportMessage.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = SwitchTransportMessage.h; sourceTree = "<group>"; };
+ 48108DDB0E2C15BD007FA76C /* AllowedConnections.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AllowedConnections.cpp; sourceTree = "<group>"; };
+ 48108DDC0E2C15BD007FA76C /* AllowedConnections.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AllowedConnections.h; sourceTree = "<group>"; };
+ 48108DDD0E2C15BD007FA76C /* Socket.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Socket.cpp; sourceTree = "<group>"; };
+ 48108DDE0E2C15BD007FA76C /* Socket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Socket.h; sourceTree = "<group>"; };
+ 48338DDB0E4A2C49008ACF0F /* oophm_bypass.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = oophm_bypass.plist; sourceTree = "<group>"; };
+ 48420D3C0DD51A23001F3839 /* GTMDefines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GTMDefines.h; path = GTM/GTMDefines.h; sourceTree = "<group>"; };
+ 48420D3D0DD51A3D001F3839 /* GTMNSString+HTML.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "GTMNSString+HTML.h"; path = "GTM/Foundation/GTMNSString+HTML.h"; sourceTree = "<group>"; };
+ 48420D3E0DD51A3D001F3839 /* GTMNSString+HTML.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "GTMNSString+HTML.m"; path = "GTM/Foundation/GTMNSString+HTML.m"; sourceTree = "<group>"; };
+ 48547EFE0DD889DA0047AC8A /* GTMSystemVersion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GTMSystemVersion.h; path = GTM/Foundation/GTMSystemVersion.h; sourceTree = "<group>"; };
+ 48547EFF0DD889DA0047AC8A /* GTMSystemVersion.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GTMSystemVersion.m; path = GTM/Foundation/GTMSystemVersion.m; sourceTree = "<group>"; };
+ 48547F490DD88D110047AC8A /* NSMutableString+HtmlReplacement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSMutableString+HtmlReplacement.h"; sourceTree = "<group>"; };
+ 48547F4A0DD88D110047AC8A /* NSMutableString+HtmlReplacement.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSMutableString+HtmlReplacement.m"; sourceTree = "<group>"; };
+ 485505EB0DCD475C0009536F /* SlowScriptProxy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SlowScriptProxy.h; sourceTree = "<group>"; };
+ 485505EC0DCD475C0009536F /* SlowScriptProxy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SlowScriptProxy.m; sourceTree = "<group>"; };
+ 4856DF740DCF95B8000BF47C /* BrowserChannel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BrowserChannel.h; path = ../common/BrowserChannel.h; sourceTree = SOURCE_ROOT; };
+ 4856DF750DCF95B8000BF47C /* HostChannel.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = HostChannel.cpp; path = ../common/HostChannel.cpp; sourceTree = SOURCE_ROOT; };
+ 4856DF760DCF95B8000BF47C /* HostChannel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HostChannel.h; path = ../common/HostChannel.h; sourceTree = SOURCE_ROOT; };
+ 4856DF770DCF95B8000BF47C /* InvokeMessage.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = InvokeMessage.cpp; path = ../common/InvokeMessage.cpp; sourceTree = SOURCE_ROOT; };
+ 4856DF780DCF95B8000BF47C /* InvokeMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = InvokeMessage.h; path = ../common/InvokeMessage.h; sourceTree = SOURCE_ROOT; };
+ 4856DF790DCF95B8000BF47C /* LoadModuleMessage.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = LoadModuleMessage.cpp; path = ../common/LoadModuleMessage.cpp; sourceTree = SOURCE_ROOT; };
+ 4856DF7A0DCF95B8000BF47C /* LoadModuleMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = LoadModuleMessage.h; path = ../common/LoadModuleMessage.h; sourceTree = SOURCE_ROOT; };
+ 4856DF7D0DCF95B8000BF47C /* Message.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Message.h; path = ../common/Message.h; sourceTree = SOURCE_ROOT; };
+ 4856DF7E0DCF95B8000BF47C /* QuitMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = QuitMessage.h; path = ../common/QuitMessage.h; sourceTree = SOURCE_ROOT; };
+ 4856DF7F0DCF95B8000BF47C /* ReturnMessage.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ReturnMessage.cpp; path = ../common/ReturnMessage.cpp; sourceTree = SOURCE_ROOT; };
+ 4856DF800DCF95B8000BF47C /* ReturnMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ReturnMessage.h; path = ../common/ReturnMessage.h; sourceTree = SOURCE_ROOT; };
+ 4856DF820DCF95B8000BF47C /* README.google */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = README.google; path = ../common/scoped_ptr/README.google; sourceTree = SOURCE_ROOT; };
+ 4856DF830DCF95B8000BF47C /* scoped_ptr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = scoped_ptr.h; path = ../common/scoped_ptr/scoped_ptr.h; sourceTree = SOURCE_ROOT; };
+ 4856DF840DCF95B8000BF47C /* ServerMethods.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ServerMethods.cpp; path = ../common/ServerMethods.cpp; sourceTree = SOURCE_ROOT; };
+ 4856DF850DCF95B8000BF47C /* ServerMethods.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ServerMethods.h; path = ../common/ServerMethods.h; sourceTree = SOURCE_ROOT; };
+ 4856DF860DCF95B8000BF47C /* SessionHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SessionHandler.h; path = ../common/SessionHandler.h; sourceTree = SOURCE_ROOT; };
+ 4856DF880DCF95B8000BF47C /* Value.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Value.h; path = ../common/Value.h; sourceTree = SOURCE_ROOT; };
+ 485CCE650DDDC5E900AEE666 /* HashMap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HashMap.h; sourceTree = "<group>"; };
+ 485CCFEF0DDDDEA400AEE666 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = /System/Library/Frameworks/CoreFoundation.framework; sourceTree = "<absolute>"; };
+ 485CD0A90DDDEAF300AEE666 /* Debug.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = Debug.mm; sourceTree = "<group>"; };
+ 486DA8ED0DD22B850065980B /* English */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; name = English; path = English.lproj/crash.html; sourceTree = "<group>"; wrapsLines = 0; };
+ 48A23BA20DD0E5B4004EF5CA /* Browser.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Browser.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ 48A23BB40DD0E688004EF5CA /* AppController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppController.h; sourceTree = "<group>"; };
+ 48A23BB50DD0E688004EF5CA /* AppController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppController.m; sourceTree = "<group>"; };
+ 48A23BB60DD0E688004EF5CA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
+ 48A23BC50DD0E6EE004EF5CA /* browser.nib */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; path = browser.nib; sourceTree = "<group>"; };
+ 48A23C500DD0F2D6004EF5CA /* Browser-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "Browser-Info.plist"; sourceTree = "<group>"; };
+ 48A23C760DD0F545004EF5CA /* BrowserWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BrowserWindow.h; sourceTree = "<group>"; };
+ 48A23C770DD0F545004EF5CA /* BrowserWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BrowserWindow.m; sourceTree = "<group>"; };
+ 48ABDDC30DCBA04800B0159A /* WebScriptSessionHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebScriptSessionHandler.h; sourceTree = "<group>"; };
+ 48ABDDC40DCBA04800B0159A /* WebScriptSessionHandler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WebScriptSessionHandler.cpp; sourceTree = "<group>"; };
+ 48ABDDC80DCBA09D00B0159A /* TrackingData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TrackingData.h; sourceTree = "<group>"; };
+ 48ABE1050DCBB67600B0159A /* SessionData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SessionData.h; sourceTree = "<group>"; };
+ 48C4D72D0DCA2B6900C34919 /* gwtlogo.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = gwtlogo.icns; sourceTree = "<group>"; };
+ 48C9EA440E37863700E691C6 /* FreeValueMessage.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FreeValueMessage.cpp; sourceTree = "<group>"; };
+ 48C9EA450E37863700E691C6 /* FreeValueMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FreeValueMessage.h; sourceTree = "<group>"; };
+ 48C9EA460E37863700E691C6 /* InvokeSpecialMessage.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InvokeSpecialMessage.cpp; sourceTree = "<group>"; };
+ 48C9EA470E37863700E691C6 /* InvokeSpecialMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InvokeSpecialMessage.h; sourceTree = "<group>"; };
+ 48C9EA480E37863700E691C6 /* LoadJsniMessage.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LoadJsniMessage.cpp; sourceTree = "<group>"; };
+ 48C9EA490E37863700E691C6 /* LoadJsniMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LoadJsniMessage.h; sourceTree = "<group>"; };
+ 48D5795D0DDB8C03005A3498 /* Debug.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Debug.h; sourceTree = "<group>"; };
+ 48D5795E0DDB8C03005A3498 /* DebugLevel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DebugLevel.h; sourceTree = "<group>"; };
+ 48EF692B0E318E200050F5D6 /* ObjectFunctions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ObjectFunctions.h; sourceTree = "<group>"; };
+ 48EF692C0E318E200050F5D6 /* ObjectFunctions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ObjectFunctions.cpp; sourceTree = "<group>"; };
+ 48FD988E0DC62E7400E011A2 /* OophmPlugin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OophmPlugin.h; sourceTree = "<group>"; };
+ 48FD988F0DC62E7400E011A2 /* OophmPlugin.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = OophmPlugin.mm; sourceTree = "<group>"; };
+ 48FD989B0DC62F8800E011A2 /* WebFrameNonTigerHeaders.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = WebFrameNonTigerHeaders.h; sourceTree = "<group>"; };
+ 48FD98A00DC62FD800E011A2 /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = /System/Library/Frameworks/JavaScriptCore.framework; sourceTree = "<absolute>"; };
+ 48FD98A10DC62FD800E011A2 /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = /System/Library/Frameworks/WebKit.framework; sourceTree = "<absolute>"; };
+ 48FD99520DC6349F00E011A2 /* OophmWebScriptObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OophmWebScriptObject.h; sourceTree = "<group>"; };
+ 48FD99530DC6349F00E011A2 /* OophmWebScriptObject.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = OophmWebScriptObject.mm; sourceTree = "<group>"; };
+ 48FFCFC80DD35DA900805659 /* Platform.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Platform.h; sourceTree = "<group>"; };
+ 8D5B49B6048680CD000E48DA /* gwt-dev.webplugin */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "gwt-dev.webplugin"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 8D5B49B7048680CD000E48DA /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
+ D2F7E65807B2D6F200F64583 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = "<absolute>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 48A23BA00DD0E5B4004EF5CA /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 48A23BE00DD0E8B1004EF5CA /* WebKit.framework in Frameworks */,
+ 48A23BE10DD0E8B6004EF5CA /* Cocoa.framework in Frameworks */,
+ 4851A9D50DD1198300C577B2 /* JavaScriptCore.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 8D5B49B3048680CD000E48DA /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 48FD98A20DC62FD800E011A2 /* JavaScriptCore.framework in Frameworks */,
+ 48FD98A30DC62FD800E011A2 /* WebKit.framework in Frameworks */,
+ 48A237D10DCFB46D004EF5CA /* Cocoa.framework in Frameworks */,
+ 485CCFF00DDDDEA400AEE666 /* CoreFoundation.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 089C166AFE841209C02AAC07 /* oophm */ = {
+ isa = PBXGroup;
+ children = (
+ 485506C90DCD54180009536F /* Classes */,
+ 48420D3B0DD51A0F001F3839 /* GTM */,
+ 32C88E010371C26100C91783 /* Other Sources */,
+ 089C167CFE841241C02AAC07 /* Resources */,
+ 089C1671FE841209C02AAC07 /* Frameworks and Libraries */,
+ 19C28FB8FE9D52D311CA2CBB /* Products */,
+ );
+ comments = "/*\n * Copyright 2008 Google Inc.\n * \n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * \n * http://www.apache.org/licenses/LICENSE-2.0\n * \n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n";
+ name = oophm;
+ sourceTree = "<group>";
+ };
+ 089C1671FE841209C02AAC07 /* Frameworks and Libraries */ = {
+ isa = PBXGroup;
+ children = (
+ 1058C7ACFEA557BF11CA2CBB /* Linked Frameworks */,
+ 1058C7AEFEA557BF11CA2CBB /* Other Frameworks */,
+ );
+ name = "Frameworks and Libraries";
+ sourceTree = "<group>";
+ };
+ 089C167CFE841241C02AAC07 /* Resources */ = {
+ isa = PBXGroup;
+ children = (
+ 48338DDB0E4A2C49008ACF0F /* oophm_bypass.plist */,
+ 486DA8F40DD22BD50065980B /* crash.html */,
+ 48C4D72D0DCA2B6900C34919 /* gwtlogo.icns */,
+ 8D5B49B7048680CD000E48DA /* Info.plist */,
+ 089C167DFE841241C02AAC07 /* InfoPlist.strings */,
+ );
+ name = Resources;
+ sourceTree = "<group>";
+ };
+ 1058C7ACFEA557BF11CA2CBB /* Linked Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ 485CCFEF0DDDDEA400AEE666 /* CoreFoundation.framework */,
+ 48FD98A00DC62FD800E011A2 /* JavaScriptCore.framework */,
+ 48FD98A10DC62FD800E011A2 /* WebKit.framework */,
+ 1058C7ADFEA557BF11CA2CBB /* Cocoa.framework */,
+ );
+ name = "Linked Frameworks";
+ sourceTree = "<group>";
+ };
+ 1058C7AEFEA557BF11CA2CBB /* Other Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ 089C167FFE841241C02AAC07 /* AppKit.framework */,
+ D2F7E65807B2D6F200F64583 /* CoreData.framework */,
+ 089C1672FE841209C02AAC07 /* Foundation.framework */,
+ );
+ name = "Other Frameworks";
+ sourceTree = "<group>";
+ };
+ 19C28FB8FE9D52D311CA2CBB /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 8D5B49B6048680CD000E48DA /* gwt-dev.webplugin */,
+ 48A23BA20DD0E5B4004EF5CA /* Browser.app */,
+ );
+ name = Products;
+ sourceTree = "<group>";
+ };
+ 32C88E010371C26100C91783 /* Other Sources */ = {
+ isa = PBXGroup;
+ children = (
+ 4856DF730DCF95B8000BF47C /* common */,
+ 32DBCF630370AF2F00C91783 /* oophm_Prefix.pch */,
+ );
+ name = "Other Sources";
+ sourceTree = "<group>";
+ };
+ 48420D3B0DD51A0F001F3839 /* GTM */ = {
+ isa = PBXGroup;
+ children = (
+ 48547EFE0DD889DA0047AC8A /* GTMSystemVersion.h */,
+ 48547EFF0DD889DA0047AC8A /* GTMSystemVersion.m */,
+ 48420D3D0DD51A3D001F3839 /* GTMNSString+HTML.h */,
+ 48420D3E0DD51A3D001F3839 /* GTMNSString+HTML.m */,
+ 48420D3C0DD51A23001F3839 /* GTMDefines.h */,
+ );
+ comments = "We just need a subset of the functionality available in GTM, so we'll pull in only the files we need as opposed to creating a cross-project dependency and having to package the framework in the plugin.";
+ name = GTM;
+ sourceTree = "<group>";
+ };
+ 485506C90DCD54180009536F /* Classes */ = {
+ isa = PBXGroup;
+ children = (
+ 48A23B9D0DD0E57E004EF5CA /* Browser */,
+ 4856DFFB0DCFAEFD000BF47C /* Plugin */,
+ 4856DFFA0DCFAEBC000BF47C /* Core */,
+ );
+ name = Classes;
+ sourceTree = "<group>";
+ };
+ 4856DF730DCF95B8000BF47C /* common */ = {
+ isa = PBXGroup;
+ children = (
+ 45283766103BCCDF00153ABF /* CheckVersionsMessage.h */,
+ 45283767103BCCDF00153ABF /* ChooseTransportMessage.cpp */,
+ 45283768103BCCDF00153ABF /* ChooseTransportMessage.h */,
+ 45283769103BCCDF00153ABF /* FatalErrorMessage.cpp */,
+ 4528376A103BCCDF00153ABF /* FatalErrorMessage.h */,
+ 4528376B103BCCDF00153ABF /* ProtocolVersionMessage.cpp */,
+ 4528376C103BCCDF00153ABF /* ProtocolVersionMessage.h */,
+ 4528376D103BCCDF00153ABF /* SwitchTransportMessage.cpp */,
+ 4528376E103BCCDF00153ABF /* SwitchTransportMessage.h */,
+ 48C9EA440E37863700E691C6 /* FreeValueMessage.cpp */,
+ 48C9EA450E37863700E691C6 /* FreeValueMessage.h */,
+ 48C9EA460E37863700E691C6 /* InvokeSpecialMessage.cpp */,
+ 48C9EA470E37863700E691C6 /* InvokeSpecialMessage.h */,
+ 48C9EA480E37863700E691C6 /* LoadJsniMessage.cpp */,
+ 48C9EA490E37863700E691C6 /* LoadJsniMessage.h */,
+ 48108DDB0E2C15BD007FA76C /* AllowedConnections.cpp */,
+ 48108DDC0E2C15BD007FA76C /* AllowedConnections.h */,
+ 48108DDD0E2C15BD007FA76C /* Socket.cpp */,
+ 48108DDE0E2C15BD007FA76C /* Socket.h */,
+ 485CCE650DDDC5E900AEE666 /* HashMap.h */,
+ 48D5795D0DDB8C03005A3498 /* Debug.h */,
+ 48D5795E0DDB8C03005A3498 /* DebugLevel.h */,
+ 48FFCFC80DD35DA900805659 /* Platform.h */,
+ 4856DF740DCF95B8000BF47C /* BrowserChannel.h */,
+ 4856DF750DCF95B8000BF47C /* HostChannel.cpp */,
+ 4856DF760DCF95B8000BF47C /* HostChannel.h */,
+ 4856DF770DCF95B8000BF47C /* InvokeMessage.cpp */,
+ 4856DF780DCF95B8000BF47C /* InvokeMessage.h */,
+ 4856DF790DCF95B8000BF47C /* LoadModuleMessage.cpp */,
+ 4856DF7A0DCF95B8000BF47C /* LoadModuleMessage.h */,
+ 4856DF7D0DCF95B8000BF47C /* Message.h */,
+ 4856DF7E0DCF95B8000BF47C /* QuitMessage.h */,
+ 4856DF7F0DCF95B8000BF47C /* ReturnMessage.cpp */,
+ 4856DF800DCF95B8000BF47C /* ReturnMessage.h */,
+ 4856DF810DCF95B8000BF47C /* scoped_ptr */,
+ 4856DF840DCF95B8000BF47C /* ServerMethods.cpp */,
+ 4856DF850DCF95B8000BF47C /* ServerMethods.h */,
+ 4856DF860DCF95B8000BF47C /* SessionHandler.h */,
+ 4856DF880DCF95B8000BF47C /* Value.h */,
+ 45283764103BCCB100153ABF /* CheckVersionsMessage.cpp */,
+ );
+ name = common;
+ path = ../common;
+ sourceTree = SOURCE_ROOT;
+ };
+ 4856DF810DCF95B8000BF47C /* scoped_ptr */ = {
+ isa = PBXGroup;
+ children = (
+ 4856DF820DCF95B8000BF47C /* README.google */,
+ 4856DF830DCF95B8000BF47C /* scoped_ptr.h */,
+ );
+ name = scoped_ptr;
+ path = ../common/scoped_ptr;
+ sourceTree = SOURCE_ROOT;
+ };
+ 4856DFFA0DCFAEBC000BF47C /* Core */ = {
+ isa = PBXGroup;
+ children = (
+ 48ABDDC30DCBA04800B0159A /* WebScriptSessionHandler.h */,
+ 48ABDDC40DCBA04800B0159A /* WebScriptSessionHandler.cpp */,
+ 48ABDDC80DCBA09D00B0159A /* TrackingData.h */,
+ 48ABE1050DCBB67600B0159A /* SessionData.h */,
+ 48EF692B0E318E200050F5D6 /* ObjectFunctions.h */,
+ 48EF692C0E318E200050F5D6 /* ObjectFunctions.cpp */,
+ );
+ path = Core;
+ sourceTree = "<group>";
+ };
+ 4856DFFB0DCFAEFD000BF47C /* Plugin */ = {
+ isa = PBXGroup;
+ children = (
+ 485CD0A90DDDEAF300AEE666 /* Debug.mm */,
+ 48FD988E0DC62E7400E011A2 /* OophmPlugin.h */,
+ 48FD988F0DC62E7400E011A2 /* OophmPlugin.mm */,
+ 48FD99520DC6349F00E011A2 /* OophmWebScriptObject.h */,
+ 485505EB0DCD475C0009536F /* SlowScriptProxy.h */,
+ 48FD99530DC6349F00E011A2 /* OophmWebScriptObject.mm */,
+ 485505EC0DCD475C0009536F /* SlowScriptProxy.m */,
+ 48FD989B0DC62F8800E011A2 /* WebFrameNonTigerHeaders.h */,
+ 48547F490DD88D110047AC8A /* NSMutableString+HtmlReplacement.h */,
+ 48547F4A0DD88D110047AC8A /* NSMutableString+HtmlReplacement.m */,
+ );
+ path = Plugin;
+ sourceTree = "<group>";
+ };
+ 48A23B9D0DD0E57E004EF5CA /* Browser */ = {
+ isa = PBXGroup;
+ children = (
+ 48A23C760DD0F545004EF5CA /* BrowserWindow.h */,
+ 48A23C770DD0F545004EF5CA /* BrowserWindow.m */,
+ 48A23C500DD0F2D6004EF5CA /* Browser-Info.plist */,
+ 48A23BB40DD0E688004EF5CA /* AppController.h */,
+ 48A23BB50DD0E688004EF5CA /* AppController.m */,
+ 48A23BB60DD0E688004EF5CA /* main.m */,
+ 48A23BC50DD0E6EE004EF5CA /* browser.nib */,
+ );
+ path = Browser;
+ sourceTree = "<group>";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 48A23BA10DD0E5B4004EF5CA /* Browser */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 48A23BA70DD0E5B5004EF5CA /* Build configuration list for PBXNativeTarget "Browser" */;
+ buildPhases = (
+ 48A23B9E0DD0E5B4004EF5CA /* Resources */,
+ 48A23B9F0DD0E5B4004EF5CA /* Sources */,
+ 48A23BA00DD0E5B4004EF5CA /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 485CD0C50DDDED1700AEE666 /* PBXTargetDependency */,
+ );
+ name = Browser;
+ productName = Browser;
+ productReference = 48A23BA20DD0E5B4004EF5CA /* Browser.app */;
+ productType = "com.apple.product-type.application";
+ };
+ 8D5B49AC048680CD000E48DA /* gwt-dev */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 1DEB913A08733D840010E9CD /* Build configuration list for PBXNativeTarget "gwt-dev" */;
+ buildPhases = (
+ 8D5B49AF048680CD000E48DA /* Resources */,
+ 8D5B49B1048680CD000E48DA /* Sources */,
+ 8D5B49B3048680CD000E48DA /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "gwt-dev";
+ productInstallPath = "$(HOME)/Library/Bundles";
+ productName = oophm;
+ productReference = 8D5B49B6048680CD000E48DA /* gwt-dev.webplugin */;
+ productType = "com.apple.product-type.bundle";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 089C1669FE841209C02AAC07 /* Project object */ = {
+ isa = PBXProject;
+ buildConfigurationList = 1DEB913E08733D840010E9CD /* Build configuration list for PBXProject "oophm" */;
+ compatibilityVersion = "Xcode 3.1";
+ developmentRegion = English;
+ hasScannedForEncodings = 1;
+ knownRegions = (
+ en,
+ );
+ mainGroup = 089C166AFE841209C02AAC07 /* oophm */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 48A23BA10DD0E5B4004EF5CA /* Browser */,
+ 8D5B49AC048680CD000E48DA /* gwt-dev */,
+ 48547E030DD882170047AC8A /* symlinks */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 48A23B9E0DD0E5B4004EF5CA /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 48A23BC60DD0E6EE004EF5CA /* browser.nib in Resources */,
+ 48A23C510DD0F2D6004EF5CA /* Browser-Info.plist in Resources */,
+ 48A23C530DD0F302004EF5CA /* gwtlogo.icns in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 8D5B49AF048680CD000E48DA /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 8D5B49B0048680CD000E48DA /* InfoPlist.strings in Resources */,
+ 48C4D72E0DCA2B6900C34919 /* gwtlogo.icns in Resources */,
+ 4856DF8F0DCF95B8000BF47C /* README.google in Resources */,
+ 486DA8F50DD22BD50065980B /* crash.html in Resources */,
+ 48338DDF0E4A2CA7008ACF0F /* oophm_bypass.plist in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+ 48547E020DD882170047AC8A /* Make symlink */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ "$(BUILT_PRODUCTS_DIR)/{$PluginShortName}.webplugin",
+ );
+ name = "Make symlink";
+ outputPaths = (
+ "$(USER_LIBRARY_DIR)/Internet Plug-Ins/${PluginShortName}.webplugin/Contents",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "set -x\nrm -r \"${USER_LIBRARY_DIR}/Internet Plug-Ins/${PluginShortName}.webplugin\"\nln -sf \"${BUILT_PRODUCTS_DIR}/${PluginShortName}.webplugin\" \"${USER_LIBRARY_DIR}/Internet Plug-Ins/.\"";
+ };
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 48A23B9F0DD0E5B4004EF5CA /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 480DDCAA0E381E22000711F4 /* AppController.m in Sources */,
+ 480DDCAB0E381E23000711F4 /* BrowserWindow.m in Sources */,
+ 480DDCAC0E381E28000711F4 /* main.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 8D5B49B1048680CD000E48DA /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 48FD98900DC62E7400E011A2 /* OophmPlugin.mm in Sources */,
+ 48FD99540DC6349F00E011A2 /* OophmWebScriptObject.mm in Sources */,
+ 48ABDDC50DCBA04800B0159A /* WebScriptSessionHandler.cpp in Sources */,
+ 485505ED0DCD475C0009536F /* SlowScriptProxy.m in Sources */,
+ 4856DF890DCF95B8000BF47C /* HostChannel.cpp in Sources */,
+ 4856DF8A0DCF95B8000BF47C /* InvokeMessage.cpp in Sources */,
+ 4856DF8B0DCF95B8000BF47C /* LoadModuleMessage.cpp in Sources */,
+ 4856DF8E0DCF95B8000BF47C /* ReturnMessage.cpp in Sources */,
+ 4856DF900DCF95B8000BF47C /* ServerMethods.cpp in Sources */,
+ 48420D410DD51A3D001F3839 /* GTMNSString+HTML.m in Sources */,
+ 48547F000DD889DA0047AC8A /* GTMSystemVersion.m in Sources */,
+ 48547F4B0DD88D110047AC8A /* NSMutableString+HtmlReplacement.m in Sources */,
+ 485CD0AA0DDDEAF300AEE666 /* Debug.mm in Sources */,
+ 48108DDF0E2C15BD007FA76C /* AllowedConnections.cpp in Sources */,
+ 48108DE00E2C15BD007FA76C /* Socket.cpp in Sources */,
+ 48EF692D0E318E200050F5D6 /* ObjectFunctions.cpp in Sources */,
+ 48C9EA4A0E37863700E691C6 /* FreeValueMessage.cpp in Sources */,
+ 48C9EA4B0E37863700E691C6 /* InvokeSpecialMessage.cpp in Sources */,
+ 48C9EA4C0E37863700E691C6 /* LoadJsniMessage.cpp in Sources */,
+ 45283765103BCCB100153ABF /* CheckVersionsMessage.cpp in Sources */,
+ 4528376F103BCCDF00153ABF /* ChooseTransportMessage.cpp in Sources */,
+ 45283770103BCCDF00153ABF /* FatalErrorMessage.cpp in Sources */,
+ 45283771103BCCDF00153ABF /* ProtocolVersionMessage.cpp in Sources */,
+ 45283772103BCCDF00153ABF /* SwitchTransportMessage.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+ 48547E070DD8821D0047AC8A /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 8D5B49AC048680CD000E48DA /* gwt-dev */;
+ targetProxy = 48547E060DD8821D0047AC8A /* PBXContainerItemProxy */;
+ };
+ 485CD0C50DDDED1700AEE666 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 48547E030DD882170047AC8A /* symlinks */;
+ targetProxy = 485CD0C40DDDED1700AEE666 /* PBXContainerItemProxy */;
+ };
+/* End PBXTargetDependency section */
+
+/* Begin PBXVariantGroup section */
+ 089C167DFE841241C02AAC07 /* InfoPlist.strings */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 089C167EFE841241C02AAC07 /* English */,
+ );
+ name = InfoPlist.strings;
+ sourceTree = "<group>";
+ };
+ 486DA8F40DD22BD50065980B /* crash.html */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 486DA8ED0DD22B850065980B /* English */,
+ );
+ name = crash.html;
+ path = Plugin;
+ sourceTree = "<group>";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ 1DEB913B08733D840010E9CD /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COPY_PHASE_STRIP = NO;
+ FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SRCROOT)/GTM/build/TigerOrLater-Release\"";
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_ENABLE_FIX_AND_CONTINUE = YES;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = oophm_Prefix.pch;
+ GCC_WARN_EFFECTIVE_CPLUSPLUS_VIOLATIONS = NO;
+ GCC_WARN_NON_VIRTUAL_DESTRUCTOR = NO;
+ GCC_WARN_PEDANTIC = NO;
+ INFOPLIST_FILE = Info.plist;
+ INSTALL_PATH = "$(HOME)/Library/Bundles";
+ PRODUCT_NAME = "${PluginShortName}";
+ SDKROOT = macosx10.6;
+ WRAPPER_EXTENSION = webplugin;
+ ZERO_LINK = YES;
+ };
+ name = Debug;
+ };
+ 1DEB913C08733D840010E9CD /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ FRAMEWORK_SEARCH_PATHS_QUOTED_1 = "\"$(SRCROOT)/GTM/build/TigerOrLater-Release\"";
+ GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
+ GCC_MODEL_TUNING = G5;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = oophm_Prefix.pch;
+ GCC_WARN_EFFECTIVE_CPLUSPLUS_VIOLATIONS = NO;
+ GCC_WARN_NON_VIRTUAL_DESTRUCTOR = NO;
+ GCC_WARN_PEDANTIC = NO;
+ INFOPLIST_FILE = Info.plist;
+ INSTALL_PATH = "$(HOME)/Library/Bundles";
+ PRODUCT_NAME = "${PluginShortName}";
+ SDKROOT = macosx10.6;
+ STRIP_INSTALLED_PRODUCT = YES;
+ STRIP_STYLE = "non-global";
+ WRAPPER_EXTENSION = webplugin;
+ };
+ name = Release;
+ };
+ 1DEB913F08733D840010E9CD /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COPY_PHASE_STRIP = NO;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = "GWT_DEBUGLEVEL=Debugging";
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ OTHER_CFLAGS = "-mmacosx-version-min=10.5";
+ PREBINDING = NO;
+ PluginShortName = "gwt-dev";
+ SDKROOT = macosx10.5;
+ STRIP_INSTALLED_PRODUCT = NO;
+ STRIP_STYLE = "non-global";
+ SYMROOT = build;
+ };
+ name = Debug;
+ };
+ 1DEB914008733D840010E9CD /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ARCHS = "$(ARCHS_STANDARD_32_64_BIT)";
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_OPTIMIZATION_LEVEL = 3;
+ GCC_PREPROCESSOR_DEFINITIONS = GWT_DEBUGDISABLE;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ OTHER_CFLAGS = "-mmacosx-version-min=10.5";
+ PREBINDING = NO;
+ PluginShortName = "gwt-dev";
+ SDKROOT = macosx10.5;
+ STRIP_STYLE = "non-global";
+ SYMROOT = build;
+ };
+ name = Release;
+ };
+ 48547E040DD882170047AC8A /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ PRODUCT_NAME = "${PluginShortName}.symlinks";
+ SDKROOT = macosx10.6;
+ };
+ name = Debug;
+ };
+ 48547E050DD882170047AC8A /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_ENABLE_FIX_AND_CONTINUE = NO;
+ PRODUCT_NAME = "${PluginShortName}.symlinks";
+ SDKROOT = macosx10.6;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ 48A23BA50DD0E5B5004EF5CA /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_ENABLE_FIX_AND_CONTINUE = YES;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = oophm_Prefix.pch;
+ INFOPLIST_FILE = "Browser/Browser-Info.plist";
+ INSTALL_PATH = "$(HOME)/Applications";
+ OTHER_LDFLAGS = (
+ "-framework",
+ Foundation,
+ "-framework",
+ AppKit,
+ );
+ PREBINDING = NO;
+ PRODUCT_NAME = Browser;
+ SDKROOT = macosx10.6;
+ WRAPPER_EXTENSION = app;
+ ZERO_LINK = YES;
+ };
+ name = Debug;
+ };
+ 48A23BA60DD0E5B5004EF5CA /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ARCHS = (
+ i386,
+ ppc,
+ );
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_ENABLE_FIX_AND_CONTINUE = NO;
+ GCC_MODEL_TUNING = G5;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = oophm_Prefix.pch;
+ INFOPLIST_FILE = "Browser/Browser-Info.plist";
+ INSTALL_PATH = "$(HOME)/Applications";
+ OTHER_LDFLAGS = (
+ "-framework",
+ Foundation,
+ "-framework",
+ AppKit,
+ );
+ PREBINDING = NO;
+ PRODUCT_NAME = Browser;
+ SDKROOT = macosx10.6;
+ STRIP_INSTALLED_PRODUCT = YES;
+ STRIP_STYLE = "non-global";
+ VALID_ARCHS = "ppc64 ppc7400 ppc970 i386 x86_64 ppc";
+ WRAPPER_EXTENSION = app;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 1DEB913A08733D840010E9CD /* Build configuration list for PBXNativeTarget "gwt-dev" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 1DEB913B08733D840010E9CD /* Debug */,
+ 1DEB913C08733D840010E9CD /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 1DEB913E08733D840010E9CD /* Build configuration list for PBXProject "oophm" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 1DEB913F08733D840010E9CD /* Debug */,
+ 1DEB914008733D840010E9CD /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 48547E080DD8823B0047AC8A /* Build configuration list for PBXAggregateTarget "symlinks" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 48547E040DD882170047AC8A /* Debug */,
+ 48547E050DD882170047AC8A /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 48A23BA70DD0E5B5004EF5CA /* Build configuration list for PBXNativeTarget "Browser" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 48A23BA50DD0E5B5004EF5CA /* Debug */,
+ 48A23BA60DD0E5B5004EF5CA /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 089C1669FE841209C02AAC07 /* Project object */;
+}
diff --git a/plugins/webkit/oophm_Prefix.pch b/plugins/webkit/oophm_Prefix.pch
new file mode 100644
index 0000000..e7b7f01
--- /dev/null
+++ b/plugins/webkit/oophm_Prefix.pch
@@ -0,0 +1,7 @@
+//
+// Prefix header for all source files of the 'oophm' target in the 'oophm' project.
+//
+
+#ifdef __OBJC__
+ #import <Cocoa/Cocoa.h>
+#endif
diff --git a/plugins/webkit/oophm_bypass.plist b/plugins/webkit/oophm_bypass.plist
new file mode 100644
index 0000000..b7af14f
--- /dev/null
+++ b/plugins/webkit/oophm_bypass.plist
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<!-- Copy this to Library/Preferences/com.google.gwt.oophm.plist -->
+<plist version="1.0">
+<dict>
+ <key>allowAll</key>
+ <true/>
+</dict>
+</plist>
diff --git a/plugins/webkit/prebuilt/gwt-dev-plugin.dmg b/plugins/webkit/prebuilt/gwt-dev-plugin.dmg
new file mode 100644
index 0000000..b96c731
--- /dev/null
+++ b/plugins/webkit/prebuilt/gwt-dev-plugin.dmg
Binary files differ
diff --git a/plugins/wireshark/Makefile b/plugins/wireshark/Makefile
new file mode 100644
index 0000000..a1be1f9
--- /dev/null
+++ b/plugins/wireshark/Makefile
@@ -0,0 +1,51 @@
+#
+# Copyright 2010 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.
+
+# Modify to point to your Wireshark and glib include directories
+INCS = -I/usr/include/wireshark -I/usr/include/glib-2.0 \
+ -I/usr/lib/glib-2.0/include -I../common
+
+CC = gcc
+
+SRCS = packet-gwtcs.c
+OBJS = obj/packet-gwtcs.o
+
+PLUGIN_NAME = packet-gwtcs
+PLUGIN_DIR = $(HOME)/.wireshark/plugins
+PLUGIN = $(PLUGIN_NAME).so
+
+CFLAGS = -DHAVE_CONFIG_H $(INCS) -DINET6 -D_U_=__attribute__\(\(unused\)\) \
+ -Wall -Wpointer-arith -g -DXTHREADS -D_REENTRANT -DXUSE_MTSAFE_API \
+ -fPIC -DPIC -O2
+
+all:: obj/$(PLUGIN)
+
+install:: obj/$(PLUGIN)
+ cp obj/$(PLUGIN) $(PLUGIN_DIR)/$(PLUGIN)
+
+obj/$(PLUGIN) : $(OBJS)
+ mkdir -p $(PLUGIN_DIR)
+ $(CC) -shared $(OBJS) -o $@
+
+$(OBJS): obj
+
+obj:
+ mkdir obj
+
+obj/packet-gwtcs.o : packet-gwtcs.c ../common/BrowserChannel.h
+ $(CC) -c $(CFLAGS) $< -o $@
+
+clean:
+ rm -rf obj
diff --git a/plugins/wireshark/README.txt b/plugins/wireshark/README.txt
new file mode 100644
index 0000000..1ed9817
--- /dev/null
+++ b/plugins/wireshark/README.txt
@@ -0,0 +1,12 @@
+This is a quick and dirty Wireshark packet dissector for the GWT Code Server
+protocol.
+
+I have only tested this on Ubuntu Hardy with wireshark 1.0.0 on an x86_64
+machine. It may require other changes for other platforms, and has only
+light testing. It is also incomplete but provided enough decoding to be
+useful to me -- YMMV.
+
+The Makefile is very Unix-centric as it installs the library under your home
+directory.
+
+On Linux, you need the wireshark-dev package installed.
diff --git a/plugins/wireshark/packet-gwtcs.c b/plugins/wireshark/packet-gwtcs.c
new file mode 100644
index 0000000..fc12f8c
--- /dev/null
+++ b/plugins/wireshark/packet-gwtcs.c
@@ -0,0 +1,975 @@
+/*
+ * Copyright 2010 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.
+ */
+
+/*
+ * Note that Wireshark dissectors are pure C, not C++ -- there are also
+ * restrictions on various C extensions, including things like all variables
+ * must be declared at the beginning of a block, and only initialized to
+ * scalar constants.
+ */
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "BrowserChannel.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <gmodule.h>
+#include <epan/conversation.h>
+#include <epan/prefs.h>
+#include <epan/packet.h>
+
+/*
+ * Default port to follow.
+ */
+#define DEFAULT_GWTCS_PORT 9997
+
+/*
+ * Trim strngs at this length.
+ */
+#define MAX_STRING_LENGTH 100
+
+/* forward reference */
+void proto_register_gwtcs();
+void proto_reg_handoff_gwtcs();
+
+/* Define version if we are not building Wireshark statically */
+#ifndef ENABLE_STATIC
+G_MODULE_EXPORT const gchar version[] = "0.1";
+#endif
+
+/*
+ * Data stored for a GWT-CS conversation.
+ */
+typedef struct _gwtcs_data {
+ address clientAddress;
+ guint32 clientPort;
+ int level;
+} gwtcs_data;
+
+/*
+ * Names of packet types -- must be in order.
+ */
+static const value_string packetTypes[] = {
+ { MESSAGE_TYPE_INVOKE, "Invoke" },
+ { MESSAGE_TYPE_RETURN, "Return" },
+ { MESSAGE_TYPE_OLD_LOAD_MODULE, "Old Load Module" },
+ { MESSAGE_TYPE_QUIT, "Quit" },
+ { MESSAGE_TYPE_LOADJSNI, "Load JSNI" },
+ { MESSAGE_TYPE_INVOKESPECIAL, "Invoke Special" },
+ { MESSAGE_TYPE_FREEVALUE, "Free Value" },
+ { MESSAGE_TYPE_FATAL_ERROR, "Fatal Error" },
+ { MESSAGE_TYPE_CHECK_VERSIONS, "Check Versions" },
+ { MESSAGE_TYPE_PROTOCOL_VERSION, "Protocol Version" },
+ { MESSAGE_TYPE_CHOOSE_TRANSPORT, "Choose Transport" },
+ { MESSAGE_TYPE_SWITCH_TRANSPORT, "Switch Transport" },
+ { MESSAGE_TYPE_LOAD_MODULE, "Load Module" },
+ { 0, NULL }
+};
+#define MAX_PACKET_TYPE MESSAGE_TYPE_LOAD_MODULE
+
+
+static const value_string valueTypes[] = {
+ {VALUE_TYPE_NULL, "null" },
+ {VALUE_TYPE_BOOLEAN, "boolean" },
+ {VALUE_TYPE_BYTE, "byte" },
+ {VALUE_TYPE_CHAR, "char" },
+ {VALUE_TYPE_SHORT, "short" },
+ {VALUE_TYPE_INT, "int" },
+ {VALUE_TYPE_LONG, "long" },
+ {VALUE_TYPE_FLOAT, "float" },
+ {VALUE_TYPE_DOUBLE, "double" },
+ {VALUE_TYPE_STRING, "string" },
+ {VALUE_TYPE_JAVA_OBJECT, "Java object" },
+ {VALUE_TYPE_JS_OBJECT, "JS object" },
+ {VALUE_TYPE_UNDEFINED, "undefined" },
+ { 0, NULL }
+};
+
+/*
+ * InvokeSpecial types -- must be in order.
+ */
+static const value_string specialTypes[] = {
+ { SPECIAL_HAS_METHOD, "hasMethod" },
+ { SPECIAL_HAS_PROPERTY, "hasProperty" },
+ { SPECIAL_GET_PROPERTY, "getProperty" },
+ { SPECIAL_SET_PROPERTY, "setProperty" },
+ { 0, NULL }
+};
+
+/*
+ * Dynamically assigned protocol ID.
+ */
+static int proto_gwtcs = -1;
+
+/*
+ * Dynamically assigned subtree IDs.
+ */
+static gint ett_gwtcs = -1;
+static gint ett_value = -1;
+static gint ett_args = -1;
+
+/*
+ * IDs for displayed values.
+ */
+static int hf_gwtcs_pdu_type = -1;
+static int hf_gwtcs_value_tag = -1;
+static int hf_gwtcs_min_vers = -1;
+static int hf_gwtcs_max_vers = -1;
+static int hf_gwtcs_hosted_vers = -1;
+static int hf_gwtcs_sel_vers = -1;
+static int hf_gwtcs_lm_ua = -1;
+static int hf_gwtcs_lm_tabkey = -1;
+static int hf_gwtcs_lm_seskey = -1;
+static int hf_gwtcs_lm_modname = -1;
+static int hf_gwtcs_lm_url = -1;
+static int hf_gwtcs_methname = -1;
+static int hf_gwtcs_isexc = -1;
+static int hf_gwtcs_dispid = -1;
+static int hf_gwtcs_jsni = -1;
+static int hf_gwtcs_val_hdr = -1;
+static int hf_gwtcs_val_bool = -1;
+static int hf_gwtcs_val_byte = -1;
+static int hf_gwtcs_val_char = -1;
+static int hf_gwtcs_val_short = -1;
+static int hf_gwtcs_val_int = -1;
+static int hf_gwtcs_val_long = -1;
+static int hf_gwtcs_val_float = -1;
+static int hf_gwtcs_val_double = -1;
+static int hf_gwtcs_val_string = -1;
+static int hf_gwtcs_val_javaobj = -1;
+static int hf_gwtcs_val_jsobj = -1;
+static int hf_gwtcs_val_null = -1;
+static int hf_gwtcs_val_undef = -1;
+static int hf_gwtcs_numargs = -1;
+static int hf_gwtcs_spectype = -1;
+static int hf_gwtcs_transport = -1;
+static int hf_gwtcs_transargs = -1;
+
+static dissector_handle_t gwtcs_handle;
+
+static GMemChunk* memChunk = 0;
+
+#ifndef ENABLE_STATIC
+G_MODULE_EXPORT void plugin_register(void)
+{
+ /* register the new protocol, protocol fields, and subtrees */
+ if (proto_gwtcs == -1) { /* execute protocol initialization only once */
+ proto_register_gwtcs();
+ }
+}
+
+G_MODULE_EXPORT void plugin_reg_handoff(void){
+ proto_reg_handoff_gwtcs();
+}
+#endif
+
+/*
+ * Get a string describing a Value from the packet, and return the total length
+ * (including the tag byte).
+ *
+ * ofs - offset into the buffer of the Value's tag byte
+ * buf - buffer to write string into; on return is guaranteed to be null
+ * terminated
+ * buflen - length of buf
+ *
+ * returns the offset after the last byte of this Value
+ */
+static int getValue(tvbuff_t* tvb, int ofs, char* buf, int buflen) {
+ guint8 tag;
+ tag = tvb_get_guint8(tvb, ofs++);
+ int len = 0;
+ switch (tag) {
+ case VALUE_TYPE_NULL:
+ strncpy(buf, "null", buflen);
+ break;
+ case VALUE_TYPE_UNDEFINED:
+ strncpy(buf, "undef", buflen);
+ break;
+ case VALUE_TYPE_BOOLEAN:
+ {
+ guint8 val;
+ val = tvb_get_guint8(tvb, ofs);
+ len = 1;
+ strncpy(buf, val ? "true" : "false", buflen);
+ }
+ break;
+ case VALUE_TYPE_BYTE:
+ {
+ int val;
+ val = tvb_get_guint8(tvb, ofs);
+ if (val & 128) {
+ val -= 256;
+ }
+ len = 1;
+ snprintf(buf, buflen, "%d", val);
+ }
+ break;
+ case VALUE_TYPE_SHORT:
+ {
+ int val;
+ val = tvb_get_ntohs(tvb, ofs);
+ if (val & 0x8000) {
+ val -= 0x10000;
+ }
+ len = 2;
+ snprintf(buf, buflen, "%d", val);
+ }
+ break;
+ case VALUE_TYPE_CHAR:
+ {
+ int val;
+ val = tvb_get_ntohs(tvb, ofs);
+ len = 2;
+ /* show printable ASCII */
+ if (val >= 0x20 && val < 0x7f) {
+ snprintf(buf, buflen, "%d - %c", val, val);
+ } else {
+ snprintf(buf, buflen, "%d (U+%04x)", val, val);
+ }
+ }
+ break;
+ case VALUE_TYPE_INT:
+ {
+ int val;
+ val = tvb_get_ntohl(tvb, ofs);
+ len = 4;
+ snprintf(buf, buflen, "%d", val);
+ }
+ break;
+ case VALUE_TYPE_FLOAT:
+ {
+ float val;
+ val = tvb_get_ntohieee_float(tvb, ofs);
+ len = 4;
+ snprintf(buf, buflen, "%g", val);
+ }
+ break;
+ case VALUE_TYPE_JAVA_OBJECT:
+ {
+ int val;
+ val = tvb_get_ntohl(tvb, ofs);
+ len = 4;
+ snprintf(buf, buflen, "Java Object %d", val);
+ }
+ break;
+ case VALUE_TYPE_JS_OBJECT:
+ {
+ int val;
+ val = tvb_get_ntohl(tvb, ofs);
+ len = 4;
+ snprintf(buf, buflen, "JS Object %d", val);
+ }
+ break;
+ case VALUE_TYPE_LONG:
+ {
+ guint64 val;
+ val = tvb_get_ntoh64(tvb, ofs);
+ len = 8;
+ /* no portable way to print guint64, so do it in two pieces */
+ snprintf(buf, buflen, "0x%08x%08x", (int) ((val >> 32) & 0xFFFFFFFF),
+ (int) (val & 0xFFFFFFFF));
+ }
+ break;
+ case VALUE_TYPE_DOUBLE:
+ {
+ double val;
+ val = tvb_get_ntohieee_double(tvb, ofs);
+ len = 8;
+ snprintf(buf, buflen, "%lg", val);
+ }
+ break;
+ case VALUE_TYPE_STRING:
+ {
+ guint8* str;
+ len = tvb_get_ntohl(tvb, ofs);
+ ofs += 4;
+ str = tvb_get_ephemeral_string(tvb, ofs, len);
+ if (len > buflen - 3 && buflen >= 6) {
+ snprintf(buf, buflen, "\"%.*s...\"", buflen - 6, (char*) str);
+ } else {
+ snprintf(buf, buflen, "\"%s\"", (char*) str);
+ }
+ }
+ break;
+ }
+ /* ensure the buffer is null-terminated */;
+ buf[buflen - 1] = 0;
+
+ /* point to byte after this Value */
+ return ofs + len;
+}
+
+/*
+ * Show a labelled Value.
+ *
+ * hdr - name of this Value
+ * ofs - offset into buffer where the Value tag byte is located.
+ *
+ * returns the offset after the last byte of this Value
+ */
+static int showValue(proto_tree* tree, char* hdr, tvbuff_t* tvb, int ofs) {
+ proto_tree* subtree;
+ proto_item* ti;
+ guint8 tag;
+ int newOffset;
+ char buf[40];
+ *buf = 0;
+ newOffset = getValue(tvb, ofs, buf, sizeof(buf));
+ tag = tvb_get_guint8(tvb, ofs);
+ ti = proto_tree_add_string_format(tree, hf_gwtcs_val_hdr, tvb, ofs,
+ newOffset - ofs, 0, "%s: %s", hdr, buf);
+ subtree = proto_item_add_subtree(ti, ett_value);
+ proto_tree_add_item(subtree, hf_gwtcs_value_tag, tvb, ofs++, 1, FALSE);
+ switch (tag) {
+ case VALUE_TYPE_NULL:
+ proto_tree_add_item(subtree, hf_gwtcs_val_null, tvb, ofs, 0, FALSE);
+ break;
+ case VALUE_TYPE_UNDEFINED:
+ proto_tree_add_item(subtree, hf_gwtcs_val_undef, tvb, ofs, 0, FALSE);
+ break;
+ case VALUE_TYPE_BOOLEAN:
+ proto_tree_add_item(subtree, hf_gwtcs_val_bool, tvb, ofs, 1, FALSE);
+ break;
+ case VALUE_TYPE_BYTE:
+ proto_tree_add_item(subtree, hf_gwtcs_val_byte, tvb, ofs, 1, FALSE);
+ break;
+ case VALUE_TYPE_CHAR:
+ proto_tree_add_item(subtree, hf_gwtcs_val_char, tvb, ofs, 2, FALSE);
+ break;
+ case VALUE_TYPE_SHORT:
+ proto_tree_add_item(subtree, hf_gwtcs_val_short, tvb, ofs, 2, FALSE);
+ break;
+ case VALUE_TYPE_INT:
+ proto_tree_add_item(subtree, hf_gwtcs_val_int, tvb, ofs, 4, FALSE);
+ break;
+ case VALUE_TYPE_LONG:
+ proto_tree_add_item(subtree, hf_gwtcs_val_long, tvb, ofs, 8, FALSE);
+ break;
+ case VALUE_TYPE_FLOAT:
+ proto_tree_add_item(subtree, hf_gwtcs_val_float, tvb, ofs, 4, FALSE);
+ break;
+ case VALUE_TYPE_DOUBLE:
+ proto_tree_add_item(subtree, hf_gwtcs_val_double, tvb, ofs, 8, FALSE);
+ break;
+ case VALUE_TYPE_STRING:
+ proto_tree_add_item(subtree, hf_gwtcs_val_string, tvb, ofs, 4, FALSE);
+ break;
+ case VALUE_TYPE_JAVA_OBJECT:
+ proto_tree_add_item(subtree, hf_gwtcs_val_javaobj, tvb, ofs, 4, FALSE);
+ break;
+ case VALUE_TYPE_JS_OBJECT:
+ proto_tree_add_item(subtree, hf_gwtcs_val_jsobj, tvb, ofs, 4, FALSE);
+ break;
+ }
+ return newOffset;
+}
+
+/*
+ * Initialize memchunk system.
+ */
+static void init() {
+ if (memChunk) {
+ g_mem_chunk_destroy(memChunk);
+ }
+ memChunk = g_mem_chunk_new("gwtcs data", sizeof(gwtcs_data),
+ 20 * sizeof(gwtcs_data), G_ALLOC_AND_FREE);
+}
+
+/*
+ * Dissect a single packet.
+ */
+static int dissect_gwtcs(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
+{
+ guint8 packetType;
+ conversation_t* conv;
+ gwtcs_data* data = 0;
+ int isClient = 0;
+
+ if (tvb_length(tvb) < 1) {
+ return 0;
+ }
+
+ packetType = tvb_get_guint8(tvb, 0);
+ if (packetType > MAX_PACKET_TYPE) {
+ return 0;
+ }
+
+ if (check_col(pinfo->cinfo, COL_PROTOCOL)) {
+ col_set_str(pinfo->cinfo, COL_PROTOCOL, "GWT-CS");
+ }
+
+ /* Clear the info column */
+ if (check_col(pinfo->cinfo, COL_INFO)) {
+ col_set_str(pinfo->cinfo, COL_INFO, "");
+ }
+
+ /* get the conversation */
+ conv = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst,
+ pinfo->ptype, pinfo->srcport, pinfo->destport, 0);
+ if (!conv) {
+ conv = conversation_new(pinfo->fd->num, &pinfo->src, &pinfo->dst,
+ pinfo->ptype, pinfo->srcport, pinfo->destport, 0);
+ }
+ data = (gwtcs_data*) conversation_get_proto_data(conv, proto_gwtcs);
+ if (!data) {
+ data = (gwtcs_data*) g_mem_chunk_alloc(memChunk);
+ data->clientPort = -1;
+ data->level = 0;
+ conversation_add_proto_data(conv, proto_gwtcs, data);
+ }
+
+ if (packetType == MESSAGE_TYPE_CHECK_VERSIONS) {
+ data->clientAddress = pinfo->src;
+ data->clientPort = pinfo->srcport;
+ }
+
+ if (data->clientPort == pinfo->srcport) {
+ isClient = 1;
+ }
+
+ /* Set the info column */
+ if (check_col(pinfo->cinfo,COL_INFO)) {
+ gint32 len;
+ guint8* str;
+ int i;
+ gint32 offset = 1;
+ if (data->clientPort != -1) {
+ col_add_str(pinfo->cinfo, COL_INFO, isClient ? "C->S: " : "S->C: ");
+ }
+ for (i = 0; i < data->level; ++i) {
+ col_append_str(pinfo->cinfo, COL_INFO, " ");
+ }
+ col_append_str(pinfo->cinfo, COL_INFO, packetTypes[packetType].strptr);
+ switch (packetType) {
+ case MESSAGE_TYPE_CHECK_VERSIONS:
+ {
+ int minvers, maxvers;
+ minvers = tvb_get_ntohl(tvb, offset);
+ offset += 4;
+ maxvers = tvb_get_ntohl(tvb, offset);
+ col_append_fstr(pinfo->cinfo, COL_INFO, " vers=%d-%d", minvers,
+ maxvers);
+ }
+ break;
+ case MESSAGE_TYPE_PROTOCOL_VERSION:
+ {
+ int vers;
+ vers = tvb_get_ntohl(tvb, offset);
+ col_append_fstr(pinfo->cinfo, COL_INFO, " vers=%d", vers);
+ }
+ break;
+ case MESSAGE_TYPE_LOAD_MODULE:
+ data->level++;
+ // URL
+ len = tvb_get_ntohl(tvb, offset);
+ offset += 4 + len;
+ // tab key
+ len = tvb_get_ntohl(tvb, offset);
+ offset += 4 + len;
+ // session key
+ len = tvb_get_ntohl(tvb, offset);
+ offset += 4 + len;
+ // module name
+ len = tvb_get_ntohl(tvb, offset);
+ offset += 4;
+ // clip string
+ if (len > MAX_STRING_LENGTH) {
+ len = MAX_STRING_LENGTH;
+ }
+ str = tvb_get_ephemeral_string(tvb, offset, len);
+ col_append_fstr(pinfo->cinfo, COL_INFO, " %s", str);
+ break;
+ case MESSAGE_TYPE_INVOKE:
+ data->level++;
+ if (data->clientPort == -1) {
+ break;
+ }
+ if (isClient) {
+ int dispId;
+ dispId = tvb_get_ntohl(tvb, offset);
+ offset += 4;
+ col_append_fstr(pinfo->cinfo, COL_INFO, " dispid=%d", dispId);
+ } else {
+ // module name
+ len = tvb_get_ntohl(tvb, offset);
+ offset += 4;
+ // clip string
+ if (len > MAX_STRING_LENGTH) {
+ len = MAX_STRING_LENGTH;
+ }
+ str = tvb_get_ephemeral_string(tvb, offset, len);
+ col_append_fstr(pinfo->cinfo, COL_INFO, " %s", str);
+ }
+ break;
+ case MESSAGE_TYPE_RETURN:
+ {
+ char buf[40];
+ guint8 isexc;
+ data->level--;
+ isexc = tvb_get_guint8(tvb, 1);
+ getValue(tvb, 2, buf, sizeof(buf));
+ col_append_fstr(pinfo->cinfo, COL_INFO, " %s%s",
+ isexc ? "** EXCEPTION ** " : "", buf);
+ }
+ break;
+ case MESSAGE_TYPE_INVOKESPECIAL:
+ {
+ guint8 specialType;
+ data->level++;
+ specialType = tvb_get_guint8(tvb, 1);
+ col_append_fstr(pinfo->cinfo, COL_INFO, " %s",
+ specialTypes[specialType].strptr);
+ }
+ break;
+ }
+ }
+
+ /*
+ * If tree is non-null, then we want to get the detailed data.
+ */
+ if (tree) {
+ proto_item *ti = 0;
+ proto_tree *gwtcs_tree = 0;
+ gint32 offset = 1;
+
+ ti = proto_tree_add_item(tree, proto_gwtcs, tvb, 0 , -1, FALSE);
+ gwtcs_tree = proto_item_add_subtree(ti, ett_gwtcs);
+ proto_tree_add_item(gwtcs_tree, hf_gwtcs_pdu_type, tvb, 0, 1, FALSE);
+ switch (packetType) {
+ case MESSAGE_TYPE_CHECK_VERSIONS:
+ proto_tree_add_item(gwtcs_tree, hf_gwtcs_min_vers, tvb, 1, 4, FALSE);
+ proto_tree_add_item(gwtcs_tree, hf_gwtcs_max_vers, tvb, 5, 4, FALSE);
+ proto_tree_add_item(gwtcs_tree, hf_gwtcs_hosted_vers, tvb, 9, 4, FALSE);
+ break;
+ case MESSAGE_TYPE_PROTOCOL_VERSION:
+ proto_tree_add_item(gwtcs_tree, hf_gwtcs_sel_vers, tvb, 1, 4, FALSE);
+ break;
+ case MESSAGE_TYPE_LOAD_MODULE:
+ {
+ guint32 len;
+ len = tvb_get_ntohl(tvb, offset);
+ proto_tree_add_item(gwtcs_tree, hf_gwtcs_lm_url, tvb, offset, 4,
+ FALSE);
+ offset += 4 + len;
+ len = tvb_get_ntohl(tvb, offset);
+ proto_tree_add_item(gwtcs_tree, hf_gwtcs_lm_tabkey, tvb, offset, 4,
+ FALSE);
+ offset += 4 + len;
+ len = tvb_get_ntohl(tvb, offset);
+ proto_tree_add_item(gwtcs_tree, hf_gwtcs_lm_seskey, tvb, offset, 4,
+ FALSE);
+ offset += 4 + len;
+ len = tvb_get_ntohl(tvb, offset);
+ proto_tree_add_item(gwtcs_tree, hf_gwtcs_lm_modname, tvb, offset, 4,
+ FALSE);
+ offset += 4 + len;
+ len = tvb_get_ntohl(tvb, offset);
+ proto_tree_add_item(gwtcs_tree, hf_gwtcs_lm_ua, tvb, offset, 4,
+ FALSE);
+ offset += 4 + len;
+ }
+ break;
+ case MESSAGE_TYPE_INVOKE:
+ {
+ int numArgs, len, i;
+ proto_item* ti;
+ proto_tree* subtree;
+ if (data->clientPort == -1) {
+ proto_tree_add_text(gwtcs_tree, tvb, 1, -1,
+ "Can't decode - unknown direction");
+ break;
+ }
+ if (isClient) {
+ proto_tree_add_item(gwtcs_tree, hf_gwtcs_dispid, tvb, offset, 4,
+ FALSE);
+ offset += 4;
+ } else {
+ // method name
+ len = tvb_get_ntohl(tvb, offset);
+ proto_tree_add_item(gwtcs_tree, hf_gwtcs_methname, tvb, offset, 4,
+ FALSE);
+ offset += 4 + len;
+ }
+ offset = showValue(gwtcs_tree, "This Value", tvb, offset);
+ numArgs = tvb_get_ntohl(tvb, offset);
+ ti = proto_tree_add_item(gwtcs_tree, hf_gwtcs_numargs, tvb, offset, 4,
+ FALSE);
+ subtree = proto_item_add_subtree(ti, ett_args);
+ offset += 4;
+ for (i = 0; i < numArgs; ++i) {
+ char argName[10];
+ snprintf(argName, sizeof(argName), "arg%d", i);
+ offset = showValue(subtree, argName, tvb, offset);
+ }
+ }
+ break;
+ case MESSAGE_TYPE_RETURN:
+ proto_tree_add_item(gwtcs_tree, hf_gwtcs_isexc, tvb, 1, 1, FALSE);
+ showValue(gwtcs_tree, "Return Value", tvb, 2);
+ break;
+ case MESSAGE_TYPE_LOADJSNI:
+ proto_tree_add_item(gwtcs_tree, hf_gwtcs_jsni, tvb, 1, 4, FALSE);
+ break;
+ case MESSAGE_TYPE_INVOKESPECIAL:
+ {
+ int numArgs, i;
+ proto_item* ti;
+ proto_tree* subtree;
+ proto_tree_add_item(gwtcs_tree, hf_gwtcs_spectype, tvb, offset++, 1,
+ FALSE);
+ numArgs = tvb_get_ntohl(tvb, offset);
+ ti = proto_tree_add_item(gwtcs_tree, hf_gwtcs_numargs, tvb, offset, 4,
+ FALSE);
+ offset += 4;
+ subtree = proto_item_add_subtree(ti, ett_args);
+ for (i = 0; i < numArgs; ++i) {
+ char argName[10];
+ snprintf(argName, sizeof(argName), "arg%d", i);
+ offset = showValue(subtree, argName, tvb, offset);
+ }
+ }
+ break;
+ case MESSAGE_TYPE_FREEVALUE:
+ {
+ int numArgs, i, label;
+ proto_item* ti;
+ proto_tree* subtree;
+ numArgs = tvb_get_ntohl(tvb, offset);
+ ti = proto_tree_add_item(gwtcs_tree, hf_gwtcs_numargs, tvb, offset, 4,
+ FALSE);
+ offset += 4;
+ subtree = proto_item_add_subtree(ti, ett_args);
+ label = isClient ? hf_gwtcs_val_jsobj : hf_gwtcs_val_javaobj;
+ for (i = 0; i < numArgs; ++i) {
+ proto_tree_add_item(subtree, label, tvb, offset, 4, FALSE);
+ offset += 4;
+ }
+ }
+ break;
+ case MESSAGE_TYPE_CHOOSE_TRANSPORT:
+ {
+ int numArgs, i, len;
+ proto_item* ti;
+ proto_tree* subtree;
+ numArgs = tvb_get_ntohl(tvb, offset);
+ ti = proto_tree_add_item(gwtcs_tree, hf_gwtcs_numargs, tvb, offset, 4,
+ FALSE);
+ offset += 4;
+ subtree = proto_item_add_subtree(ti, ett_args);
+ for (i = 0; i < numArgs; ++i) {
+ len = tvb_get_ntohl(tvb, offset);
+ proto_tree_add_item(subtree, hf_gwtcs_transport, tvb, offset, 4,
+ FALSE);
+ offset += 4 + len;
+ }
+ }
+ break;
+ case MESSAGE_TYPE_SWITCH_TRANSPORT:
+ {
+ int len;
+ len = tvb_get_ntohl(tvb, offset);
+ proto_tree_add_item(gwtcs_tree, hf_gwtcs_transport, tvb, offset, 4,
+ FALSE);
+ offset += 4 + len;
+ len = tvb_get_ntohl(tvb, offset);
+ proto_tree_add_item(gwtcs_tree, hf_gwtcs_transargs, tvb, offset, 4,
+ FALSE);
+ offset += 4 + len;
+ }
+ break;
+ }
+ }
+
+ return tvb_length(tvb);
+}
+
+void proto_register_gwtcs(void)
+{
+ /*
+ * List of subtree identifiers to be allocated.
+ */
+ static gint *ett[] = {
+ &ett_gwtcs,
+ &ett_value,
+ &ett_args,
+ };
+
+ /*
+ * List of display identifiers to be allocated.
+ */
+ static hf_register_info hf[] = {
+ {
+ &hf_gwtcs_pdu_type,
+ {
+ "Packet Type", "gwtcs.type",
+ FT_UINT8, BASE_DEC, VALS(packetTypes), 0x0, NULL, HFILL,
+ }
+ },
+ {
+ &hf_gwtcs_spectype,
+ {
+ "Type", "gwtcs.spectype",
+ FT_UINT8, BASE_DEC, VALS(specialTypes), 0x0, NULL, HFILL,
+ }
+ },
+ {
+ &hf_gwtcs_value_tag,
+ {
+ "Value Tag", "gwtcs.value.tag",
+ FT_UINT8, BASE_DEC, VALS(valueTypes), 0x0, NULL, HFILL,
+ }
+ },
+ {
+ &hf_gwtcs_min_vers,
+ {
+ "Minimum version", "gwtcs.minvers",
+ FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL,
+ }
+ },
+ {
+ &hf_gwtcs_max_vers,
+ {
+ "Maximum version", "gwtcs.maxvers",
+ FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL,
+ }
+ },
+ {
+ &hf_gwtcs_hosted_vers,
+ {
+ "hosted.html version", "gwtcs.hostedvers",
+ FT_UINT_STRING, BASE_DEC, NULL, 0x0, NULL, HFILL,
+ }
+ },
+ {
+ &hf_gwtcs_sel_vers,
+ {
+ "Selected version", "gwtcs.selvers",
+ FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL,
+ }
+ },
+ {
+ &hf_gwtcs_lm_url,
+ {
+ "URL", "gwtcs.lm.url",
+ FT_UINT_STRING, BASE_DEC, NULL, 0x0, NULL, HFILL,
+ }
+ },
+ {
+ &hf_gwtcs_lm_modname,
+ {
+ "Module Name", "gwtcs.lm.modname",
+ FT_UINT_STRING, BASE_DEC, NULL, 0x0, NULL, HFILL,
+ }
+ },
+ {
+ &hf_gwtcs_lm_tabkey,
+ {
+ "Tab Key", "gwtcs.lm.tabkey",
+ FT_UINT_STRING, BASE_DEC, NULL, 0x0, NULL, HFILL,
+ }
+ },
+ {
+ &hf_gwtcs_lm_seskey,
+ {
+ "Session Key", "gwtcs.lm.seskey",
+ FT_UINT_STRING, BASE_DEC, NULL, 0x0, NULL, HFILL,
+ }
+ },
+ {
+ &hf_gwtcs_lm_ua,
+ {
+ "User Agent", "gwtcs.lm.ua",
+ FT_UINT_STRING, BASE_DEC, NULL, 0x0, NULL, HFILL,
+ }
+ },
+ {
+ &hf_gwtcs_methname,
+ {
+ "Method Name", "gwtcs.lm.methname",
+ FT_UINT_STRING, BASE_DEC, NULL, 0x0, NULL, HFILL,
+ }
+ },
+ {
+ &hf_gwtcs_isexc,
+ {
+ "Is Exception", "gwtcs.isexc",
+ FT_BOOLEAN, BASE_DEC, NULL, 0x0, NULL, HFILL,
+ }
+ },
+ {
+ &hf_gwtcs_dispid,
+ {
+ "Dispatch ID", "gwtcs.dispid",
+ FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL,
+ }
+ },
+ {
+ &hf_gwtcs_jsni,
+ {
+ "JSNI Source", "gwtcs.jsni",
+ FT_UINT_STRING, BASE_DEC, NULL, 0x0, NULL, HFILL,
+ }
+ },
+ {
+ &hf_gwtcs_val_hdr,
+ {
+ "Value", "gwtcs.val.hdr",
+ FT_STRINGZ, BASE_DEC, NULL, 0x0, NULL, HFILL,
+ }
+ },
+ {
+ &hf_gwtcs_numargs,
+ {
+ "# of Arguments", "gwtcs.val.numargs",
+ FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL,
+ }
+ },
+ {
+ &hf_gwtcs_val_null,
+ {
+ "Null Value", "gwtcs.val.null",
+ FT_NONE, BASE_DEC, NULL, 0x0, NULL, HFILL,
+ }
+ },
+ {
+ &hf_gwtcs_val_undef,
+ {
+ "Undef Value", "gwtcs.val.undef",
+ FT_NONE, BASE_DEC, NULL, 0x0, NULL, HFILL,
+ }
+ },
+ {
+ &hf_gwtcs_val_bool,
+ {
+ "Boolean Value", "gwtcs.val.bool",
+ FT_BOOLEAN, BASE_DEC, NULL, 0x0, NULL, HFILL,
+ }
+ },
+ {
+ &hf_gwtcs_val_byte,
+ {
+ "Byte Value", "gwtcs.val.byte",
+ FT_INT8, BASE_DEC, NULL, 0x0, NULL, HFILL,
+ }
+ },
+ {
+ &hf_gwtcs_val_char,
+ {
+ "Char Value", "gwtcs.val.char",
+ FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL,
+ }
+ },
+ {
+ &hf_gwtcs_val_short,
+ {
+ "Short Value", "gwtcs.val.short",
+ FT_INT16, BASE_DEC, NULL, 0x0, NULL, HFILL,
+ }
+ },
+ {
+ &hf_gwtcs_val_int,
+ {
+ "Int Value", "gwtcs.val.int",
+ FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL,
+ }
+ },
+ {
+ &hf_gwtcs_val_long,
+ {
+ "Long Value", "gwtcs.val.long",
+ FT_INT64, BASE_DEC, NULL, 0x0, NULL, HFILL,
+ }
+ },
+ {
+ &hf_gwtcs_val_float,
+ {
+ "Float Value", "gwtcs.val.float",
+ FT_FLOAT, BASE_DEC, NULL, 0x0, NULL, HFILL,
+ }
+ },
+ {
+ &hf_gwtcs_val_double,
+ {
+ "Double Value", "gwtcs.val.double",
+ FT_DOUBLE, BASE_DEC, NULL, 0x0, NULL, HFILL,
+ }
+ },
+ {
+ &hf_gwtcs_val_javaobj,
+ {
+ "Java Object Id", "gwtcs.val.javaobj",
+ FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL,
+ }
+ },
+ {
+ &hf_gwtcs_val_jsobj,
+ {
+ "JS Object Id", "gwtcs.val.jsobj",
+ FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL,
+ }
+ },
+ {
+ &hf_gwtcs_val_string,
+ {
+ "String Value", "gwtcs.val.string",
+ FT_UINT_STRING, BASE_DEC, NULL, 0x0, NULL, HFILL,
+ }
+ },
+ {
+ &hf_gwtcs_transport,
+ {
+ "Transport Name", "gwtcs.transport",
+ FT_UINT_STRING, BASE_DEC, NULL, 0x0, NULL, HFILL,
+ }
+ },
+ {
+ &hf_gwtcs_transargs,
+ {
+ "Transport Args", "gwtcs.transargs",
+ FT_UINT_STRING, BASE_DEC, NULL, 0x0, NULL, HFILL,
+ }
+ },
+ };
+
+ if (proto_gwtcs == -1)
+ {
+ register_init_routine(&init);
+ proto_gwtcs = proto_register_protocol (
+ "GWT Code Server Protocol", /* name */
+ "GWT-CS", /* short name */
+ "gwtcs" /* abbrev */
+ );
+
+ proto_register_field_array(proto_gwtcs, hf, array_length(hf));
+ proto_register_subtree_array(ett, array_length(ett));
+ }
+}
+
+void proto_reg_handoff_gwtcs(void)
+{
+ static int Initialized=FALSE;
+
+ /* register with wireshark to dissect tdp packets on port 9997 */
+ if (!Initialized) {
+ gwtcs_handle = new_create_dissector_handle(dissect_gwtcs, proto_gwtcs);
+ dissector_add("tcp.port", DEFAULT_GWTCS_PORT, gwtcs_handle);
+ Initialized = TRUE;
+ }
+}
diff --git a/plugins/xpcom/ExternalWrapper.cpp b/plugins/xpcom/ExternalWrapper.cpp
new file mode 100644
index 0000000..62cc1b5
--- /dev/null
+++ b/plugins/xpcom/ExternalWrapper.cpp
@@ -0,0 +1,417 @@
+/*
+ * Copyright 2008 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.
+ */
+
+#include "ExternalWrapper.h"
+
+#include "nsIHttpProtocolHandler.h"
+#include "nsISupports.h"
+#include "nsNetCID.h"
+#include "nsCOMPtr.h"
+#include "nsMemory.h"
+#include "nsServiceManagerUtils.h"
+#include "nsIPromptService.h"
+#include "nsIDOMWindow.h"
+#if GECKO_VERSION <= 7000
+#include "nsIDOMWindowInternal.h"
+#endif //GECKO_VERSION
+#include "nsIDOMLocation.h"
+#include "nsXPCOMStrings.h"
+#include "nsICategoryManager.h"
+#include "nsIJSContextStack.h"
+#include "nsIScriptContext.h"
+#include "nsIScriptGlobalObject.h"
+#include "nsPIDOMWindow.h"
+#include "LoadModuleMessage.h"
+#include "ServerMethods.h"
+#include "BrowserChannel.h"
+#include "AllowedConnections.h"
+
+#if GECKO_VERSION >= 1900
+#include "nsIClassInfoImpl.h"
+#endif //GECKO_VERSION
+
+#if GECKO_VERSION >= 2000
+NS_IMPL_CLASSINFO(ExternalWrapper, NULL, 0, OOPHM_CID)
+#endif //GECKO_VERSION
+
+NS_IMPL_ISUPPORTS2_CI(ExternalWrapper, IOOPHM, nsISecurityCheckedComponent)
+
+ExternalWrapper::ExternalWrapper() {
+ Debug::log(Debug::Debugging) << "ExternalWrapper::ExternalWrapper(this="
+ << this << ")" << Debug::flush;
+ preferences = new Preferences();
+ windowWatcher = do_GetService(NS_WINDOWWATCHER_CONTRACTID);
+ if (!windowWatcher) {
+ Debug::log(Debug::Warning) << "Can't get WindowWatcher service"
+ << Debug::flush;
+ return;
+ }
+}
+
+ExternalWrapper::~ExternalWrapper() {
+ Debug::log(Debug::Debugging) << "ExternalWrapper::~ExternalWrapper(this="
+ << this << ")" << Debug::flush;
+}
+
+// define the CID for nsIHttpProtocolHandler
+static NS_DEFINE_CID(kHttpHandlerCID, NS_HTTPPROTOCOLHANDLER_CID);
+
+static nsresult getUserAgent(std::string& userAgent) {
+ nsresult res;
+ nsCOMPtr<nsIHttpProtocolHandler> http = do_GetService(kHttpHandlerCID, &res);
+ if (NS_FAILED(res)) {
+ return res;
+ }
+ nsCString userAgentStr;
+ res = http->GetUserAgent(userAgentStr);
+ if (NS_FAILED(res)) {
+ return res;
+ }
+ userAgent.assign(userAgentStr.get());
+ return NS_OK;
+}
+
+/**
+ * Get JS window object.
+ *
+ * @param win output parameter to store the window object
+ * @return true on success
+ */
+static bool getWindowObject(nsIDOMWindow** win) {
+ // Get JSContext from stack.
+ nsCOMPtr<nsIJSContextStack> stack =
+ do_GetService("@mozilla.org/js/xpc/ContextStack;1");
+ if (!stack) {
+ Debug::log(Debug::Error) << "getWindowObject: no context stack"
+ << Debug::flush;
+ return false;
+ }
+ JSContext *cx;
+ if (NS_FAILED(stack->Peek(&cx)) || !cx) {
+ Debug::log(Debug::Error) << "getWindowObject: no context on stack"
+ << Debug::flush;
+ return false;
+ }
+ if (!(::JS_GetOptions(cx) & JSOPTION_PRIVATE_IS_NSISUPPORTS)) {
+ Debug::log(Debug::Error)
+ << "getWindowObject: context doesn't have nsISupports" << Debug::flush;
+ return false;
+ }
+
+ nsCOMPtr<nsIScriptContext> scx =
+ do_QueryInterface(static_cast<nsISupports *>
+ (::JS_GetContextPrivate(cx)));
+ if (!scx) {
+ Debug::log(Debug::Error) << "getWindowObject: no script context"
+ << Debug::flush;
+ return false;
+ }
+ nsCOMPtr<nsIScriptGlobalObject> globalObj = scx->GetGlobalObject();
+ if (!globalObj) {
+ Debug::log(Debug::Error) << "getWindowObject: no global object"
+ << Debug::flush;
+ return false;
+ }
+ nsCOMPtr<nsPIDOMWindow> window = do_QueryInterface(globalObj);
+ if (!window) {
+ Debug::log(Debug::Error) << "getWindowObject: window is null"
+ << Debug::flush;
+ return false;
+ }
+ NS_ADDREF(*win = window);
+ return true;
+}
+
+/**
+ * Get the URL of a window.
+ *
+ * @param win DOMWindowInternal instance
+ * @param url output wide string for the URL
+ * @return true if successful
+ */
+static bool getWindowUrl(nsIDOMWindowInternal* win, nsAString& url) {
+ nsCOMPtr<nsIDOMLocation> loc;
+ if (win->GetLocation(getter_AddRefs(loc)) != NS_OK) {
+ Debug::log(Debug::Info) << "Unable to get location" << Debug::flush;
+ return false;
+ }
+ if (loc->GetHref(url) != NS_OK) {
+ Debug::log(Debug::Info) << "Unable to get URL" << Debug::flush;
+ return false;
+ }
+ return true;
+}
+
+/**
+ * Get the top-level window for a given window, and its URL.
+ *
+ * @param win window to start from
+ * @param topWinRet output parameter to store top window
+ * @param topUrl output parameter to store URL
+ * @return true on success, false on error (already logged)
+ */
+static bool getTopWindow(nsIDOMWindow* win, nsIDOMWindowInternal** topWinRet,
+ nsAString& topUrl) {
+ nsCOMPtr<nsIDOMWindow> topWin;
+ if (win->GetTop(getter_AddRefs(topWin)) != NS_OK) {
+ Debug::log(Debug::Error) << "Unable to get top window" << Debug::flush;
+ return false;
+ }
+ nsresult rv;
+ nsCOMPtr<nsIDOMWindowInternal> topWinInt = do_QueryInterface(topWin, &rv);
+ if (rv != NS_OK) {
+ Debug::log(Debug::Error) << "Unable to QI DOMWindowInternal"
+ << Debug::flush;
+ return false;
+ }
+ if (!getWindowUrl(topWinInt, topUrl)) {
+ Debug::log(Debug::Error) << "Unable to get url of top window"
+ << Debug::flush;
+ return false;
+ }
+ NS_ADDREF(*topWinRet = topWinInt);
+ return true;
+}
+
+std::string ExternalWrapper::computeTabIdentity() {
+ std::string returnVal;
+ if (!windowWatcher) {
+ return returnVal;
+ }
+ // The nsPIDOMWindow interface of our top-level window appears to be stable
+ // across refreshes, so we will use that for our tab ID.
+ nsCOMPtr<nsPIDOMWindow> privateWin = do_QueryInterface(topWindow);
+ if (!privateWin) {
+ return returnVal;
+ }
+ char buf[20]; // typically 8-16 hex digits plus 0x, not horrible if truncated
+ snprintf(buf, sizeof(buf), "%p", privateWin.get());
+ buf[19] = 0; // ensure null termination
+ returnVal = buf;
+ return returnVal;
+}
+
+// TODO(jat): remove suppliedWindow and update hosted.html API
+
+#if GECKO_VERSION < 10000
+NS_IMETHODIMP ExternalWrapper::Init(nsIDOMWindow* suppliedWindow,
+ PRBool *_retval) {
+#else
+NS_IMETHODIMP ExternalWrapper::Init(nsIDOMWindow* suppliedWindow,
+ bool *_retval) {
+#endif //GECKO_VERSION
+
+ Debug::log(Debug::Debugging) << "Plugin initialized from hosted.html"
+ << Debug::flush;
+ *_retval = false;
+ nsCOMPtr<nsIDOMWindow> computedWindow;
+ if (getWindowObject(getter_AddRefs(computedWindow))) {
+ Debug::log(Debug::Debugging) << " passed window=" << suppliedWindow
+ << ", computed=" << computedWindow << Debug::flush;
+ domWindow = computedWindow;
+ } else {
+ Debug::log(Debug::Warning) << " using supplied window object"
+ << Debug::flush;
+ // TODO(jat): remove this
+ domWindow = suppliedWindow;
+ }
+ if (getTopWindow(domWindow, getter_AddRefs(topWindow), url)) {
+ *_retval = true;
+ }
+ return NS_OK;
+}
+
+bool ExternalWrapper::askUserToAllow(const std::string& url) {
+ nsCOMPtr<nsIPromptService> promptService = do_GetService(
+ "@mozilla.org/embedcomp/prompt-service;1");
+ if (!promptService) {
+ return false;
+ }
+ NS_ConvertASCIItoUTF16 title("Allow GWT Developer Plugin Connection");
+ NS_ConvertASCIItoUTF16 text("The web and code server combination is unrecognized and requesting a GWT "
+ "developer plugin connection -- do you want to allow it?");
+ NS_ConvertASCIItoUTF16 checkMsg("Remember this decision for this server "
+ "(change in GWT Developer Plugin preferences)");
+
+#if GECKO_VERSION < 10000
+ // Please see: https://bugzilla.mozilla.org/show_bug.cgi?id=681188
+ PRBool remember = false;
+ PRBool include = true;
+ if (promptService->ConfirmCheck(domWindow.get(), title.get(), text.get(),
+ checkMsg.get(), &remember, &include) != NS_OK) {
+ return false;
+ }
+
+ if (remember) {
+ std::string host = AllowedConnections::getHostFromUrl(url);
+ std::string server = AllowedConnections::getCodeServerFromUrl(url);
+ preferences->addNewRule(host + "/" + server, !include);
+ }
+ return include;
+
+#else
+
+ bool remember = false;
+ bool include = true;
+ if (promptService->ConfirmCheck(domWindow.get(), title.get(), text.get(),
+ checkMsg.get(), &remember, &include) != NS_OK) {
+ return false;
+ }
+
+ if (remember) {
+ std::string host = AllowedConnections::getHostFromUrl(url);
+ std::string server = AllowedConnections::getCodeServerFromUrl(url);
+ preferences->addNewRule(host + "/" + server, !include);
+ }
+
+ return include;
+
+#endif //GECKO_VERSION
+}
+
+// TODO(jat): remove suppliedUrl and update hosted.html API
+#if GECKO_VERSION < 10000
+NS_IMETHODIMP ExternalWrapper::Connect(const nsACString& suppliedUrl,
+ const nsACString& sessionKey, const nsACString& aAddr,
+ const nsACString& aModuleName, const nsACString& hostedHtmlVersion,
+ PRBool *_retval) {
+#else
+NS_IMETHODIMP ExternalWrapper::Connect(const nsACString& suppliedUrl,
+ const nsACString& sessionKey, const nsACString& aAddr,
+ const nsACString& aModuleName, const nsACString& hostedHtmlVersion,
+ bool *_retval) {
+#endif //GECKO_VERSION
+
+ Debug::log(Debug::Info) << "Connect(url=" << url << ", sessionKey="
+ << sessionKey << ", address=" << aAddr << ", module=" << aModuleName
+ << ", hostedHtmlVersion=" << hostedHtmlVersion << Debug::flush;
+
+ // TODO: string utilities?
+ nsCString urlAutoStr;
+ NS_UTF16ToCString(url, NS_CSTRING_ENCODING_UTF8, urlAutoStr);
+ nsCString sessionKeyAutoStr(sessionKey);
+ nsCString addrAutoStr(aAddr);
+ nsCString moduleAutoStr(aModuleName);
+ nsCString hostedHtmlVersionAutoStr(hostedHtmlVersion);
+ std::string hostedUrl(addrAutoStr.get());
+ std::string urlStr(urlAutoStr.get());
+
+ bool allowed = false;
+ std::string webHost = AllowedConnections::getHostFromUrl(urlStr);
+ std::string codeServer = AllowedConnections::getCodeServerFromUrl(urlStr);
+ if (!AllowedConnections::matchesRule( webHost, codeServer, &allowed)) {
+ // If we didn't match an existing rule, prompt the user
+ allowed = askUserToAllow(urlStr);
+ }
+ if (!allowed) {
+ *_retval = false;
+ return NS_OK;
+ }
+
+ size_t index = hostedUrl.find(':');
+ if (index == std::string::npos) {
+ *_retval = false;
+ return NS_OK;
+ }
+ std::string hostPart = hostedUrl.substr(0, index);
+ std::string portPart = hostedUrl.substr(index + 1);
+
+ // TODO(jat): leaks HostChannel -- need to save it in a session object and
+ // return that so the host page can call a disconnect method on it at unload
+ // time or when it gets GC'd.
+ HostChannel* channel = new HostChannel();
+
+ Debug::log(Debug::Debugging) << "Connecting..." << Debug::flush;
+
+ if (!channel->connectToHost(hostPart.c_str(),
+ atoi(portPart.c_str()))) {
+ *_retval = false;
+ return NS_OK;
+ }
+
+ Debug::log(Debug::Debugging) << "...Connected" << Debug::flush;
+ sessionHandler.reset(new FFSessionHandler(channel/*, ctx*/));
+
+ std::string hostedHtmlVersionStr(hostedHtmlVersionAutoStr.get());
+ if (!channel->init(sessionHandler.get(), BROWSERCHANNEL_PROTOCOL_VERSION,
+ BROWSERCHANNEL_PROTOCOL_VERSION, hostedHtmlVersionStr)) {
+ *_retval = false;
+ return NS_OK;
+ }
+
+ std::string moduleName(moduleAutoStr.get());
+ std::string userAgent;
+
+ // get the user agent
+ nsresult res = getUserAgent(userAgent);
+ if (NS_FAILED(res)) {
+ return res;
+ }
+
+ std::string tabKeyStr = computeTabIdentity();
+ std::string sessionKeyStr(sessionKeyAutoStr.get());
+
+ LoadModuleMessage::send(*channel, urlStr, tabKeyStr, sessionKeyStr,
+ moduleName, userAgent, sessionHandler.get());
+
+ // TODO: return session object?
+ *_retval = true;
+ return NS_OK;
+}
+
+// nsISecurityCheckedComponent
+static char* cloneAllAccess() {
+ static const char allAccess[] = "allAccess";
+ return static_cast<char*>(nsMemory::Clone(allAccess, sizeof(allAccess)));
+}
+
+static bool strEquals(const PRUnichar* utf16, const char* ascii) {
+ nsCString utf8;
+ NS_UTF16ToCString(nsDependentString(utf16), NS_CSTRING_ENCODING_UTF8, utf8);
+ return strcmp(ascii, utf8.get()) == 0;
+}
+
+NS_IMETHODIMP ExternalWrapper::CanCreateWrapper(const nsIID * iid,
+ char **_retval) {
+ Debug::log(Debug::Spam) << "ExternalWrapper::CanCreateWrapper"
+ << Debug::flush;
+ *_retval = cloneAllAccess();
+ return NS_OK;
+}
+
+NS_IMETHODIMP ExternalWrapper::CanCallMethod(const nsIID * iid,
+ const PRUnichar *methodName, char **_retval) {
+ Debug::log(Debug::Spam) << "ExternalWrapper::CanCallMethod" << Debug::flush;
+ if (strEquals(methodName, "connect") || strEquals(methodName, "init")) {
+ *_retval = cloneAllAccess();
+ } else {
+ *_retval = nsnull;
+ }
+ return NS_OK;
+}
+
+NS_IMETHODIMP ExternalWrapper::CanGetProperty(const nsIID * iid,
+ const PRUnichar *propertyName, char **_retval) {
+ Debug::log(Debug::Spam) << "ExternalWrapper::CanGetProperty" << Debug::flush;
+ *_retval = nsnull;
+ return NS_OK;
+}
+NS_IMETHODIMP ExternalWrapper::CanSetProperty(const nsIID * iid,
+ const PRUnichar *propertyName, char **_retval) {
+ Debug::log(Debug::Spam) << "ExternalWrapper::CanSetProperty" << Debug::flush;
+ *_retval = nsnull;
+ return NS_OK;
+}
diff --git a/plugins/xpcom/ExternalWrapper.h b/plugins/xpcom/ExternalWrapper.h
new file mode 100755
index 0000000..9d012e1
--- /dev/null
+++ b/plugins/xpcom/ExternalWrapper.h
@@ -0,0 +1,93 @@
+#ifndef _H_ExternalWrapper
+#define _H_ExternalWrapper
+/*
+ * Copyright 2008 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.
+ */
+
+#include <string>
+
+#include "mozincludes.h"
+
+#include "IOOPHM.h"
+
+#include "Preferences.h"
+#include "FFSessionHandler.h"
+#include "Debug.h"
+#include "scoped_ptr/scoped_ptr.h"
+
+#include "nsCOMPtr.h"
+#include "nsISecurityCheckedComponent.h"
+#include "nsStringAPI.h"
+#include "nsIWindowWatcher.h"
+#include "nsIDOMWindow.h"
+
+class nsIDOMWindow;
+
+// {028DD88B-6D65-401D-AAFD-17E497D15D09}
+#define OOPHM_CID \
+ { 0x028DD88B, 0x6D65, 0x401D, \
+ { 0xAA, 0xFD, 0x17, 0xE4, 0x97, 0xD1, 0x5D, 0x09 } }
+
+#define OOPHM_CONTRACTID "@gwt.google.com/oophm/ExternalWrapper;1"
+#define OOPHM_CLASSNAME "GWT DevMode component"
+
+class ExternalWrapper : public IOOPHM,
+ public nsISecurityCheckedComponent {
+ NS_DECL_ISUPPORTS
+ NS_DECL_IOOPHM
+ NS_DECL_NSISECURITYCHECKEDCOMPONENT
+
+ ExternalWrapper();
+ virtual ~ExternalWrapper();
+
+private:
+ nsCOMPtr<nsIDOMWindow> domWindow;
+ nsCOMPtr<nsIDOMWindowInternal> topWindow;
+ nsString url;
+ nsCOMPtr<Preferences> preferences;
+ scoped_ptr<FFSessionHandler> sessionHandler;
+ nsCOMPtr<nsIWindowWatcher> windowWatcher;
+
+ /**
+ * Prompt the user whether a connection should be allowed, and optionally
+ * update the preferences.
+ */
+ bool askUserToAllow(const std::string& url);
+
+ /**
+ * Compute a stable tab identity value for the DOM window.
+ *
+ * @return a unique tab identifier which is stable across reloads, or an
+ * empty string if it cannot be computed
+ */
+ std::string computeTabIdentity();
+
+};
+
+inline Debug::DebugStream& operator<<(Debug::DebugStream& dbg,
+ const nsACString& str) {
+ nsCString copy(str);
+ dbg << copy.get();
+ return dbg;
+}
+
+inline Debug::DebugStream& operator<<(Debug::DebugStream& dbg,
+ const nsAString& str) {
+ NS_ConvertUTF16toUTF8 copy(str);
+ dbg << copy.get();
+ return dbg;
+}
+
+#endif
diff --git a/plugins/xpcom/FFSessionHandler.cpp b/plugins/xpcom/FFSessionHandler.cpp
new file mode 100755
index 0000000..37eb57b
--- /dev/null
+++ b/plugins/xpcom/FFSessionHandler.cpp
@@ -0,0 +1,651 @@
+/*
+ * Copyright 2008 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.
+ */
+
+#include "FFSessionHandler.h"
+#include "HostChannel.h"
+#include "JavaObject.h"
+#include "JSRunner.h"
+#include "Debug.h"
+#include "XpcomDebug.h"
+#include "scoped_ptr/scoped_ptr.h"
+#include "RootedObject.h"
+#include "InvokeMessage.h"
+#include "ServerMethods.h"
+#include "AllowedConnections.h"
+
+#include "jsapi.h"
+#include "nsCOMPtr.h"
+#include "nsStringAPI.h"
+#include "nsIJSContextStack.h"
+#include "nsIPrincipal.h"
+#include "nsServiceManagerUtils.h"
+
+#if GECKO_VERSION >= 2000
+#define JS_RemoveRootRT js_RemoveRoot
+static inline bool INT_FITS_IN_JSVAL(int i) {
+ return (i >= JSVAL_INT_MIN) && (i <= JSVAL_INT_MAX);
+}
+#endif //GECKO_VERSION
+
+static JSContext* getJSContext() {
+ // Get JSContext from stack.
+ nsCOMPtr<nsIJSContextStack> stack =
+ do_GetService("@mozilla.org/js/xpc/ContextStack;1");
+ if (!stack) {
+ return NULL;
+ }
+
+ JSContext *cx;
+ if (NS_FAILED(stack->Peek(&cx))) {
+ return NULL;
+ }
+
+ if (cx == nsnull) {
+ // TODO(jat): figure out why this can be null at plugin unload time
+ Debug::log(Debug::Error) << "GWT Dev Plugin: Null JS context" << Debug::flush;
+ }
+
+ return cx;
+}
+
+FFSessionHandler::FFSessionHandler(HostChannel* channel)
+ : SessionData(channel, this, getJSContext()), jsObjectId(0),
+ jsObjectsById(NULL), stringObjectClass(NULL) {
+ Debug::log(Debug::Debugging) << "FFSessionHandler::FFSessionHandler(this="
+ << this << ")" << Debug::flush;
+ // TODO(jat): is there a way to avoid calling this twice, without keeping
+ // JSContext in an instance field?
+ JSContext* ctx = getJSContext();
+ if (!JS_AddNamedObjectRoot(ctx, &jsObjectsById, "jsObjectsById")) {
+ Debug::log(Debug::Error) << "Error rooting jsObjectsById" << Debug::flush;
+ }
+ jsObjectsById = JS_NewArrayObject(ctx, 0, NULL);
+ if (!jsObjectsById) {
+ Debug::log(Debug::Error) << "Error rooting jsObjectsById" << Debug::flush;
+ }
+ if (!JS_AddNamedValueRoot(ctx, &toStringTearOff, "toStringTearOff")) {
+ Debug::log(Debug::Error) << "Error rooting toStringTearOff" << Debug::flush;
+ }
+ getStringObjectClass(ctx);
+ getToStringTearOff(ctx);
+}
+
+void FFSessionHandler::getStringObjectClass(JSContext* ctx) {
+ jsval str = JS_GetEmptyStringValue(ctx);
+ JSObject* obj = 0;
+ if (!JS_ValueToObject(ctx, str, &obj)) {
+ return;
+ }
+ if (!obj) {
+ return;
+ }
+ stringObjectClass = JS_GET_CLASS(ctx, obj);
+}
+
+void FFSessionHandler::getToStringTearOff(JSContext* ctx) {
+ jsval funcVal;
+
+ Debug::log(Debug::Debugging) << "Getting function \"__gwt_makeTearOff\""
+ << Debug::flush;
+
+ if (!JS_GetProperty(ctx, global, "__gwt_makeTearOff", &funcVal)
+ || funcVal == JSVAL_VOID) {
+ Debug::log(Debug::Error) << "Could not get function \"__gwt_makeTearOff\""
+ << Debug::flush;
+ return;
+ }
+ jsval jsargs[3] = {
+ JSVAL_NULL, // no proxy
+ INT_TO_JSVAL(InvokeMessage::TOSTRING_DISP_ID), // dispId
+ JSVAL_ZERO // arg count is zero
+ };
+ if (!JS_CallFunctionValue(ctx, global, funcVal, 3, jsargs, &toStringTearOff)) {
+ jsval exc;
+ if (JS_GetPendingException(ctx, &exc)) {
+ Debug::log(Debug::Error)
+ << "__gwt_makeTearOff(null,0,0) threw exception "
+ << dumpJsVal(ctx, exc) << Debug::flush;
+ } else {
+ Debug::log(Debug::Error) << "Error creating toString tear-off"
+ << Debug::flush;
+ }
+ // TODO(jat): show some crash page and die
+ }
+}
+
+FFSessionHandler::~FFSessionHandler(void) {
+ Debug::log(Debug::Debugging) << "FFSessionHandler::~FFSessionHandler(this="
+ << this << ")" << Debug::flush;
+ disconnect();
+ if (runtime) {
+ JS_RemoveRootRT(runtime, &jsObjectsById);
+ jsObjectsById = NULL;
+ JS_RemoveRootRT(runtime, &toStringTearOff);
+ runtime = NULL;
+ }
+}
+
+void FFSessionHandler::disconnectDetectedImpl() {
+ JSContext* ctx = getJSContext();
+ if (!ctx) {
+ return;
+ }
+
+ Debug::log(Debug::Debugging) << "Getting function \"__gwt_disconnected\""
+ << Debug::flush;
+
+ jsval funcVal;
+ if (!JS_GetProperty(ctx, global, "__gwt_disconnected", &funcVal)
+ || funcVal == JSVAL_VOID) {
+ Debug::log(Debug::Error) << "Could not get function \"__gwt_disconnected\""
+ << Debug::flush;
+ return;
+ }
+ jsval rval;
+ JS_CallFunctionValue(ctx, global, funcVal, 0, 0, &rval);
+}
+
+void FFSessionHandler::freeValue(HostChannel& channel, int idCount, const int* ids) {
+ Debug::DebugStream& dbg = Debug::log(Debug::Spam)
+ << "FFSessionHandler::freeValue [ ";
+ JSContext* ctx = getJSContext();
+
+ for (int i = 0; i < idCount; ++i) {
+ int objId = ids[i];
+ dbg << objId << " ";
+ jsval toRemove;
+ if (JS_GetElement(ctx, jsObjectsById, objId, &toRemove) &&
+#ifdef JSVAL_IS_OBJECT
+ JSVAL_IS_OBJECT(toRemove)) {
+#else
+ !JSVAL_IS_PRIMITIVE(toRemove)) {
+#endif
+ jsIdsByObject.erase(identityFromObject(JSVAL_TO_OBJECT(toRemove)));
+ JS_DeleteElement(ctx, jsObjectsById, objId);
+ } else {
+ Debug::log(Debug::Error) << "Error deleting js objId=" << objId << Debug::flush;
+ }
+ }
+
+ dbg << "]" << Debug::flush;
+}
+
+void FFSessionHandler::loadJsni(HostChannel& channel, const std::string& js) {
+ Debug::log(Debug::Spam) << "FFSessionHandler::loadJsni " << js << "(EOM)" << Debug::flush;
+ JSContext* ctx = getJSContext();
+ if (!JSRunner::eval(ctx, global, js)) {
+ Debug::log(Debug::Error) << "Error executing script" << Debug::flush;
+ }
+}
+
+void FFSessionHandler::sendFreeValues(HostChannel& channel) {
+ unsigned n = javaObjectsToFree.size();
+ if (n) {
+ scoped_array<int> ids(new int[n]);
+ int i = 0;
+ for (std::set<int>::iterator it = javaObjectsToFree.begin();
+ it != javaObjectsToFree.end(); ++it) {
+ ids[i++] = *it;
+ }
+ if (ServerMethods::freeJava(channel, this, n, ids.get())) {
+ javaObjectsToFree.clear();
+ }
+ }
+}
+
+void FFSessionHandler::fatalError(HostChannel& channel,
+ const std::string& message) {
+ // TODO(jat): implement
+}
+
+bool FFSessionHandler::invoke(HostChannel& channel, const gwt::Value& thisObj, const std::string& methodName,
+ int numArgs, const gwt::Value* const args, gwt::Value* returnValue) {
+ Debug::log(Debug::Debugging) << "FFSessionHandler::invoke " << thisObj.toString()
+ << "::" << methodName << Debug::flush;
+ JSContext* ctx = getJSContext();
+
+ // Used to root JSthis and args while making the JS call
+ // TODO(jat): keep one object and just keep a "stack pointer" into that
+ // object on the native stack so we don't keep allocating/rooting/freeing
+ // an object
+ RootedObject argsRoot(ctx, "FFSessionhandler::invoke");
+ argsRoot = JS_NewArrayObject(ctx, 0, NULL);
+ if (!JS_SetArrayLength(ctx, argsRoot.get(), numArgs + 1)) {
+ Debug::log(Debug::Error)
+ << "FFSessionhandler::invoke - could not set argsRoot length"
+ << Debug::flush;
+ return true;
+ }
+
+ jsval jsThis;
+ if (thisObj.isNull()) {
+ jsThis = OBJECT_TO_JSVAL(global);
+ Debug::log(Debug::Error) << " using global object for this" << Debug::flush;
+ } else {
+ makeJsvalFromValue(jsThis, ctx, thisObj);
+ if (Debug::level(Debug::Spam)) {
+ Debug::log(Debug::Spam) << " obj=" << dumpJsVal(ctx, jsThis)
+ << Debug::flush;
+ }
+ }
+ if (!JS_SetElement(ctx, argsRoot.get(), 0, &jsThis)) {
+ Debug::log(Debug::Error)
+ << "FFSessionhandler::invoke - could not set argsRoot[0] to this"
+ << Debug::flush;
+ return true;
+ }
+
+ jsval funcVal;
+ // TODO: handle non-ASCII method names
+ if (!JS_GetProperty(ctx, global, methodName.c_str(), &funcVal)
+ || funcVal == JSVAL_VOID) {
+ Debug::log(Debug::Error) << "Could not get function " << methodName
+ << Debug::flush;
+ return true;
+ }
+
+ scoped_array<jsval> jsargs(new jsval[numArgs]);
+ for (int i = 0; i < numArgs; ++i) {
+ makeJsvalFromValue(jsargs[i], ctx, args[i]);
+ if (Debug::level(Debug::Spam)) {
+ Debug::log(Debug::Spam) << " arg[" << i << "] = " << dumpJsVal(ctx,
+ jsargs[i]) << Debug::flush;
+ }
+ if (!JS_SetElement(ctx, argsRoot.get(), i + 1, &jsargs[i])) {
+ Debug::log(Debug::Error)
+ << "FFSessionhandler::invoke - could not set args[" << (i + 1) << "]"
+ << Debug::flush;
+ return true;
+ }
+ }
+
+ if (JS_IsExceptionPending(ctx)) {
+ JS_ClearPendingException(ctx);
+ }
+
+ jsval rval;
+ JSBool ok = JS_CallFunctionValue(ctx, JSVAL_TO_OBJECT(jsThis), funcVal,
+ numArgs, jsargs.get(), &rval);
+
+ if (!ok) {
+ if (JS_GetPendingException(ctx, &rval)) {
+ makeValueFromJsval(*returnValue, ctx, rval);
+ Debug::log(Debug::Debugging) << "FFSessionHandler::invoke "
+ << thisObj.toString() << "::" << methodName << " threw exception "
+ << dumpJsVal(ctx, rval) << Debug::flush;
+ } else {
+ Debug::log(Debug::Error) << "Non-exception failure invoking "
+ << methodName << Debug::flush;
+ returnValue->setUndefined();
+ }
+ } else {
+ makeValueFromJsval(*returnValue, ctx, rval);
+ }
+ Debug::log(Debug::Spam) << " return= " << *returnValue << Debug::flush;
+ return !ok;
+}
+
+/**
+ * Invoke a plugin-provided method with the given args. As above, this method does not own
+ * any of its args.
+ *
+ * Returns true if an exception occurred.
+ */
+bool FFSessionHandler::invokeSpecial(HostChannel& channel, SpecialMethodId method, int numArgs,
+ const gwt::Value* const args, gwt::Value* returnValue) {
+ Debug::log(Debug::Spam) << "FFSessionHandler::invokeSpecial" << Debug::flush;
+ return false;
+}
+
+/**
+ * Convert UTF16 string to UTF8-encoded std::string.
+ *
+ * This is implemented here because the Mozilla libraries mangle certain UTF8
+ * strings.
+ *
+ * @return UTF8-encoded string.
+ */
+static std::string utf8String(const jschar* str, unsigned len) {
+ std::string utf8str;
+ while (len-- > 0) {
+ unsigned ch = *str++;
+ // check for paired surrogates first, leave unpaired surrogates as-is
+ if (ch >= 0xD800 && ch < 0xDC00 && len > 0 && *str >= 0xDC00 && *str < 0xE000) {
+ ch = ((ch & 1023) << 10) + (*str++ & 1023) + 0x10000;
+ len--;
+ }
+ if (ch < 0x80) { // U+0000 - U+007F as 0xxxxxxx
+ utf8str.append(1, ch);
+ } else if (ch < 0x800) { // U+0080 - U+07FF as 110xxxxx 10xxxxxx
+ utf8str.append(1, 0xC0 + ((ch >> 6) & 31));
+ utf8str.append(1, 0x80 + (ch & 63));
+ } else if (ch < 0x10000) { // U+0800 - U+FFFF as 1110xxxx 10xxxxxx 10xxxxxx
+ utf8str.append(1, 0xE0 + ((ch >> 12) & 15));
+ utf8str.append(1, 0x80 + ((ch >> 6) & 63));
+ utf8str.append(1, 0x80 + (ch & 63));
+ } else { // rest as 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
+ utf8str.append(1, 0xF0 + ((ch >> 18) & 7));
+ utf8str.append(1, 0x80 + ((ch >> 12) & 63));
+ utf8str.append(1, 0x80 + ((ch >> 6) & 63));
+ utf8str.append(1, 0x80 + (ch & 63));
+ }
+ }
+ return utf8str;
+}
+
+/**
+ * Creates a JSString from a UTF8-encoded std::string.
+ *
+ * This is implemented here because the Mozilla libraries mangle certain UTF8
+ * strings.
+ *
+ * @return the JSString object, which owns its memory buffer.
+ */
+static JSString* stringUtf8(JSContext* ctx, const std::string& utf8str) {
+ unsigned len = 0;
+ for (unsigned i = 0; i < utf8str.length(); ++i) {
+ char ch = utf8str[i];
+ switch (ch & 0xF8) {
+ // continuation & invalid chars
+ default:
+ // ASCII characters
+ case 0x00: case 0x08: case 0x10: case 0x18:
+ case 0x20: case 0x28: case 0x30: case 0x38:
+ case 0x40: case 0x48: case 0x50: case 0x58:
+ case 0x60: case 0x68: case 0x70: case 0x78:
+ // 2-byte UTF8 characters
+ case 0xC0: case 0xC8: case 0xD0: case 0xD8:
+ // 3-byte UTF8 characters
+ case 0xE0: case 0xE8:
+ ++len;
+ break;
+ case 0xF0:
+ len += 2;
+ break;
+ }
+ }
+ // Account for null terminator even if it isn't included in the string length
+ // Note that buf becomes owned by the JSString and must not be freed here.
+ jschar* buf = static_cast<jschar*>(JS_malloc(ctx, (len + 1) * sizeof(jschar)));
+ if (!buf) {
+ return NULL;
+ }
+ jschar* p = buf;
+ unsigned codePoint;
+ int charsLeft = -1;
+ for (unsigned i = 0; i < utf8str.length(); ++i) {
+ char ch = utf8str[i];
+ if (charsLeft >= 0) {
+ if ((ch & 0xC0) != 0x80) {
+ // invalid, missing continuation character
+ *p++ = static_cast<jschar>(0xFFFD);
+ charsLeft = -1;
+ } else {
+ codePoint = (codePoint << 6) | (ch & 63);
+ if (!--charsLeft) {
+ if (codePoint >= 0x10000) {
+ codePoint -= 0x10000;
+ *p++ = static_cast<jschar>(0xD800 + ((codePoint >> 10) & 1023));
+ *p++ = static_cast<jschar>(0xDC00 + (codePoint & 1023));
+ } else {
+ *p++ = static_cast<jschar>(codePoint);
+ }
+ charsLeft = -1;
+ }
+ }
+ continue;
+ }
+ // Look at the top 5 bits to determine how many bytes are in this character.
+ switch (ch & 0xF8) {
+ default: // skip invalid and continuation chars
+ break;
+ case 0x00: case 0x08: case 0x10: case 0x18:
+ case 0x20: case 0x28: case 0x30: case 0x38:
+ case 0x40: case 0x48: case 0x50: case 0x58:
+ case 0x60: case 0x68: case 0x70: case 0x78:
+ *p++ = static_cast<jschar>(ch);
+ break;
+ case 0xC0: case 0xC8: case 0xD0: case 0xD8:
+ charsLeft = 1;
+ codePoint = ch & 31;
+ break;
+ case 0xE0: case 0xE8:
+ charsLeft = 2;
+ codePoint = ch & 15;
+ break;
+ case 0xF0:
+ charsLeft = 3;
+ codePoint = ch & 7;
+ break;
+ }
+ }
+ // null terminator, apparently some code expects a terminator even though
+ // the strings are counted. Note that this null word should not be included
+ // in the length, and that the buffer becomes owned by the JSString object.
+ *p = 0;
+ return JS_NewUCString(ctx, buf, p - buf);
+}
+
+void FFSessionHandler::makeValueFromJsval(gwt::Value& retVal, JSContext* ctx,
+ const jsval& value) {
+ if (JSVAL_IS_VOID(value)) {
+ retVal.setUndefined();
+ } else if (JSVAL_IS_NULL(value)) {
+ retVal.setNull();
+ } else if (JSVAL_IS_INT(value)) {
+ retVal.setInt(JSVAL_TO_INT(value));
+ } else if (JSVAL_IS_BOOLEAN(value)) {
+ retVal.setBoolean(JSVAL_TO_BOOLEAN(value));
+ } else if (JSVAL_IS_STRING(value)) {
+ JSString* str = JSVAL_TO_STRING(value);
+#if GECKO_VERSION < 2000
+ retVal.setString(utf8String(JS_GetStringChars(str),
+ JS_GetStringLength(str)));
+#else
+ retVal.setString(utf8String(JS_GetStringCharsZ(ctx, str),
+ JS_GetStringLength(str)));
+#endif //GECKO_VERSION
+ } else if (JSVAL_IS_DOUBLE(value)) {
+ retVal.setDouble(JSVAL_TO_DOUBLE(value));
+#ifdef JSVAL_IS_OBJECT
+ } else if (JSVAL_IS_OBJECT(value)) {
+#else
+ } else if (!JSVAL_IS_PRIMITIVE(value)) {
+#endif
+ JSObject* obj = JSVAL_TO_OBJECT(value);
+ if (JavaObject::isJavaObject(ctx, obj)) {
+ retVal.setJavaObject(JavaObject::getObjectId(ctx, obj));
+ } else if (JS_GET_CLASS(ctx, obj) == stringObjectClass) {
+ // JS String wrapper object, treat as a string primitive
+ JSString* str = JS_ValueToString(ctx, value);
+#if GECKO_VERSION < 2000
+ retVal.setString(utf8String(JS_GetStringChars(str),
+ JS_GetStringLength(str)));
+#else
+ retVal.setString(utf8String(JS_GetStringCharsZ(ctx, str),
+ JS_GetStringLength(str)));
+#endif //GECKO_VERSION
+ // str will be garbage-collected, does not need to be freed
+ } else {
+ // It's a plain-old JavaScript Object
+ void* objKey = identityFromObject(obj);
+ std::map<void*, int>::iterator it = jsIdsByObject.find(objKey);
+ if (it != jsIdsByObject.end()) {
+ retVal.setJsObjectId(it->second);
+ } else {
+ // Allocate a new id
+ int objId = ++jsObjectId;
+ JS_SetElement(ctx, jsObjectsById, objId, const_cast<jsval*>(&value));
+ jsIdsByObject[objKey] = objId;
+ retVal.setJsObjectId(objId);
+ }
+ }
+ } else {
+ Debug::log(Debug::Error) << "Unhandled jsval type " << Debug::flush;
+ retVal.setString("Unhandled jsval type");
+ }
+}
+
+void FFSessionHandler::makeJsvalFromValue(jsval& retVal, JSContext* ctx,
+ const gwt::Value& value) {
+ switch (value.getType()) {
+ case gwt::Value::NULL_TYPE:
+ retVal = JSVAL_NULL;
+ break;
+ case gwt::Value::BOOLEAN:
+ retVal = BOOLEAN_TO_JSVAL(value.getBoolean());
+ break;
+ case gwt::Value::BYTE:
+ retVal = INT_TO_JSVAL((int) value.getByte());
+ break;
+ case gwt::Value::CHAR:
+ retVal = INT_TO_JSVAL((int) value.getChar());
+ break;
+ case gwt::Value::SHORT:
+ retVal = INT_TO_JSVAL((int) value.getShort());
+ break;
+ case gwt::Value::INT: {
+ int intValue = value.getInt();
+ if (INT_FITS_IN_JSVAL(intValue)) {
+ retVal = INT_TO_JSVAL(intValue);
+ } else {
+ JS_NewNumberValue(ctx, (jsdouble) intValue, &retVal);
+ }
+ break;
+ }
+ // TODO(jat): do we still need long support in the wire format and Value?
+// case gwt::Value::LONG:
+// retVal = value.getLong();
+// break;
+ case gwt::Value::FLOAT:
+ JS_NewNumberValue(ctx, (jsdouble) value.getFloat(), &retVal);
+ break;
+ case gwt::Value::DOUBLE:
+ JS_NewNumberValue(ctx, (jsdouble) value.getDouble(), &retVal);
+ break;
+ case gwt::Value::STRING:
+ {
+ JSString* str = stringUtf8(ctx, value.getString());
+ retVal = STRING_TO_JSVAL(str);
+ }
+ break;
+ case gwt::Value::JAVA_OBJECT:
+ {
+ int javaId = value.getJavaObjectId();
+ std::map<int, JSObject*>::iterator i = javaObjectsById.find(javaId);
+ if (i == javaObjectsById.end()) {
+ JSObject* obj = JavaObject::construct(ctx, this, javaId);
+ javaObjectsById[javaId] = obj;
+ // We may have previously released the proxy for the same object id,
+ // but have not yet sent a free message back to the server.
+ javaObjectsToFree.erase(javaId);
+ retVal = OBJECT_TO_JSVAL(obj);
+ } else {
+ retVal = OBJECT_TO_JSVAL(i->second);
+ }
+ }
+ break;
+ case gwt::Value::JS_OBJECT:
+ {
+ int jsId = value.getJsObjectId();
+ if (!JS_GetElement(ctx, jsObjectsById, jsId, &retVal)) {
+ Debug::log(Debug::Error) << "Error getting jsObject with id " << jsId << Debug::flush;
+ }
+#ifdef JSVAL_IS_OBJECT
+ if (!JSVAL_IS_OBJECT(retVal)) {
+#else
+ if (JSVAL_IS_PRIMITIVE(retVal)) {
+#endif
+ Debug::log(Debug::Error) << "Missing jsObject with id " << jsId << Debug::flush;
+ }
+ }
+ break;
+ case gwt::Value::UNDEFINED:
+ retVal = JSVAL_VOID;
+ break;
+ default:
+ Debug::log(Debug::Error) << "Unknown Value type " << value.toString() << Debug::flush;
+ }
+}
+
+void FFSessionHandler::freeJavaObject(int objectId) {
+ if (!javaObjectsById.erase(objectId)) {
+ Debug::log(Debug::Error) << "Trying to free unknown JavaObject: " << objectId << Debug::flush;
+ return;
+ }
+ javaObjectsToFree.insert(objectId);
+}
+
+void FFSessionHandler::disconnect() {
+ Debug::log(Debug::Debugging) << "FFSessionHandler::disconnect" << Debug::flush;
+ JSContext* ctx = getJSContext();
+ bool freeCtx = false;
+ if (!ctx) {
+ Debug::log(Debug::Debugging) << " creating temporary context"
+ << Debug::flush;
+ freeCtx = true;
+ ctx = JS_NewContext(runtime, 8192);
+ if (ctx) {
+ JS_SetOptions(ctx, JSOPTION_VAROBJFIX);
+#ifdef JSVERSION_LATEST
+ JS_SetVersion(ctx, JSVERSION_LATEST);
+#endif
+ }
+ }
+ if (ctx) {
+ JS_BeginRequest(ctx);
+ for (std::map<int, JSObject*>::iterator it = javaObjectsById.begin();
+ it != javaObjectsById.end(); ++it) {
+ int javaId = it->first;
+ JSObject* obj = it->second;
+ if (JavaObject::isJavaObject(ctx, obj)) {
+ // clear the SessionData pointer -- JavaObject knows it is
+ // disconnected if this is null
+ MOZ_JS_SetPrivate(ctx, obj, NULL);
+ javaObjectsToFree.erase(javaId);
+ }
+ }
+ JS_EndRequest(ctx);
+ if (freeCtx) {
+ JS_DestroyContext(ctx);
+ }
+ } else {
+ Debug::log(Debug::Warning)
+ << "FFSessionHandler::disconnect - no context available"
+ << Debug::flush;
+ }
+ HostChannel* channel = getHostChannel();
+ if (channel->isConnected()) {
+ channel->disconnectFromHost();
+ }
+}
+
+void* FFSessionHandler::identityFromObject(JSObject* obj) {
+ JSContext* ctx = getJSContext();
+ jsval rval;
+ void* returnValue = obj;
+ if (JS_GetProperty(ctx, obj, "wrappedJSObject", &rval)
+#ifdef JSVAL_IS_OBJECT
+ && JSVAL_IS_OBJECT(rval)) {
+#else
+ && !JSVAL_IS_PRIMITIVE(rval)) {
+#endif
+ returnValue = JSVAL_TO_OBJECT(rval);
+ Debug::log(Debug::Info) << "identityFromObject mapped " << obj << " to "
+ << returnValue << Debug::flush;
+ }
+ return returnValue;
+}
diff --git a/plugins/xpcom/FFSessionHandler.h b/plugins/xpcom/FFSessionHandler.h
new file mode 100755
index 0000000..f7941bf
--- /dev/null
+++ b/plugins/xpcom/FFSessionHandler.h
@@ -0,0 +1,73 @@
+#ifndef _H_FFSessionHandler
+#define _H_FFSessionHandler
+/*
+ * Copyright 2008 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.
+ */
+
+#include <set>
+#include <map>
+
+#include "mozincludes.h"
+#include "SessionData.h"
+#include "Preferences.h"
+
+#include "jsapi.h"
+
+class HostChannel;
+namespace gwt {
+ class Value;
+}
+
+class FFSessionHandler : public SessionData, public SessionHandler {
+ friend class JavaObject;
+public:
+ FFSessionHandler(HostChannel* channel);
+ ~FFSessionHandler(void);
+ virtual void makeValueFromJsval(gwt::Value& retVal, JSContext* ctx,
+ const jsval& value);
+ virtual void makeJsvalFromValue(jsval& retVal, JSContext* ctx,
+ const gwt::Value& value);
+ virtual void freeJavaObject(int objectId);
+ void disconnect();
+
+protected:
+ virtual void disconnectDetectedImpl();
+ virtual void freeValue(HostChannel& channel, int idCount, const int* ids);
+ virtual void loadJsni(HostChannel& channel, const std::string& js);
+ virtual bool invoke(HostChannel& channel, const gwt::Value& thisObj, const std::string& methodName,
+ int numArgs, const gwt::Value* const args, gwt::Value* returnValue);
+ virtual bool invokeSpecial(HostChannel& channel, SpecialMethodId method, int numArgs,
+ const gwt::Value* const args, gwt::Value* returnValue);
+ virtual void sendFreeValues(HostChannel& channel);
+ virtual void fatalError(HostChannel& channel, const std::string& message);
+
+private:
+ void getStringObjectClass(JSContext* ctx);
+ void getToStringTearOff(JSContext* ctx);
+ void* identityFromObject(JSObject* obj);
+
+ int jsObjectId;
+
+ std::map<int, JSObject*> javaObjectsById;
+ std::set<int> javaObjectsToFree;
+
+ // Array of JSObjects exposed to the host
+ JSObject* jsObjectsById;
+ JSClass* stringObjectClass;
+
+ std::map<void*, int> jsIdsByObject;
+};
+
+#endif
diff --git a/plugins/xpcom/IOOPHM.idl b/plugins/xpcom/IOOPHM.idl
new file mode 100644
index 0000000..1aeea54
--- /dev/null
+++ b/plugins/xpcom/IOOPHM.idl
@@ -0,0 +1,11 @@
+#include "nsISupports.idl"
+
+interface nsIDOMWindow;
+
+[scriptable, uuid(90CEF17B-C3FE-4251-AF68-4381B3D938A0)]
+interface IOOPHM : nsISupports
+{
+ boolean init(in nsIDOMWindow window);
+ boolean connect(in ACString url, in ACString sessionKey, in ACString addr,
+ in ACString moduleName, in ACString hostedHtmlVersion);
+};
diff --git a/plugins/xpcom/IOOPHM.xpt b/plugins/xpcom/IOOPHM.xpt
new file mode 100644
index 0000000..4be87b7
--- /dev/null
+++ b/plugins/xpcom/IOOPHM.xpt
Binary files differ
diff --git a/plugins/xpcom/JSRunner.cpp b/plugins/xpcom/JSRunner.cpp
new file mode 100755
index 0000000..f5b3a8a
--- /dev/null
+++ b/plugins/xpcom/JSRunner.cpp
@@ -0,0 +1,142 @@
+/*
+ * Copyright 2008 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.
+ */
+
+#include "Debug.h"
+#include "JSRunner.h"
+
+#include "nsCOMPtr.h"
+#include "nsIPrincipal.h"
+#include "nsIScriptGlobalObject.h"
+#include "nsIScriptObjectPrincipal.h"
+#include "nsIURI.h"
+#include "nsIXPConnect.h"
+#if GECKO_VERSION >= 13000
+#include "nsJSPrincipals.h"
+#endif
+#include "nsStringAPI.h"
+
+// from js_runner_ff.cc in Gears (http://code.google.com/p/gears/)
+
+bool JSRunner::eval(JSContext* ctx, JSObject* object, const std::string& script) {
+ // To eval the script, we need the JSPrincipals to be acquired through
+ // nsIPrincipal. nsIPrincipal can be queried through the
+ // nsIScriptObjectPrincipal interface on the Script Global Object. In order
+ // to get the Script Global Object, we need to request the private data
+ // associated with the global JSObject on the current context.
+ nsCOMPtr<nsIScriptGlobalObject> sgo;
+ nsISupports *priv = reinterpret_cast<nsISupports *>(JS_GetPrivate(
+#if GECKO_VERSION < 13000
+ ctx,
+#endif
+ object));
+ nsCOMPtr<nsIXPConnectWrappedNative> wrapped_native = do_QueryInterface(priv);
+
+ if (wrapped_native) {
+ // The global object is a XPConnect wrapped native, the native in
+ // the wrapper might be the nsIScriptGlobalObject.
+ sgo = do_QueryWrappedNative(wrapped_native);
+ } else {
+ sgo = do_QueryInterface(priv);
+ }
+
+ JSPrincipals *jsprin = nsnull;
+ std::string virtual_filename;
+ nsresult nr;
+
+ nsCOMPtr<nsIScriptObjectPrincipal> obj_prin = do_QueryInterface(sgo, &nr);
+ if (NS_FAILED(nr)) {
+ Debug::log(Debug::Error) << "Error getting object principal" << Debug::flush;
+ return false;
+ }
+
+ nsIPrincipal *principal = obj_prin->GetPrincipal();
+ if (!principal) {
+ Debug::log(Debug::Error) << "Error getting principal" << Debug::flush;
+ return false;
+ }
+
+ // Get the script scheme and host from the principal. This is the URI that
+ // Firefox treats this script as running from.
+
+ // If the codebase is null, the script may be running from a chrome context.
+ // In that case, don't construct a virtual filename.
+
+ nsCOMPtr<nsIURI> codebase;
+ nr = principal->GetURI(getter_AddRefs(codebase));
+ if (codebase) {
+ nsCString scheme;
+ nsCString host;
+
+ if (NS_FAILED(codebase->GetScheme(scheme)) ||
+ NS_FAILED(codebase->GetHostPort(host))) {
+ Debug::log(Debug::Error) << "Error getting codebase" << Debug::flush;
+ return false;
+ }
+
+ // Build a virtual filename that we'll run as. This is to workaround
+ // http://lxr.mozilla.org/seamonkey/source/dom/src/base/nsJSEnvironment.cpp#500
+ // Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=387477
+ // The filename is being used as the security origin instead of the principal.
+ // TODO(zork): Remove this section if this bug is resolved.
+ virtual_filename = std::string(scheme.BeginReading());
+ virtual_filename += "://";
+ virtual_filename += host.BeginReading();
+ }
+
+#if GECKO_VERSION >= 13000
+ jsprin = nsJSPrincipals::get(principal);
+#else
+ principal->GetJSPrincipals(ctx, &jsprin);
+#endif
+
+ if (jsprin == nsnull) {
+ Debug::log(Debug::Error) << "Get JSPrincial failed at JSRunner::eval"
+ << Debug::flush;
+ return false;
+ }
+
+ // Set up the JS stack so that our context is on top. This is needed to
+ // play nicely with plugins that access the context stack, such as Firebug.
+// nsCOMPtr<nsIJSContextStack> stack =
+// do_GetService("@mozilla.org/js/xpc/ContextStack;1");
+// if (!stack) { return false; }
+//
+// stack->Push(js_engine_context_);
+
+ uintN line_number_start = 0;
+ jsval rval;
+ JSBool js_ok = JS_EvaluateScriptForPrincipals(ctx, object, jsprin,
+ script.c_str(), script.length(), virtual_filename.c_str(),
+ line_number_start, &rval);
+
+ // Restore the context stack.
+// JSContext *cx;
+// stack->Pop(&cx);
+
+ // Decrements ref count on jsprin (Was added in GetJSPrincipals()).
+#if GECKO_VERSION >= 13000
+ (void) JS_DropPrincipals(JS_GetRuntime(ctx), jsprin);
+#else
+ (void) JSPRINCIPALS_DROP(ctx, jsprin);
+#endif
+ if (!js_ok) {
+ Debug::log(Debug::Error) << "JS execution failed in JSRunner::eval"
+ << Debug::flush;
+ return false;
+ }
+
+ return true;
+}
diff --git a/plugins/xpcom/JSRunner.h b/plugins/xpcom/JSRunner.h
new file mode 100755
index 0000000..733970e
--- /dev/null
+++ b/plugins/xpcom/JSRunner.h
@@ -0,0 +1,29 @@
+#ifndef _H_JSRunner
+#define _H_JSRunner
+/*
+ * Copyright 2008 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.
+ */
+
+#include <string>
+
+#include "mozincludes.h"
+#include "jsapi.h"
+
+class JSRunner {
+public:
+ static bool eval(JSContext* ctx, JSObject* global, const std::string& script);
+};
+
+#endif
diff --git a/plugins/xpcom/JavaObject.cpp b/plugins/xpcom/JavaObject.cpp
new file mode 100644
index 0000000..e54aa48
--- /dev/null
+++ b/plugins/xpcom/JavaObject.cpp
@@ -0,0 +1,498 @@
+/*
+ * Copyright 2008 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.
+ */
+
+#include "JavaObject.h"
+#include "FFSessionHandler.h"
+#include "SessionData.h"
+#include "ServerMethods.h"
+#include "Debug.h"
+#include "XpcomDebug.h"
+#include "HostChannel.h"
+#include "InvokeMessage.h"
+#include "ReturnMessage.h"
+#include "scoped_ptr/scoped_ptr.h"
+
+static JSClass JavaObjectClass = {
+ "GWTJavaObject", /* class name */
+ JSCLASS_HAS_PRIVATE | JSCLASS_HAS_RESERVED_SLOTS(1) | JSCLASS_NEW_ENUMERATE, /* flags */
+
+ JS_PropertyStub, /* add property */
+ JS_PropertyStub, /* delete property */
+#if GECKO_VERSION < 15000
+ JavaObject::getProperty, /* get property */
+ JavaObject::setProperty, /* set property */
+#else
+ JavaObject::getPropertyWrapper,
+ JavaObject::setPropertyWrapper,
+#endif //GECHO_VERSION
+
+ reinterpret_cast<JSEnumerateOp>(JavaObject::enumerate), /* enumerate */
+ JS_ResolveStub, /* resolve */
+ JS_ConvertStub, // JavaObject::convert, /* convert */
+ JavaObject::finalize, /* finalize */ //TODO
+
+#if GECKO_VERSION < 13000
+ NULL, /* object hooks */
+#endif
+ NULL, /* check access */
+#if GECKO_VERSION < 2000
+ JavaObject::call, /* call */ //TODO
+#else
+ JavaObject::call20, /* call: compatability wrapper for 2.0+ */
+#endif //GECKO_VERSION
+ NULL, /* construct */
+ NULL, /* object serialization */
+ NULL, /* has instance */
+ NULL, /* mark */
+ NULL /* reserve slots */
+};
+
+int JavaObject::getObjectId(JSContext* ctx, JSObject* obj) {
+ jsval val;
+ JSClass* jsClass = JS_GET_CLASS(ctx, obj);
+ if (jsClass != &JavaObjectClass) {
+ Debug::log(Debug::Error)
+ << "JavaObject::getObjectId called on non-JavaObject: " << jsClass->name
+ << Debug::flush;
+ return -1;
+ }
+ if (JSCLASS_RESERVED_SLOTS(jsClass) < 1) {
+ Debug::log(Debug::Error)
+ << "JavaObject::getObjectId -- " << static_cast<void*>(obj)
+ << " has only " << (JSCLASS_RESERVED_SLOTS(jsClass))
+ << " reserved slots, no objectId present" << Debug::flush;
+ return -1;
+ }
+
+
+#if GECKO_VERSION >= 13000
+ val = JS_GetReservedSlot(obj, 0);
+#else
+ if (!JS_GetReservedSlot(ctx, obj, 0, &val)) {
+ Debug::log(Debug::Error) << "Error getting reserved slot" << Debug::flush;
+ return -1;
+ }
+#endif
+
+ // TODO: assert JSVAL_IS_INT(val)
+ return JSVAL_TO_INT(val);
+}
+
+SessionData* JavaObject::getSessionData(JSContext* ctx, JSObject* obj) {
+ void* data = JS_GetInstancePrivate(ctx, obj, &JavaObjectClass, NULL);
+ return static_cast<SessionData*>(data);
+}
+
+
+bool JavaObject::isJavaObject(JSContext* ctx, JSObject* obj) {
+ return JS_GET_CLASS(ctx, obj) == &JavaObjectClass;
+}
+
+JSObject* JavaObject::construct(JSContext* ctx, SessionData* data, int objectRef) {
+ // TODO: prototype? parent?
+ Debug::log(Debug::Spam) << "JavaObject::construct objectId=" << objectRef << Debug::flush;
+ JSObject* obj = JS_NewObject(ctx, &JavaObjectClass, NULL, NULL);
+ Debug::log(Debug::Spam) << " obj=" << obj << Debug::flush;
+ if (!obj) {
+ return NULL;
+ }
+ // set the session data
+#if GECKO_VERSION >= 13000
+ MOZ_JS_SetPrivate(ctx, obj, data);
+#else
+ if (!MOZ_JS_SetPrivate(ctx, obj, data)) {
+ Debug::log(Debug::Error) << "Could not set private data" << Debug::flush;
+ return NULL;
+ }
+#endif
+
+ #if GECKO_VERSION >= 13000
+ MOZ_JS_SetReservedSlot(ctx, obj, 0, INT_TO_JSVAL(objectRef));
+ #else
+ // set the objectId
+ if (!MOZ_JS_SetReservedSlot(ctx, obj, 0, INT_TO_JSVAL(objectRef))) {
+ Debug::log(Debug::Error) << "Could not set reserved slot" << Debug::flush;
+ return NULL;
+ }
+ #endif
+
+ // define toString (TODO: some way to avoid doing this each time)
+#if GECKO_VERSION < 2000
+ if (!JS_DefineFunction(ctx, obj, "toString", JavaObject::toString, 0, 0)) {
+ Debug::log(Debug::Error) << "Could not define toString method on object"
+ << Debug::flush;
+ }
+#else
+ if (!JS_DefineFunction(ctx, obj, "toString", JavaObject::toString20, 0, 0)) {
+ Debug::log(Debug::Error) << "Could not define toString method on object"
+ << Debug::flush;
+ }
+#endif //GECKO_VERSION
+ return obj;
+}
+
+#if GECKO_VERSION >= 15000
+JSBool JavaObject::getPropertyWrapper(JSContext* ctx, JSHandleObject obj,
+ JSHandleId id, jsval *vp) {
+ return JavaObject::getProperty(ctx, obj.value(), id.value(), vp);
+}
+#endif
+
+JSBool JavaObject::getProperty(JSContext* ctx, JSObject* obj, jsid id,
+ jsval* rval) {
+ Debug::log(Debug::Spam) << "JavaObject::getProperty obj=" << obj << Debug::flush;
+ SessionData* data = JavaObject::getSessionData(ctx, obj);
+ if (!data) {
+ // TODO: replace the frame with an error page instead?
+ *rval = JSVAL_VOID;
+ return JS_TRUE;
+ }
+ int objectRef = JavaObject::getObjectId(ctx, obj);
+ if (JSID_IS_STRING(id)) {
+ JSString* str = JSID_TO_STRING(id);
+ if ((JS_GetStringEncodingLength(ctx, str) == 8) && !strncmp("toString",
+ JS_EncodeString(ctx, str), 8)) {
+ *rval = data->getToStringTearOff();
+ return JS_TRUE;
+ }
+ if ((JS_GetStringEncodingLength(ctx, str) == 2) && !strncmp("id",
+ JS_EncodeString(ctx, str), 2)) {
+ *rval = INT_TO_JSVAL(objectRef);
+ return JS_TRUE;
+ }
+ if ((JS_GetStringEncodingLength(ctx, str) == 16) && !strncmp("__noSuchMethod__",
+ JS_EncodeString(ctx, str), 16)) {
+ // Avoid error spew if we are disconnected
+ *rval = JSVAL_VOID;
+ return JS_TRUE;
+ }
+ // TODO: dumpJsVal can no longer handle this case
+ //Debug::log(Debug::Error) << "Getting unexpected string property "
+ // << dumpJsVal(ctx, id) << Debug::flush;
+ // TODO: throw a better exception here
+ return JS_FALSE;
+ }
+ if (!JSID_IS_INT(id)) {
+ // TODO: dumpJsVal can no longer handle this case
+ //Debug::log(Debug::Error) << "Getting non-int/non-string property "
+ // << dumpJsVal(ctx, id) << Debug::flush;
+ // TODO: throw a better exception here
+ return JS_FALSE;
+ }
+ int dispId = JSID_TO_INT(id);
+
+ HostChannel* channel = data->getHostChannel();
+ SessionHandler* handler = data->getSessionHandler();
+
+ gwt::Value value = ServerMethods::getProperty(*channel, handler, objectRef, dispId);
+ data->makeJsvalFromValue(*rval, ctx, value);
+ return JS_TRUE;
+}
+
+#if GECKO_VERSION >= 15000
+JSBool JavaObject::setPropertyWrapper(JSContext* ctx, JSHandleObject obj,
+ JSHandleId id, JSBool strict, jsval *vp) {
+ return setProperty(ctx, obj.value(), id.value(), strict, vp);
+}
+#endif
+
+#if GECKO_VERSION < 2000
+JSBool JavaObject::setProperty(JSContext* ctx, JSObject* obj, jsid id,
+ jsval* vp) {
+#else
+JSBool JavaObject::setProperty(JSContext* ctx, JSObject* obj, jsid id,
+ JSBool strict, jsval* vp) {
+#endif //GECKO_VERSION
+
+ Debug::log(Debug::Spam) << "JavaObject::setProperty obj=" << obj << Debug::flush;
+ if (!JSID_IS_INT(id)) {
+ Debug::log(Debug::Error) << " Error: setting string property id" << Debug::flush;
+ // TODO: throw a better exception here
+ return JS_FALSE;
+ }
+
+ SessionData* data = JavaObject::getSessionData(ctx, obj);
+ if (!data) {
+ return JS_TRUE;
+ }
+
+ int objectRef = JavaObject::getObjectId(ctx, obj);
+ int dispId = JSID_TO_INT(id);
+
+ gwt::Value value;
+ data->makeValueFromJsval(value, ctx, *vp);
+
+ HostChannel* channel = data->getHostChannel();
+ SessionHandler* handler = data->getSessionHandler();
+
+ if (!ServerMethods::setProperty(*channel, handler, objectRef, dispId, value)) {
+ // TODO: throw a better exception here
+ return JS_FALSE;
+ }
+ return JS_TRUE;
+}
+
+// TODO: can this be removed now?
+JSBool JavaObject::convert(JSContext* ctx, JSObject* obj, JSType type, jsval* vp) {
+ Debug::log(Debug::Spam) << "JavaObject::convert obj=" << obj
+ << " type=" << type << Debug::flush;
+ switch (type) {
+ case JSTYPE_STRING:
+ return toString(ctx, obj, 0, NULL, vp);
+ case JSTYPE_VOID:
+ *vp = JSVAL_VOID;
+ return JS_TRUE;
+ case JSTYPE_NULL:
+ *vp = JSVAL_NULL;
+ return JS_TRUE;
+ case JSTYPE_OBJECT:
+ *vp = OBJECT_TO_JSVAL(obj);
+ return JS_TRUE;
+ default:
+ break;
+ }
+ return JS_FALSE;
+}
+
+/**
+ * List of property names we want to fake on wrapped Java objects.
+ */
+static const char* propertyNames[] = {
+ "toString",
+ "id",
+};
+#define NUM_PROPERTY_NAMES (sizeof(propertyNames) / sizeof(propertyNames[0]))
+
+JSBool JavaObject::enumerate(JSContext* ctx, JSObject* obj, JSIterateOp op,
+ jsval* statep, jsid* idp) {
+ int objectId = JavaObject::getObjectId(ctx, obj);
+ switch (op) {
+ case JSENUMERATE_INIT:
+ Debug::log(Debug::Spam) << "JavaObject::enumerate(oid=" << objectId
+ << ", INIT)" << Debug::flush;
+ *statep = JSVAL_ZERO;
+ if (idp) {
+ *idp = INT_TO_JSID(NUM_PROPERTY_NAMES);
+ }
+ break;
+ case JSENUMERATE_NEXT:
+ {
+ int idNum = JSVAL_TO_INT(*statep);
+ Debug::log(Debug::Spam) << "JavaObject::enumerate(oid=" << objectId
+ << ", NEXT " << idNum << ")" << Debug::flush;
+ *statep = INT_TO_JSVAL(idNum + 1);
+ if (idNum >= NUM_PROPERTY_NAMES) {
+ *statep = JSVAL_NULL;
+#if GECKO_VERSION < 2000
+ //TODO(jat): do we need to do this?
+ *idp = JSVAL_NULL;
+#endif //GECKO_VERSION
+ } else {
+ const char* propName = propertyNames[idNum];
+ JSString* str = JS_NewStringCopyZ(ctx, propName);
+ return JS_ValueToId(ctx, STRING_TO_JSVAL(str), idp);
+ }
+ break;
+ }
+ case JSENUMERATE_DESTROY:
+ Debug::log(Debug::Spam) << "JavaObject::enumerate(oid=" << objectId
+ << ", DESTROY)" << Debug::flush;
+ *statep = JSVAL_NULL;
+ break;
+ default:
+ Debug::log(Debug::Error) << "Unknown Enumerate op " <<
+ static_cast<int>(op) << Debug::flush;
+ return JS_FALSE;
+ }
+ return JS_TRUE;
+}
+
+#if GECKO_VERSION >= 14000
+void JavaObject::finalize(JSFreeOp* fop, JSObject* obj) {
+ // In general use of JS_GetPrivate is not safe but it is OK in the finalizer
+ // according to:
+ // https://developer.mozilla.org/en/SpiderMonkey/JSAPI_Reference/JS_GetPrivate
+ // We will not be using getSession for that reason.
+ SessionData * data = static_cast<SessionData*>(JS_GetPrivate(obj));
+ if (data) {
+ jsval val = JS_GetReservedSlot(obj, 0);
+ int objectId = JSVAL_TO_INT(val);
+ data->freeJavaObject(objectId);
+ MOZ_JS_SetPrivate(/** Post-FF13 requires no ctx anyways*/ NULL, obj, NULL);
+ }
+}
+#else
+void JavaObject::finalize(JSContext* ctx, JSObject* obj) {
+ Debug::log(Debug::Spam) << "JavaObject::finalize obj=" << obj
+ << " objId=" << JavaObject::getObjectId(ctx, obj) << Debug::flush;
+ SessionData* data = JavaObject::getSessionData(ctx, obj);
+ if (data) {
+ int objectId = JavaObject::getObjectId(ctx, obj);
+ data->freeJavaObject(objectId);
+ MOZ_JS_SetPrivate(ctx, obj, NULL);
+ }
+}
+#endif
+
+JSBool JavaObject::toString(JSContext* ctx, JSObject* obj, uintN argc,
+ jsval* argv, jsval* rval) {
+ SessionData* data = JavaObject::getSessionData(ctx, obj);
+ if (!data) {
+ *rval = JSVAL_VOID;
+ return JS_TRUE;
+ }
+ int oid = getObjectId(ctx, obj);
+ Debug::log(Debug::Spam) << "JavaObject::toString(id=" << oid << ")"
+ << Debug::flush;
+ gwt::Value javaThis;
+ javaThis.setJavaObject(oid);
+ // we ignore any supplied parameters
+ return invokeJava(ctx, data, javaThis, InvokeMessage::TOSTRING_DISP_ID, 0,
+ NULL, rval);
+}
+
+/**
+ * Called when the JavaObject is invoked as a function.
+ * We ignore the JSObject* argument, which is the 'this' context, which is
+ * usually the window object. The JavaObject instance is in argv[-2].
+ *
+ * Returns a JS array, with the first element being a boolean indicating that
+ * an exception occured, and the second element is either the return value or
+ * the exception which was thrown. In this case, we always return false and
+ * raise the exception ourselves.
+ */
+JSBool JavaObject::call(JSContext* ctx, JSObject*, uintN argc, jsval* argv,
+ jsval* rval) {
+ // Get the JavaObject called as a function
+ JSObject* obj = JSVAL_TO_OBJECT(argv[-2]);
+ if (argc < 2 || !JSVAL_IS_INT(argv[0]) ||
+#ifdef JSVAL_IS_OBJECT
+ !JSVAL_IS_OBJECT(argv[1])) {
+#else
+ (JSVAL_IS_PRIMITIVE(argv[1]) && !JSVAL_IS_NULL(argv[1]))) {
+#endif
+ Debug::log(Debug::Error) << "JavaObject::call incorrect arguments" << Debug::flush;
+ return JS_FALSE;
+ }
+ int dispId = JSVAL_TO_INT(argv[0]);
+ if (Debug::level(Debug::Spam)) {
+ Debug::DebugStream& dbg = Debug::log(Debug::Spam) << "JavaObject::call oid="
+ << JavaObject::getObjectId(ctx, obj) << ",dispId=" << dispId << " (";
+ for (unsigned i = 2; i < argc; ++i) {
+ if (i > 2) {
+ dbg << ", ";
+ }
+ dbg << dumpJsVal(ctx, argv[i]);
+ }
+ dbg << ")" << Debug::flush;
+ }
+
+ SessionData* data = JavaObject::getSessionData(ctx, obj);
+ if (!data) {
+ *rval = JSVAL_VOID;
+ return JS_TRUE;
+ }
+ Debug::log(Debug::Spam) << "Data = " << data << Debug::flush;
+
+ gwt::Value javaThis;
+ if (!JSVAL_IS_NULL(argv[1])) {
+ JSObject* thisObj = JSVAL_TO_OBJECT(argv[1]);
+ if (isJavaObject(ctx, thisObj)) {
+ javaThis.setJavaObject(getObjectId(ctx, thisObj));
+ } else {
+ data->makeValueFromJsval(javaThis, ctx, argv[1]);
+ }
+ } else {
+ int oid = getObjectId(ctx, obj);
+ javaThis.setJavaObject(oid);
+ }
+ return invokeJava(ctx, data, javaThis, dispId, argc - 2, &argv[2], rval);
+}
+
+#if GECKO_VERSION >= 2000
+/**
+ * Compatability wrapper for Gecko 2.0+
+ */
+JSBool JavaObject::toString20(JSContext* ctx, uintN argc, jsval* vp) {
+ jsval rval = JSVAL_VOID;
+ JSBool success;
+ success = toString(ctx, JS_THIS_OBJECT(ctx, vp), argc, JS_ARGV(ctx, vp),
+ &rval);
+ JS_SET_RVAL(cx, vp, rval);
+ return success;
+}
+
+/**
+ * Compatability wrapper method for Gecko 2.0+
+ */
+JSBool JavaObject::call20(JSContext* ctx, uintN argc, jsval* vp) {
+ jsval rval = JSVAL_VOID;
+ JSBool success;
+ success = call(ctx, NULL, argc, JS_ARGV(ctx, vp), &rval);
+ JS_SET_RVAL(ctx, vp, rval);
+ return success;
+}
+#endif //GECKO_VERSION
+
+/**
+ * Calls a method on a Java object and returns a two-element JS array, with
+ * the first element being a boolean flag indicating an exception was thrown,
+ * and the second element is the actual return value or exception.
+ */
+JSBool JavaObject::invokeJava(JSContext* ctx, SessionData* data,
+ const gwt::Value& javaThis, int dispId, int numArgs, const jsval* jsargs,
+ jsval* rval) {
+ HostChannel* channel = data->getHostChannel();
+ SessionHandler* handler = data->getSessionHandler();
+ scoped_array<gwt::Value> args(new gwt::Value[numArgs]);
+ for (int i = 0; i < numArgs; ++i) {
+ data->makeValueFromJsval(args[i], ctx, jsargs[i]);
+ }
+
+ bool isException = false;
+ gwt::Value returnValue;
+ if (!InvokeMessage::send(*channel, javaThis, dispId, numArgs, args.get())) {
+ Debug::log(Debug::Debugging) << "JavaObject::call failed to send invoke message" << Debug::flush;
+ } else {
+ Debug::log(Debug::Spam) << " return from invoke" << Debug::flush;
+ scoped_ptr<ReturnMessage> retMsg(channel->reactToMessagesWhileWaitingForReturn(handler));
+ if (!retMsg.get()) {
+ Debug::log(Debug::Debugging) << "JavaObject::call failed to get return value" << Debug::flush;
+ } else {
+ isException = retMsg->isException();
+ returnValue = retMsg->getReturnValue();
+ }
+ }
+ // Since we can set exceptions normally, we always return false to the
+ // wrapper function and set the exception ourselves if one occurs.
+ // TODO: cleanup exception case
+ jsval retvalArray[] = {JSVAL_FALSE, JSVAL_VOID};
+ JSObject* retval = JS_NewArrayObject(ctx, 2, retvalArray);
+ *rval = OBJECT_TO_JSVAL(retval);
+ jsval retJsVal;
+ Debug::log(Debug::Spam) << " result is " << returnValue << Debug::flush;
+ data->makeJsvalFromValue(retJsVal, ctx, returnValue);
+ if (isException) {
+ JS_SetPendingException(ctx, retJsVal);
+ return false;
+ }
+ if (!JS_SetElement(ctx, retval, 1, &retJsVal)) {
+ Debug::log(Debug::Error) << "Error setting return value element in array"
+ << Debug::flush;
+ return false;
+ }
+ return true;
+}
diff --git a/plugins/xpcom/JavaObject.h b/plugins/xpcom/JavaObject.h
new file mode 100755
index 0000000..c2fcf00
--- /dev/null
+++ b/plugins/xpcom/JavaObject.h
@@ -0,0 +1,79 @@
+#ifndef _H_JavaObject
+#define _H_JavaObject
+/*
+ * Copyright 2008 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.
+ */
+
+#include "mozincludes.h"
+#include "jsapi.h"
+
+class SessionData;
+namespace gwt {
+ class Value;
+}
+
+#if GECKO_VERSION < 2000
+#define jsid jsval
+#define JSID_IS_STRING JSVAL_IS_STRING
+#define JSID_TO_STRING JSVAL_TO_STRING
+#define JSID_IS_INT JSVAL_IS_INT
+#define JSID_TO_INT JSVAL_TO_INT
+#define INT_TO_JSID INT_TO_JSVAL
+#define JS_GetStringEncodingLength(ctx, str) JS_GetStringLength(str)
+#define JS_EncodeString(ctx, str) JS_GetStringBytes(str)
+#endif
+
+class JavaObject {
+public:
+ static bool isJavaObject(JSContext* ctx, JSObject* obj);
+ static JSObject* construct(JSContext* ctx, SessionData* data, int objectRef);
+ static int getObjectId(JSContext* ctx, JSObject* obj);
+ static JSBool getProperty(JSContext* ctx, JSObject* obj, jsid id, jsval* vp);
+
+#if GECKO_VERSION < 2000
+ static JSBool setProperty(JSContext* ctx, JSObject* obj, jsid id, jsval* vp);
+#else
+ static JSBool setProperty(JSContext* ctx, JSObject* obj, jsid id, JSBool strict, jsval* vp);
+#endif //GECKO_VERSION
+
+ static JSBool resolve(JSContext* ctx, JSObject* obj, jsval id);
+ static JSBool convert(JSContext* cx, JSObject* obj, JSType type, jsval* vp);
+ static JSBool enumerate(JSContext* ctx, JSObject* obj, JSIterateOp op, jsval* statep, jsid* idp);
+#if GECKO_VERSION >= 14000
+ static void finalize(JSFreeOp* fop, JSObject* obj);
+#else
+ static void finalize(JSContext* ctx, JSObject* obj);
+#endif //GECKO_VERSION
+ static JSBool toString(JSContext* ctx, JSObject* obj, uintN argc, jsval* argv, jsval* rval);
+ static JSBool call(JSContext* ctx, JSObject* obj, uintN argc, jsval* argv, jsval* rval);
+
+#if GECKO_VERSION >= 2000
+ static JSBool toString20(JSContext* ctx, uintN argc, jsval* vp);
+ static JSBool call20(JSContext* ctx, uintN argc, jsval* vp);
+#endif //GECKO_VERSION
+#if GECKO_VERSION >= 15000
+ static JSBool getPropertyWrapper(JSContext* ctx, JSHandleObject obj, JSHandleId id, jsval *vp);
+ static JSBool setPropertyWrapper(JSContext* ctx, JSHandleObject obj, JSHandleId id,
+ JSBool strict, jsval *vp);
+#endif
+
+private:
+ static SessionData* getSessionData(JSContext* ctx, JSObject* obj);
+ static JSBool invokeJava(JSContext* ctx, SessionData* data,
+ const gwt::Value& javaThis, int dispId, int numArgs, const jsval* jsargs,
+ jsval* rval);
+};
+
+#endif
diff --git a/plugins/xpcom/Makefile b/plugins/xpcom/Makefile
new file mode 100644
index 0000000..7d7f755
--- /dev/null
+++ b/plugins/xpcom/Makefile
@@ -0,0 +1,435 @@
+# Copyright 2009 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.
+
+include ../config.mk
+
+# Make variables intended to be settable from the command line:
+# DEFAULT_FIREFOX_LIBS points to /usr/lib/firefox or equivalent
+# PLUGIN_SDKS points to GWT /plugin-sdks directory
+# GECKO_PLATFORM XPCOM ABI (ie, Linux_x86_64-gcc3)
+#
+
+ifeq ($(OS),mac)
+DEFAULT_FIREFOX_LIBS ?= /Applications/Firefox.app/Contents/MacOS
+RUN_PATH_FLAG = -executable_path
+DLL_SUFFIX = .dylib
+DLLFLAGS += -bundle $(ALLARCHCFLAGS) -mmacosx-version-min=10.5 -isysroot /Developer/SDKs/MacOSX10.5.sdk
+CFLAGS += $(ALLARCHCFLAGS)
+CXXFLAGS += $(ALLARCHCFLAGS)
+TARGET_PLATFORM = Darwin-gcc3
+# Mac puts multiple architectures into the same files
+GECKO_PLATFORM = Darwin-gcc3
+else
+ifeq ($(OS),linux)
+DEFAULT_FIREFOX_LIBS ?= /usr/lib/firefox
+RUN_PATH_FLAG = -rpath-link
+DLL_SUFFIX = .so
+DLLFLAGS += -shared -m$(FLAG32BIT)
+TARGET_PLATFORM = Linux_$(ARCH)-gcc3
+else
+ifeq ($(OS),sun)
+TARGET_PLATFORM = SunOS_$(ARCH)-sunc
+RUN_PATH_FLAG = -rpath-link
+DLLFLAGS ?= ""
+endif
+endif
+endif
+
+export FLAG32BIT
+
+ifeq ($(BROWSER),)
+$(warning Defaulting to FF3 build [set with BROWSER=ff3, ff3+, ff35, ff36, ff40, ff50, ff60, ff70, ff80, ff90, ff100, f110, ff120, ff130, ff140, ff150])
+BROWSER=ff3
+endif
+
+# Gold doesn't play nice with xpcom libs
+LINKER=$(shell ld -v | awk '{print $$2}')
+ifeq ($(LINKER), gold)
+ifeq ($(wildcard /usr/lib/compat-ld),)
+$(error cannot link with gold, use the BFD ld instead)
+else
+CFLAGS += -B/usr/lib/compat-ld/
+CXXFLAGS += -B/usr/lib/compat-ld/
+DLLFLAGS += -B/usr/lib/compat-ld/
+endif
+endif
+
+CFLAGS += -DBROWSER=$(BROWSER)
+GECKO_MINOR_VERSION=
+GECKO_DLLFLAGS = -lxpcomglue_s -lxpcom
+NSPR_DLLFLAGS = -lnspr4
+MOZJS_DLLFLAGS = -lxul
+
+#defaults to post-FF4
+MOZALLOC_DLLFLAGS = -lmozalloc
+
+#default ALLARCHFLAGS for post-FF4
+ALLARCHCFLAGS = -arch i386 -arch x86_64 -Xarch_i386 -DFLAG32BIT=32 -Xarch_x86_64 -DFLAG32BIT=64
+
+# Python xpidl tool is the new hotness post-FF9
+XPIDL_TOOL = python
+
+ifeq ($(BROWSER),ff3)
+XPIDL_TOOL = binary
+MOZALLOC_DLLFLAGS =
+GECKO_VERSION = 1.9.0
+CFLAGS += -DGECKO_VERSION=1900
+MOZJS_DLLFLAGS = -lmozjs
+ifeq ($(OS),mac)
+ALLARCHCFLAGS = -arch i386 -arch ppc
+endif
+else
+ifeq ($(BROWSER),ff3+)
+XPIDL_TOOL = binary
+MOZALLOC_DLLFLAGS =
+GECKO_VERSION = 1.9.0
+CFLAGS += -DGECKO_VERSION=1901
+GECKO_MINOR_VERSION=.10
+MOZJS_DLLFLAGS = -lmozjs
+ifeq ($(OS),mac)
+ALLARCHCFLAGS = -arch i386 -arch ppc
+endif
+else
+ifeq ($(BROWSER),ff35)
+XPIDL_TOOL = binary
+MOZALLOC_DLLFLAGS =
+GECKO_VERSION = 1.9.1
+CFLAGS += -DGECKO_VERSION=1910
+MOZJS_DLLFLAGS = -lmozjs
+ifeq ($(OS),mac)
+ALLARCHCFLAGS = -arch i386 -arch ppc
+endif
+else
+ifeq ($(BROWSER),ff36)
+XPIDL_TOOL = binary
+MOZALLOC_DLLFLAGS =
+GECKO_VERSION = 1.9.2
+CFLAGS += -DGECKO_VERSION=1920
+MOZJS_DLLFLAGS = -lmozjs
+ifeq ($(OS),mac)
+ALLARCHCFLAGS = -arch i386 -arch ppc
+endif
+else
+ifeq ($(BROWSER),ff40)
+XPIDL_TOOL = binary
+GECKO_VERSION = 2.0.0
+CFLAGS += -DGECKO_VERSION=2000
+else
+ifeq ($(BROWSER),ff50)
+XPIDL_TOOL = binary
+GECKO_VERSION = 5.0.0
+CFLAGS += -DGECKO_VERSION=5000
+else
+ifeq ($(BROWSER),ff60)
+XPIDL_TOOL = binary
+GECKO_VERSION = 6.0.0
+CFLAGS += -DGECKO_VERSION=6000
+else
+ifeq ($(BROWSER),ff70)
+XPIDL_TOOL = binary
+GECKO_VERSION = 7.0.0
+CFLAGS += -DGECKO_VERSION=7000
+else
+ifeq ($(BROWSER),ff80)
+XPIDL_TOOL = binary
+GECKO_VERSION = 8.0.0
+CFLAGS += -DGECKO_VERSION=8000
+else
+ifeq ($(BROWSER),ff90)
+GECKO_VERSION = 9.0.0
+CFLAGS += -DGECKO_VERSION=9000
+else
+ifeq ($(BROWSER),ff100)
+GECKO_VERSION = 10.0.0
+CFLAGS += -DGECKO_VERSION=10000
+else
+ifeq ($(BROWSER),ff110)
+GECKO_VERSION = 11.0.0
+CFLAGS += -DGECKO_VERSION=11000
+else
+ifeq ($(BROWSER),ff120)
+GECKO_VERSION = 12.0.0
+CFLAGS += -DGECKO_VERSION=12000
+else
+ifeq ($(BROWSER),ff130)
+GECKO_VERSION = 13.0.0
+CFLAGS += -DGECKO_VERSION=13000
+else
+ifeq ($(BROWSER),ff140)
+GECKO_VERSION = 14.0.0
+CFLAGS += -DGECKO_VERSION=14000
+else
+ifeq ($(BROWSER),ff150)
+GECKO_VERSION = 15.0.0
+CFLAGS += -DGECKO_VERSION=15000
+else
+$(error Unrecognized BROWSER of $(BROWSER) - options are ff3, ff3+, ff35, ff36, ff40, ff50, ff60, ff70, ff80, ff90, ff100, ff110, ff120, ff130, ff140, ff150)
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+
+CFLAGS += -fshort-wchar
+CXXFLAGS = $(CXXONLYFLAGS) $(CFLAGS)
+DIR = $(shell pwd)
+
+# Set $PLUGIN_SDKS if it isn't in the default location
+PLUGIN_SDKS ?= ../../../plugin-sdks
+GECKO_PLATFORM ?= $(TARGET_PLATFORM)
+
+COMMON = ../common/libcommon$(FLAG32BIT).a
+
+OBJ_OUTDIR = build/$(TARGET_PLATFORM)-$(BROWSER)
+EXTENSION_OUTDIR = prebuilt/extension
+FF_PLATFORM_DIR = $(EXTENSION_OUTDIR)/lib/$(TARGET_PLATFORM)/$(BROWSER)
+
+INSTALLER_XPI = prebuilt/gwt-dev-plugin.xpi
+FF_DLL = $(OBJ_OUTDIR)/libgwt_dev_$(BROWSER)$(DLL_SUFFIX)
+#FF_TYPELIB = build/IOOPHM.xpt
+#FF_HEADER = $(OBJ_OUTDIR)/IOOPHM.h
+FF_TYPELIB = prebuilt/extension/components/IOOPHM.xpt
+FF_HEADERDIR = prebuilt/$(BROWSER)/include
+FF_HEADER = $(FF_HEADERDIR)/IOOPHM.h
+INSTALL_RDF = $(EXTENSION_OUTDIR)/install.rdf
+
+SDK_PATH = $(PLUGIN_SDKS)/gecko-sdks
+GECKO_SDK = $(SDK_PATH)/gecko-$(GECKO_VERSION)
+GECKO_PLAT_INC = $(GECKO_SDK)/$(GECKO_PLATFORM)/include
+GECKO_LIBS = $(GECKO_SDK)/$(GECKO_PLATFORM)/lib$(GECKO_MINOR_VERSION)
+
+ifeq ($(XPIDL_TOOL),python)
+XPIDL = $(GECKO_SDK)/bin/xpidl.py
+XPIDL_HEADER = $(GECKO_SDK)/bin/header.py
+XPIDL_TYPELIBS = $(GECKO_SDK)/bin/typelib.py
+else
+XPIDL = $(GECKO_SDK)/$(GECKO_PLATFORM)/bin/xpidl
+XPIDL_HEADER = $(GECKO_SDK)/$(GECKO_PLATFORM)/bin/xpidl -m header
+XPIDL_TYPELIBS = $(GECKO_SDK)/$(GECKO_PLATFORM)/bin/xpidl -m typelib
+endif
+
+XPIDL_FLAGS = -I$(GECKO_SDK)/idl
+
+DLLFLAGS += \
+ -L$(GECKO_LIBS) \
+ -Wl,$(RUN_PATH_FLAG),$(GECKO_LIBS) \
+ $(GECKO_DLLFLAGS) $(NSPR_DLLFLAGS) \
+ $(MOZALLOC_DLLFLAGS) $(MOZJS_DLLFLAGS)
+
+INC += -I$(GECKO_PLAT_INC) -I$(GECKO_SDK)/include -I$(dir $(FF_HEADER))
+
+VERSION ?= 1.0.$(shell ./getversion).$(shell date +%Y%m%d%H%M%S)
+
+.PHONY: all xpi lib common browser clean depend install install-platform find-ff-libs
+
+all:: common lib xpi
+
+lib:: browser $(OBJ_OUTDIR) $(EXTENSION_OUTDIR) $(FF_DLL)
+xpi:: $(EXTENSION_OUTDIR) $(INSTALLER_XPI)
+
+find-ff-libs::
+ifeq ($(FIREFOX_LIBS),)
+ $(warning Using firefox libraries at $(GECKO_LIBS))
+ $(eval FIREFOX_LIBS = $(GECKO_LIBS))
+endif
+
+browser:: find-ff-libs
+# if [ ! -r $(GECKO_LIBS)/libxpcom.so ]
+# then
+# $(error Missing Firefox libraries at $(GECKO_LIBS))
+# fi
+
+generate-install:: $(EXTENSION_OUTDIR) install-template.rdf
+ sed -e s/GWT_DEV_PLUGIN_VERSION/$(VERSION)/ install-template.rdf >$(INSTALL_RDF)
+
+linuxplatforms:
+ $(MAKE) lib BROWSER=ff3 ARCH=x86
+ $(MAKE) lib BROWSER=ff3+ ARCH=x86
+ $(MAKE) lib BROWSER=ff35 ARCH=x86
+ $(MAKE) lib BROWSER=ff36 ARCH=x86
+ $(MAKE) lib BROWSER=ff40 ARCH=x86
+ $(MAKE) lib BROWSER=ff50 ARCH=x86
+ $(MAKE) lib BROWSER=ff60 ARCH=x86
+ $(MAKE) lib BROWSER=ff70 ARCH=x86
+ $(MAKE) lib BROWSER=ff80 ARCH=x86
+ $(MAKE) lib BROWSER=ff90 ARCH=x86
+ $(MAKE) lib BROWSER=ff100 ARCH=x86
+ $(MAKE) lib BROWSER=ff110 ARCH=x86
+ $(MAKE) lib BROWSER=ff120 ARCH=x86
+ $(MAKE) lib BROWSER=ff130 ARCH=x86
+ $(MAKE) lib BROWSER=ff140 ARCH=x86
+ $(MAKE) lib BROWSER=ff150 ARCH=x86
+ $(MAKE) lib BROWSER=ff3 ARCH=x86_64
+ $(MAKE) lib BROWSER=ff3+ ARCH=x86_64
+ $(MAKE) lib BROWSER=ff35 ARCH=x86_64
+ $(MAKE) lib BROWSER=ff36 ARCH=x86_64
+ $(MAKE) lib BROWSER=ff40 ARCH=x86_64
+ $(MAKE) lib BROWSER=ff50 ARCH=x86_64
+ $(MAKE) lib BROWSER=ff60 ARCH=x86_64
+ $(MAKE) lib BROWSER=ff70 ARCH=x86_64
+ $(MAKE) lib BROWSER=ff80 ARCH=x86_64
+ $(MAKE) lib BROWSER=ff90 ARCH=x86_64
+ $(MAKE) lib BROWSER=ff100 ARCH=x86_64
+ $(MAKE) lib BROWSER=ff110 ARCH=x86_64
+ $(MAKE) lib BROWSER=ff120 ARCH=x86_64
+ $(MAKE) lib BROWSER=ff130 ARCH=x86_64
+ $(MAKE) lib BROWSER=ff140 ARCH=x86_64
+ $(MAKE) lib BROWSER=ff150 ARCH=x86_64
+
+macplatforms:
+ $(MAKE) lib BROWSER=ff3
+ $(MAKE) lib BROWSER=ff35
+ $(MAKE) lib BROWSER=ff36
+ $(MAKE) lib BROWSER=ff40
+ $(MAKE) lib BROWSER=ff50
+ $(MAKE) lib BROWSER=ff60
+ $(MAKE) lib BROWSER=ff70
+ $(MAKE) lib BROWSER=ff80
+ $(MAKE) lib BROWSER=ff90
+ $(MAKE) lib BROWSER=ff100
+ $(MAKE) lib BROWSER=ff110
+ $(MAKE) lib BROWSER=ff120
+ $(MAKE) lib BROWSER=ff130
+ $(MAKE) lib BROWSER=ff140
+
+SRCS = \
+ ExternalWrapper.cpp \
+ ModuleOOPHM.cpp \
+ FFSessionHandler.cpp \
+ JavaObject.cpp \
+ JSRunner.cpp \
+ Preferences.cpp \
+ XpcomDebug.cpp
+
+FF_OBJS = $(patsubst %.cpp,$(OBJ_OUTDIR)/%.o,$(SRCS))
+
+$(FF_OBJS): $(OBJ_OUTDIR)
+
+$(OBJ_OUTDIR)::
+ @mkdir -p $@
+
+$(INSTALLER_XPI): $(FF_TYPELIB) $(EXTENSION_OUTDIR) generate-install $(shell find prebuilt/extension $(EXTENSION_OUTDIR))
+ @mkdir -p $(EXTENSION_OUTDIR)/components
+ #(cd prebuilt/extension; find . \( -name .svn -prune \) -o -print | cpio -pmdua ../../$(EXTENSION_OUTDIR))
+ -rm $(INSTALLER_XPI)
+ (cd $(EXTENSION_OUTDIR) && zip -r -D -9 $(DIR)/$(INSTALLER_XPI) * -x '*/.svn/*' -x 'META-INF/*')
+
+$(FF_TYPELIB): IOOPHM.idl
+ [ ! -x $(XPIDL) -o \( -e $(FF_TYPELIB) -a ! -w $(FF_TYPELIB) \) ] || $(XPIDL_TYPELIBS) $(XPIDL_FLAGS) -o $@ $<
+
+$(FF_HEADERDIR):
+ @mkdir -p $@
+
+$(FF_HEADER): IOOPHM.idl $(OBJ_OUTDIR) $(FF_HEADERDIR)
+ [ ! -x $(XPIDL) -o \( -e $(FF_HEADER) -a ! -w $(FF_HEADER) \) ] || $(XPIDL_HEADER) $(XPIDL_FLAGS) -o $@ $<
+
+$(FF_DLL): $(FF_OBJS) $(COMMON)
+ $(CXX) -o $@ $(FF_OBJS) $(COMMON) $(DLLFLAGS)
+ @mkdir -p $(FF_PLATFORM_DIR)
+ cp $(FF_DLL) $(FF_PLATFORM_DIR)/
+
+$(OBJ_OUTDIR)/%.o: %.cpp $(FF_HEADER)
+ $(CXX) $(CXXFLAGS) -c -o $@ -I. -I../common $<
+
+common $(COMMON):
+ (cd ../common && $(MAKE))
+
+clean:
+ rm -rf build
+ (cd ../common && $(MAKE) clean)
+
+install-platform:
+ifdef BROWSER
+ @-mkdir -p $(FF_PLATFORM_DIR)
+ -cp $(FF_DLL) $(FF_PLATFORM_DIR))/
+ifeq ($(OS),mac)
+ @-mkdir -p $(subst $(EXTENSION_OUTDIR),prebuilt/extension-$(BROWSER),$(subst x86,ppc,$(FF_PLATFORM_DIR)))/components
+ -cp $(FF_DLL) $(subst $(EXTENSION_OUTDIR),prebuilt/extension-$(BROWSER),$(subst x86,ppc,$(FF_PLATFORM_DIR)))/components
+endif
+else
+ @$(MAKE) $@ BROWSER=ff3
+ @$(MAKE) $@ BROWSER=ff3+
+ @$(MAKE) $@ BROWSER=ff35
+ @$(MAKE) $@ BROWSER=ff36
+ @$(MAKE) $@ BROWSER=ff40
+ @$(MAKE) $@ BROWSER=ff50
+endif
+
+DEPEND = g++ -MM -MT'$$(OBJ_OUTDIR)/$(patsubst %.cpp,%.o,$(src))' \
+ -I. -I../common -isystem$(dir $(FF_HEADER)) -isystem$(GECKO_SDK)/include $(src) &&
+depend: browser $(OBJ_OUTDIR) $(FF_HEADER)
+ ($(foreach src,$(SRCS),$(DEPEND)) true) >>Makefile
+# makedepend -- $(CFLAGS) -- $(SRCS)
+
+# DO NOT DELETE
+$(OBJ_OUTDIR)/ExternalWrapper.o: ExternalWrapper.cpp ExternalWrapper.h \
+ mozincludes.h FFSessionHandler.h SessionData.h \
+ ../common/SessionHandler.h ../common/BrowserChannel.h ../common/Value.h \
+ ../common/Debug.h ../common/Platform.h ../common/DebugLevel.h \
+ ../common/BrowserChannel.h ../common/scoped_ptr/scoped_ptr.h \
+ ../common/LoadModuleMessage.h ../common/Message.h \
+ ../common/BrowserChannel.h ../common/HostChannel.h ../common/Debug.h \
+ ../common/ByteOrder.h ../common/Platform.h ../common/Socket.h \
+ ../common/Platform.h ../common/Debug.h ../common/AllowedConnections.h \
+ ../common/Platform.h ../common/Message.h ../common/ReturnMessage.h \
+ ../common/Message.h ../common/BrowserChannel.h ../common/Value.h \
+ ../common/Value.h ../common/SessionHandler.h ../common/SessionHandler.h \
+ ../common/ServerMethods.h ../common/Value.h
+$(OBJ_OUTDIR)/ModuleOOPHM.o: ModuleOOPHM.cpp ../common/Debug.h \
+ ../common/Platform.h ../common/DebugLevel.h ExternalWrapper.h \
+ mozincludes.h FFSessionHandler.h SessionData.h \
+ ../common/SessionHandler.h ../common/BrowserChannel.h ../common/Value.h \
+ ../common/Debug.h ../common/BrowserChannel.h \
+ ../common/scoped_ptr/scoped_ptr.h
+$(OBJ_OUTDIR)/FFSessionHandler.o: FFSessionHandler.cpp FFSessionHandler.h \
+ mozincludes.h SessionData.h ../common/SessionHandler.h \
+ ../common/BrowserChannel.h ../common/Value.h ../common/Debug.h \
+ ../common/Platform.h ../common/DebugLevel.h ../common/BrowserChannel.h \
+ ../common/HostChannel.h ../common/Debug.h ../common/ByteOrder.h \
+ ../common/Platform.h ../common/Socket.h ../common/Platform.h \
+ ../common/Debug.h ../common/AllowedConnections.h ../common/Platform.h \
+ ../common/Message.h ../common/ReturnMessage.h ../common/Message.h \
+ ../common/BrowserChannel.h ../common/Value.h ../common/Value.h \
+ ../common/SessionHandler.h JavaObject.h JSRunner.h XpcomDebug.h \
+ ../common/scoped_ptr/scoped_ptr.h RootedObject.h \
+ ../common/InvokeMessage.h ../common/Message.h \
+ ../common/BrowserChannel.h ../common/Value.h ../common/ServerMethods.h \
+ ../common/Value.h
+$(OBJ_OUTDIR)/JavaObject.o: JavaObject.cpp JavaObject.h mozincludes.h \
+ FFSessionHandler.h SessionData.h ../common/SessionHandler.h \
+ ../common/BrowserChannel.h ../common/Value.h ../common/Debug.h \
+ ../common/Platform.h ../common/DebugLevel.h ../common/BrowserChannel.h \
+ ../common/ServerMethods.h ../common/Value.h XpcomDebug.h \
+ ../common/HostChannel.h ../common/Debug.h ../common/ByteOrder.h \
+ ../common/Platform.h ../common/Socket.h ../common/Platform.h \
+ ../common/Debug.h ../common/AllowedConnections.h ../common/Platform.h \
+ ../common/Message.h ../common/ReturnMessage.h ../common/Message.h \
+ ../common/BrowserChannel.h ../common/Value.h ../common/Value.h \
+ ../common/SessionHandler.h ../common/InvokeMessage.h \
+ ../common/Message.h ../common/BrowserChannel.h ../common/Value.h \
+ ../common/scoped_ptr/scoped_ptr.h
+$(OBJ_OUTDIR)/JSRunner.o: JSRunner.cpp JSRunner.h mozincludes.h
+$(OBJ_OUTDIR)/XpcomDebug.o: XpcomDebug.cpp XpcomDebug.h mozincludes.h \
+ JavaObject.h
diff --git a/plugins/xpcom/ModuleOOPHM.cpp b/plugins/xpcom/ModuleOOPHM.cpp
new file mode 100644
index 0000000..7e52bb1
--- /dev/null
+++ b/plugins/xpcom/ModuleOOPHM.cpp
@@ -0,0 +1,214 @@
+/*
+ * Copyright 2008 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.
+ */
+
+#include "Debug.h"
+#include "ExternalWrapper.h"
+
+#include "nsCOMPtr.h"
+#include "nsISupports.h"
+#include "nsIXULAppInfo.h"
+#include "nsIXULRuntime.h"
+#include "nsServiceManagerUtils.h"
+#include "nsXPCOMCID.h"
+
+#if GECKO_VERSION >= 1900
+#include "nsIClassInfoImpl.h"
+#endif
+
+#if GECKO_VERSION >= 2000
+#include "mozilla/ModuleUtils.h"
+#else
+#include "nsIGenericFactory.h"
+#include "nsICategoryManager.h"
+#endif
+
+
+// Allow a macro to be treated as a C string, ie -Dfoo=bar; QUOTE(foo) = "bar"
+#define QUOTE_HELPER(x) #x
+#define QUOTE(x) QUOTE_HELPER(x)
+
+#ifdef _WINDOWS
+#include <windows.h>
+
+BOOL APIENTRY DllMain(HMODULE hModule, DWORD ulReasonForCall, LPVOID lpReserved) {
+ switch (ulReasonForCall) {
+ case DLL_PROCESS_ATTACH:
+ case DLL_THREAD_ATTACH:
+ case DLL_THREAD_DETACH:
+ case DLL_PROCESS_DETACH:
+ break;
+ }
+ return TRUE;
+}
+#endif
+
+// This defines ExternalWrapperConstructor, which in turn instantiates via
+// ExternalWrapper::ExternalWrapper()
+NS_GENERIC_FACTORY_CONSTRUCTOR(ExternalWrapper);
+
+static nsresult Load() {
+ nsresult nr;
+ nsCOMPtr<nsIXULAppInfo> app_info
+ = do_GetService("@mozilla.org/xre/app-info;1", &nr);
+ if (NS_FAILED(nr) || !app_info) {
+ return NS_ERROR_FAILURE;
+ }
+ nsCString gecko_version;
+ app_info->GetPlatformVersion(gecko_version);
+ nsCString browser_version;
+ app_info->GetVersion(browser_version);
+ nsCOMPtr<nsIXULRuntime> xulRuntime
+ = do_GetService("@mozilla.org/xre/app-info;1", &nr);
+ if (NS_FAILED(nr) || !app_info) {
+ return NS_ERROR_FAILURE;
+ }
+ nsCString os;
+ xulRuntime->GetOS(os);
+ nsCString abi;
+ xulRuntime->GetXPCOMABI(abi);
+ Debug::log(Debug::Info) << "Initializing GWT Developer Plugin"
+ << Debug::flush;
+ Debug::log(Debug::Info) << " gecko=" << gecko_version.BeginReading()
+ << ", firefox=" << browser_version.BeginReading() << ", abi="
+ << os.BeginReading() << "_" << abi.BeginReading() << ", built for "
+ QUOTE(BROWSER) << Debug::flush;
+ return NS_OK;
+}
+
+static void Unload() {
+ Debug::log(Debug::Debugging) << "ModuleOOPHM Unload()"
+ << Debug::flush;
+}
+
+#if GECKO_VERSION >= 2000
+/**
+ * Gecko 2.0 has a completely different initialization mechanism
+ */
+
+// This defines kOOPHM_CID variable that refers to the OOPHM_CID
+NS_DEFINE_NAMED_CID(OOPHM_CID);
+
+// Build a table of ClassIDs (CIDs) which are implemented by this module. CIDs
+// should be completely unique UUIDs.
+// each entry has the form { CID, service, factoryproc, constructorproc }
+// where factoryproc is usually NULL.
+static const mozilla::Module::CIDEntry kOOPHMCIDs[] = {
+ {&kOOPHM_CID, false, NULL, ExternalWrapperConstructor},
+ {NULL }
+};
+
+// Build a table which maps contract IDs to CIDs.
+// A contract is a string which identifies a particular set of functionality. In some
+// cases an extension component may override the contract ID of a builtin gecko component
+// to modify or extend functionality.
+static const mozilla::Module::ContractIDEntry kOOPHMContracts[] = {
+ {OOPHM_CONTRACTID, &kOOPHM_CID},
+ {NULL}
+};
+
+// Category entries are category/key/value triples which can be used
+// to register contract ID as content handlers or to observe certain
+// notifications.
+static const mozilla::Module::CategoryEntry kOOPHMCategories[] = {
+ {"JavaScript-global-property", "__gwt_HostedModePlugin", OOPHM_CONTRACTID},
+ {NULL}
+};
+
+static const mozilla::Module kModuleOOPHM = {
+ mozilla::Module::kVersion,
+ kOOPHMCIDs,
+ kOOPHMContracts,
+ kOOPHMCategories,
+ NULL, /* Use the default factory */
+ Load,
+ Unload
+};
+
+NSMODULE_DEFN(ModuleOOPHM) = &kModuleOOPHM;
+
+#else
+/**
+ * pre-Gecko2.0 initialization
+ */
+NS_DECL_CLASSINFO(ExternalWrapper);
+static NS_IMETHODIMP registerSelf(nsIComponentManager *aCompMgr, nsIFile *aPath,
+ const char *aLoaderStr, const char *aType,
+ const nsModuleComponentInfo *aInfo) {
+
+ Debug::log(Debug::Info)
+ << " successfully registered GWT Developer Plugin"
+ << Debug::flush;
+ nsresult rv;
+ nsCOMPtr<nsICategoryManager> categoryManager =
+ do_GetService(NS_CATEGORYMANAGER_CONTRACTID, &rv);
+
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ rv = categoryManager->AddCategoryEntry("JavaScript global property",
+ "__gwt_HostedModePlugin", OOPHM_CONTRACTID, true, true, nsnull);
+
+ if (rv != NS_OK) {
+ Debug::log(Debug::Error) << "ModuleOOPHM registerSelf returned " << rv
+ << Debug::flush;
+ }
+ return rv;
+}
+
+static NS_IMETHODIMP factoryDestructor(void) {
+ Unload();
+ return NS_OK;
+}
+
+static NS_IMETHODIMP unregisterSelf(nsIComponentManager *aCompMgr,
+ nsIFile *aPath, const char *aLoaderStr,
+ const nsModuleComponentInfo *aInfo) {
+ Debug::log(Debug::Info) << "Unregistered GWT Developer Plugin"
+ << Debug::flush;
+ return NS_OK;
+}
+
+static nsModuleComponentInfo components[] = {
+ {
+ OOPHM_CLASSNAME,
+ OOPHM_CID,
+ OOPHM_CONTRACTID,
+ ExternalWrapperConstructor,
+ registerSelf,
+ unregisterSelf, /* unregister self */
+ factoryDestructor, /* factory destructor */
+ NS_CI_INTERFACE_GETTER_NAME(ExternalWrapper), /* get interfaces */
+ nsnull, /* language helper */
+ &NS_CLASSINFO_NAME(ExternalWrapper), /* global class-info pointer */
+ 0 /* class flags */
+ }
+};
+
+// From Gears base/firefox/module.cc
+static nsModuleInfo const kModuleInfo = {
+ NS_MODULEINFO_VERSION,
+ ("ExternalWrapperModule"),
+ (components),
+ (sizeof(components) / sizeof(components[0])),
+ (nsnull),
+ (nsnull)
+};
+
+NSGETMODULE_ENTRY_POINT(ExternalWrapperModule) (nsIComponentManager *servMgr,
+ nsIFile* location, nsIModule** result) {
+ Load();
+ return NS_NewGenericModule2(&kModuleInfo, result);
+}
+#endif //GECKO_VERSION
diff --git a/plugins/xpcom/Preferences.cpp b/plugins/xpcom/Preferences.cpp
new file mode 100644
index 0000000..055200c
--- /dev/null
+++ b/plugins/xpcom/Preferences.cpp
@@ -0,0 +1,123 @@
+/*
+ * Copyright 2009 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.
+ */
+
+#include "Preferences.h"
+#include "Debug.h"
+#include "AllowedConnections.h"
+
+#include "nsCOMPtr.h"
+#include "nsStringAPI.h"
+#include "nsISupportsImpl.h"
+#include "nsIObserver.h"
+#include "nsIPrefService.h"
+#include "nsIPrefBranch.h"
+#include "nsIPrefBranch2.h"
+#include "nsServiceManagerUtils.h"
+
+#define GWT_DEV_PREFS_PREFIX "gwt-dev-plugin."
+#define GWT_DEV_ACCESS_LIST "accessList"
+
+NS_IMPL_ADDREF(Preferences)
+NS_IMPL_RELEASE(Preferences)
+NS_IMPL_QUERY_INTERFACE1(Preferences, nsIObserver)
+
+Preferences::Preferences() {
+ nsCOMPtr<nsIPrefService> prefService = do_GetService(
+ NS_PREFSERVICE_CONTRACTID);
+ if (!prefService) {
+ Debug::log(Debug::Error) << "Unable to get preference service"
+ << Debug::flush;
+ return;
+ }
+ nsCOMPtr<nsIPrefBranch> branch;
+ prefService->GetBranch(GWT_DEV_PREFS_PREFIX, getter_AddRefs(branch));
+ if (!branch) {
+ Debug::log(Debug::Error) << "Unable to get " GWT_DEV_PREFS_PREFIX
+ " preference branch" << Debug::flush;
+ return;
+ }
+ prefs = do_QueryInterface(branch);
+ if (!prefs) {
+ Debug::log(Debug::Error) << "Unable to get nsIPrefBranch2" << Debug::flush;
+ return;
+ }
+ prefs->AddObserver(GWT_DEV_ACCESS_LIST, this, PR_FALSE);
+ nsCString prefValue;
+ if (branch->GetCharPref(GWT_DEV_ACCESS_LIST, getter_Copies(prefValue))
+ == NS_OK) {
+ loadAccessList(prefValue.get());
+ }
+}
+
+// implements nsIObserver
+NS_IMETHODIMP
+Preferences::Observe(nsISupports *aSubject, const char* aTopic,
+ const PRUnichar *aData) {
+ nsresult rv = NS_OK;
+ Debug::log(Debug::Spam) << "Preferences::Observe(subject="
+ << aSubject << ", topic=" << aTopic << ", data=" << aData << Debug::flush;
+ if (strcmp(aTopic, NS_PREFBRANCH_PREFCHANGE_TOPIC_ID)) {
+ return NS_ERROR_UNEXPECTED;
+ }
+ // TODO(jat): check preference name in aData if we ever add another one
+ nsCOMPtr<nsIPrefBranch> prefs(do_QueryInterface(aSubject, &rv));
+ NS_ENSURE_SUCCESS(rv, rv);
+ nsCString prefValue;
+ if (prefs->GetCharPref(GWT_DEV_ACCESS_LIST, getter_Copies(prefValue))
+ == NS_OK) {
+ loadAccessList(prefValue.get());
+ }
+ return NS_OK;
+}
+
+void Preferences::addNewRule(const std::string& pattern, bool exclude) {
+ nsCString prefValue;
+ if (prefs->GetCharPref(GWT_DEV_ACCESS_LIST, getter_Copies(prefValue))
+ != NS_OK) {
+ Debug::log(Debug::Error) << "Unable to retrieve access list preference"
+ << Debug::flush;
+ return;
+ }
+ // TODO(jat): see if the same rule already exists
+ std::string pref(prefValue.get());
+ if (pref.length() > 0) {
+ pref += ',';
+ }
+ if (exclude) {
+ pref += '!';
+ }
+ pref += pattern;
+ if (prefs->SetCharPref(GWT_DEV_ACCESS_LIST, pref.c_str()) != NS_OK) {
+ Debug::log(Debug::Error) << "Unable to save modified access list preference"
+ << Debug::flush;
+ return;
+ }
+}
+
+void Preferences::loadAccessList(const char* prefValue) {
+ if (!prefValue) {
+ return;
+ }
+ Debug::log(Debug::Spam) << "loadFromAccessList(prefValue=" << prefValue << ")"
+ << Debug::flush;
+ AllowedConnections::initFromAccessList(prefValue);
+}
+
+Preferences::~Preferences() {
+ if (prefs) {
+ prefs->RemoveObserver(GWT_DEV_ACCESS_LIST, this);
+ }
+}
diff --git a/plugins/xpcom/Preferences.h b/plugins/xpcom/Preferences.h
new file mode 100644
index 0000000..2bc0a81
--- /dev/null
+++ b/plugins/xpcom/Preferences.h
@@ -0,0 +1,55 @@
+#ifndef _H_Preferences
+#define _H_Preferences
+/*
+ * Copyright 2009 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.
+ */
+
+#include <string>
+
+#include "mozincludes.h"
+
+#include "nsCOMPtr.h"
+#include "nsISupports.h"
+#include "nsIObserver.h"
+#include "nsIPrefBranch2.h"
+
+class HostChannel;
+namespace gwt {
+ class Value;
+}
+
+class Preferences : public nsIObserver {
+ NS_DECL_ISUPPORTS
+ NS_DECL_NSIOBSERVER
+public:
+ Preferences();
+ virtual ~Preferences();
+
+ /**
+ * Add a new rule to the access list preference.
+ *
+ * @param pattern pattern to add (currently only an exact-match literal)
+ * @param exclude true if the pattern should be excluded from matches,
+ * otherwise included
+ */
+ void addNewRule(const std::string& pattern, bool exclude);
+
+private:
+ static void loadAccessList(const char*);
+
+ nsCOMPtr<nsIPrefBranch2> prefs;
+};
+
+#endif
diff --git a/plugins/xpcom/README.txt b/plugins/xpcom/README.txt
new file mode 100644
index 0000000..0ef9b49
--- /dev/null
+++ b/plugins/xpcom/README.txt
@@ -0,0 +1,28 @@
+You will need to checkout the SDKs required for building the plugin
+separately. These are located at:
+ https://google-web-toolkit.googlecode.com/svn/plugin-sdks
+
+This assumes the SDKS are located in ../../../plugin-sdks -- if this is
+not correct, edit the definition in Makefile or pass PLUGIN_SDKS=<path> on the
+make command.
+
+Build by:
+
+make ARCH=x86 BROWSER=ff35
+make ARCH=x86_64 BROWSER=ff3
+
+etc -- default is current architecture and ff3.
+
+BROWSER values supported:
+ ff3 Firefox 3.0
+ ff3+ Firefox 3.0.11+ on some platforms
+ ff35 Firefox 3.5
+ ff36 Firefox 3.6
+ ff40 Firefox 4.0 (and 3.7alpha)
+
+You may need to try both ff3 and ff3+, as different platforms chose different
+library layouts.
+
+Targets of interest:
+ make linuxplatforms
+ make macplatforms
diff --git a/plugins/xpcom/RootedObject.h b/plugins/xpcom/RootedObject.h
new file mode 100755
index 0000000..1f85b71
--- /dev/null
+++ b/plugins/xpcom/RootedObject.h
@@ -0,0 +1,84 @@
+#ifndef _H_RootedObject
+#define _H_RootedObject
+/*
+ * Copyright 2008 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.
+ */
+
+#include "Debug.h"
+
+#include "jsapi.h"
+
+#if GECKO_VERSION < 2000
+#define JS_AddNamedObjectRoot JS_AddNamedRoot
+#define JS_AddNamedValueRoot JS_AddNamedRoot
+#define JS_RemoveObjectRoot JS_RemoveRoot
+#define JS_RemoveValueRoot JS_RemoveRoot
+#endif
+
+class RootedObject {
+public:
+ RootedObject(JSContext* ctx, const char* name = 0) : ctx(ctx), obj(0) {
+ if (!JS_AddNamedObjectRoot(ctx, &obj, name)) {
+ Debug::log(Debug::Error) << "RootedObject(" << (name ? name : "")
+ << "): JS_AddNamedRoot failed" << Debug::flush;
+ }
+ }
+
+ ~RootedObject() {
+ // Always returns success, so no need to check.
+ JS_RemoveObjectRoot(ctx, &obj);
+ }
+
+ JSObject& operator*() const {
+ assert(obj != 0);
+ return *obj;
+ }
+
+ JSObject* operator->() const {
+ assert(obj != 0);
+ return obj;
+ }
+
+ bool operator==(JSObject* p) const {
+ return obj == p;
+ }
+
+ bool operator!=(JSObject* p) const {
+ return obj != p;
+ }
+
+ JSObject* get() const {
+ return obj;
+ }
+
+ RootedObject& operator=(JSObject* val) {
+ obj = val;
+ return *this;
+ }
+
+private:
+ JSContext* ctx;
+ JSObject* obj;
+};
+
+inline bool operator==(JSObject* p, const RootedObject& ro) {
+ return p == ro.get();
+}
+
+inline bool operator!=(JSObject* p, const RootedObject& ro) {
+ return p != ro.get();
+}
+
+#endif
diff --git a/plugins/xpcom/SessionData.h b/plugins/xpcom/SessionData.h
new file mode 100755
index 0000000..3f77d42
--- /dev/null
+++ b/plugins/xpcom/SessionData.h
@@ -0,0 +1,114 @@
+#ifndef _H_SessionData
+#define _H_SessionData
+/*
+ * Copyright 2008 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.
+ */
+
+#include "mozincludes.h"
+
+#include "SessionHandler.h"
+
+#include "jsapi.h"
+
+#if GECKO_VERSION >= 2000 && GECKO_VERSION < 10000
+#include "jsobj.h"
+#endif
+
+class HostChannel;
+
+class SessionData {
+public:
+ SessionData(HostChannel* channel, SessionHandler* sessionHandler,
+ JSContext* ctx) : channel(channel), sessionHandler(sessionHandler),
+ global(SessionData::getJSGlobalObject(ctx)), runtime(JS_GetRuntime(ctx)),
+ toStringTearOff(JSVAL_VOID)
+ {
+ }
+
+ HostChannel* getHostChannel() const {
+ return channel;
+ }
+
+ SessionHandler* getSessionHandler() const {
+ return sessionHandler;
+ }
+
+ JSObject* getGlobalObject() const {
+ return global;
+ }
+
+ jsval getToStringTearOff() const {
+ return toStringTearOff;
+ }
+
+ /*
+ * Convert a value from the JavaScript into something that can be sent back
+ * to the OOPHM host.
+ */
+ virtual void makeValueFromJsval(gwt::Value& retVal, JSContext* ctx, const jsval& value)=0;
+
+ /*
+ * Convert a value from the OOPHM host into something that can be passed into
+ * the JavaScript execution environment.
+ */
+ virtual void makeJsvalFromValue(jsval& retVal, JSContext* ctx, const gwt::Value& value)=0;
+
+ /*
+ * Removes the JavaObject wrapper with the given id and notifies the host.
+ */
+ virtual void freeJavaObject(int objectId)=0;
+
+private:
+ static JSObject* getJSGlobalObject(JSContext* ctx) {
+#if GECKO_VERSION < 10000
+ JSObject* global = JS_GetGlobalObject(ctx);
+#endif
+
+// See: https://developer.mozilla.org/en/SpiderMonkey/JSAPI_Reference/JS_GetGlobalObject
+#if GECKO_VERSION >= 2000 && GECKO_VERSION < 10000
+ // Innerize the global object from the WindowProxy object to its inner
+ // Window delegate since the proxy can't be used for evaluating scripts.
+ OBJ_TO_INNER_OBJECT(ctx, global);
+#endif
+
+#if GECKO_VERSION >= 10000
+ JSObject* global = JS_GetGlobalForScopeChain(ctx);
+#endif
+
+ return global;
+ }
+
+protected:
+ /*
+ * The communication channel used for the OOPHM session.
+ */
+ HostChannel* const channel;
+
+ /*
+ * A reference to the SessionHandler being used in the OOPHM session.
+ */
+ SessionHandler* const sessionHandler;
+
+ JSRuntime* runtime;
+
+ JSObject* const global;
+
+ /**
+ * A function object representing the toString tear-off method.
+ */
+ jsval toStringTearOff;
+};
+
+#endif
diff --git a/plugins/xpcom/UserAgents.txt b/plugins/xpcom/UserAgents.txt
new file mode 100644
index 0000000..28d70ae
--- /dev/null
+++ b/plugins/xpcom/UserAgents.txt
@@ -0,0 +1,8 @@
+User agents that work with ff3 XPI:
+===================================
+Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.13) Gecko/2009080315 Ubuntu/9.04 (jaunty) Firefox/3.08
+
+User agents that work with ff3+ XPI:
+====================================
+Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.12) Gecko/2009072110 Fedora/3.0.12-1.fc10 Firefox/3.0.12
+
diff --git a/plugins/xpcom/VisualStudio/FirefoxPlugins.sln b/plugins/xpcom/VisualStudio/FirefoxPlugins.sln
new file mode 100644
index 0000000..e4bb71e
--- /dev/null
+++ b/plugins/xpcom/VisualStudio/FirefoxPlugins.sln
@@ -0,0 +1,48 @@
+
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ff70-xpcom", "ff70-xpcom.vcxproj", "{58AE040D-01CC-4E4A-AE98-BEDE56480AE9}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ff60-xpcom", "ff60-xpcom.vcxproj", "{58AE040D-01CC-4E4A-AE98-BEDE56480AE9}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ff50-xpcom", "ff50-xpcom.vcxproj", "{58AE040D-01CC-4E4A-AE98-BEDE56480AE9}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ff40-xpcom", "ff40-xpcom.vcxproj", "{6BF0C2CE-CB0C-421B-A67C-1E448371D24D}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ff36-xpcom", "ff36-xpcom.vcxproj", "{37692217-C7AD-4FA9-A588-DDC11E17D925}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ff35-xpcom", "ff35-xpcom.vcxproj", "{59A0C5AD-DE66-4C6D-9164-86F31308E719}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ff3-xpcom", "ff3-xpcom.vcxproj", "{6BF0C2CE-CB0C-421B-A67C-1E448371D24C}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Release|Win32 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {58AE040D-01CC-4E4A-AE98-BEDE56480AE9}.Debug|Win32.ActiveCfg = Debug|Win32
+ {58AE040D-01CC-4E4A-AE98-BEDE56480AE9}.Debug|Win32.Build.0 = Debug|Win32
+ {58AE040D-01CC-4E4A-AE98-BEDE56480AE9}.Release|Win32.ActiveCfg = Release|Win32
+ {58AE040D-01CC-4E4A-AE98-BEDE56480AE9}.Release|Win32.Build.0 = Release|Win32
+ {6BF0C2CE-CB0C-421B-A67C-1E448371D24D}.Debug|Win32.ActiveCfg = Debug|Win32
+ {6BF0C2CE-CB0C-421B-A67C-1E448371D24D}.Debug|Win32.Build.0 = Debug|Win32
+ {6BF0C2CE-CB0C-421B-A67C-1E448371D24D}.Release|Win32.ActiveCfg = Release|Win32
+ {6BF0C2CE-CB0C-421B-A67C-1E448371D24D}.Release|Win32.Build.0 = Release|Win32
+ {37692217-C7AD-4FA9-A588-DDC11E17D925}.Debug|Win32.ActiveCfg = Debug|Win32
+ {37692217-C7AD-4FA9-A588-DDC11E17D925}.Debug|Win32.Build.0 = Debug|Win32
+ {37692217-C7AD-4FA9-A588-DDC11E17D925}.Release|Win32.ActiveCfg = Release|Win32
+ {37692217-C7AD-4FA9-A588-DDC11E17D925}.Release|Win32.Build.0 = Release|Win32
+ {59A0C5AD-DE66-4C6D-9164-86F31308E719}.Debug|Win32.ActiveCfg = Debug|Win32
+ {59A0C5AD-DE66-4C6D-9164-86F31308E719}.Debug|Win32.Build.0 = Debug|Win32
+ {59A0C5AD-DE66-4C6D-9164-86F31308E719}.Release|Win32.ActiveCfg = Release|Win32
+ {59A0C5AD-DE66-4C6D-9164-86F31308E719}.Release|Win32.Build.0 = Release|Win32
+ {6BF0C2CE-CB0C-421B-A67C-1E448371D24C}.Debug|Win32.ActiveCfg = Debug|Win32
+ {6BF0C2CE-CB0C-421B-A67C-1E448371D24C}.Debug|Win32.Build.0 = Debug|Win32
+ {6BF0C2CE-CB0C-421B-A67C-1E448371D24C}.Release|Win32.ActiveCfg = Release|Win32
+ {6BF0C2CE-CB0C-421B-A67C-1E448371D24C}.Release|Win32.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/plugins/xpcom/VisualStudio/ff100-xpcom.vcproj b/plugins/xpcom/VisualStudio/ff100-xpcom.vcproj
new file mode 100755
index 0000000..c8b81e8
--- /dev/null
+++ b/plugins/xpcom/VisualStudio/ff100-xpcom.vcproj
@@ -0,0 +1,845 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="9.00"
+ Name="ff100-xpcom"
+ ProjectGUID="{6BF0C2CE-CB0C-421B-A67C-1E448371D24D}"
+ RootNamespace="ff100-xpcom"
+ Keyword="Win32Proj"
+ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="Debug100"
+ IntermediateDirectory="Debug100"
+ ConfigurationType="2"
+ UseOfMFC="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories=""$(ProjectDir)\..\..\common";..\prebuilt\ff100\include;"..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include";"..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\mozilla";"..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\WINNT_x86-msvc\include";"..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\xpconnect";"..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\WINNT_x86-msvc\include""
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF8;GECKO_VERSION=10000"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ TreatWChar_tAsBuiltInType="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ ResourceOutputFileName="$(IntDir)/$(TargetName).res"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="ws2_32.lib Advapi32.lib xpcomglue_s.lib xpcom.lib nspr4.lib mozalloc.lib xul.lib mozjs.lib"
+ ShowProgress="2"
+ OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff100\xpGwtDevPlugin.dll"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories=""..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\WINNT_x86-msvc\lib""
+ ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
+ SubSystem="2"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ ImportLibrary="$(IntDir)\$(TargetName).lib"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="Release100"
+ IntermediateDirectory="Release100"
+ ConfigurationType="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="3"
+ EnableIntrinsicFunctions="true"
+ AdditionalIncludeDirectories=""$(ProjectDir)\..\..\common";..\prebuilt\ff100\include;"..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include";"..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\mozilla";"..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\WINNT_x86-msvc\include";"..\..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\xpconnect""
+ PreprocessorDefinitions="WIN32;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF8;GECKO_VERSION=10000;$(NOINHERIT)"
+ ExceptionHandling="1"
+ RuntimeLibrary="0"
+ TreatWChar_tAsBuiltInType="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="false"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ ResourceOutputFileName="$(IntDir)/$(TargetName).res"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="ws2_32.lib Advapi32.lib xpcomglue_s.lib xpcom.lib nspr4.lib mozalloc.lib xul.lib mozjs.lib"
+ ShowProgress="2"
+ OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff100\xpGwtDevPlugin.dll"
+ LinkIncremental="0"
+ AdditionalLibraryDirectories=""..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\WINNT_x86-msvc\lib""
+ ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ ImportLibrary="$(IntDir)\$(TargetName).lib"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ <File
+ RelativePath="..\ExternalWrapper.h"
+ >
+ </File>
+ <File
+ RelativePath="..\FFSessionHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\prebuilt\ff100\include\IOOPHM.h"
+ >
+ </File>
+ <File
+ RelativePath="..\JavaObject.h"
+ >
+ </File>
+ <File
+ RelativePath="..\JSRunner.h"
+ >
+ </File>
+ <File
+ RelativePath="..\mozincludes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\Preferences.h"
+ >
+ </File>
+ <File
+ RelativePath="..\RootedObject.h"
+ >
+ </File>
+ <File
+ RelativePath="..\SessionData.h"
+ >
+ </File>
+ <File
+ RelativePath="..\XpcomDebug.h"
+ >
+ </File>
+ <Filter
+ Name="common"
+ >
+ <File
+ RelativePath="..\..\common\AllowedConnections.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\BrowserChannel.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ByteOrder.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\CheckVersionsMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ChooseTransportMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Debug.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\DebugLevel.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FatalErrorMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FreeValueMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\HashMap.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\HostChannel.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeSpecialMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadJsniMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadModuleMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Message.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Platform.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ProtocolVersionMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\QuitMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ReturnMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\scoped_ptr\scoped_ptr.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ServerMethods.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\SessionHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Socket.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\SwitchTransportMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Value.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="gecko"
+ >
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\WINNT_x86-msvc\include\js-config.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\js\jsapi.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\js\jsautocfg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\js\jscompat.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\js\jsconfig.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\WINNT_x86-msvc\include\jscpucfg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\jscpucfg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\jsinttypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\js\jslong.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\jsosdep.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\js\jsotypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\js\jsproto.tbl"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\js\jspubtd.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\js\jstypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\js\jsutil.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\js\jsutil.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\js\jsutil.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\js\jsutil.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\WINNT_x86-msvc\include\mozilla-config.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\xpconnect\nsAXPCNativeCallContext.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\nsCOMPtr.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\nscore.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\xpcom\nscore.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\nsCycleCollector.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\nsDebug.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\nsError.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\widget\nsEvent.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\nsICategoryManager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\nsIClassInfo.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\nsIClassInfoImpl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\nsIComponentManager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\nsID.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\xpcom\nsIEnumerator.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\xpcom\nsIException.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\xpcom\nsIExceptionService.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\nsIFactory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\nsIGenericFactory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\necko\nsIHttpProtocolHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\xpcom\nsIInterfaceInfo.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\xpcom\nsIInterfaceInfoManager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\xpconnect\nsIJSContextStack.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\nsIMemory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\nsIModule.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\caps\nsIPrincipal.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\nsIProgrammingLanguage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\necko\nsIProtocolHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\necko\nsIProxiedProtocolHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\xpconnect\nsIScriptableInterfaces.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\dom\nsIScriptGlobalObject.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\dom\nsIScriptObjectPrincipal.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\caps\nsISecurityCheckedComponent.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\xpcom\nsISerializable.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\nsIServiceManager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\xpcom\nsISimpleEnumerator.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\nsISimpleEnumerator.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\xpcom\nsISupports.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\nsISupports.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\xpcom\nsISupportsBase.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\nsISupportsBase.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\nsISupportsImpl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\xpcom\nsISupportsUtils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\nsISupportsUtils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\nsIURI.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\xpcom\nsIVariant.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\xpconnect\nsIXPConnect.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\nsMemory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\necko\nsNetCID.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\nsrootidl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\xpcom\nsrootidl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\nsServiceManagerUtils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\nsStringAPI.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\nsTraceRefcnt.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\nsXPCOM.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\nsXPCOMCID.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\nsXPCOMStrings.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\pratom.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\prcpucfg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\prinrval.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\prlock.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\prlog.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\prlong.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\obsolete\protypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\prthread.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\prtime.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\prtypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\xpconnect\xpccomponents.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\xpconnect\xpcexception.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\xpconnect\xpcjsid.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\WINNT_x86-msvc\include\xpcom-config.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\xpcom\xpt_arena.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\xpcom\xpt_struct.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\xpcom\xptinfo.h"
+ >
+ </File>
+ </Filter>
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ >
+ <File
+ RelativePath="..\xpGwtDevPlugin.rc"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\ExternalWrapper.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\FFSessionHandler.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\JavaObject.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\JSRunner.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\ModuleOOPHM.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ GeneratePreprocessedFile="0"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\Preferences.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\XpcomDebug.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\xpGwtDevPlugin.def"
+ >
+ </File>
+ <Filter
+ Name="common"
+ >
+ <File
+ RelativePath="..\..\common\AllowedConnections.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\CheckVersionsMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ChooseTransportMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Debug.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FatalErrorMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FreeValueMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\HostChannel.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeSpecialMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadJsniMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadModuleMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ProtocolVersionMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ReturnMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ServerMethods.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Socket.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\SwitchTransportMessage.cpp"
+ >
+ </File>
+ </Filter>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/plugins/xpcom/VisualStudio/ff110-xpcom.vcproj b/plugins/xpcom/VisualStudio/ff110-xpcom.vcproj
new file mode 100755
index 0000000..3d46823
--- /dev/null
+++ b/plugins/xpcom/VisualStudio/ff110-xpcom.vcproj
@@ -0,0 +1,845 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="9.00"
+ Name="ff110-xpcom"
+ ProjectGUID="{6BF0C2CE-CB0C-421B-A67C-1E448371D24D}"
+ RootNamespace="ff110-xpcom"
+ Keyword="Win32Proj"
+ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="Debug110"
+ IntermediateDirectory="Debug110"
+ ConfigurationType="2"
+ UseOfMFC="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories=""$(ProjectDir)\..\..\common";..\prebuilt\ff110\include;"..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include";"..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\mozilla";"..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\WINNT_x86-msvc\include";"..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\xpconnect";"..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\WINNT_x86-msvc\include""
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF8;GECKO_VERSION=11000"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ TreatWChar_tAsBuiltInType="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ ResourceOutputFileName="$(IntDir)/$(TargetName).res"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="ws2_32.lib Advapi32.lib xpcomglue_s.lib xpcom.lib nspr4.lib mozalloc.lib xul.lib mozjs.lib"
+ ShowProgress="2"
+ OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff110\xpGwtDevPlugin.dll"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories=""..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\WINNT_x86-msvc\lib""
+ ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
+ SubSystem="2"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ ImportLibrary="$(IntDir)\$(TargetName).lib"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="Release110"
+ IntermediateDirectory="Release110"
+ ConfigurationType="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="3"
+ EnableIntrinsicFunctions="true"
+ AdditionalIncludeDirectories=""$(ProjectDir)\..\..\common";..\prebuilt\ff110\include;"..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include";"..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\mozilla";"..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\WINNT_x86-msvc\include";"..\..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\xpconnect""
+ PreprocessorDefinitions="WIN32;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF8;GECKO_VERSION=11000;$(NOINHERIT)"
+ ExceptionHandling="1"
+ RuntimeLibrary="0"
+ TreatWChar_tAsBuiltInType="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="false"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ ResourceOutputFileName="$(IntDir)/$(TargetName).res"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="ws2_32.lib Advapi32.lib xpcomglue_s.lib xpcom.lib nspr4.lib mozalloc.lib xul.lib mozjs.lib"
+ ShowProgress="2"
+ OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff110\xpGwtDevPlugin.dll"
+ LinkIncremental="0"
+ AdditionalLibraryDirectories=""..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\WINNT_x86-msvc\lib""
+ ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ ImportLibrary="$(IntDir)\$(TargetName).lib"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ <File
+ RelativePath="..\ExternalWrapper.h"
+ >
+ </File>
+ <File
+ RelativePath="..\FFSessionHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\prebuilt\ff110\include\IOOPHM.h"
+ >
+ </File>
+ <File
+ RelativePath="..\JavaObject.h"
+ >
+ </File>
+ <File
+ RelativePath="..\JSRunner.h"
+ >
+ </File>
+ <File
+ RelativePath="..\mozincludes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\Preferences.h"
+ >
+ </File>
+ <File
+ RelativePath="..\RootedObject.h"
+ >
+ </File>
+ <File
+ RelativePath="..\SessionData.h"
+ >
+ </File>
+ <File
+ RelativePath="..\XpcomDebug.h"
+ >
+ </File>
+ <Filter
+ Name="common"
+ >
+ <File
+ RelativePath="..\..\common\AllowedConnections.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\BrowserChannel.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ByteOrder.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\CheckVersionsMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ChooseTransportMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Debug.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\DebugLevel.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FatalErrorMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FreeValueMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\HashMap.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\HostChannel.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeSpecialMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadJsniMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadModuleMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Message.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Platform.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ProtocolVersionMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\QuitMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ReturnMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\scoped_ptr\scoped_ptr.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ServerMethods.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\SessionHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Socket.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\SwitchTransportMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Value.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="gecko"
+ >
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\WINNT_x86-msvc\include\js-config.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\js\jsapi.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\js\jsautocfg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\js\jscompat.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\js\jsconfig.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\WINNT_x86-msvc\include\jscpucfg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\jscpucfg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\jsinttypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\js\jslong.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\jsosdep.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\js\jsotypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\js\jsproto.tbl"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\js\jspubtd.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\js\jstypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\js\jsutil.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\js\jsutil.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\js\jsutil.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\js\jsutil.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\WINNT_x86-msvc\include\mozilla-config.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\xpconnect\nsAXPCNativeCallContext.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\nsCOMPtr.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\nscore.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\xpcom\nscore.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\nsCycleCollector.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\nsDebug.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\nsError.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\widget\nsEvent.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\nsICategoryManager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\nsIClassInfo.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\nsIClassInfoImpl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\nsIComponentManager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\nsID.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\xpcom\nsIEnumerator.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\xpcom\nsIException.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\xpcom\nsIExceptionService.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\nsIFactory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\nsIGenericFactory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\necko\nsIHttpProtocolHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\xpcom\nsIInterfaceInfo.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\xpcom\nsIInterfaceInfoManager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\xpconnect\nsIJSContextStack.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\nsIMemory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\nsIModule.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\caps\nsIPrincipal.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\nsIProgrammingLanguage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\necko\nsIProtocolHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\necko\nsIProxiedProtocolHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\xpconnect\nsIScriptableInterfaces.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\dom\nsIScriptGlobalObject.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\dom\nsIScriptObjectPrincipal.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\caps\nsISecurityCheckedComponent.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\xpcom\nsISerializable.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\nsIServiceManager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\xpcom\nsISimpleEnumerator.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\nsISimpleEnumerator.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\xpcom\nsISupports.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\nsISupports.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\xpcom\nsISupportsBase.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\nsISupportsBase.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\nsISupportsImpl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\xpcom\nsISupportsUtils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\nsISupportsUtils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\nsIURI.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\xpcom\nsIVariant.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\xpconnect\nsIXPConnect.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\nsMemory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\necko\nsNetCID.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\nsrootidl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\xpcom\nsrootidl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\nsServiceManagerUtils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\nsStringAPI.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\nsTraceRefcnt.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\nsXPCOM.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\nsXPCOMCID.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\nsXPCOMStrings.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\pratom.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\prcpucfg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\prinrval.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\prlock.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\prlog.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\prlong.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\obsolete\protypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\prthread.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\prtime.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\prtypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\xpconnect\xpccomponents.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\xpconnect\xpcexception.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\xpconnect\xpcjsid.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\WINNT_x86-msvc\include\xpcom-config.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\xpcom\xpt_arena.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\xpcom\xpt_struct.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\xpcom\xptinfo.h"
+ >
+ </File>
+ </Filter>
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ >
+ <File
+ RelativePath="..\xpGwtDevPlugin.rc"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\ExternalWrapper.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\FFSessionHandler.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\JavaObject.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\JSRunner.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\ModuleOOPHM.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ GeneratePreprocessedFile="0"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\Preferences.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\XpcomDebug.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\xpGwtDevPlugin.def"
+ >
+ </File>
+ <Filter
+ Name="common"
+ >
+ <File
+ RelativePath="..\..\common\AllowedConnections.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\CheckVersionsMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ChooseTransportMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Debug.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FatalErrorMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FreeValueMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\HostChannel.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeSpecialMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadJsniMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadModuleMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ProtocolVersionMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ReturnMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ServerMethods.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Socket.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\SwitchTransportMessage.cpp"
+ >
+ </File>
+ </Filter>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/plugins/xpcom/VisualStudio/ff120-xpcom.vcproj b/plugins/xpcom/VisualStudio/ff120-xpcom.vcproj
new file mode 100755
index 0000000..340e6d4
--- /dev/null
+++ b/plugins/xpcom/VisualStudio/ff120-xpcom.vcproj
@@ -0,0 +1,845 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="9.00"
+ Name="ff120-xpcom"
+ ProjectGUID="{6BF0C2CE-CB0C-421B-A67C-1E448371D24D}"
+ RootNamespace="ff120-xpcom"
+ Keyword="Win32Proj"
+ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="Debug120"
+ IntermediateDirectory="Debug120"
+ ConfigurationType="2"
+ UseOfMFC="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories=""$(ProjectDir)\..\..\common";..\prebuilt\ff120\include;"..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include";"..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\mozilla";"..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\WINNT_x86-msvc\include";"..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\xpconnect";"..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\WINNT_x86-msvc\include""
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF8;GECKO_VERSION=12000"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ TreatWChar_tAsBuiltInType="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ ResourceOutputFileName="$(IntDir)/$(TargetName).res"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="ws2_32.lib Advapi32.lib xpcomglue_s.lib xpcom.lib nspr4.lib mozalloc.lib xul.lib mozjs.lib"
+ ShowProgress="2"
+ OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff120\xpGwtDevPlugin.dll"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories=""..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\WINNT_x86-msvc\lib""
+ ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
+ SubSystem="2"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ ImportLibrary="$(IntDir)\$(TargetName).lib"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="Release120"
+ IntermediateDirectory="Release120"
+ ConfigurationType="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="3"
+ EnableIntrinsicFunctions="true"
+ AdditionalIncludeDirectories=""$(ProjectDir)\..\..\common";..\prebuilt\ff120\include;"..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include";"..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\mozilla";"..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\WINNT_x86-msvc\include";"..\..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\xpconnect""
+ PreprocessorDefinitions="WIN32;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF8;GECKO_VERSION=12000;$(NOINHERIT)"
+ ExceptionHandling="1"
+ RuntimeLibrary="0"
+ TreatWChar_tAsBuiltInType="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="false"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ ResourceOutputFileName="$(IntDir)/$(TargetName).res"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="ws2_32.lib Advapi32.lib xpcomglue_s.lib xpcom.lib nspr4.lib mozalloc.lib xul.lib mozjs.lib"
+ ShowProgress="2"
+ OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff120\xpGwtDevPlugin.dll"
+ LinkIncremental="0"
+ AdditionalLibraryDirectories=""..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\WINNT_x86-msvc\lib""
+ ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ ImportLibrary="$(IntDir)\$(TargetName).lib"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ <File
+ RelativePath="..\ExternalWrapper.h"
+ >
+ </File>
+ <File
+ RelativePath="..\FFSessionHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\prebuilt\ff120\include\IOOPHM.h"
+ >
+ </File>
+ <File
+ RelativePath="..\JavaObject.h"
+ >
+ </File>
+ <File
+ RelativePath="..\JSRunner.h"
+ >
+ </File>
+ <File
+ RelativePath="..\mozincludes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\Preferences.h"
+ >
+ </File>
+ <File
+ RelativePath="..\RootedObject.h"
+ >
+ </File>
+ <File
+ RelativePath="..\SessionData.h"
+ >
+ </File>
+ <File
+ RelativePath="..\XpcomDebug.h"
+ >
+ </File>
+ <Filter
+ Name="common"
+ >
+ <File
+ RelativePath="..\..\common\AllowedConnections.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\BrowserChannel.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ByteOrder.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\CheckVersionsMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ChooseTransportMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Debug.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\DebugLevel.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FatalErrorMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FreeValueMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\HashMap.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\HostChannel.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeSpecialMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadJsniMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadModuleMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Message.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Platform.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ProtocolVersionMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\QuitMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ReturnMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\scoped_ptr\scoped_ptr.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ServerMethods.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\SessionHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Socket.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\SwitchTransportMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Value.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="gecko"
+ >
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\WINNT_x86-msvc\include\js-config.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\js\jsapi.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\js\jsautocfg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\js\jscompat.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\js\jsconfig.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\WINNT_x86-msvc\include\jscpucfg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\jscpucfg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\jsinttypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\js\jslong.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\jsosdep.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\js\jsotypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\js\jsproto.tbl"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\js\jspubtd.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\js\jstypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\js\jsutil.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\js\jsutil.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\js\jsutil.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\js\jsutil.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\WINNT_x86-msvc\include\mozilla-config.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\xpconnect\nsAXPCNativeCallContext.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\nsCOMPtr.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\nscore.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\xpcom\nscore.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\nsCycleCollector.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\nsDebug.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\nsError.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\widget\nsEvent.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\nsICategoryManager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\nsIClassInfo.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\nsIClassInfoImpl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\nsIComponentManager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\nsID.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\xpcom\nsIEnumerator.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\xpcom\nsIException.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\xpcom\nsIExceptionService.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\nsIFactory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\nsIGenericFactory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\necko\nsIHttpProtocolHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\xpcom\nsIInterfaceInfo.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\xpcom\nsIInterfaceInfoManager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\xpconnect\nsIJSContextStack.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\nsIMemory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\nsIModule.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\caps\nsIPrincipal.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\nsIProgrammingLanguage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\necko\nsIProtocolHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\necko\nsIProxiedProtocolHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\xpconnect\nsIScriptableInterfaces.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\dom\nsIScriptGlobalObject.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\dom\nsIScriptObjectPrincipal.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\caps\nsISecurityCheckedComponent.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\xpcom\nsISerializable.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\nsIServiceManager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\xpcom\nsISimpleEnumerator.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\nsISimpleEnumerator.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\xpcom\nsISupports.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\nsISupports.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\xpcom\nsISupportsBase.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\nsISupportsBase.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\nsISupportsImpl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\xpcom\nsISupportsUtils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\nsISupportsUtils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\nsIURI.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\xpcom\nsIVariant.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\xpconnect\nsIXPConnect.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\nsMemory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\necko\nsNetCID.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\nsrootidl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\xpcom\nsrootidl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\nsServiceManagerUtils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\nsStringAPI.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\nsTraceRefcnt.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\nsXPCOM.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\nsXPCOMCID.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\nsXPCOMStrings.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\pratom.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\prcpucfg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\prinrval.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\prlock.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\prlog.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\prlong.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\obsolete\protypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\prthread.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\prtime.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\prtypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\xpconnect\xpccomponents.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\xpconnect\xpcexception.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\xpconnect\xpcjsid.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\WINNT_x86-msvc\include\xpcom-config.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\xpcom\xpt_arena.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\xpcom\xpt_struct.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\xpcom\xptinfo.h"
+ >
+ </File>
+ </Filter>
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ >
+ <File
+ RelativePath="..\xpGwtDevPlugin.rc"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\ExternalWrapper.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\FFSessionHandler.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\JavaObject.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\JSRunner.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\ModuleOOPHM.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ GeneratePreprocessedFile="0"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\Preferences.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\XpcomDebug.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\xpGwtDevPlugin.def"
+ >
+ </File>
+ <Filter
+ Name="common"
+ >
+ <File
+ RelativePath="..\..\common\AllowedConnections.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\CheckVersionsMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ChooseTransportMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Debug.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FatalErrorMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FreeValueMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\HostChannel.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeSpecialMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadJsniMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadModuleMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ProtocolVersionMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ReturnMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ServerMethods.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Socket.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\SwitchTransportMessage.cpp"
+ >
+ </File>
+ </Filter>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/plugins/xpcom/VisualStudio/ff130-xpcom.vcproj b/plugins/xpcom/VisualStudio/ff130-xpcom.vcproj
new file mode 100755
index 0000000..4f3ac18
--- /dev/null
+++ b/plugins/xpcom/VisualStudio/ff130-xpcom.vcproj
@@ -0,0 +1,845 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="9.00"
+ Name="ff130-xpcom"
+ ProjectGUID="{6BF0C2CE-CB0C-421B-A67C-1E448371D24D}"
+ RootNamespace="ff130-xpcom"
+ Keyword="Win32Proj"
+ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="Debug130"
+ IntermediateDirectory="Debug130"
+ ConfigurationType="2"
+ UseOfMFC="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories=""$(ProjectDir)\..\..\common";..\prebuilt\ff130\include;"..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include";"..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\mozilla";"..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\WINNT_x86-msvc\include";"..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpconnect";"..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\WINNT_x86-msvc\include""
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF8;GECKO_VERSION=13000"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ TreatWChar_tAsBuiltInType="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ ResourceOutputFileName="$(IntDir)/$(TargetName).res"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="ws2_32.lib Advapi32.lib xpcomglue_s.lib xpcom.lib nspr4.lib mozalloc.lib xul.lib mozjs.lib"
+ ShowProgress="2"
+ OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff130\xpGwtDevPlugin.dll"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories=""..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\WINNT_x86-msvc\lib""
+ ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
+ SubSystem="2"
+ RandomizedBaseAddress="2"
+ DataExecutionPrevention="0"
+ ImportLibrary="$(IntDir)\$(TargetName).lib"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="Release130"
+ IntermediateDirectory="Release130"
+ ConfigurationType="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="3"
+ EnableIntrinsicFunctions="true"
+ AdditionalIncludeDirectories=""$(ProjectDir)\..\..\common";..\prebuilt\ff130\include;"..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include";"..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\mozilla";"..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\WINNT_x86-msvc\include";"..\..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpconnect""
+ PreprocessorDefinitions="WIN32;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF8;GECKO_VERSION=13000;$(NOINHERIT)"
+ ExceptionHandling="1"
+ RuntimeLibrary="0"
+ TreatWChar_tAsBuiltInType="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="false"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ ResourceOutputFileName="$(IntDir)/$(TargetName).res"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="ws2_32.lib Advapi32.lib xpcomglue_s.lib xpcom.lib nspr4.lib mozalloc.lib xul.lib mozjs.lib"
+ ShowProgress="2"
+ OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff130\xpGwtDevPlugin.dll"
+ LinkIncremental="0"
+ AdditionalLibraryDirectories=""..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\WINNT_x86-msvc\lib""
+ ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ RandomizedBaseAddress="2"
+ DataExecutionPrevention="0"
+ ImportLibrary="$(IntDir)\$(TargetName).lib"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ <File
+ RelativePath="..\ExternalWrapper.h"
+ >
+ </File>
+ <File
+ RelativePath="..\FFSessionHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\prebuilt\ff130\include\IOOPHM.h"
+ >
+ </File>
+ <File
+ RelativePath="..\JavaObject.h"
+ >
+ </File>
+ <File
+ RelativePath="..\JSRunner.h"
+ >
+ </File>
+ <File
+ RelativePath="..\mozincludes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\Preferences.h"
+ >
+ </File>
+ <File
+ RelativePath="..\RootedObject.h"
+ >
+ </File>
+ <File
+ RelativePath="..\SessionData.h"
+ >
+ </File>
+ <File
+ RelativePath="..\XpcomDebug.h"
+ >
+ </File>
+ <Filter
+ Name="common"
+ >
+ <File
+ RelativePath="..\..\common\AllowedConnections.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\BrowserChannel.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ByteOrder.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\CheckVersionsMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ChooseTransportMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Debug.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\DebugLevel.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FatalErrorMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FreeValueMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\HashMap.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\HostChannel.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeSpecialMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadJsniMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadModuleMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Message.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Platform.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ProtocolVersionMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\QuitMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ReturnMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\scoped_ptr\scoped_ptr.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ServerMethods.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\SessionHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Socket.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\SwitchTransportMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Value.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="gecko"
+ >
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\WINNT_x86-msvc\include\js-config.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\js\jsapi.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\js\jsautocfg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\js\jscompat.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\js\jsconfig.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\WINNT_x86-msvc\include\jscpucfg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\jscpucfg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\jsinttypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\js\jslong.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\jsosdep.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\js\jsotypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\js\jsproto.tbl"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\js\jspubtd.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\js\jstypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\js\jsutil.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\js\jsutil.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\js\jsutil.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\js\jsutil.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\WINNT_x86-msvc\include\mozilla-config.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpconnect\nsAXPCNativeCallContext.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsCOMPtr.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpcom\nscore.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nscore.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsCycleCollector.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsDebug.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsError.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\widget\nsEvent.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsICategoryManager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsIClassInfo.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsIClassInfoImpl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsIComponentManager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsID.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpcom\nsIEnumerator.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpcom\nsIException.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpcom\nsIExceptionService.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsIFactory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsIGenericFactory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\necko\nsIHttpProtocolHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpcom\nsIInterfaceInfo.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpcom\nsIInterfaceInfoManager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpconnect\nsIJSContextStack.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsIMemory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsIModule.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\caps\nsIPrincipal.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsIProgrammingLanguage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\necko\nsIProtocolHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\necko\nsIProxiedProtocolHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpconnect\nsIScriptableInterfaces.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\dom\nsIScriptGlobalObject.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\dom\nsIScriptObjectPrincipal.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\caps\nsISecurityCheckedComponent.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpcom\nsISerializable.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsIServiceManager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsISimpleEnumerator.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpcom\nsISimpleEnumerator.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsISupports.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpcom\nsISupports.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpcom\nsISupportsBase.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsISupportsBase.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsISupportsImpl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsISupportsUtils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpcom\nsISupportsUtils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsIURI.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpcom\nsIVariant.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpconnect\nsIXPConnect.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsMemory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\necko\nsNetCID.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpcom\nsrootidl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsrootidl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsServiceManagerUtils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsStringAPI.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsTraceRefcnt.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsXPCOM.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsXPCOMCID.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsXPCOMStrings.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\pratom.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\prcpucfg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\prinrval.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\prlock.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\prlog.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\prlong.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\obsolete\protypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\prthread.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\prtime.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\prtypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpconnect\xpccomponents.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpconnect\xpcexception.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpconnect\xpcjsid.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\WINNT_x86-msvc\include\xpcom-config.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpcom\xpt_arena.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpcom\xpt_struct.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpcom\xptinfo.h"
+ >
+ </File>
+ </Filter>
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ >
+ <File
+ RelativePath="..\xpGwtDevPlugin.rc"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\ExternalWrapper.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\FFSessionHandler.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\JavaObject.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\JSRunner.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\ModuleOOPHM.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ GeneratePreprocessedFile="0"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\Preferences.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\XpcomDebug.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\xpGwtDevPlugin.def"
+ >
+ </File>
+ <Filter
+ Name="common"
+ >
+ <File
+ RelativePath="..\..\common\AllowedConnections.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\CheckVersionsMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ChooseTransportMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Debug.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FatalErrorMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FreeValueMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\HostChannel.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeSpecialMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadJsniMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadModuleMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ProtocolVersionMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ReturnMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ServerMethods.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Socket.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\SwitchTransportMessage.cpp"
+ >
+ </File>
+ </Filter>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/plugins/xpcom/VisualStudio/ff140-xpcom.vcproj b/plugins/xpcom/VisualStudio/ff140-xpcom.vcproj
new file mode 100755
index 0000000..ee3d7f9
--- /dev/null
+++ b/plugins/xpcom/VisualStudio/ff140-xpcom.vcproj
@@ -0,0 +1,845 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="9.00"
+ Name="ff140-xpcom"
+ ProjectGUID="{6BF0C2CE-CB0C-421B-A67C-1E448371D24D}"
+ RootNamespace="ff140-xpcom"
+ Keyword="Win32Proj"
+ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="Debug140"
+ IntermediateDirectory="Debug140"
+ ConfigurationType="2"
+ UseOfMFC="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories=""$(ProjectDir)\..\..\common";..\prebuilt\ff140\include;"..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include";"..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\mozilla";"..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\WINNT_x86-msvc\include";"..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpconnect";"..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\WINNT_x86-msvc\include""
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF8;GECKO_VERSION=14000"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ TreatWChar_tAsBuiltInType="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ ResourceOutputFileName="$(IntDir)/$(TargetName).res"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="ws2_32.lib Advapi32.lib xpcomglue_s.lib xpcom.lib nspr4.lib mozalloc.lib xul.lib mozjs.lib"
+ ShowProgress="2"
+ OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff140\xpGwtDevPlugin.dll"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories=""..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\WINNT_x86-msvc\lib""
+ ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
+ SubSystem="2"
+ RandomizedBaseAddress="2"
+ DataExecutionPrevention="0"
+ ImportLibrary="$(IntDir)\$(TargetName).lib"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="Release140"
+ IntermediateDirectory="Release140"
+ ConfigurationType="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="3"
+ EnableIntrinsicFunctions="true"
+ AdditionalIncludeDirectories=""$(ProjectDir)\..\..\common";..\prebuilt\ff140\include;"..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include";"..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\mozilla";"..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\WINNT_x86-msvc\include";"..\..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpconnect""
+ PreprocessorDefinitions="WIN32;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF8;GECKO_VERSION=14000;$(NOINHERIT)"
+ ExceptionHandling="1"
+ RuntimeLibrary="0"
+ TreatWChar_tAsBuiltInType="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="false"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ ResourceOutputFileName="$(IntDir)/$(TargetName).res"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="ws2_32.lib Advapi32.lib xpcomglue_s.lib xpcom.lib nspr4.lib mozalloc.lib xul.lib mozjs.lib"
+ ShowProgress="2"
+ OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff140\xpGwtDevPlugin.dll"
+ LinkIncremental="0"
+ AdditionalLibraryDirectories=""..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\WINNT_x86-msvc\lib""
+ ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ RandomizedBaseAddress="2"
+ DataExecutionPrevention="0"
+ ImportLibrary="$(IntDir)\$(TargetName).lib"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ <File
+ RelativePath="..\ExternalWrapper.h"
+ >
+ </File>
+ <File
+ RelativePath="..\FFSessionHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\prebuilt\ff140\include\IOOPHM.h"
+ >
+ </File>
+ <File
+ RelativePath="..\JavaObject.h"
+ >
+ </File>
+ <File
+ RelativePath="..\JSRunner.h"
+ >
+ </File>
+ <File
+ RelativePath="..\mozincludes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\Preferences.h"
+ >
+ </File>
+ <File
+ RelativePath="..\RootedObject.h"
+ >
+ </File>
+ <File
+ RelativePath="..\SessionData.h"
+ >
+ </File>
+ <File
+ RelativePath="..\XpcomDebug.h"
+ >
+ </File>
+ <Filter
+ Name="common"
+ >
+ <File
+ RelativePath="..\..\common\AllowedConnections.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\BrowserChannel.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ByteOrder.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\CheckVersionsMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ChooseTransportMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Debug.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\DebugLevel.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FatalErrorMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FreeValueMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\HashMap.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\HostChannel.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeSpecialMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadJsniMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadModuleMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Message.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Platform.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ProtocolVersionMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\QuitMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ReturnMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\scoped_ptr\scoped_ptr.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ServerMethods.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\SessionHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Socket.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\SwitchTransportMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Value.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="gecko"
+ >
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\WINNT_x86-msvc\include\js-config.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\js\jsapi.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\js\jsautocfg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\js\jscompat.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\js\jsconfig.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\WINNT_x86-msvc\include\jscpucfg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\jscpucfg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\jsinttypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\js\jslong.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\jsosdep.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\js\jsotypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\js\jsproto.tbl"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\js\jspubtd.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\js\jstypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\js\jsutil.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\js\jsutil.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\js\jsutil.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\js\jsutil.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\WINNT_x86-msvc\include\mozilla-config.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpconnect\nsAXPCNativeCallContext.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsCOMPtr.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpcom\nscore.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nscore.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsCycleCollector.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsDebug.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsError.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\widget\nsEvent.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsICategoryManager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsIClassInfo.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsIClassInfoImpl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsIComponentManager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsID.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpcom\nsIEnumerator.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpcom\nsIException.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpcom\nsIExceptionService.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsIFactory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsIGenericFactory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\necko\nsIHttpProtocolHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpcom\nsIInterfaceInfo.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpcom\nsIInterfaceInfoManager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpconnect\nsIJSContextStack.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsIMemory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsIModule.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\caps\nsIPrincipal.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsIProgrammingLanguage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\necko\nsIProtocolHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\necko\nsIProxiedProtocolHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpconnect\nsIScriptableInterfaces.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\dom\nsIScriptGlobalObject.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\dom\nsIScriptObjectPrincipal.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\caps\nsISecurityCheckedComponent.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpcom\nsISerializable.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsIServiceManager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsISimpleEnumerator.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpcom\nsISimpleEnumerator.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsISupports.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpcom\nsISupports.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpcom\nsISupportsBase.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsISupportsBase.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsISupportsImpl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsISupportsUtils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpcom\nsISupportsUtils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsIURI.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpcom\nsIVariant.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpconnect\nsIXPConnect.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsMemory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\necko\nsNetCID.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpcom\nsrootidl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsrootidl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsServiceManagerUtils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsStringAPI.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsTraceRefcnt.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsXPCOM.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsXPCOMCID.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsXPCOMStrings.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\pratom.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\prcpucfg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\prinrval.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\prlock.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\prlog.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\prlong.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\obsolete\protypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\prthread.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\prtime.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\prtypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpconnect\xpccomponents.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpconnect\xpcexception.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpconnect\xpcjsid.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\WINNT_x86-msvc\include\xpcom-config.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpcom\xpt_arena.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpcom\xpt_struct.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpcom\xptinfo.h"
+ >
+ </File>
+ </Filter>
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ >
+ <File
+ RelativePath="..\xpGwtDevPlugin.rc"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\ExternalWrapper.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\FFSessionHandler.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\JavaObject.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\JSRunner.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\ModuleOOPHM.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ GeneratePreprocessedFile="0"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\Preferences.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\XpcomDebug.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\xpGwtDevPlugin.def"
+ >
+ </File>
+ <Filter
+ Name="common"
+ >
+ <File
+ RelativePath="..\..\common\AllowedConnections.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\CheckVersionsMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ChooseTransportMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Debug.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FatalErrorMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FreeValueMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\HostChannel.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeSpecialMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadJsniMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadModuleMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ProtocolVersionMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ReturnMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ServerMethods.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Socket.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\SwitchTransportMessage.cpp"
+ >
+ </File>
+ </Filter>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/plugins/xpcom/VisualStudio/ff150-xpcom.vcproj b/plugins/xpcom/VisualStudio/ff150-xpcom.vcproj
new file mode 100755
index 0000000..ebcf539
--- /dev/null
+++ b/plugins/xpcom/VisualStudio/ff150-xpcom.vcproj
@@ -0,0 +1,846 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="9.00"
+ Name="ff150-xpcom"
+ ProjectGUID="{6BF0C2CE-CB0C-421B-A67C-1E448371D24D}"
+ RootNamespace="ff150-xpcom"
+ Keyword="Win32Proj"
+ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="Debug150"
+ IntermediateDirectory="Debug150"
+ ConfigurationType="2"
+ UseOfMFC="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories=""$(ProjectDir)\..\..\common";..\prebuilt\ff150\include;"..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include";"..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\mozilla";"..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\WINNT_x86-msvc\include";"..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpconnect";"..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\WINNT_x86-msvc\include""
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF8;GECKO_VERSION=15000"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ TreatWChar_tAsBuiltInType="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ ResourceOutputFileName="$(IntDir)/$(TargetName).res"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="ws2_32.lib Advapi32.lib xpcomglue_s.lib xpcom.lib nspr4.lib mozalloc.lib xul.lib mozjs.lib"
+ ShowProgress="2"
+ OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff150\xpGwtDevPlugin.dll"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories=""..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\WINNT_x86-msvc\lib""
+ ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
+ SubSystem="2"
+ RandomizedBaseAddress="2"
+ DataExecutionPrevention="0"
+ ImportLibrary="$(IntDir)\$(TargetName).lib"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="Release150"
+ IntermediateDirectory="Release150"
+ ConfigurationType="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="3"
+ EnableIntrinsicFunctions="true"
+ AdditionalIncludeDirectories=""$(ProjectDir)\..\..\common";..\prebuilt\ff150\include;"..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include";"..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\mozilla";"..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\WINNT_x86-msvc\include";"..\..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpconnect""
+ PreprocessorDefinitions="WIN32;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF8;GECKO_VERSION=15000;$(NOINHERIT)"
+ ExceptionHandling="1"
+ RuntimeLibrary="0"
+ TreatWChar_tAsBuiltInType="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="false"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ ResourceOutputFileName="$(IntDir)/$(TargetName).res"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="ws2_32.lib Advapi32.lib xpcomglue_s.lib xpcom.lib nspr4.lib mozalloc.lib xul.lib mozjs.lib msvcrt.lib"
+ ShowProgress="2"
+ OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff150\xpGwtDevPlugin.dll"
+ LinkIncremental="0"
+ AdditionalLibraryDirectories=""..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\WINNT_x86-msvc\lib""
+ IgnoreDefaultLibraryNames=""
+ ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ RandomizedBaseAddress="2"
+ DataExecutionPrevention="0"
+ ImportLibrary="$(IntDir)\$(TargetName).lib"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ <File
+ RelativePath="..\ExternalWrapper.h"
+ >
+ </File>
+ <File
+ RelativePath="..\FFSessionHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\prebuilt\ff150\include\IOOPHM.h"
+ >
+ </File>
+ <File
+ RelativePath="..\JavaObject.h"
+ >
+ </File>
+ <File
+ RelativePath="..\JSRunner.h"
+ >
+ </File>
+ <File
+ RelativePath="..\mozincludes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\Preferences.h"
+ >
+ </File>
+ <File
+ RelativePath="..\RootedObject.h"
+ >
+ </File>
+ <File
+ RelativePath="..\SessionData.h"
+ >
+ </File>
+ <File
+ RelativePath="..\XpcomDebug.h"
+ >
+ </File>
+ <Filter
+ Name="common"
+ >
+ <File
+ RelativePath="..\..\common\AllowedConnections.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\BrowserChannel.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ByteOrder.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\CheckVersionsMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ChooseTransportMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Debug.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\DebugLevel.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FatalErrorMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FreeValueMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\HashMap.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\HostChannel.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeSpecialMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadJsniMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadModuleMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Message.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Platform.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ProtocolVersionMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\QuitMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ReturnMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\scoped_ptr\scoped_ptr.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ServerMethods.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\SessionHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Socket.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\SwitchTransportMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Value.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="gecko"
+ >
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\WINNT_x86-msvc\include\js-config.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\js\jsapi.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\js\jsautocfg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\js\jscompat.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\js\jsconfig.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\WINNT_x86-msvc\include\jscpucfg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\jscpucfg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\jsinttypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\js\jslong.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\jsosdep.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\js\jsotypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\js\jsproto.tbl"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\js\jspubtd.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\js\jstypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\js\jsutil.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\js\jsutil.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\js\jsutil.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\js\jsutil.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\WINNT_x86-msvc\include\mozilla-config.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpconnect\nsAXPCNativeCallContext.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsCOMPtr.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nscore.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpcom\nscore.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsCycleCollector.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsDebug.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsError.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\widget\nsEvent.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsICategoryManager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsIClassInfo.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsIClassInfoImpl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsIComponentManager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsID.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpcom\nsIEnumerator.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpcom\nsIException.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpcom\nsIExceptionService.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsIFactory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsIGenericFactory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\necko\nsIHttpProtocolHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpcom\nsIInterfaceInfo.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpcom\nsIInterfaceInfoManager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpconnect\nsIJSContextStack.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsIMemory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsIModule.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\caps\nsIPrincipal.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsIProgrammingLanguage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\necko\nsIProtocolHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\necko\nsIProxiedProtocolHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpconnect\nsIScriptableInterfaces.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\dom\nsIScriptGlobalObject.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\dom\nsIScriptObjectPrincipal.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\caps\nsISecurityCheckedComponent.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpcom\nsISerializable.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsIServiceManager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpcom\nsISimpleEnumerator.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsISimpleEnumerator.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpcom\nsISupports.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsISupports.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpcom\nsISupportsBase.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsISupportsBase.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsISupportsImpl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpcom\nsISupportsUtils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsISupportsUtils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsIURI.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpcom\nsIVariant.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpconnect\nsIXPConnect.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsMemory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\necko\nsNetCID.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsrootidl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpcom\nsrootidl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsServiceManagerUtils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsStringAPI.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsTraceRefcnt.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsXPCOM.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsXPCOMCID.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsXPCOMStrings.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\pratom.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\prcpucfg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\prinrval.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\prlock.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\prlog.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\prlong.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\obsolete\protypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\prthread.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\prtime.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\prtypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpconnect\xpccomponents.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpconnect\xpcexception.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpconnect\xpcjsid.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\WINNT_x86-msvc\include\xpcom-config.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpcom\xpt_arena.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpcom\xpt_struct.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpcom\xptinfo.h"
+ >
+ </File>
+ </Filter>
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ >
+ <File
+ RelativePath="..\xpGwtDevPlugin.rc"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\ExternalWrapper.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\FFSessionHandler.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\JavaObject.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\JSRunner.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\ModuleOOPHM.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ GeneratePreprocessedFile="0"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\Preferences.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\XpcomDebug.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\xpGwtDevPlugin.def"
+ >
+ </File>
+ <Filter
+ Name="common"
+ >
+ <File
+ RelativePath="..\..\common\AllowedConnections.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\CheckVersionsMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ChooseTransportMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Debug.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FatalErrorMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FreeValueMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\HostChannel.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeSpecialMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadJsniMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadModuleMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ProtocolVersionMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ReturnMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ServerMethods.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Socket.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\SwitchTransportMessage.cpp"
+ >
+ </File>
+ </Filter>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/plugins/xpcom/VisualStudio/ff3-xpcom.vcproj b/plugins/xpcom/VisualStudio/ff3-xpcom.vcproj
new file mode 100755
index 0000000..582c455
--- /dev/null
+++ b/plugins/xpcom/VisualStudio/ff3-xpcom.vcproj
@@ -0,0 +1,837 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="9.00"
+ Name="ff3-xpcom"
+ ProjectGUID="{6BF0C2CE-CB0C-421B-A67C-1E448371D24C}"
+ RootNamespace="ff3-xpcom"
+ Keyword="Win32Proj"
+ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="Debug3"
+ IntermediateDirectory="Debug3"
+ ConfigurationType="2"
+ UseOfMFC="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories=""$(ProjectDir)\..\..\common";"..\prebuilt\ff3\include";"..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\WINNT_x86-msvc\include";"..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include";"..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include""
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF3"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ TreatWChar_tAsBuiltInType="false"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ ResourceOutputFileName="$(IntDir)/$(TargetName).res"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="ws2_32.lib xpcomglue_s.lib xpcom.lib nspr4.lib js3250.lib"
+ ShowProgress="2"
+ OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff3\xpGwtDevPlugin.dll"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\WINNT_x86-msvc\lib"
+ ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
+ SubSystem="2"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ ImportLibrary="$(IntDir)\$(TargetName).lib"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="Release3"
+ IntermediateDirectory="Release3"
+ ConfigurationType="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="3"
+ EnableIntrinsicFunctions="true"
+ AdditionalIncludeDirectories=""$(ProjectDir)\..\..\common";..\prebuilt\ff3\include;"..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\WINNT_x86-msvc\include";"..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include""
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Warning;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF3;BROWSER=ff3;GECKO_VERSION=1900"
+ ExceptionHandling="1"
+ RuntimeLibrary="0"
+ TreatWChar_tAsBuiltInType="false"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="false"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ ResourceOutputFileName="$(IntDir)/$(TargetName).res"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="ws2_32.lib xpcomglue_s.lib xpcom.lib nspr4.lib js3250.lib"
+ ShowProgress="2"
+ OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff3\xpGwtDevPlugin.dll"
+ LinkIncremental="0"
+ AdditionalLibraryDirectories=""..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\WINNT_x86-msvc\lib""
+ ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ ImportLibrary="$(IntDir)\$(TargetName).lib"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ <File
+ RelativePath="..\ExternalWrapper.h"
+ >
+ </File>
+ <File
+ RelativePath="..\FFSessionHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\prebuilt\ff3\include\IOOPHM.h"
+ >
+ </File>
+ <File
+ RelativePath="..\JavaObject.h"
+ >
+ </File>
+ <File
+ RelativePath="..\JSRunner.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ModuleOOPHM.h"
+ >
+ </File>
+ <File
+ RelativePath="..\mozincludes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\Preferences.h"
+ >
+ </File>
+ <File
+ RelativePath="..\RootedObject.h"
+ >
+ </File>
+ <File
+ RelativePath="..\SessionData.h"
+ >
+ </File>
+ <File
+ RelativePath="..\XpcomDebug.h"
+ >
+ </File>
+ <Filter
+ Name="common"
+ >
+ <File
+ RelativePath="..\..\common\AllowedConnections.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\BrowserChannel.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ByteOrder.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\CheckVersionsMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ChooseTransportMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Debug.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\DebugLevel.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FatalErrorMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FreeValueMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\HashMap.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\HostChannel.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeSpecialMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadJsniMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadModuleMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Message.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Platform.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ProtocolVersionMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\QuitMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ReturnMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\scoped_ptr\scoped_ptr.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ServerMethods.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\SessionHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Socket.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\SwitchTransportMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Value.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="gecko"
+ >
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jsapi.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jsautocfg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jscompat.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jsconfig.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jscpucfg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jslong.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jsosdep.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jsotypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jsproto.tbl"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jspubtd.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jstypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jsutil.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jsutil.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jsutil.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jsutil.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\WINNT_x86-msvc\include\mozilla-config.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsAXPCNativeCallContext.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsCOMPtr.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nscore.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nscore.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsCycleCollector.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsDebug.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsError.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsEvent.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsICategoryManager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIClassInfo.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIClassInfoImpl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIComponentManager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsID.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIEnumerator.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIException.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIExceptionService.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIFactory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIGenericFactory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIHttpProtocolHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIInterfaceInfo.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIInterfaceInfoManager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIJSContextStack.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIMemory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIModule.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIPrincipal.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIProgrammingLanguage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIProtocolHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIProxiedProtocolHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIScriptableInterfaces.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIScriptGlobalObject.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIScriptObjectPrincipal.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsISecurityCheckedComponent.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsISerializable.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIServiceManager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsISimpleEnumerator.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsISimpleEnumerator.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsISupports.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsISupports.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsISupportsBase.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsISupportsBase.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsISupportsImpl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsISupportsUtils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsISupportsUtils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIURI.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIVariant.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIXPConnect.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsMemory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsNetCID.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsrootidl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsrootidl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsServiceManagerUtils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsStringAPI.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsTraceRefcnt.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsXPCOM.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsXPCOMCID.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsXPCOMStrings.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\pratom.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\prcpucfg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\prinrval.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\prlock.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\prlog.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\prlong.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\obsolete\protypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\prthread.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\prtime.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\prtypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\xpccomponents.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\xpcexception.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\xpcjsid.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\WINNT_x86-msvc\include\xpcom-config.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\xpt_arena.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\xpt_struct.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\xptinfo.h"
+ >
+ </File>
+ </Filter>
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ >
+ <File
+ RelativePath="..\xpGwtDevPlugin.rc"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\ExternalWrapper.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\FFSessionHandler.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\JavaObject.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\JSRunner.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\ModuleOOPHM.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ GeneratePreprocessedFile="0"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\Preferences.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\XpcomDebug.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\xpGwtDevPlugin.def"
+ >
+ </File>
+ <Filter
+ Name="common"
+ >
+ <File
+ RelativePath="..\..\common\AllowedConnections.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\CheckVersionsMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ChooseTransportMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Debug.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FatalErrorMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FreeValueMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\HostChannel.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeSpecialMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadJsniMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadModuleMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ProtocolVersionMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ReturnMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ServerMethods.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Socket.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\SwitchTransportMessage.cpp"
+ >
+ </File>
+ </Filter>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/plugins/xpcom/VisualStudio/ff3-xpcom.vcxproj b/plugins/xpcom/VisualStudio/ff3-xpcom.vcxproj
new file mode 100644
index 0000000..53575bb
--- /dev/null
+++ b/plugins/xpcom/VisualStudio/ff3-xpcom.vcxproj
@@ -0,0 +1,269 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{6BF0C2CE-CB0C-421B-A67C-1E448371D24C}</ProjectGuid>
+ <RootNamespace>ff3-xpcom</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>Static</UseOfMfc>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Debug3\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Debug3\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Release3\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Release3\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>$(ProjectDir)\..\..\common;..\prebuilt\ff3\include;..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\WINNT_x86-msvc\include;..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF3;BROWSER=ff3;GECKO_VERSION=1900;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <TreatWChar_tAsBuiltInType>false</TreatWChar_tAsBuiltInType>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <ResourceCompile>
+ <ResourceOutputFileName>$(IntDir)$(TargetName).res</ResourceOutputFileName>
+ </ResourceCompile>
+ <Link>
+ <AdditionalDependencies>ws2_32.lib;xpcomglue_s.lib;xpcom.lib;nspr4.lib;js3250.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <ShowProgress>LinkVerboseLib</ShowProgress>
+ <OutputFile>$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff3\xpGwtDevPlugin.dll</OutputFile>
+ <AdditionalLibraryDirectories>..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\WINNT_x86-msvc\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ <ModuleDefinitionFile>$(ProjectDir)\..\xpGwtDevPlugin.def</ModuleDefinitionFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
+ <SubSystem>Windows</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <Optimization>Full</Optimization>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <AdditionalIncludeDirectories>$(ProjectDir)\..\..\common;..\prebuilt\ff3\include;..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\WINNT_x86-msvc\include;..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Warning;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF3;BROWSER=ff3;GECKO_VERSION=1900;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <ExceptionHandling>Sync</ExceptionHandling>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <TreatWChar_tAsBuiltInType>false</TreatWChar_tAsBuiltInType>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <ResourceCompile>
+ <ResourceOutputFileName>$(IntDir)$(TargetName).res</ResourceOutputFileName>
+ </ResourceCompile>
+ <Link>
+ <AdditionalDependencies>ws2_32.lib;xpcomglue_s.lib;xpcom.lib;nspr4.lib;js3250.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <ShowProgress>LinkVerboseLib</ShowProgress>
+ <OutputFile>$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff3\xpGwtDevPlugin.dll</OutputFile>
+ <AdditionalLibraryDirectories>..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\WINNT_x86-msvc\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ <ModuleDefinitionFile>$(ProjectDir)\..\xpGwtDevPlugin.def</ModuleDefinitionFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
+ <SubSystem>Windows</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClInclude Include="..\ExternalWrapper.h" />
+ <ClInclude Include="..\FFSessionHandler.h" />
+ <ClInclude Include="..\prebuilt\ff3\include\IOOPHM.h" />
+ <ClInclude Include="..\JavaObject.h" />
+ <ClInclude Include="..\JSRunner.h" />
+ <ClInclude Include="..\ModuleOOPHM.h" />
+ <ClInclude Include="..\mozincludes.h" />
+ <ClInclude Include="..\Preferences.h" />
+ <ClInclude Include="..\RootedObject.h" />
+ <ClInclude Include="..\SessionData.h" />
+ <ClInclude Include="..\XpcomDebug.h" />
+ <ClInclude Include="..\..\common\AllowedConnections.h" />
+ <ClInclude Include="..\..\common\BrowserChannel.h" />
+ <ClInclude Include="..\..\common\ByteOrder.h" />
+ <ClInclude Include="..\..\common\CheckVersionsMessage.h" />
+ <ClInclude Include="..\..\common\ChooseTransportMessage.h" />
+ <ClInclude Include="..\..\common\Debug.h" />
+ <ClInclude Include="..\..\common\DebugLevel.h" />
+ <ClInclude Include="..\..\common\FatalErrorMessage.h" />
+ <ClInclude Include="..\..\common\FreeValueMessage.h" />
+ <ClInclude Include="..\..\common\HashMap.h" />
+ <ClInclude Include="..\..\common\HostChannel.h" />
+ <ClInclude Include="..\..\common\InvokeMessage.h" />
+ <ClInclude Include="..\..\common\InvokeSpecialMessage.h" />
+ <ClInclude Include="..\..\common\LoadJsniMessage.h" />
+ <ClInclude Include="..\..\common\LoadModuleMessage.h" />
+ <ClInclude Include="..\..\common\Message.h" />
+ <ClInclude Include="..\..\common\Platform.h" />
+ <ClInclude Include="..\..\common\ProtocolVersionMessage.h" />
+ <ClInclude Include="..\..\common\QuitMessage.h" />
+ <ClInclude Include="..\..\common\ReturnMessage.h" />
+ <ClInclude Include="..\..\common\scoped_ptr\scoped_ptr.h" />
+ <ClInclude Include="..\..\common\ServerMethods.h" />
+ <ClInclude Include="..\..\common\SessionHandler.h" />
+ <ClInclude Include="..\..\common\Socket.h" />
+ <ClInclude Include="..\..\common\SwitchTransportMessage.h" />
+ <ClInclude Include="..\..\common\Value.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jsapi.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jsautocfg.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jscompat.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jsconfig.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jscpucfg.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jslong.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jsosdep.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jsotypes.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jspubtd.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jstypes.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jsutil.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\WINNT_x86-msvc\include\mozilla-config.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsAXPCNativeCallContext.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsCOMPtr.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nscore.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsCycleCollector.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsDebug.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsError.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsEvent.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsICategoryManager.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIClassInfo.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIClassInfoImpl.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIComponentManager.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsID.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIEnumerator.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIException.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIExceptionService.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIFactory.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIGenericFactory.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIHttpProtocolHandler.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIInterfaceInfo.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIInterfaceInfoManager.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIJSContextStack.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIMemory.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIModule.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIPrincipal.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIProgrammingLanguage.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIProtocolHandler.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIProxiedProtocolHandler.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIScriptableInterfaces.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIScriptGlobalObject.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIScriptObjectPrincipal.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsISecurityCheckedComponent.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsISerializable.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIServiceManager.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsISimpleEnumerator.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsISupports.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsISupportsBase.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsISupportsImpl.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsISupportsUtils.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIURI.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIVariant.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIXPConnect.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsMemory.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsNetCID.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsrootidl.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsServiceManagerUtils.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsStringAPI.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsTraceRefcnt.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsXPCOM.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsXPCOMCID.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsXPCOMStrings.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\pratom.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\prcpucfg.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\prinrval.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\prlock.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\prlog.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\prlong.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\obsolete\protypes.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\prthread.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\prtime.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\prtypes.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\xpccomponents.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\xpcexception.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\xpcjsid.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\WINNT_x86-msvc\include\xpcom-config.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\xpt_arena.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\xpt_struct.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\xptinfo.h" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jsproto.tbl" />
+ <None Include="..\xpGwtDevPlugin.def" />
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="..\xpGwtDevPlugin.rc" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\ExternalWrapper.cpp" />
+ <ClCompile Include="..\FFSessionHandler.cpp" />
+ <ClCompile Include="..\JavaObject.cpp" />
+ <ClCompile Include="..\JSRunner.cpp" />
+ <ClCompile Include="..\ModuleOOPHM.cpp">
+ <PreprocessToFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</PreprocessToFile>
+ <PreprocessSuppressLineNumbers Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</PreprocessSuppressLineNumbers>
+ </ClCompile>
+ <ClCompile Include="..\Preferences.cpp" />
+ <ClCompile Include="..\XpcomDebug.cpp" />
+ <ClCompile Include="..\..\common\AllowedConnections.cpp" />
+ <ClCompile Include="..\..\common\CheckVersionsMessage.cpp" />
+ <ClCompile Include="..\..\common\ChooseTransportMessage.cpp" />
+ <ClCompile Include="..\..\common\Debug.cpp" />
+ <ClCompile Include="..\..\common\FatalErrorMessage.cpp" />
+ <ClCompile Include="..\..\common\FreeValueMessage.cpp" />
+ <ClCompile Include="..\..\common\HostChannel.cpp" />
+ <ClCompile Include="..\..\common\InvokeMessage.cpp" />
+ <ClCompile Include="..\..\common\InvokeSpecialMessage.cpp" />
+ <ClCompile Include="..\..\common\LoadJsniMessage.cpp" />
+ <ClCompile Include="..\..\common\LoadModuleMessage.cpp" />
+ <ClCompile Include="..\..\common\ProtocolVersionMessage.cpp" />
+ <ClCompile Include="..\..\common\ReturnMessage.cpp" />
+ <ClCompile Include="..\..\common\ServerMethods.cpp" />
+ <ClCompile Include="..\..\common\Socket.cpp" />
+ <ClCompile Include="..\..\common\SwitchTransportMessage.cpp" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project>
\ No newline at end of file
diff --git a/plugins/xpcom/VisualStudio/ff3-xpcom.vcxproj.filters b/plugins/xpcom/VisualStudio/ff3-xpcom.vcxproj.filters
new file mode 100644
index 0000000..94395ca
--- /dev/null
+++ b/plugins/xpcom/VisualStudio/ff3-xpcom.vcxproj.filters
@@ -0,0 +1,460 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Header Files">
+ <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
+ <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
+ </Filter>
+ <Filter Include="Header Files\common">
+ <UniqueIdentifier>{fc617b60-337a-4e22-a021-35cb77fb21d7}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Header Files\gecko">
+ <UniqueIdentifier>{9d802c13-b225-4cb5-8cbf-794f114b390a}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Resource Files">
+ <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
+ <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx</Extensions>
+ </Filter>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+ <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+ </Filter>
+ <Filter Include="Source Files\common">
+ <UniqueIdentifier>{b7f8abdc-77a5-4e89-9c37-3528a82c42d2}</UniqueIdentifier>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\ExternalWrapper.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\FFSessionHandler.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\prebuilt\ff3\include\IOOPHM.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\JavaObject.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\JSRunner.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\ModuleOOPHM.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\mozincludes.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Preferences.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\RootedObject.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\SessionData.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\XpcomDebug.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\AllowedConnections.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\BrowserChannel.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\ByteOrder.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\CheckVersionsMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\ChooseTransportMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\Debug.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\DebugLevel.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\FatalErrorMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\FreeValueMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\HashMap.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\HostChannel.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\InvokeMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\InvokeSpecialMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\LoadJsniMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\LoadModuleMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\Message.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\Platform.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\ProtocolVersionMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\QuitMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\ReturnMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\scoped_ptr\scoped_ptr.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\ServerMethods.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\SessionHandler.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\Socket.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\SwitchTransportMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\Value.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jsapi.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jsautocfg.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jscompat.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jsconfig.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jscpucfg.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jslong.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jsosdep.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jsotypes.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jspubtd.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jstypes.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jsutil.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\WINNT_x86-msvc\include\mozilla-config.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsAXPCNativeCallContext.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsCOMPtr.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nscore.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsCycleCollector.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsDebug.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsError.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsEvent.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsICategoryManager.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIClassInfo.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIClassInfoImpl.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIComponentManager.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsID.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIEnumerator.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIException.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIExceptionService.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIFactory.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIGenericFactory.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIHttpProtocolHandler.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIInterfaceInfo.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIInterfaceInfoManager.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIJSContextStack.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIMemory.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIModule.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIPrincipal.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIProgrammingLanguage.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIProtocolHandler.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIProxiedProtocolHandler.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIScriptableInterfaces.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIScriptGlobalObject.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIScriptObjectPrincipal.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsISecurityCheckedComponent.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsISerializable.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIServiceManager.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsISimpleEnumerator.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsISupports.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsISupportsBase.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsISupportsImpl.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsISupportsUtils.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIURI.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIVariant.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIXPConnect.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsMemory.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsNetCID.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsrootidl.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsServiceManagerUtils.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsStringAPI.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsTraceRefcnt.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsXPCOM.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsXPCOMCID.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsXPCOMStrings.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\pratom.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\prcpucfg.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\prinrval.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\prlock.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\prlog.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\prlong.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\obsolete\protypes.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\prthread.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\prtime.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\prtypes.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\xpccomponents.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\xpcexception.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\xpcjsid.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\WINNT_x86-msvc\include\xpcom-config.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\xpt_arena.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\xpt_struct.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\xptinfo.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jsproto.tbl">
+ <Filter>Header Files\gecko</Filter>
+ </None>
+ <None Include="..\xpGwtDevPlugin.def">
+ <Filter>Source Files</Filter>
+ </None>
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="..\xpGwtDevPlugin.rc">
+ <Filter>Resource Files</Filter>
+ </ResourceCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\ExternalWrapper.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\FFSessionHandler.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\JavaObject.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\JSRunner.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\ModuleOOPHM.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Preferences.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\XpcomDebug.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\AllowedConnections.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\CheckVersionsMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\ChooseTransportMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\Debug.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\FatalErrorMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\FreeValueMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\HostChannel.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\InvokeMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\InvokeSpecialMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\LoadJsniMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\LoadModuleMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\ProtocolVersionMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\ReturnMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\ServerMethods.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\Socket.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\SwitchTransportMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ </ItemGroup>
+</Project>
\ No newline at end of file
diff --git a/plugins/xpcom/VisualStudio/ff35-xpcom.vcproj b/plugins/xpcom/VisualStudio/ff35-xpcom.vcproj
new file mode 100755
index 0000000..02682dc
--- /dev/null
+++ b/plugins/xpcom/VisualStudio/ff35-xpcom.vcproj
@@ -0,0 +1,837 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="9.00"
+ Name="ff35-xpcom"
+ ProjectGUID="{59A0C5AD-DE66-4C6D-9164-86F31308E719}"
+ RootNamespace="ff35-xpcom"
+ Keyword="Win32Proj"
+ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="Debug35"
+ IntermediateDirectory="Debug35"
+ ConfigurationType="2"
+ UseOfMFC="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories=""$(ProjectDir)\..\..\common";..\prebuilt\ff35\include;"..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\WINNT_x86-msvc\include";"..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include""
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF3"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ TreatWChar_tAsBuiltInType="false"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ ResourceOutputFileName="$(IntDir)/$(TargetName).res"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="ws2_32.lib xpcomglue_s.lib xpcom.lib nspr4.lib js3250.lib"
+ ShowProgress="2"
+ OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff35\xpGwtDevPlugin.dll"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories=""..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\WINNT_x86-msvc\lib""
+ ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
+ SubSystem="2"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ ImportLibrary="$(IntDir)\$(TargetName).lib"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="Release35"
+ IntermediateDirectory="Release35"
+ ConfigurationType="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="3"
+ EnableIntrinsicFunctions="true"
+ AdditionalIncludeDirectories=""$(ProjectDir)\..\..\common";..\prebuilt\ff35\include;"..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\WINNT_x86-msvc\include";"..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include""
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Warning;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF3;BROWSER=ff35;GECKO_VERSION=1901"
+ ExceptionHandling="1"
+ RuntimeLibrary="0"
+ TreatWChar_tAsBuiltInType="false"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="false"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ ResourceOutputFileName="$(IntDir)/$(TargetName).res"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="ws2_32.lib xpcomglue_s.lib xpcom.lib nspr4.lib js3250.lib"
+ ShowProgress="2"
+ OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff35\xpGwtDevPlugin.dll"
+ LinkIncremental="0"
+ AdditionalLibraryDirectories=""..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\WINNT_x86-msvc\lib""
+ ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ ImportLibrary="$(IntDir)\$(TargetName).lib"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ <File
+ RelativePath="..\ExternalWrapper.h"
+ >
+ </File>
+ <File
+ RelativePath="..\FFSessionHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\prebuilt\ff35\include\IOOPHM.h"
+ >
+ </File>
+ <File
+ RelativePath="..\JavaObject.h"
+ >
+ </File>
+ <File
+ RelativePath="..\JSRunner.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ModuleOOPHM.h"
+ >
+ </File>
+ <File
+ RelativePath="..\mozincludes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\Preferences.h"
+ >
+ </File>
+ <File
+ RelativePath="..\RootedObject.h"
+ >
+ </File>
+ <File
+ RelativePath="..\SessionData.h"
+ >
+ </File>
+ <File
+ RelativePath="..\XpcomDebug.h"
+ >
+ </File>
+ <Filter
+ Name="common"
+ >
+ <File
+ RelativePath="..\..\common\AllowedConnections.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\BrowserChannel.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ByteOrder.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\CheckVersionsMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ChooseTransportMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Debug.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\DebugLevel.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FatalErrorMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FreeValueMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\HashMap.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\HostChannel.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeSpecialMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadJsniMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadModuleMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Message.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Platform.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ProtocolVersionMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\QuitMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ReturnMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\scoped_ptr\scoped_ptr.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ServerMethods.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\SessionHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Socket.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\SwitchTransportMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Value.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="gecko"
+ >
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jsapi.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jsautocfg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jscompat.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jsconfig.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\jscpucfg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jslong.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\jsosdep.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jsotypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jsproto.tbl"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jspubtd.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jstypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jsutil.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jsutil.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jsutil.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jsutil.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\WINNT_x86-msvc\include\mozilla-config.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpconnect\nsAXPCNativeCallContext.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsCOMPtr.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nscore.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nscore.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsCycleCollector.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsDebug.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsError.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\widget\nsEvent.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsICategoryManager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsIClassInfo.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsIClassInfoImpl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsIComponentManager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsID.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsIEnumerator.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsIException.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsIExceptionService.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsIFactory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsIGenericFactory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\necko\nsIHttpProtocolHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsIInterfaceInfo.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsIInterfaceInfoManager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpconnect\nsIJSContextStack.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsIMemory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsIModule.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\caps\nsIPrincipal.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsIProgrammingLanguage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\necko\nsIProtocolHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\necko\nsIProxiedProtocolHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpconnect\nsIScriptableInterfaces.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\dom\nsIScriptGlobalObject.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\dom\nsIScriptObjectPrincipal.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\caps\nsISecurityCheckedComponent.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsISerializable.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsIServiceManager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsISimpleEnumerator.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsISimpleEnumerator.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsISupports.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsISupports.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsISupportsBase.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsISupportsBase.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsISupportsImpl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsISupportsUtils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsISupportsUtils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsIURI.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsIVariant.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpconnect\nsIXPConnect.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsMemory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\necko\nsNetCID.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsrootidl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsrootidl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsServiceManagerUtils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsStringAPI.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsTraceRefcnt.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsXPCOM.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsXPCOMCID.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsXPCOMStrings.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\pratom.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\prcpucfg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\prinrval.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\prlock.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\prlog.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\prlong.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\obsolete\protypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\prthread.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\prtime.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\prtypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpconnect\xpccomponents.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpconnect\xpcexception.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpconnect\xpcjsid.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\WINNT_x86-msvc\include\xpcom-config.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\xpt_arena.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\xpt_struct.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\xptinfo.h"
+ >
+ </File>
+ </Filter>
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ >
+ <File
+ RelativePath="..\xpGwtDevPlugin.rc"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\ExternalWrapper.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\FFSessionHandler.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\JavaObject.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\JSRunner.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\ModuleOOPHM.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ GeneratePreprocessedFile="0"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\Preferences.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\XpcomDebug.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\xpGwtDevPlugin.def"
+ >
+ </File>
+ <Filter
+ Name="common"
+ >
+ <File
+ RelativePath="..\..\common\AllowedConnections.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\CheckVersionsMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ChooseTransportMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Debug.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FatalErrorMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FreeValueMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\HostChannel.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeSpecialMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadJsniMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadModuleMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ProtocolVersionMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ReturnMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ServerMethods.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Socket.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\SwitchTransportMessage.cpp"
+ >
+ </File>
+ </Filter>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/plugins/xpcom/VisualStudio/ff35-xpcom.vcxproj b/plugins/xpcom/VisualStudio/ff35-xpcom.vcxproj
new file mode 100644
index 0000000..eaef50d
--- /dev/null
+++ b/plugins/xpcom/VisualStudio/ff35-xpcom.vcxproj
@@ -0,0 +1,275 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{59A0C5AD-DE66-4C6D-9164-86F31308E719}</ProjectGuid>
+ <RootNamespace>ff35-xpcom</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>Static</UseOfMfc>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Debug35\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Debug35\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Release35\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Release35\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>$(ProjectDir)\..\..\common;..\prebuilt\ff35\include;..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\WINNT_x86-msvc\include;..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF3;BROWSER=ff35;GECKO_VERSION=1901;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <TreatWChar_tAsBuiltInType>false</TreatWChar_tAsBuiltInType>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <ResourceCompile>
+ <ResourceOutputFileName>$(IntDir)$(TargetName).res</ResourceOutputFileName>
+ </ResourceCompile>
+ <Link>
+ <AdditionalDependencies>ws2_32.lib;xpcomglue_s.lib;xpcom.lib;nspr4.lib;js3250.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <ShowProgress>LinkVerboseLib</ShowProgress>
+ <OutputFile>$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff35\xpGwtDevPlugin.dll</OutputFile>
+ <AdditionalLibraryDirectories>..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\WINNT_x86-msvc\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ <ModuleDefinitionFile>$(ProjectDir)\..\xpGwtDevPlugin.def</ModuleDefinitionFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
+ <SubSystem>Windows</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <Optimization>Full</Optimization>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <AdditionalIncludeDirectories>$(ProjectDir)\..\..\common;..\prebuilt\ff35\include;..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\WINNT_x86-msvc\include;..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Warning;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF3;BROWSER=ff35;GECKO_VERSION=1901;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <ExceptionHandling>Sync</ExceptionHandling>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <TreatWChar_tAsBuiltInType>false</TreatWChar_tAsBuiltInType>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <ResourceCompile>
+ <ResourceOutputFileName>$(IntDir)$(TargetName).res</ResourceOutputFileName>
+ </ResourceCompile>
+ <Link>
+ <AdditionalDependencies>ws2_32.lib;xpcomglue_s.lib;xpcom.lib;nspr4.lib;js3250.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <ShowProgress>LinkVerboseLib</ShowProgress>
+ <OutputFile>$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff35\xpGwtDevPlugin.dll</OutputFile>
+ <AdditionalLibraryDirectories>..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\WINNT_x86-msvc\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ <ModuleDefinitionFile>$(ProjectDir)\..\xpGwtDevPlugin.def</ModuleDefinitionFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
+ <SubSystem>Windows</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClInclude Include="..\ExternalWrapper.h" />
+ <ClInclude Include="..\FFSessionHandler.h" />
+ <ClInclude Include="..\prebuilt\ff35\include\IOOPHM.h" />
+ <ClInclude Include="..\JavaObject.h" />
+ <ClInclude Include="..\JSRunner.h" />
+ <ClInclude Include="..\ModuleOOPHM.h" />
+ <ClInclude Include="..\mozincludes.h" />
+ <ClInclude Include="..\Preferences.h" />
+ <ClInclude Include="..\RootedObject.h" />
+ <ClInclude Include="..\SessionData.h" />
+ <ClInclude Include="..\XpcomDebug.h" />
+ <ClInclude Include="..\..\common\AllowedConnections.h" />
+ <ClInclude Include="..\..\common\BrowserChannel.h" />
+ <ClInclude Include="..\..\common\ByteOrder.h" />
+ <ClInclude Include="..\..\common\CheckVersionsMessage.h" />
+ <ClInclude Include="..\..\common\ChooseTransportMessage.h" />
+ <ClInclude Include="..\..\common\Debug.h" />
+ <ClInclude Include="..\..\common\DebugLevel.h" />
+ <ClInclude Include="..\..\common\FatalErrorMessage.h" />
+ <ClInclude Include="..\..\common\FreeValueMessage.h" />
+ <ClInclude Include="..\..\common\HashMap.h" />
+ <ClInclude Include="..\..\common\HostChannel.h" />
+ <ClInclude Include="..\..\common\InvokeMessage.h" />
+ <ClInclude Include="..\..\common\InvokeSpecialMessage.h" />
+ <ClInclude Include="..\..\common\LoadJsniMessage.h" />
+ <ClInclude Include="..\..\common\LoadModuleMessage.h" />
+ <ClInclude Include="..\..\common\Message.h" />
+ <ClInclude Include="..\..\common\Platform.h" />
+ <ClInclude Include="..\..\common\ProtocolVersionMessage.h" />
+ <ClInclude Include="..\..\common\QuitMessage.h" />
+ <ClInclude Include="..\..\common\ReturnMessage.h" />
+ <ClInclude Include="..\..\common\scoped_ptr\scoped_ptr.h" />
+ <ClInclude Include="..\..\common\ServerMethods.h" />
+ <ClInclude Include="..\..\common\SessionHandler.h" />
+ <ClInclude Include="..\..\common\Socket.h" />
+ <ClInclude Include="..\..\common\SwitchTransportMessage.h" />
+ <ClInclude Include="..\..\common\Value.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jsapi.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jsautocfg.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jscompat.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jsconfig.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\jscpucfg.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jslong.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\jsosdep.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jsotypes.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jspubtd.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jstypes.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jsutil.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\WINNT_x86-msvc\include\mozilla-config.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpconnect\nsAXPCNativeCallContext.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsCOMPtr.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nscore.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nscore.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsCycleCollector.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsDebug.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsError.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\widget\nsEvent.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsICategoryManager.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsIClassInfo.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsIClassInfoImpl.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsIComponentManager.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsID.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsIEnumerator.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsIException.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsIExceptionService.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsIFactory.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsIGenericFactory.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\necko\nsIHttpProtocolHandler.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsIInterfaceInfo.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsIInterfaceInfoManager.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpconnect\nsIJSContextStack.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsIMemory.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsIModule.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\caps\nsIPrincipal.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsIProgrammingLanguage.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\necko\nsIProtocolHandler.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\necko\nsIProxiedProtocolHandler.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpconnect\nsIScriptableInterfaces.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\dom\nsIScriptGlobalObject.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\dom\nsIScriptObjectPrincipal.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\caps\nsISecurityCheckedComponent.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsISerializable.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsIServiceManager.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsISimpleEnumerator.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsISimpleEnumerator.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsISupports.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsISupports.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsISupportsBase.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsISupportsBase.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsISupportsImpl.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsISupportsUtils.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsISupportsUtils.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsIURI.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsIVariant.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpconnect\nsIXPConnect.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsMemory.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\necko\nsNetCID.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsrootidl.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsrootidl.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsServiceManagerUtils.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsStringAPI.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsTraceRefcnt.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsXPCOM.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsXPCOMCID.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsXPCOMStrings.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\pratom.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\prcpucfg.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\prinrval.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\prlock.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\prlog.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\prlong.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\obsolete\protypes.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\prthread.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\prtime.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\prtypes.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpconnect\xpccomponents.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpconnect\xpcexception.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpconnect\xpcjsid.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\WINNT_x86-msvc\include\xpcom-config.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\xpt_arena.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\xpt_struct.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\xptinfo.h" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jsproto.tbl" />
+ <None Include="..\xpGwtDevPlugin.def" />
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="..\xpGwtDevPlugin.rc" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\ExternalWrapper.cpp" />
+ <ClCompile Include="..\FFSessionHandler.cpp" />
+ <ClCompile Include="..\JavaObject.cpp" />
+ <ClCompile Include="..\JSRunner.cpp" />
+ <ClCompile Include="..\ModuleOOPHM.cpp">
+ <PreprocessToFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</PreprocessToFile>
+ <PreprocessSuppressLineNumbers Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</PreprocessSuppressLineNumbers>
+ </ClCompile>
+ <ClCompile Include="..\Preferences.cpp" />
+ <ClCompile Include="..\XpcomDebug.cpp" />
+ <ClCompile Include="..\..\common\AllowedConnections.cpp" />
+ <ClCompile Include="..\..\common\CheckVersionsMessage.cpp" />
+ <ClCompile Include="..\..\common\ChooseTransportMessage.cpp" />
+ <ClCompile Include="..\..\common\Debug.cpp" />
+ <ClCompile Include="..\..\common\FatalErrorMessage.cpp" />
+ <ClCompile Include="..\..\common\FreeValueMessage.cpp" />
+ <ClCompile Include="..\..\common\HostChannel.cpp" />
+ <ClCompile Include="..\..\common\InvokeMessage.cpp" />
+ <ClCompile Include="..\..\common\InvokeSpecialMessage.cpp" />
+ <ClCompile Include="..\..\common\LoadJsniMessage.cpp" />
+ <ClCompile Include="..\..\common\LoadModuleMessage.cpp" />
+ <ClCompile Include="..\..\common\ProtocolVersionMessage.cpp" />
+ <ClCompile Include="..\..\common\ReturnMessage.cpp" />
+ <ClCompile Include="..\..\common\ServerMethods.cpp" />
+ <ClCompile Include="..\..\common\Socket.cpp" />
+ <ClCompile Include="..\..\common\SwitchTransportMessage.cpp" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project>
\ No newline at end of file
diff --git a/plugins/xpcom/VisualStudio/ff35-xpcom.vcxproj.filters b/plugins/xpcom/VisualStudio/ff35-xpcom.vcxproj.filters
new file mode 100644
index 0000000..ce2cab8
--- /dev/null
+++ b/plugins/xpcom/VisualStudio/ff35-xpcom.vcxproj.filters
@@ -0,0 +1,478 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Header Files">
+ <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
+ <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
+ </Filter>
+ <Filter Include="Header Files\common">
+ <UniqueIdentifier>{4f18743c-59fe-408a-91e9-dc3d52dcdb5f}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Header Files\gecko">
+ <UniqueIdentifier>{df580225-cf8c-4a43-b99e-1fe657ff5722}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Resource Files">
+ <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
+ <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx</Extensions>
+ </Filter>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+ <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+ </Filter>
+ <Filter Include="Source Files\common">
+ <UniqueIdentifier>{a894e408-3d66-4e63-ac34-51c4a524cfd4}</UniqueIdentifier>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\ExternalWrapper.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\FFSessionHandler.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\prebuilt\ff35\include\IOOPHM.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\JavaObject.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\JSRunner.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\ModuleOOPHM.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\mozincludes.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Preferences.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\RootedObject.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\SessionData.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\XpcomDebug.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\AllowedConnections.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\BrowserChannel.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\ByteOrder.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\CheckVersionsMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\ChooseTransportMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\Debug.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\DebugLevel.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\FatalErrorMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\FreeValueMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\HashMap.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\HostChannel.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\InvokeMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\InvokeSpecialMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\LoadJsniMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\LoadModuleMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\Message.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\Platform.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\ProtocolVersionMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\QuitMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\ReturnMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\scoped_ptr\scoped_ptr.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\ServerMethods.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\SessionHandler.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\Socket.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\SwitchTransportMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\Value.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jsapi.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jsautocfg.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jscompat.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jsconfig.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\jscpucfg.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jslong.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\jsosdep.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jsotypes.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jspubtd.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jstypes.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jsutil.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\WINNT_x86-msvc\include\mozilla-config.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpconnect\nsAXPCNativeCallContext.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsCOMPtr.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nscore.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nscore.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsCycleCollector.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsDebug.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsError.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\widget\nsEvent.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsICategoryManager.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsIClassInfo.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsIClassInfoImpl.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsIComponentManager.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsID.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsIEnumerator.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsIException.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsIExceptionService.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsIFactory.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsIGenericFactory.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\necko\nsIHttpProtocolHandler.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsIInterfaceInfo.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsIInterfaceInfoManager.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpconnect\nsIJSContextStack.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsIMemory.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsIModule.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\caps\nsIPrincipal.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsIProgrammingLanguage.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\necko\nsIProtocolHandler.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\necko\nsIProxiedProtocolHandler.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpconnect\nsIScriptableInterfaces.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\dom\nsIScriptGlobalObject.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\dom\nsIScriptObjectPrincipal.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\caps\nsISecurityCheckedComponent.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsISerializable.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsIServiceManager.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsISimpleEnumerator.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsISimpleEnumerator.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsISupports.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsISupports.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsISupportsBase.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsISupportsBase.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsISupportsImpl.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsISupportsUtils.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsISupportsUtils.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsIURI.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsIVariant.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpconnect\nsIXPConnect.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsMemory.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\necko\nsNetCID.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsrootidl.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsrootidl.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsServiceManagerUtils.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsStringAPI.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsTraceRefcnt.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsXPCOM.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsXPCOMCID.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsXPCOMStrings.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\pratom.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\prcpucfg.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\prinrval.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\prlock.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\prlog.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\prlong.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\obsolete\protypes.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\prthread.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\prtime.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\prtypes.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpconnect\xpccomponents.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpconnect\xpcexception.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpconnect\xpcjsid.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\WINNT_x86-msvc\include\xpcom-config.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\xpt_arena.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\xpt_struct.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\xptinfo.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jsproto.tbl">
+ <Filter>Header Files\gecko</Filter>
+ </None>
+ <None Include="..\xpGwtDevPlugin.def">
+ <Filter>Source Files</Filter>
+ </None>
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="..\xpGwtDevPlugin.rc">
+ <Filter>Resource Files</Filter>
+ </ResourceCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\ExternalWrapper.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\FFSessionHandler.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\JavaObject.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\JSRunner.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\ModuleOOPHM.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Preferences.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\XpcomDebug.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\AllowedConnections.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\CheckVersionsMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\ChooseTransportMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\Debug.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\FatalErrorMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\FreeValueMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\HostChannel.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\InvokeMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\InvokeSpecialMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\LoadJsniMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\LoadModuleMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\ProtocolVersionMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\ReturnMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\ServerMethods.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\Socket.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\SwitchTransportMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ </ItemGroup>
+</Project>
\ No newline at end of file
diff --git a/plugins/xpcom/VisualStudio/ff36-xpcom.vcproj b/plugins/xpcom/VisualStudio/ff36-xpcom.vcproj
new file mode 100644
index 0000000..f1667a1
--- /dev/null
+++ b/plugins/xpcom/VisualStudio/ff36-xpcom.vcproj
@@ -0,0 +1,849 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="9.00"
+ Name="ff36-xpcom"
+ ProjectGUID="{37692217-C7AD-4FA9-A588-DDC11E17D925}"
+ RootNamespace="ff36-xpcom"
+ Keyword="Win32Proj"
+ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="Debug36"
+ IntermediateDirectory="Debug36"
+ ConfigurationType="2"
+ UseOfMFC="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories=""$(ProjectDir)\..\..\common";..\prebuilt\ff36\include;"..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\WINNT_x86-msvc\include";"..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include""
+ PreprocessorDefinitions="WIN32;_DEBUG;NDEBUG;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Warning;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF3;BROWSER=ff36;GECKO_VERSION=1910"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ TreatWChar_tAsBuiltInType="false"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ ResourceOutputFileName="$(IntDir)/$(TargetName).res"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="ws2_32.lib xpcomglue_s.lib xpcom.lib nspr4.lib js3250.lib"
+ ShowProgress="2"
+ OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff36\xpGwtDevPlugin.dll"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories=""..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\WINNT_x86-msvc\lib""
+ ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
+ SubSystem="2"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ ImportLibrary="$(IntDir)\$(TargetName).lib"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="Release36"
+ IntermediateDirectory="Release36"
+ ConfigurationType="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="3"
+ EnableIntrinsicFunctions="true"
+ AdditionalIncludeDirectories=""$(ProjectDir)\..\..\common";..\prebuilt\ff36\include;"..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\WINNT_x86-msvc\include";"..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include""
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Warning;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF3;BROWSER=ff36;GECKO_VERSION=1910"
+ ExceptionHandling="1"
+ RuntimeLibrary="0"
+ TreatWChar_tAsBuiltInType="false"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="false"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ ResourceOutputFileName="$(IntDir)/$(TargetName).res"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="ws2_32.lib xpcomglue_s.lib xpcom.lib nspr4.lib js3250.lib"
+ ShowProgress="2"
+ OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff36\xpGwtDevPlugin.dll"
+ LinkIncremental="0"
+ AdditionalLibraryDirectories=""..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\WINNT_x86-msvc\lib""
+ ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ ImportLibrary="$(IntDir)\$(TargetName).lib"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ <File
+ RelativePath="..\ExternalWrapper.h"
+ >
+ </File>
+ <File
+ RelativePath="..\FFSessionHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\prebuilt\ff36\include\IOOPHM.h"
+ >
+ </File>
+ <File
+ RelativePath="..\JavaObject.h"
+ >
+ </File>
+ <File
+ RelativePath="..\JSRunner.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ModuleOOPHM.h"
+ >
+ </File>
+ <File
+ RelativePath="..\mozincludes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\Preferences.h"
+ >
+ </File>
+ <File
+ RelativePath="..\RootedObject.h"
+ >
+ </File>
+ <File
+ RelativePath="..\SessionData.h"
+ >
+ </File>
+ <File
+ RelativePath="..\XpcomDebug.h"
+ >
+ </File>
+ <Filter
+ Name="common"
+ >
+ <File
+ RelativePath="..\..\common\AllowedConnections.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\BrowserChannel.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ByteOrder.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\CheckVersionsMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ChooseTransportMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Debug.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\DebugLevel.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FatalErrorMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FreeValueMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\HashMap.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\HostChannel.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeSpecialMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadJsniMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadModuleMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Message.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Platform.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ProtocolVersionMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\QuitMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ReturnMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\scoped_ptr\scoped_ptr.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ServerMethods.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\SessionHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Socket.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\SwitchTransportMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Value.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="gecko"
+ >
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\WINNT_x86-msvc\include\js-config.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jsapi.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jsautocfg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jscompat.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jsconfig.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\WINNT_x86-msvc\include\jscpucfg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\jscpucfg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\jsinttypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jslong.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\jsosdep.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jsotypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jsproto.tbl"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jspubtd.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jstypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jsutil.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jsutil.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jsutil.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jsutil.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\WINNT_x86-msvc\include\mozilla-config.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpconnect\nsAXPCNativeCallContext.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsCOMPtr.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nscore.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nscore.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsCycleCollector.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsDebug.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsError.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\widget\nsEvent.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsICategoryManager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsIClassInfo.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsIClassInfoImpl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsIComponentManager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsID.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsIEnumerator.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsIException.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsIExceptionService.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsIFactory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsIGenericFactory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\necko\nsIHttpProtocolHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsIInterfaceInfo.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsIInterfaceInfoManager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpconnect\nsIJSContextStack.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsIMemory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsIModule.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\caps\nsIPrincipal.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsIProgrammingLanguage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\necko\nsIProtocolHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\necko\nsIProxiedProtocolHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpconnect\nsIScriptableInterfaces.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\dom\nsIScriptGlobalObject.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\dom\nsIScriptObjectPrincipal.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\caps\nsISecurityCheckedComponent.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsISerializable.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsIServiceManager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsISimpleEnumerator.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsISimpleEnumerator.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsISupports.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsISupports.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsISupportsBase.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsISupportsBase.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsISupportsImpl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsISupportsUtils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsISupportsUtils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsIURI.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsIVariant.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpconnect\nsIXPConnect.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsMemory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\necko\nsNetCID.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsrootidl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsrootidl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsServiceManagerUtils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsStringAPI.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsTraceRefcnt.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsXPCOM.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsXPCOMCID.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsXPCOMStrings.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\pratom.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\prcpucfg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\prinrval.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\prlock.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\prlog.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\prlong.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\obsolete\protypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\prthread.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\prtime.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\prtypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpconnect\xpccomponents.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpconnect\xpcexception.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpconnect\xpcjsid.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\WINNT_x86-msvc\include\xpcom-config.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\xpt_arena.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\xpt_struct.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\xptinfo.h"
+ >
+ </File>
+ </Filter>
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ >
+ <File
+ RelativePath="..\xpGwtDevPlugin.rc"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\ExternalWrapper.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\FFSessionHandler.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\JavaObject.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\JSRunner.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\ModuleOOPHM.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ GeneratePreprocessedFile="0"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\Preferences.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\XpcomDebug.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\xpGwtDevPlugin.def"
+ >
+ </File>
+ <Filter
+ Name="common"
+ >
+ <File
+ RelativePath="..\..\common\AllowedConnections.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\CheckVersionsMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ChooseTransportMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Debug.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FatalErrorMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FreeValueMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\HostChannel.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeSpecialMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadJsniMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadModuleMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ProtocolVersionMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ReturnMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ServerMethods.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Socket.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\SwitchTransportMessage.cpp"
+ >
+ </File>
+ </Filter>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/plugins/xpcom/VisualStudio/ff36-xpcom.vcxproj b/plugins/xpcom/VisualStudio/ff36-xpcom.vcxproj
new file mode 100644
index 0000000..d00b934
--- /dev/null
+++ b/plugins/xpcom/VisualStudio/ff36-xpcom.vcxproj
@@ -0,0 +1,278 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{37692217-C7AD-4FA9-A588-DDC11E17D925}</ProjectGuid>
+ <RootNamespace>ff36-xpcom</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>Static</UseOfMfc>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Debug36\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Debug36\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Release36\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Release36\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>$(ProjectDir)\..\..\common;..\prebuilt\ff36\include;..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\WINNT_x86-msvc\include;..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_DEBUG;NDEBUG;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Warning;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF3;BROWSER=ff36;GECKO_VERSION=1910;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <TreatWChar_tAsBuiltInType>false</TreatWChar_tAsBuiltInType>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <ResourceCompile>
+ <ResourceOutputFileName>$(IntDir)$(TargetName).res</ResourceOutputFileName>
+ </ResourceCompile>
+ <Link>
+ <AdditionalDependencies>ws2_32.lib;xpcomglue_s.lib;xpcom.lib;nspr4.lib;js3250.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <ShowProgress>LinkVerboseLib</ShowProgress>
+ <OutputFile>$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff36\xpGwtDevPlugin.dll</OutputFile>
+ <AdditionalLibraryDirectories>..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\WINNT_x86-msvc\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ <ModuleDefinitionFile>$(ProjectDir)\..\xpGwtDevPlugin.def</ModuleDefinitionFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
+ <SubSystem>Windows</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <Optimization>Full</Optimization>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <AdditionalIncludeDirectories>$(ProjectDir)\..\..\common;..\prebuilt\ff36\include;..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\WINNT_x86-msvc\include;..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Warning;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF3;BROWSER=ff36;GECKO_VERSION=1910;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <ExceptionHandling>Sync</ExceptionHandling>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <TreatWChar_tAsBuiltInType>false</TreatWChar_tAsBuiltInType>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <ResourceCompile>
+ <ResourceOutputFileName>$(IntDir)$(TargetName).res</ResourceOutputFileName>
+ </ResourceCompile>
+ <Link>
+ <AdditionalDependencies>ws2_32.lib;xpcomglue_s.lib;xpcom.lib;nspr4.lib;js3250.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <ShowProgress>LinkVerboseLib</ShowProgress>
+ <OutputFile>$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff36\xpGwtDevPlugin.dll</OutputFile>
+ <AdditionalLibraryDirectories>..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\WINNT_x86-msvc\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ <ModuleDefinitionFile>$(ProjectDir)\..\xpGwtDevPlugin.def</ModuleDefinitionFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
+ <SubSystem>Windows</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClInclude Include="..\ExternalWrapper.h" />
+ <ClInclude Include="..\FFSessionHandler.h" />
+ <ClInclude Include="..\prebuilt\ff36\include\IOOPHM.h" />
+ <ClInclude Include="..\JavaObject.h" />
+ <ClInclude Include="..\JSRunner.h" />
+ <ClInclude Include="..\ModuleOOPHM.h" />
+ <ClInclude Include="..\mozincludes.h" />
+ <ClInclude Include="..\Preferences.h" />
+ <ClInclude Include="..\RootedObject.h" />
+ <ClInclude Include="..\SessionData.h" />
+ <ClInclude Include="..\XpcomDebug.h" />
+ <ClInclude Include="..\..\common\AllowedConnections.h" />
+ <ClInclude Include="..\..\common\BrowserChannel.h" />
+ <ClInclude Include="..\..\common\ByteOrder.h" />
+ <ClInclude Include="..\..\common\CheckVersionsMessage.h" />
+ <ClInclude Include="..\..\common\ChooseTransportMessage.h" />
+ <ClInclude Include="..\..\common\Debug.h" />
+ <ClInclude Include="..\..\common\DebugLevel.h" />
+ <ClInclude Include="..\..\common\FatalErrorMessage.h" />
+ <ClInclude Include="..\..\common\FreeValueMessage.h" />
+ <ClInclude Include="..\..\common\HashMap.h" />
+ <ClInclude Include="..\..\common\HostChannel.h" />
+ <ClInclude Include="..\..\common\InvokeMessage.h" />
+ <ClInclude Include="..\..\common\InvokeSpecialMessage.h" />
+ <ClInclude Include="..\..\common\LoadJsniMessage.h" />
+ <ClInclude Include="..\..\common\LoadModuleMessage.h" />
+ <ClInclude Include="..\..\common\Message.h" />
+ <ClInclude Include="..\..\common\Platform.h" />
+ <ClInclude Include="..\..\common\ProtocolVersionMessage.h" />
+ <ClInclude Include="..\..\common\QuitMessage.h" />
+ <ClInclude Include="..\..\common\ReturnMessage.h" />
+ <ClInclude Include="..\..\common\scoped_ptr\scoped_ptr.h" />
+ <ClInclude Include="..\..\common\ServerMethods.h" />
+ <ClInclude Include="..\..\common\SessionHandler.h" />
+ <ClInclude Include="..\..\common\Socket.h" />
+ <ClInclude Include="..\..\common\SwitchTransportMessage.h" />
+ <ClInclude Include="..\..\common\Value.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\WINNT_x86-msvc\include\js-config.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jsapi.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jsautocfg.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jscompat.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jsconfig.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\WINNT_x86-msvc\include\jscpucfg.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\jscpucfg.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\jsinttypes.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jslong.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\jsosdep.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jsotypes.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jspubtd.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jstypes.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jsutil.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\WINNT_x86-msvc\include\mozilla-config.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpconnect\nsAXPCNativeCallContext.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsCOMPtr.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nscore.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nscore.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsCycleCollector.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsDebug.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsError.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\widget\nsEvent.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsICategoryManager.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsIClassInfo.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsIClassInfoImpl.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsIComponentManager.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsID.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsIEnumerator.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsIException.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsIExceptionService.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsIFactory.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsIGenericFactory.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\necko\nsIHttpProtocolHandler.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsIInterfaceInfo.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsIInterfaceInfoManager.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpconnect\nsIJSContextStack.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsIMemory.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsIModule.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\caps\nsIPrincipal.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsIProgrammingLanguage.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\necko\nsIProtocolHandler.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\necko\nsIProxiedProtocolHandler.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpconnect\nsIScriptableInterfaces.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\dom\nsIScriptGlobalObject.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\dom\nsIScriptObjectPrincipal.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\caps\nsISecurityCheckedComponent.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsISerializable.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsIServiceManager.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsISimpleEnumerator.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsISimpleEnumerator.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsISupports.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsISupports.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsISupportsBase.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsISupportsBase.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsISupportsImpl.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsISupportsUtils.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsISupportsUtils.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsIURI.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsIVariant.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpconnect\nsIXPConnect.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsMemory.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\necko\nsNetCID.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsrootidl.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsrootidl.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsServiceManagerUtils.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsStringAPI.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsTraceRefcnt.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsXPCOM.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsXPCOMCID.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsXPCOMStrings.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\pratom.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\prcpucfg.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\prinrval.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\prlock.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\prlog.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\prlong.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\obsolete\protypes.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\prthread.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\prtime.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\prtypes.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpconnect\xpccomponents.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpconnect\xpcexception.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpconnect\xpcjsid.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\WINNT_x86-msvc\include\xpcom-config.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\xpt_arena.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\xpt_struct.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\xptinfo.h" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jsproto.tbl" />
+ <None Include="..\xpGwtDevPlugin.def" />
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="..\xpGwtDevPlugin.rc" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\ExternalWrapper.cpp" />
+ <ClCompile Include="..\FFSessionHandler.cpp" />
+ <ClCompile Include="..\JavaObject.cpp" />
+ <ClCompile Include="..\JSRunner.cpp" />
+ <ClCompile Include="..\ModuleOOPHM.cpp">
+ <PreprocessToFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</PreprocessToFile>
+ <PreprocessSuppressLineNumbers Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</PreprocessSuppressLineNumbers>
+ </ClCompile>
+ <ClCompile Include="..\Preferences.cpp" />
+ <ClCompile Include="..\XpcomDebug.cpp" />
+ <ClCompile Include="..\..\common\AllowedConnections.cpp" />
+ <ClCompile Include="..\..\common\CheckVersionsMessage.cpp" />
+ <ClCompile Include="..\..\common\ChooseTransportMessage.cpp" />
+ <ClCompile Include="..\..\common\Debug.cpp" />
+ <ClCompile Include="..\..\common\FatalErrorMessage.cpp" />
+ <ClCompile Include="..\..\common\FreeValueMessage.cpp" />
+ <ClCompile Include="..\..\common\HostChannel.cpp" />
+ <ClCompile Include="..\..\common\InvokeMessage.cpp" />
+ <ClCompile Include="..\..\common\InvokeSpecialMessage.cpp" />
+ <ClCompile Include="..\..\common\LoadJsniMessage.cpp" />
+ <ClCompile Include="..\..\common\LoadModuleMessage.cpp" />
+ <ClCompile Include="..\..\common\ProtocolVersionMessage.cpp" />
+ <ClCompile Include="..\..\common\ReturnMessage.cpp" />
+ <ClCompile Include="..\..\common\ServerMethods.cpp" />
+ <ClCompile Include="..\..\common\Socket.cpp" />
+ <ClCompile Include="..\..\common\SwitchTransportMessage.cpp" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project>
\ No newline at end of file
diff --git a/plugins/xpcom/VisualStudio/ff36-xpcom.vcxproj.filters b/plugins/xpcom/VisualStudio/ff36-xpcom.vcxproj.filters
new file mode 100644
index 0000000..4e8e2db
--- /dev/null
+++ b/plugins/xpcom/VisualStudio/ff36-xpcom.vcxproj.filters
@@ -0,0 +1,487 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Header Files">
+ <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
+ <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
+ </Filter>
+ <Filter Include="Header Files\common">
+ <UniqueIdentifier>{f5a3dd15-8632-44d4-9eae-08d8ce7f6140}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Header Files\gecko">
+ <UniqueIdentifier>{7e144492-1e7b-48d4-8fd9-027f5d1d157d}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Resource Files">
+ <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
+ <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx</Extensions>
+ </Filter>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+ <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+ </Filter>
+ <Filter Include="Source Files\common">
+ <UniqueIdentifier>{b9a8c71b-0d6b-43ae-9af8-53dc254d84e0}</UniqueIdentifier>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\ExternalWrapper.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\FFSessionHandler.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\prebuilt\ff36\include\IOOPHM.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\JavaObject.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\JSRunner.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\ModuleOOPHM.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\mozincludes.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Preferences.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\RootedObject.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\SessionData.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\XpcomDebug.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\AllowedConnections.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\BrowserChannel.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\ByteOrder.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\CheckVersionsMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\ChooseTransportMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\Debug.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\DebugLevel.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\FatalErrorMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\FreeValueMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\HashMap.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\HostChannel.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\InvokeMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\InvokeSpecialMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\LoadJsniMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\LoadModuleMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\Message.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\Platform.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\ProtocolVersionMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\QuitMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\ReturnMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\scoped_ptr\scoped_ptr.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\ServerMethods.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\SessionHandler.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\Socket.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\SwitchTransportMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\Value.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\WINNT_x86-msvc\include\js-config.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jsapi.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jsautocfg.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jscompat.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jsconfig.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\WINNT_x86-msvc\include\jscpucfg.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\jscpucfg.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\jsinttypes.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jslong.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\jsosdep.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jsotypes.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jspubtd.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jstypes.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jsutil.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\WINNT_x86-msvc\include\mozilla-config.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpconnect\nsAXPCNativeCallContext.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsCOMPtr.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nscore.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nscore.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsCycleCollector.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsDebug.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsError.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\widget\nsEvent.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsICategoryManager.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsIClassInfo.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsIClassInfoImpl.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsIComponentManager.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsID.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsIEnumerator.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsIException.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsIExceptionService.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsIFactory.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsIGenericFactory.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\necko\nsIHttpProtocolHandler.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsIInterfaceInfo.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsIInterfaceInfoManager.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpconnect\nsIJSContextStack.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsIMemory.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsIModule.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\caps\nsIPrincipal.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsIProgrammingLanguage.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\necko\nsIProtocolHandler.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\necko\nsIProxiedProtocolHandler.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpconnect\nsIScriptableInterfaces.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\dom\nsIScriptGlobalObject.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\dom\nsIScriptObjectPrincipal.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\caps\nsISecurityCheckedComponent.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsISerializable.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsIServiceManager.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsISimpleEnumerator.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsISimpleEnumerator.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsISupports.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsISupports.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsISupportsBase.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsISupportsBase.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsISupportsImpl.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsISupportsUtils.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsISupportsUtils.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsIURI.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsIVariant.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpconnect\nsIXPConnect.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsMemory.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\necko\nsNetCID.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsrootidl.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsrootidl.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsServiceManagerUtils.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsStringAPI.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsTraceRefcnt.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsXPCOM.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsXPCOMCID.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsXPCOMStrings.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\pratom.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\prcpucfg.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\prinrval.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\prlock.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\prlog.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\prlong.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\obsolete\protypes.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\prthread.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\prtime.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\prtypes.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpconnect\xpccomponents.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpconnect\xpcexception.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpconnect\xpcjsid.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\WINNT_x86-msvc\include\xpcom-config.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\xpt_arena.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\xpt_struct.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\xptinfo.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jsproto.tbl">
+ <Filter>Header Files\gecko</Filter>
+ </None>
+ <None Include="..\xpGwtDevPlugin.def">
+ <Filter>Source Files</Filter>
+ </None>
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="..\xpGwtDevPlugin.rc">
+ <Filter>Resource Files</Filter>
+ </ResourceCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\ExternalWrapper.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\FFSessionHandler.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\JavaObject.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\JSRunner.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\ModuleOOPHM.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Preferences.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\XpcomDebug.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\AllowedConnections.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\CheckVersionsMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\ChooseTransportMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\Debug.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\FatalErrorMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\FreeValueMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\HostChannel.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\InvokeMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\InvokeSpecialMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\LoadJsniMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\LoadModuleMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\ProtocolVersionMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\ReturnMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\ServerMethods.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\Socket.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\SwitchTransportMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ </ItemGroup>
+</Project>
\ No newline at end of file
diff --git a/plugins/xpcom/VisualStudio/ff40-xpcom.vcproj b/plugins/xpcom/VisualStudio/ff40-xpcom.vcproj
new file mode 100644
index 0000000..2821a53
--- /dev/null
+++ b/plugins/xpcom/VisualStudio/ff40-xpcom.vcproj
@@ -0,0 +1,845 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="9.00"
+ Name="ff40-xpcom"
+ ProjectGUID="{6BF0C2CE-CB0C-421B-A67C-1E448371D24D}"
+ RootNamespace="ff40-xpcom"
+ Keyword="Win32Proj"
+ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="Debug40"
+ IntermediateDirectory="Debug40"
+ ConfigurationType="2"
+ UseOfMFC="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories=""$(ProjectDir)\..\..\common";..\prebuilt\ff40\include;"..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include";"..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\mozilla";"..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\WINNT_x86-msvc\include";"..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpconnect";"..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\WINNT_x86-msvc\include""
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF4;GECKO_VERSION=2000"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ TreatWChar_tAsBuiltInType="false"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ ResourceOutputFileName="$(IntDir)/$(TargetName).res"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="ws2_32.lib Advapi32.lib xpcomglue_s.lib xpcom.lib nspr4.lib mozalloc.lib xul.lib mozjs.lib"
+ ShowProgress="2"
+ OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff40\xpGwtDevPlugin.dll"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories=""..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\WINNT_x86-msvc\lib""
+ ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
+ SubSystem="2"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ ImportLibrary="$(IntDir)\$(TargetName).lib"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="Release40"
+ IntermediateDirectory="Release40"
+ ConfigurationType="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="3"
+ EnableIntrinsicFunctions="true"
+ AdditionalIncludeDirectories=""$(ProjectDir)\..\..\common";..\prebuilt\ff40\include;"..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include";"..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\mozilla";"..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\WINNT_x86-msvc\include";"..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpconnect";"..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\WINNT_x86-msvc\include""
+ PreprocessorDefinitions="WIN32;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF4;GECKO_VERSION=2000;$(NOINHERIT)"
+ ExceptionHandling="1"
+ RuntimeLibrary="0"
+ TreatWChar_tAsBuiltInType="false"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="false"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ ResourceOutputFileName="$(IntDir)/$(TargetName).res"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="ws2_32.lib Advapi32.lib xpcomglue_s.lib xpcom.lib nspr4.lib mozalloc.lib xul.lib mozjs.lib"
+ ShowProgress="2"
+ OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff40\xpGwtDevPlugin.dll"
+ LinkIncremental="0"
+ AdditionalLibraryDirectories=""..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\WINNT_x86-msvc\lib""
+ ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ ImportLibrary="$(IntDir)\$(TargetName).lib"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ <File
+ RelativePath="..\ExternalWrapper.h"
+ >
+ </File>
+ <File
+ RelativePath="..\FFSessionHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\prebuilt\ff40\include\IOOPHM.h"
+ >
+ </File>
+ <File
+ RelativePath="..\JavaObject.h"
+ >
+ </File>
+ <File
+ RelativePath="..\JSRunner.h"
+ >
+ </File>
+ <File
+ RelativePath="..\mozincludes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\Preferences.h"
+ >
+ </File>
+ <File
+ RelativePath="..\RootedObject.h"
+ >
+ </File>
+ <File
+ RelativePath="..\SessionData.h"
+ >
+ </File>
+ <File
+ RelativePath="..\XpcomDebug.h"
+ >
+ </File>
+ <Filter
+ Name="common"
+ >
+ <File
+ RelativePath="..\..\common\AllowedConnections.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\BrowserChannel.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ByteOrder.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\CheckVersionsMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ChooseTransportMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Debug.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\DebugLevel.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FatalErrorMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FreeValueMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\HashMap.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\HostChannel.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeSpecialMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadJsniMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadModuleMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Message.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Platform.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ProtocolVersionMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\QuitMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ReturnMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\scoped_ptr\scoped_ptr.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ServerMethods.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\SessionHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Socket.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\SwitchTransportMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Value.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="gecko"
+ >
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\WINNT_x86-msvc\include\js-config.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jsapi.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jsautocfg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jscompat.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jsconfig.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\WINNT_x86-msvc\include\jscpucfg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\jscpucfg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\jsinttypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jslong.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\jsosdep.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jsotypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jsproto.tbl"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jspubtd.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jstypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jsutil.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jsutil.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jsutil.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jsutil.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\WINNT_x86-msvc\include\mozilla-config.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpconnect\nsAXPCNativeCallContext.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsCOMPtr.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nscore.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nscore.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsCycleCollector.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsDebug.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsError.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\widget\nsEvent.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsICategoryManager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsIClassInfo.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsIClassInfoImpl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsIComponentManager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsID.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsIEnumerator.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsIException.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsIExceptionService.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsIFactory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsIGenericFactory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\necko\nsIHttpProtocolHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsIInterfaceInfo.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsIInterfaceInfoManager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpconnect\nsIJSContextStack.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsIMemory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsIModule.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\caps\nsIPrincipal.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsIProgrammingLanguage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\necko\nsIProtocolHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\necko\nsIProxiedProtocolHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpconnect\nsIScriptableInterfaces.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\dom\nsIScriptGlobalObject.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\dom\nsIScriptObjectPrincipal.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\caps\nsISecurityCheckedComponent.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsISerializable.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsIServiceManager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsISimpleEnumerator.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsISimpleEnumerator.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsISupports.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsISupports.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsISupportsBase.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsISupportsBase.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsISupportsImpl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsISupportsUtils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsISupportsUtils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsIURI.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsIVariant.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpconnect\nsIXPConnect.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsMemory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\necko\nsNetCID.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsrootidl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsrootidl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsServiceManagerUtils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsStringAPI.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsTraceRefcnt.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsXPCOM.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsXPCOMCID.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsXPCOMStrings.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\pratom.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\prcpucfg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\prinrval.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\prlock.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\prlog.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\prlong.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\obsolete\protypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\prthread.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\prtime.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\prtypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpconnect\xpccomponents.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpconnect\xpcexception.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpconnect\xpcjsid.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\WINNT_x86-msvc\include\xpcom-config.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\xpt_arena.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\xpt_struct.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\xptinfo.h"
+ >
+ </File>
+ </Filter>
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ >
+ <File
+ RelativePath="..\xpGwtDevPlugin.rc"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\ExternalWrapper.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\FFSessionHandler.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\JavaObject.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\JSRunner.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\ModuleOOPHM.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ GeneratePreprocessedFile="0"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\Preferences.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\XpcomDebug.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\xpGwtDevPlugin.def"
+ >
+ </File>
+ <Filter
+ Name="common"
+ >
+ <File
+ RelativePath="..\..\common\AllowedConnections.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\CheckVersionsMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ChooseTransportMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Debug.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FatalErrorMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FreeValueMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\HostChannel.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeSpecialMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadJsniMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadModuleMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ProtocolVersionMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ReturnMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ServerMethods.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Socket.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\SwitchTransportMessage.cpp"
+ >
+ </File>
+ </Filter>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/plugins/xpcom/VisualStudio/ff40-xpcom.vcxproj b/plugins/xpcom/VisualStudio/ff40-xpcom.vcxproj
new file mode 100644
index 0000000..97a2154
--- /dev/null
+++ b/plugins/xpcom/VisualStudio/ff40-xpcom.vcxproj
@@ -0,0 +1,277 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{6BF0C2CE-CB0C-421B-A67C-1E448371D24D}</ProjectGuid>
+ <RootNamespace>ff40-xpcom</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>Static</UseOfMfc>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Debug40\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Debug40\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Release40\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Release40\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>$(ProjectDir)\..\..\common;..\prebuilt\ff40\include;..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\WINNT_x86-msvc\include;..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include;..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\mozilla;..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpconnect;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF4;GECKO_VERSION=2000;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <TreatWChar_tAsBuiltInType>false</TreatWChar_tAsBuiltInType>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <ResourceCompile>
+ <ResourceOutputFileName>$(IntDir)$(TargetName).res</ResourceOutputFileName>
+ </ResourceCompile>
+ <Link>
+ <AdditionalDependencies>ws2_32.lib;Advapi32.lib;xpcomglue_s.lib;xpcom.lib;nspr4.lib;mozalloc.lib;xul.lib;mozjs.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <ShowProgress>LinkVerboseLib</ShowProgress>
+ <OutputFile>$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff40\xpGwtDevPlugin.dll</OutputFile>
+ <AdditionalLibraryDirectories>..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\WINNT_x86-msvc\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ <ModuleDefinitionFile>$(ProjectDir)\..\xpGwtDevPlugin.def</ModuleDefinitionFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
+ <SubSystem>Windows</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <Optimization>Full</Optimization>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <AdditionalIncludeDirectories>$(ProjectDir)\..\..\common;..\prebuilt\ff40\include;..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\WINNT_x86-msvc\include;..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include;..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\mozilla;..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpconnect;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF4;GECKO_VERSION=2000</PreprocessorDefinitions>
+ <ExceptionHandling>Sync</ExceptionHandling>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <TreatWChar_tAsBuiltInType>false</TreatWChar_tAsBuiltInType>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <ResourceCompile>
+ <ResourceOutputFileName>$(IntDir)$(TargetName).res</ResourceOutputFileName>
+ </ResourceCompile>
+ <Link>
+ <AdditionalDependencies>ws2_32.lib;Advapi32.lib;xpcomglue_s.lib;xpcom.lib;nspr4.lib;mozalloc.lib;xul.lib;mozjs.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <ShowProgress>LinkVerboseLib</ShowProgress>
+ <OutputFile>$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff40\xpGwtDevPlugin.dll</OutputFile>
+ <AdditionalLibraryDirectories>..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\WINNT_x86-msvc\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ <ModuleDefinitionFile>$(ProjectDir)\..\xpGwtDevPlugin.def</ModuleDefinitionFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
+ <SubSystem>Windows</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClInclude Include="..\ExternalWrapper.h" />
+ <ClInclude Include="..\FFSessionHandler.h" />
+ <ClInclude Include="..\prebuilt\ff40\include\IOOPHM.h" />
+ <ClInclude Include="..\JavaObject.h" />
+ <ClInclude Include="..\JSRunner.h" />
+ <ClInclude Include="..\mozincludes.h" />
+ <ClInclude Include="..\Preferences.h" />
+ <ClInclude Include="..\RootedObject.h" />
+ <ClInclude Include="..\SessionData.h" />
+ <ClInclude Include="..\XpcomDebug.h" />
+ <ClInclude Include="..\..\common\AllowedConnections.h" />
+ <ClInclude Include="..\..\common\BrowserChannel.h" />
+ <ClInclude Include="..\..\common\ByteOrder.h" />
+ <ClInclude Include="..\..\common\CheckVersionsMessage.h" />
+ <ClInclude Include="..\..\common\ChooseTransportMessage.h" />
+ <ClInclude Include="..\..\common\Debug.h" />
+ <ClInclude Include="..\..\common\DebugLevel.h" />
+ <ClInclude Include="..\..\common\FatalErrorMessage.h" />
+ <ClInclude Include="..\..\common\FreeValueMessage.h" />
+ <ClInclude Include="..\..\common\HashMap.h" />
+ <ClInclude Include="..\..\common\HostChannel.h" />
+ <ClInclude Include="..\..\common\InvokeMessage.h" />
+ <ClInclude Include="..\..\common\InvokeSpecialMessage.h" />
+ <ClInclude Include="..\..\common\LoadJsniMessage.h" />
+ <ClInclude Include="..\..\common\LoadModuleMessage.h" />
+ <ClInclude Include="..\..\common\Message.h" />
+ <ClInclude Include="..\..\common\Platform.h" />
+ <ClInclude Include="..\..\common\ProtocolVersionMessage.h" />
+ <ClInclude Include="..\..\common\QuitMessage.h" />
+ <ClInclude Include="..\..\common\ReturnMessage.h" />
+ <ClInclude Include="..\..\common\scoped_ptr\scoped_ptr.h" />
+ <ClInclude Include="..\..\common\ServerMethods.h" />
+ <ClInclude Include="..\..\common\SessionHandler.h" />
+ <ClInclude Include="..\..\common\Socket.h" />
+ <ClInclude Include="..\..\common\SwitchTransportMessage.h" />
+ <ClInclude Include="..\..\common\Value.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\WINNT_x86-msvc\include\js-config.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jsapi.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jsautocfg.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jscompat.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jsconfig.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\WINNT_x86-msvc\include\jscpucfg.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\jscpucfg.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\jsinttypes.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jslong.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\jsosdep.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jsotypes.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jspubtd.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jstypes.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jsutil.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\WINNT_x86-msvc\include\mozilla-config.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpconnect\nsAXPCNativeCallContext.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsCOMPtr.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nscore.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nscore.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsCycleCollector.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsDebug.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsError.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\widget\nsEvent.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsICategoryManager.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsIClassInfo.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsIClassInfoImpl.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsIComponentManager.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsID.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsIEnumerator.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsIException.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsIExceptionService.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsIFactory.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsIGenericFactory.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\necko\nsIHttpProtocolHandler.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsIInterfaceInfo.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsIInterfaceInfoManager.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpconnect\nsIJSContextStack.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsIMemory.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsIModule.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\caps\nsIPrincipal.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsIProgrammingLanguage.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\necko\nsIProtocolHandler.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\necko\nsIProxiedProtocolHandler.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpconnect\nsIScriptableInterfaces.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\dom\nsIScriptGlobalObject.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\dom\nsIScriptObjectPrincipal.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\caps\nsISecurityCheckedComponent.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsISerializable.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsIServiceManager.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsISimpleEnumerator.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsISimpleEnumerator.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsISupports.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsISupports.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsISupportsBase.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsISupportsBase.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsISupportsImpl.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsISupportsUtils.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsISupportsUtils.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsIURI.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsIVariant.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpconnect\nsIXPConnect.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsMemory.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\necko\nsNetCID.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsrootidl.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsrootidl.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsServiceManagerUtils.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsStringAPI.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsTraceRefcnt.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsXPCOM.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsXPCOMCID.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsXPCOMStrings.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\pratom.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\prcpucfg.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\prinrval.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\prlock.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\prlog.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\prlong.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\obsolete\protypes.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\prthread.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\prtime.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\prtypes.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpconnect\xpccomponents.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpconnect\xpcexception.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpconnect\xpcjsid.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\WINNT_x86-msvc\include\xpcom-config.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\xpt_arena.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\xpt_struct.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\xptinfo.h" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jsproto.tbl" />
+ <None Include="..\xpGwtDevPlugin.def" />
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="..\xpGwtDevPlugin.rc" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\ExternalWrapper.cpp" />
+ <ClCompile Include="..\FFSessionHandler.cpp" />
+ <ClCompile Include="..\JavaObject.cpp" />
+ <ClCompile Include="..\JSRunner.cpp" />
+ <ClCompile Include="..\ModuleOOPHM.cpp">
+ <PreprocessToFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</PreprocessToFile>
+ <PreprocessSuppressLineNumbers Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</PreprocessSuppressLineNumbers>
+ </ClCompile>
+ <ClCompile Include="..\Preferences.cpp" />
+ <ClCompile Include="..\XpcomDebug.cpp" />
+ <ClCompile Include="..\..\common\AllowedConnections.cpp" />
+ <ClCompile Include="..\..\common\CheckVersionsMessage.cpp" />
+ <ClCompile Include="..\..\common\ChooseTransportMessage.cpp" />
+ <ClCompile Include="..\..\common\Debug.cpp" />
+ <ClCompile Include="..\..\common\FatalErrorMessage.cpp" />
+ <ClCompile Include="..\..\common\FreeValueMessage.cpp" />
+ <ClCompile Include="..\..\common\HostChannel.cpp" />
+ <ClCompile Include="..\..\common\InvokeMessage.cpp" />
+ <ClCompile Include="..\..\common\InvokeSpecialMessage.cpp" />
+ <ClCompile Include="..\..\common\LoadJsniMessage.cpp" />
+ <ClCompile Include="..\..\common\LoadModuleMessage.cpp" />
+ <ClCompile Include="..\..\common\ProtocolVersionMessage.cpp" />
+ <ClCompile Include="..\..\common\ReturnMessage.cpp" />
+ <ClCompile Include="..\..\common\ServerMethods.cpp" />
+ <ClCompile Include="..\..\common\Socket.cpp" />
+ <ClCompile Include="..\..\common\SwitchTransportMessage.cpp" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project>
\ No newline at end of file
diff --git a/plugins/xpcom/VisualStudio/ff40-xpcom.vcxproj.filters b/plugins/xpcom/VisualStudio/ff40-xpcom.vcxproj.filters
new file mode 100644
index 0000000..3b0a31b
--- /dev/null
+++ b/plugins/xpcom/VisualStudio/ff40-xpcom.vcxproj.filters
@@ -0,0 +1,484 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Header Files">
+ <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
+ <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
+ </Filter>
+ <Filter Include="Header Files\common">
+ <UniqueIdentifier>{a7c29063-75f8-42b1-965f-a05c1216d850}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Header Files\gecko">
+ <UniqueIdentifier>{5a35bded-1db6-48ba-ae1a-efd9f28c578f}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Resource Files">
+ <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
+ <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx</Extensions>
+ </Filter>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+ <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+ </Filter>
+ <Filter Include="Source Files\common">
+ <UniqueIdentifier>{155aa627-d60d-49af-9953-f150d540f110}</UniqueIdentifier>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\ExternalWrapper.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\FFSessionHandler.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\prebuilt\ff40\include\IOOPHM.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\JavaObject.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\JSRunner.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\mozincludes.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Preferences.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\RootedObject.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\SessionData.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\XpcomDebug.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\AllowedConnections.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\BrowserChannel.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\ByteOrder.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\CheckVersionsMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\ChooseTransportMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\Debug.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\DebugLevel.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\FatalErrorMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\FreeValueMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\HashMap.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\HostChannel.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\InvokeMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\InvokeSpecialMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\LoadJsniMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\LoadModuleMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\Message.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\Platform.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\ProtocolVersionMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\QuitMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\ReturnMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\scoped_ptr\scoped_ptr.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\ServerMethods.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\SessionHandler.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\Socket.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\SwitchTransportMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\Value.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\WINNT_x86-msvc\include\js-config.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jsapi.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jsautocfg.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jscompat.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jsconfig.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\WINNT_x86-msvc\include\jscpucfg.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\jscpucfg.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\jsinttypes.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jslong.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\jsosdep.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jsotypes.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jspubtd.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jstypes.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jsutil.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\WINNT_x86-msvc\include\mozilla-config.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpconnect\nsAXPCNativeCallContext.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsCOMPtr.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nscore.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nscore.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsCycleCollector.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsDebug.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsError.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\widget\nsEvent.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsICategoryManager.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsIClassInfo.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsIClassInfoImpl.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsIComponentManager.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsID.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsIEnumerator.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsIException.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsIExceptionService.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsIFactory.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsIGenericFactory.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\necko\nsIHttpProtocolHandler.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsIInterfaceInfo.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsIInterfaceInfoManager.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpconnect\nsIJSContextStack.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsIMemory.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsIModule.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\caps\nsIPrincipal.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsIProgrammingLanguage.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\necko\nsIProtocolHandler.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\necko\nsIProxiedProtocolHandler.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpconnect\nsIScriptableInterfaces.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\dom\nsIScriptGlobalObject.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\dom\nsIScriptObjectPrincipal.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\caps\nsISecurityCheckedComponent.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsISerializable.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsIServiceManager.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsISimpleEnumerator.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsISimpleEnumerator.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsISupports.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsISupports.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsISupportsBase.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsISupportsBase.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsISupportsImpl.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsISupportsUtils.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsISupportsUtils.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsIURI.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsIVariant.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpconnect\nsIXPConnect.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsMemory.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\necko\nsNetCID.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsrootidl.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsrootidl.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsServiceManagerUtils.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsStringAPI.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsTraceRefcnt.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsXPCOM.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsXPCOMCID.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsXPCOMStrings.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\pratom.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\prcpucfg.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\prinrval.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\prlock.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\prlog.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\prlong.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\obsolete\protypes.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\prthread.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\prtime.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\prtypes.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpconnect\xpccomponents.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpconnect\xpcexception.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpconnect\xpcjsid.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\WINNT_x86-msvc\include\xpcom-config.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\xpt_arena.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\xpt_struct.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\xptinfo.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jsproto.tbl">
+ <Filter>Header Files\gecko</Filter>
+ </None>
+ <None Include="..\xpGwtDevPlugin.def">
+ <Filter>Source Files</Filter>
+ </None>
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="..\xpGwtDevPlugin.rc">
+ <Filter>Resource Files</Filter>
+ </ResourceCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\ExternalWrapper.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\FFSessionHandler.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\JavaObject.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\JSRunner.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\ModuleOOPHM.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Preferences.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\XpcomDebug.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\AllowedConnections.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\CheckVersionsMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\ChooseTransportMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\Debug.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\FatalErrorMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\FreeValueMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\HostChannel.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\InvokeMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\InvokeSpecialMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\LoadJsniMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\LoadModuleMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\ProtocolVersionMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\ReturnMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\ServerMethods.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\Socket.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\SwitchTransportMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ </ItemGroup>
+</Project>
\ No newline at end of file
diff --git a/plugins/xpcom/VisualStudio/ff50-xpcom.vcproj b/plugins/xpcom/VisualStudio/ff50-xpcom.vcproj
new file mode 100644
index 0000000..6071520
--- /dev/null
+++ b/plugins/xpcom/VisualStudio/ff50-xpcom.vcproj
@@ -0,0 +1,845 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="9.00"
+ Name="ff50-xpcom"
+ ProjectGUID="{6BF0C2CE-CB0C-421B-A67C-1E448371D24D}"
+ RootNamespace="ff50-xpcom"
+ Keyword="Win32Proj"
+ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="Debug50"
+ IntermediateDirectory="Debug50"
+ ConfigurationType="2"
+ UseOfMFC="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories=""$(ProjectDir)\..\..\common";..\prebuilt\ff50\include;"..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include";"..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\mozilla";"..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\WINNT_x86-msvc\include";"..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpconnect";"..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\WINNT_x86-msvc\include""
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF4;GECKO_VERSION=2000"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ TreatWChar_tAsBuiltInType="false"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ ResourceOutputFileName="$(IntDir)/$(TargetName).res"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="ws2_32.lib Advapi32.lib xpcomglue_s.lib xpcom.lib nspr4.lib mozalloc.lib xul.lib mozjs.lib"
+ ShowProgress="2"
+ OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff50\xpGwtDevPlugin.dll"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories=""..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\WINNT_x86-msvc\lib""
+ ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
+ SubSystem="2"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ ImportLibrary="$(IntDir)\$(TargetName).lib"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="Release50"
+ IntermediateDirectory="Release50"
+ ConfigurationType="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="3"
+ EnableIntrinsicFunctions="true"
+ AdditionalIncludeDirectories=""$(ProjectDir)\..\..\common";..\prebuilt\ff50\include;"..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include";"..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\mozilla";"..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\WINNT_x86-msvc\include";"..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpconnect";"..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\WINNT_x86-msvc\include""
+ PreprocessorDefinitions="WIN32;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF4;GECKO_VERSION=2000;$(NOINHERIT)"
+ ExceptionHandling="1"
+ RuntimeLibrary="0"
+ TreatWChar_tAsBuiltInType="false"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="false"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ ResourceOutputFileName="$(IntDir)/$(TargetName).res"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="ws2_32.lib Advapi32.lib xpcomglue_s.lib xpcom.lib nspr4.lib mozalloc.lib xul.lib mozjs.lib"
+ ShowProgress="2"
+ OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff50\xpGwtDevPlugin.dll"
+ LinkIncremental="0"
+ AdditionalLibraryDirectories=""..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\WINNT_x86-msvc\lib""
+ ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ ImportLibrary="$(IntDir)\$(TargetName).lib"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ <File
+ RelativePath="..\ExternalWrapper.h"
+ >
+ </File>
+ <File
+ RelativePath="..\FFSessionHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\prebuilt\ff50\include\IOOPHM.h"
+ >
+ </File>
+ <File
+ RelativePath="..\JavaObject.h"
+ >
+ </File>
+ <File
+ RelativePath="..\JSRunner.h"
+ >
+ </File>
+ <File
+ RelativePath="..\mozincludes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\Preferences.h"
+ >
+ </File>
+ <File
+ RelativePath="..\RootedObject.h"
+ >
+ </File>
+ <File
+ RelativePath="..\SessionData.h"
+ >
+ </File>
+ <File
+ RelativePath="..\XpcomDebug.h"
+ >
+ </File>
+ <Filter
+ Name="common"
+ >
+ <File
+ RelativePath="..\..\common\AllowedConnections.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\BrowserChannel.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ByteOrder.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\CheckVersionsMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ChooseTransportMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Debug.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\DebugLevel.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FatalErrorMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FreeValueMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\HashMap.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\HostChannel.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeSpecialMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadJsniMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadModuleMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Message.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Platform.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ProtocolVersionMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\QuitMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ReturnMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\scoped_ptr\scoped_ptr.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ServerMethods.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\SessionHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Socket.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\SwitchTransportMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Value.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="gecko"
+ >
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\WINNT_x86-msvc\include\js-config.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jsapi.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jsautocfg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jscompat.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jsconfig.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\WINNT_x86-msvc\include\jscpucfg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\jscpucfg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\jsinttypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jslong.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\jsosdep.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jsotypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jsproto.tbl"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jspubtd.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jstypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jsutil.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jsutil.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jsutil.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jsutil.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\WINNT_x86-msvc\include\mozilla-config.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpconnect\nsAXPCNativeCallContext.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsCOMPtr.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nscore.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nscore.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsCycleCollector.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsDebug.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsError.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\widget\nsEvent.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsICategoryManager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsIClassInfo.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsIClassInfoImpl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsIComponentManager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsID.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsIEnumerator.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsIException.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsIExceptionService.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsIFactory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsIGenericFactory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\necko\nsIHttpProtocolHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsIInterfaceInfo.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsIInterfaceInfoManager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpconnect\nsIJSContextStack.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsIMemory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsIModule.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\caps\nsIPrincipal.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsIProgrammingLanguage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\necko\nsIProtocolHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\necko\nsIProxiedProtocolHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpconnect\nsIScriptableInterfaces.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\dom\nsIScriptGlobalObject.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\dom\nsIScriptObjectPrincipal.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\caps\nsISecurityCheckedComponent.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsISerializable.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsIServiceManager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsISimpleEnumerator.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsISimpleEnumerator.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsISupports.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsISupports.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsISupportsBase.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsISupportsBase.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsISupportsImpl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsISupportsUtils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsISupportsUtils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsIURI.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsIVariant.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpconnect\nsIXPConnect.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsMemory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\necko\nsNetCID.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsrootidl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsrootidl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsServiceManagerUtils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsStringAPI.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsTraceRefcnt.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsXPCOM.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsXPCOMCID.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsXPCOMStrings.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\pratom.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\prcpucfg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\prinrval.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\prlock.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\prlog.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\prlong.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\obsolete\protypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\prthread.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\prtime.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\prtypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpconnect\xpccomponents.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpconnect\xpcexception.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpconnect\xpcjsid.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\WINNT_x86-msvc\include\xpcom-config.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\xpt_arena.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\xpt_struct.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\xptinfo.h"
+ >
+ </File>
+ </Filter>
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ >
+ <File
+ RelativePath="..\xpGwtDevPlugin.rc"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\ExternalWrapper.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\FFSessionHandler.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\JavaObject.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\JSRunner.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\ModuleOOPHM.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ GeneratePreprocessedFile="0"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\Preferences.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\XpcomDebug.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\xpGwtDevPlugin.def"
+ >
+ </File>
+ <Filter
+ Name="common"
+ >
+ <File
+ RelativePath="..\..\common\AllowedConnections.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\CheckVersionsMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ChooseTransportMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Debug.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FatalErrorMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FreeValueMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\HostChannel.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeSpecialMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadJsniMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadModuleMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ProtocolVersionMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ReturnMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ServerMethods.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Socket.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\SwitchTransportMessage.cpp"
+ >
+ </File>
+ </Filter>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/plugins/xpcom/VisualStudio/ff50-xpcom.vcxproj b/plugins/xpcom/VisualStudio/ff50-xpcom.vcxproj
new file mode 100644
index 0000000..8db2270
--- /dev/null
+++ b/plugins/xpcom/VisualStudio/ff50-xpcom.vcxproj
@@ -0,0 +1,277 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{58AE040D-01CC-4E4A-AE98-BEDE56480AE9}</ProjectGuid>
+ <RootNamespace>ff50-xpcom</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>Static</UseOfMfc>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Debug50\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Debug50\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Release50\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Release50\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>$(ProjectDir)\..\..\common;..\prebuilt\ff50\include;..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\WINNT_x86-msvc\include;..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include;..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\mozilla;..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpconnect;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF4;GECKO_VERSION=2000;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <TreatWChar_tAsBuiltInType>false</TreatWChar_tAsBuiltInType>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <ResourceCompile>
+ <ResourceOutputFileName>$(IntDir)$(TargetName).res</ResourceOutputFileName>
+ </ResourceCompile>
+ <Link>
+ <AdditionalDependencies>ws2_32.lib;Advapi32.lib;xpcomglue_s.lib;xpcom.lib;nspr4.lib;mozalloc.lib;xul.lib;mozjs.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <ShowProgress>LinkVerboseLib</ShowProgress>
+ <OutputFile>$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff50\xpGwtDevPlugin.dll</OutputFile>
+ <AdditionalLibraryDirectories>..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\WINNT_x86-msvc\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ <ModuleDefinitionFile>$(ProjectDir)\..\xpGwtDevPlugin.def</ModuleDefinitionFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
+ <SubSystem>Windows</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <Optimization>Full</Optimization>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <AdditionalIncludeDirectories>$(ProjectDir)\..\..\common;..\prebuilt\ff50\include;..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\WINNT_x86-msvc\include;..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include;..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\mozilla;..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpconnect;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF4;GECKO_VERSION=2000</PreprocessorDefinitions>
+ <ExceptionHandling>Sync</ExceptionHandling>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <TreatWChar_tAsBuiltInType>false</TreatWChar_tAsBuiltInType>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <ResourceCompile>
+ <ResourceOutputFileName>$(IntDir)$(TargetName).res</ResourceOutputFileName>
+ </ResourceCompile>
+ <Link>
+ <AdditionalDependencies>ws2_32.lib;Advapi32.lib;xpcomglue_s.lib;xpcom.lib;nspr4.lib;mozalloc.lib;xul.lib;mozjs.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <ShowProgress>LinkVerboseLib</ShowProgress>
+ <OutputFile>$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff50\xpGwtDevPlugin.dll</OutputFile>
+ <AdditionalLibraryDirectories>..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\WINNT_x86-msvc\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ <ModuleDefinitionFile>$(ProjectDir)\..\xpGwtDevPlugin.def</ModuleDefinitionFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
+ <SubSystem>Windows</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClInclude Include="..\ExternalWrapper.h" />
+ <ClInclude Include="..\FFSessionHandler.h" />
+ <ClInclude Include="..\prebuilt\ff50\include\IOOPHM.h" />
+ <ClInclude Include="..\JavaObject.h" />
+ <ClInclude Include="..\JSRunner.h" />
+ <ClInclude Include="..\mozincludes.h" />
+ <ClInclude Include="..\Preferences.h" />
+ <ClInclude Include="..\RootedObject.h" />
+ <ClInclude Include="..\SessionData.h" />
+ <ClInclude Include="..\XpcomDebug.h" />
+ <ClInclude Include="..\..\common\AllowedConnections.h" />
+ <ClInclude Include="..\..\common\BrowserChannel.h" />
+ <ClInclude Include="..\..\common\ByteOrder.h" />
+ <ClInclude Include="..\..\common\CheckVersionsMessage.h" />
+ <ClInclude Include="..\..\common\ChooseTransportMessage.h" />
+ <ClInclude Include="..\..\common\Debug.h" />
+ <ClInclude Include="..\..\common\DebugLevel.h" />
+ <ClInclude Include="..\..\common\FatalErrorMessage.h" />
+ <ClInclude Include="..\..\common\FreeValueMessage.h" />
+ <ClInclude Include="..\..\common\HashMap.h" />
+ <ClInclude Include="..\..\common\HostChannel.h" />
+ <ClInclude Include="..\..\common\InvokeMessage.h" />
+ <ClInclude Include="..\..\common\InvokeSpecialMessage.h" />
+ <ClInclude Include="..\..\common\LoadJsniMessage.h" />
+ <ClInclude Include="..\..\common\LoadModuleMessage.h" />
+ <ClInclude Include="..\..\common\Message.h" />
+ <ClInclude Include="..\..\common\Platform.h" />
+ <ClInclude Include="..\..\common\ProtocolVersionMessage.h" />
+ <ClInclude Include="..\..\common\QuitMessage.h" />
+ <ClInclude Include="..\..\common\ReturnMessage.h" />
+ <ClInclude Include="..\..\common\scoped_ptr\scoped_ptr.h" />
+ <ClInclude Include="..\..\common\ServerMethods.h" />
+ <ClInclude Include="..\..\common\SessionHandler.h" />
+ <ClInclude Include="..\..\common\Socket.h" />
+ <ClInclude Include="..\..\common\SwitchTransportMessage.h" />
+ <ClInclude Include="..\..\common\Value.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\WINNT_x86-msvc\include\js-config.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jsapi.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jsautocfg.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jscompat.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jsconfig.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\WINNT_x86-msvc\include\jscpucfg.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\jscpucfg.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\jsinttypes.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jslong.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\jsosdep.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jsotypes.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jspubtd.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jstypes.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jsutil.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\WINNT_x86-msvc\include\mozilla-config.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpconnect\nsAXPCNativeCallContext.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsCOMPtr.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nscore.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nscore.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsCycleCollector.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsDebug.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsError.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\widget\nsEvent.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsICategoryManager.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsIClassInfo.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsIClassInfoImpl.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsIComponentManager.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsID.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsIEnumerator.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsIException.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsIExceptionService.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsIFactory.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsIGenericFactory.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\necko\nsIHttpProtocolHandler.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsIInterfaceInfo.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsIInterfaceInfoManager.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpconnect\nsIJSContextStack.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsIMemory.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsIModule.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\caps\nsIPrincipal.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsIProgrammingLanguage.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\necko\nsIProtocolHandler.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\necko\nsIProxiedProtocolHandler.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpconnect\nsIScriptableInterfaces.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\dom\nsIScriptGlobalObject.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\dom\nsIScriptObjectPrincipal.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\caps\nsISecurityCheckedComponent.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsISerializable.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsIServiceManager.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsISimpleEnumerator.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsISimpleEnumerator.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsISupports.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsISupports.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsISupportsBase.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsISupportsBase.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsISupportsImpl.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsISupportsUtils.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsISupportsUtils.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsIURI.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsIVariant.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpconnect\nsIXPConnect.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsMemory.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\necko\nsNetCID.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsrootidl.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsrootidl.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsServiceManagerUtils.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsStringAPI.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsTraceRefcnt.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsXPCOM.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsXPCOMCID.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsXPCOMStrings.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\pratom.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\prcpucfg.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\prinrval.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\prlock.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\prlog.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\prlong.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\obsolete\protypes.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\prthread.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\prtime.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\prtypes.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpconnect\xpccomponents.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpconnect\xpcexception.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpconnect\xpcjsid.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\WINNT_x86-msvc\include\xpcom-config.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\xpt_arena.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\xpt_struct.h" />
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\xptinfo.h" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jsproto.tbl" />
+ <None Include="..\xpGwtDevPlugin.def" />
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="..\xpGwtDevPlugin.rc" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\ExternalWrapper.cpp" />
+ <ClCompile Include="..\FFSessionHandler.cpp" />
+ <ClCompile Include="..\JavaObject.cpp" />
+ <ClCompile Include="..\JSRunner.cpp" />
+ <ClCompile Include="..\ModuleOOPHM.cpp">
+ <PreprocessToFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</PreprocessToFile>
+ <PreprocessSuppressLineNumbers Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</PreprocessSuppressLineNumbers>
+ </ClCompile>
+ <ClCompile Include="..\Preferences.cpp" />
+ <ClCompile Include="..\XpcomDebug.cpp" />
+ <ClCompile Include="..\..\common\AllowedConnections.cpp" />
+ <ClCompile Include="..\..\common\CheckVersionsMessage.cpp" />
+ <ClCompile Include="..\..\common\ChooseTransportMessage.cpp" />
+ <ClCompile Include="..\..\common\Debug.cpp" />
+ <ClCompile Include="..\..\common\FatalErrorMessage.cpp" />
+ <ClCompile Include="..\..\common\FreeValueMessage.cpp" />
+ <ClCompile Include="..\..\common\HostChannel.cpp" />
+ <ClCompile Include="..\..\common\InvokeMessage.cpp" />
+ <ClCompile Include="..\..\common\InvokeSpecialMessage.cpp" />
+ <ClCompile Include="..\..\common\LoadJsniMessage.cpp" />
+ <ClCompile Include="..\..\common\LoadModuleMessage.cpp" />
+ <ClCompile Include="..\..\common\ProtocolVersionMessage.cpp" />
+ <ClCompile Include="..\..\common\ReturnMessage.cpp" />
+ <ClCompile Include="..\..\common\ServerMethods.cpp" />
+ <ClCompile Include="..\..\common\Socket.cpp" />
+ <ClCompile Include="..\..\common\SwitchTransportMessage.cpp" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project>
\ No newline at end of file
diff --git a/plugins/xpcom/VisualStudio/ff50-xpcom.vcxproj.filters b/plugins/xpcom/VisualStudio/ff50-xpcom.vcxproj.filters
new file mode 100644
index 0000000..0bd143e
--- /dev/null
+++ b/plugins/xpcom/VisualStudio/ff50-xpcom.vcxproj.filters
@@ -0,0 +1,484 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Header Files">
+ <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
+ <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
+ </Filter>
+ <Filter Include="Header Files\common">
+ <UniqueIdentifier>{a7c29063-75f8-42b1-965f-a05c1216d850}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Header Files\gecko">
+ <UniqueIdentifier>{5a35bded-1db6-48ba-ae1a-efd9f28c578f}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Resource Files">
+ <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
+ <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx</Extensions>
+ </Filter>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+ <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+ </Filter>
+ <Filter Include="Source Files\common">
+ <UniqueIdentifier>{155aa627-d60d-49af-9953-f150d540f110}</UniqueIdentifier>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\ExternalWrapper.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\FFSessionHandler.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\prebuilt\ff40\include\IOOPHM.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\JavaObject.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\JSRunner.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\mozincludes.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Preferences.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\RootedObject.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\SessionData.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\XpcomDebug.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\AllowedConnections.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\BrowserChannel.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\ByteOrder.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\CheckVersionsMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\ChooseTransportMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\Debug.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\DebugLevel.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\FatalErrorMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\FreeValueMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\HashMap.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\HostChannel.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\InvokeMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\InvokeSpecialMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\LoadJsniMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\LoadModuleMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\Message.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\Platform.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\ProtocolVersionMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\QuitMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\ReturnMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\scoped_ptr\scoped_ptr.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\ServerMethods.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\SessionHandler.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\Socket.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\SwitchTransportMessage.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\common\Value.h">
+ <Filter>Header Files\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\WINNT_x86-msvc\include\js-config.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jsapi.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jsautocfg.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jscompat.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jsconfig.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\WINNT_x86-msvc\include\jscpucfg.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\jscpucfg.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\jsinttypes.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jslong.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\jsosdep.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jsotypes.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jspubtd.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jstypes.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jsutil.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\WINNT_x86-msvc\include\mozilla-config.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpconnect\nsAXPCNativeCallContext.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsCOMPtr.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nscore.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nscore.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsCycleCollector.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsDebug.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsError.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\widget\nsEvent.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsICategoryManager.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsIClassInfo.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsIClassInfoImpl.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsIComponentManager.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsID.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsIEnumerator.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsIException.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsIExceptionService.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsIFactory.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsIGenericFactory.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\necko\nsIHttpProtocolHandler.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsIInterfaceInfo.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsIInterfaceInfoManager.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpconnect\nsIJSContextStack.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsIMemory.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsIModule.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\caps\nsIPrincipal.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsIProgrammingLanguage.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\necko\nsIProtocolHandler.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\necko\nsIProxiedProtocolHandler.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpconnect\nsIScriptableInterfaces.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\dom\nsIScriptGlobalObject.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\dom\nsIScriptObjectPrincipal.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\caps\nsISecurityCheckedComponent.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsISerializable.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsIServiceManager.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsISimpleEnumerator.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsISimpleEnumerator.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsISupports.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsISupports.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsISupportsBase.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsISupportsBase.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsISupportsImpl.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsISupportsUtils.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsISupportsUtils.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsIURI.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsIVariant.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpconnect\nsIXPConnect.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsMemory.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\necko\nsNetCID.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsrootidl.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsrootidl.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsServiceManagerUtils.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsStringAPI.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsTraceRefcnt.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsXPCOM.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsXPCOMCID.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsXPCOMStrings.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\pratom.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\prcpucfg.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\prinrval.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\prlock.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\prlog.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\prlong.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\obsolete\protypes.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\prthread.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\prtime.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\prtypes.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpconnect\xpccomponents.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpconnect\xpcexception.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpconnect\xpcjsid.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\WINNT_x86-msvc\include\xpcom-config.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\xpt_arena.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\xpt_struct.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\xptinfo.h">
+ <Filter>Header Files\gecko</Filter>
+ </ClInclude>
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jsproto.tbl">
+ <Filter>Header Files\gecko</Filter>
+ </None>
+ <None Include="..\xpGwtDevPlugin.def">
+ <Filter>Source Files</Filter>
+ </None>
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="..\xpGwtDevPlugin.rc">
+ <Filter>Resource Files</Filter>
+ </ResourceCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\ExternalWrapper.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\FFSessionHandler.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\JavaObject.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\JSRunner.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\ModuleOOPHM.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Preferences.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\XpcomDebug.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\AllowedConnections.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\CheckVersionsMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\ChooseTransportMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\Debug.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\FatalErrorMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\FreeValueMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\HostChannel.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\InvokeMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\InvokeSpecialMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\LoadJsniMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\LoadModuleMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\ProtocolVersionMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\ReturnMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\ServerMethods.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\Socket.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\common\SwitchTransportMessage.cpp">
+ <Filter>Source Files\common</Filter>
+ </ClCompile>
+ </ItemGroup>
+</Project>
\ No newline at end of file
diff --git a/plugins/xpcom/VisualStudio/ff60-xpcom.vcproj b/plugins/xpcom/VisualStudio/ff60-xpcom.vcproj
new file mode 100755
index 0000000..fe269c3
--- /dev/null
+++ b/plugins/xpcom/VisualStudio/ff60-xpcom.vcproj
@@ -0,0 +1,845 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="9.00"
+ Name="ff60-xpcom"
+ ProjectGUID="{6BF0C2CE-CB0C-421B-A67C-1E448371D24D}"
+ RootNamespace="ff60-xpcom"
+ Keyword="Win32Proj"
+ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="Debug60"
+ IntermediateDirectory="Debug60"
+ ConfigurationType="2"
+ UseOfMFC="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories=""$(ProjectDir)\..\..\common";..\prebuilt\ff60\include;"..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include";"..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\mozilla";"..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\WINNT_x86-msvc\include";"..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\xpconnect";"..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\WINNT_x86-msvc\include""
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF4;GECKO_VERSION=2000"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ TreatWChar_tAsBuiltInType="false"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ ResourceOutputFileName="$(IntDir)/$(TargetName).res"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="ws2_32.lib Advapi32.lib xpcomglue_s.lib xpcom.lib nspr4.lib mozalloc.lib xul.lib mozjs.lib"
+ ShowProgress="2"
+ OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff60\xpGwtDevPlugin.dll"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories=""..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\WINNT_x86-msvc\lib""
+ ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
+ SubSystem="2"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ ImportLibrary="$(IntDir)\$(TargetName).lib"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="Release60"
+ IntermediateDirectory="Release60"
+ ConfigurationType="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="3"
+ EnableIntrinsicFunctions="true"
+ AdditionalIncludeDirectories=""$(ProjectDir)\..\..\common";..\prebuilt\ff60\include;"..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include";"..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\mozilla";"..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\WINNT_x86-msvc\include";"..\..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\xpconnect""
+ PreprocessorDefinitions="WIN32;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF4;GECKO_VERSION=2000;$(NOINHERIT)"
+ ExceptionHandling="1"
+ RuntimeLibrary="0"
+ TreatWChar_tAsBuiltInType="false"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="false"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ ResourceOutputFileName="$(IntDir)/$(TargetName).res"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="ws2_32.lib Advapi32.lib xpcomglue_s.lib xpcom.lib nspr4.lib mozalloc.lib xul.lib mozjs.lib"
+ ShowProgress="2"
+ OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff60\xpGwtDevPlugin.dll"
+ LinkIncremental="0"
+ AdditionalLibraryDirectories=""..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\WINNT_x86-msvc\lib""
+ ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ ImportLibrary="$(IntDir)\$(TargetName).lib"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ <File
+ RelativePath="..\ExternalWrapper.h"
+ >
+ </File>
+ <File
+ RelativePath="..\FFSessionHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\prebuilt\ff60\include\IOOPHM.h"
+ >
+ </File>
+ <File
+ RelativePath="..\JavaObject.h"
+ >
+ </File>
+ <File
+ RelativePath="..\JSRunner.h"
+ >
+ </File>
+ <File
+ RelativePath="..\mozincludes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\Preferences.h"
+ >
+ </File>
+ <File
+ RelativePath="..\RootedObject.h"
+ >
+ </File>
+ <File
+ RelativePath="..\SessionData.h"
+ >
+ </File>
+ <File
+ RelativePath="..\XpcomDebug.h"
+ >
+ </File>
+ <Filter
+ Name="common"
+ >
+ <File
+ RelativePath="..\..\common\AllowedConnections.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\BrowserChannel.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ByteOrder.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\CheckVersionsMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ChooseTransportMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Debug.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\DebugLevel.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FatalErrorMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FreeValueMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\HashMap.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\HostChannel.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeSpecialMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadJsniMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadModuleMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Message.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Platform.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ProtocolVersionMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\QuitMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ReturnMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\scoped_ptr\scoped_ptr.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ServerMethods.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\SessionHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Socket.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\SwitchTransportMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Value.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="gecko"
+ >
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\WINNT_x86-msvc\include\js-config.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\js\jsapi.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\js\jsautocfg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\js\jscompat.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\js\jsconfig.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\WINNT_x86-msvc\include\jscpucfg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\jscpucfg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\jsinttypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\js\jslong.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\jsosdep.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\js\jsotypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\js\jsproto.tbl"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\js\jspubtd.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\js\jstypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\js\jsutil.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\js\jsutil.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\js\jsutil.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\js\jsutil.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\WINNT_x86-msvc\include\mozilla-config.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\xpconnect\nsAXPCNativeCallContext.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\nsCOMPtr.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\nscore.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\xpcom\nscore.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\nsCycleCollector.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\nsDebug.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\nsError.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\widget\nsEvent.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\nsICategoryManager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\nsIClassInfo.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\nsIClassInfoImpl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\nsIComponentManager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\nsID.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\xpcom\nsIEnumerator.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\xpcom\nsIException.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\xpcom\nsIExceptionService.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\nsIFactory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\nsIGenericFactory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\necko\nsIHttpProtocolHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\xpcom\nsIInterfaceInfo.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\xpcom\nsIInterfaceInfoManager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\xpconnect\nsIJSContextStack.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\nsIMemory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\nsIModule.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\caps\nsIPrincipal.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\nsIProgrammingLanguage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\necko\nsIProtocolHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\necko\nsIProxiedProtocolHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\xpconnect\nsIScriptableInterfaces.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\dom\nsIScriptGlobalObject.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\dom\nsIScriptObjectPrincipal.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\caps\nsISecurityCheckedComponent.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\xpcom\nsISerializable.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\nsIServiceManager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\xpcom\nsISimpleEnumerator.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\nsISimpleEnumerator.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\xpcom\nsISupports.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\nsISupports.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\xpcom\nsISupportsBase.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\nsISupportsBase.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\nsISupportsImpl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\xpcom\nsISupportsUtils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\nsISupportsUtils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\nsIURI.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\xpcom\nsIVariant.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\xpconnect\nsIXPConnect.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\nsMemory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\necko\nsNetCID.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\nsrootidl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\xpcom\nsrootidl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\nsServiceManagerUtils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\nsStringAPI.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\nsTraceRefcnt.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\nsXPCOM.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\nsXPCOMCID.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\nsXPCOMStrings.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\pratom.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\prcpucfg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\prinrval.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\prlock.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\prlog.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\prlong.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\obsolete\protypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\prthread.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\prtime.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\prtypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\xpconnect\xpccomponents.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\xpconnect\xpcexception.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\xpconnect\xpcjsid.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\WINNT_x86-msvc\include\xpcom-config.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\xpcom\xpt_arena.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\xpcom\xpt_struct.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\xpcom\xptinfo.h"
+ >
+ </File>
+ </Filter>
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ >
+ <File
+ RelativePath="..\xpGwtDevPlugin.rc"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\ExternalWrapper.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\FFSessionHandler.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\JavaObject.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\JSRunner.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\ModuleOOPHM.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ GeneratePreprocessedFile="0"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\Preferences.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\XpcomDebug.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\xpGwtDevPlugin.def"
+ >
+ </File>
+ <Filter
+ Name="common"
+ >
+ <File
+ RelativePath="..\..\common\AllowedConnections.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\CheckVersionsMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ChooseTransportMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Debug.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FatalErrorMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FreeValueMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\HostChannel.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeSpecialMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadJsniMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadModuleMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ProtocolVersionMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ReturnMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ServerMethods.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Socket.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\SwitchTransportMessage.cpp"
+ >
+ </File>
+ </Filter>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/plugins/xpcom/VisualStudio/ff70-xpcom.vcproj b/plugins/xpcom/VisualStudio/ff70-xpcom.vcproj
new file mode 100755
index 0000000..d4f64e3
--- /dev/null
+++ b/plugins/xpcom/VisualStudio/ff70-xpcom.vcproj
@@ -0,0 +1,845 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="9.00"
+ Name="ff70-xpcom"
+ ProjectGUID="{6BF0C2CE-CB0C-421B-A67C-1E448371D24D}"
+ RootNamespace="ff70-xpcom"
+ Keyword="Win32Proj"
+ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="Debug70"
+ IntermediateDirectory="Debug70"
+ ConfigurationType="2"
+ UseOfMFC="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories=""$(ProjectDir)\..\..\common";..\prebuilt\ff70\include;"..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include";"..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\mozilla";"..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\WINNT_x86-msvc\include";"..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\xpconnect";"..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\WINNT_x86-msvc\include""
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF4;GECKO_VERSION=2000"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ TreatWChar_tAsBuiltInType="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ ResourceOutputFileName="$(IntDir)/$(TargetName).res"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="ws2_32.lib Advapi32.lib xpcomglue_s.lib xpcom.lib nspr4.lib mozalloc.lib xul.lib mozjs.lib"
+ ShowProgress="2"
+ OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff70\xpGwtDevPlugin.dll"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories=""..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\WINNT_x86-msvc\lib""
+ ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
+ SubSystem="2"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ ImportLibrary="$(IntDir)\$(TargetName).lib"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="Release70"
+ IntermediateDirectory="Release70"
+ ConfigurationType="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="3"
+ EnableIntrinsicFunctions="true"
+ AdditionalIncludeDirectories=""$(ProjectDir)\..\..\common";..\prebuilt\ff70\include;"..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include";"..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\mozilla";"..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\WINNT_x86-msvc\include";"..\..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\xpconnect""
+ PreprocessorDefinitions="WIN32;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF4;GECKO_VERSION=2000;$(NOINHERIT)"
+ ExceptionHandling="1"
+ RuntimeLibrary="0"
+ TreatWChar_tAsBuiltInType="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="false"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ ResourceOutputFileName="$(IntDir)/$(TargetName).res"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="ws2_32.lib Advapi32.lib xpcomglue_s.lib xpcom.lib nspr4.lib mozalloc.lib xul.lib mozjs.lib"
+ ShowProgress="2"
+ OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff70\xpGwtDevPlugin.dll"
+ LinkIncremental="0"
+ AdditionalLibraryDirectories=""..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\WINNT_x86-msvc\lib""
+ ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ ImportLibrary="$(IntDir)\$(TargetName).lib"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ <File
+ RelativePath="..\ExternalWrapper.h"
+ >
+ </File>
+ <File
+ RelativePath="..\FFSessionHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\prebuilt\ff70\include\IOOPHM.h"
+ >
+ </File>
+ <File
+ RelativePath="..\JavaObject.h"
+ >
+ </File>
+ <File
+ RelativePath="..\JSRunner.h"
+ >
+ </File>
+ <File
+ RelativePath="..\mozincludes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\Preferences.h"
+ >
+ </File>
+ <File
+ RelativePath="..\RootedObject.h"
+ >
+ </File>
+ <File
+ RelativePath="..\SessionData.h"
+ >
+ </File>
+ <File
+ RelativePath="..\XpcomDebug.h"
+ >
+ </File>
+ <Filter
+ Name="common"
+ >
+ <File
+ RelativePath="..\..\common\AllowedConnections.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\BrowserChannel.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ByteOrder.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\CheckVersionsMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ChooseTransportMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Debug.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\DebugLevel.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FatalErrorMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FreeValueMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\HashMap.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\HostChannel.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeSpecialMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadJsniMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadModuleMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Message.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Platform.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ProtocolVersionMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\QuitMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ReturnMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\scoped_ptr\scoped_ptr.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ServerMethods.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\SessionHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Socket.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\SwitchTransportMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Value.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="gecko"
+ >
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\WINNT_x86-msvc\include\js-config.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\js\jsapi.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\js\jsautocfg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\js\jscompat.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\js\jsconfig.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\WINNT_x86-msvc\include\jscpucfg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\jscpucfg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\jsinttypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\js\jslong.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\jsosdep.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\js\jsotypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\js\jsproto.tbl"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\js\jspubtd.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\js\jstypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\js\jsutil.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\js\jsutil.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\js\jsutil.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\js\jsutil.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\WINNT_x86-msvc\include\mozilla-config.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\xpconnect\nsAXPCNativeCallContext.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\nsCOMPtr.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\nscore.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\xpcom\nscore.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\nsCycleCollector.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\nsDebug.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\nsError.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\widget\nsEvent.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\nsICategoryManager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\nsIClassInfo.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\nsIClassInfoImpl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\nsIComponentManager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\nsID.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\xpcom\nsIEnumerator.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\xpcom\nsIException.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\xpcom\nsIExceptionService.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\nsIFactory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\nsIGenericFactory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\necko\nsIHttpProtocolHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\xpcom\nsIInterfaceInfo.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\xpcom\nsIInterfaceInfoManager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\xpconnect\nsIJSContextStack.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\nsIMemory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\nsIModule.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\caps\nsIPrincipal.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\nsIProgrammingLanguage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\necko\nsIProtocolHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\necko\nsIProxiedProtocolHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\xpconnect\nsIScriptableInterfaces.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\dom\nsIScriptGlobalObject.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\dom\nsIScriptObjectPrincipal.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\caps\nsISecurityCheckedComponent.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\xpcom\nsISerializable.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\nsIServiceManager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\xpcom\nsISimpleEnumerator.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\nsISimpleEnumerator.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\xpcom\nsISupports.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\nsISupports.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\xpcom\nsISupportsBase.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\nsISupportsBase.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\nsISupportsImpl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\xpcom\nsISupportsUtils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\nsISupportsUtils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\nsIURI.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\xpcom\nsIVariant.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\xpconnect\nsIXPConnect.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\nsMemory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\necko\nsNetCID.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\nsrootidl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\xpcom\nsrootidl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\nsServiceManagerUtils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\nsStringAPI.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\nsTraceRefcnt.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\nsXPCOM.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\nsXPCOMCID.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\nsXPCOMStrings.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\pratom.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\prcpucfg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\prinrval.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\prlock.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\prlog.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\prlong.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\obsolete\protypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\prthread.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\prtime.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\prtypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\xpconnect\xpccomponents.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\xpconnect\xpcexception.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\xpconnect\xpcjsid.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\WINNT_x86-msvc\include\xpcom-config.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\xpcom\xpt_arena.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\xpcom\xpt_struct.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\xpcom\xptinfo.h"
+ >
+ </File>
+ </Filter>
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ >
+ <File
+ RelativePath="..\xpGwtDevPlugin.rc"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\ExternalWrapper.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\FFSessionHandler.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\JavaObject.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\JSRunner.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\ModuleOOPHM.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ GeneratePreprocessedFile="0"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\Preferences.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\XpcomDebug.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\xpGwtDevPlugin.def"
+ >
+ </File>
+ <Filter
+ Name="common"
+ >
+ <File
+ RelativePath="..\..\common\AllowedConnections.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\CheckVersionsMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ChooseTransportMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Debug.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FatalErrorMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FreeValueMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\HostChannel.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeSpecialMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadJsniMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadModuleMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ProtocolVersionMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ReturnMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ServerMethods.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Socket.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\SwitchTransportMessage.cpp"
+ >
+ </File>
+ </Filter>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/plugins/xpcom/VisualStudio/ff80-xpcom.vcproj b/plugins/xpcom/VisualStudio/ff80-xpcom.vcproj
new file mode 100755
index 0000000..a007fbd
--- /dev/null
+++ b/plugins/xpcom/VisualStudio/ff80-xpcom.vcproj
@@ -0,0 +1,845 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="9.00"
+ Name="ff80-xpcom"
+ ProjectGUID="{6BF0C2CE-CB0C-421B-A67C-1E448371D24D}"
+ RootNamespace="ff80-xpcom"
+ Keyword="Win32Proj"
+ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="Debug80"
+ IntermediateDirectory="Debug80"
+ ConfigurationType="2"
+ UseOfMFC="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories=""$(ProjectDir)\..\..\common";..\prebuilt\ff80\include;"..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include";"..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\mozilla";"..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\WINNT_x86-msvc\include";"..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\xpconnect";"..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\WINNT_x86-msvc\include""
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF8;GECKO_VERSION=8000"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ TreatWChar_tAsBuiltInType="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ ResourceOutputFileName="$(IntDir)/$(TargetName).res"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="ws2_32.lib Advapi32.lib xpcomglue_s.lib xpcom.lib nspr4.lib mozalloc.lib xul.lib mozjs.lib"
+ ShowProgress="2"
+ OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff80\xpGwtDevPlugin.dll"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories=""..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\WINNT_x86-msvc\lib""
+ ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
+ SubSystem="2"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ ImportLibrary="$(IntDir)\$(TargetName).lib"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="Release80"
+ IntermediateDirectory="Release80"
+ ConfigurationType="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="3"
+ EnableIntrinsicFunctions="true"
+ AdditionalIncludeDirectories=""$(ProjectDir)\..\..\common";..\prebuilt\ff80\include;"..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include";"..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\mozilla";"..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\WINNT_x86-msvc\include";"..\..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\xpconnect""
+ PreprocessorDefinitions="WIN32;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF8;GECKO_VERSION=8000;$(NOINHERIT)"
+ ExceptionHandling="1"
+ RuntimeLibrary="0"
+ TreatWChar_tAsBuiltInType="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="false"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ ResourceOutputFileName="$(IntDir)/$(TargetName).res"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="ws2_32.lib Advapi32.lib xpcomglue_s.lib xpcom.lib nspr4.lib mozalloc.lib xul.lib mozjs.lib"
+ ShowProgress="2"
+ OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff80\xpGwtDevPlugin.dll"
+ LinkIncremental="0"
+ AdditionalLibraryDirectories=""..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\WINNT_x86-msvc\lib""
+ ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ ImportLibrary="$(IntDir)\$(TargetName).lib"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ <File
+ RelativePath="..\ExternalWrapper.h"
+ >
+ </File>
+ <File
+ RelativePath="..\FFSessionHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\prebuilt\ff80\include\IOOPHM.h"
+ >
+ </File>
+ <File
+ RelativePath="..\JavaObject.h"
+ >
+ </File>
+ <File
+ RelativePath="..\JSRunner.h"
+ >
+ </File>
+ <File
+ RelativePath="..\mozincludes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\Preferences.h"
+ >
+ </File>
+ <File
+ RelativePath="..\RootedObject.h"
+ >
+ </File>
+ <File
+ RelativePath="..\SessionData.h"
+ >
+ </File>
+ <File
+ RelativePath="..\XpcomDebug.h"
+ >
+ </File>
+ <Filter
+ Name="common"
+ >
+ <File
+ RelativePath="..\..\common\AllowedConnections.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\BrowserChannel.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ByteOrder.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\CheckVersionsMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ChooseTransportMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Debug.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\DebugLevel.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FatalErrorMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FreeValueMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\HashMap.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\HostChannel.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeSpecialMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadJsniMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadModuleMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Message.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Platform.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ProtocolVersionMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\QuitMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ReturnMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\scoped_ptr\scoped_ptr.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ServerMethods.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\SessionHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Socket.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\SwitchTransportMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Value.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="gecko"
+ >
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\WINNT_x86-msvc\include\js-config.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\js\jsapi.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\js\jsautocfg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\js\jscompat.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\js\jsconfig.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\WINNT_x86-msvc\include\jscpucfg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\jscpucfg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\jsinttypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\js\jslong.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\jsosdep.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\js\jsotypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\js\jsproto.tbl"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\js\jspubtd.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\js\jstypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\js\jsutil.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\js\jsutil.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\js\jsutil.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\js\jsutil.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\WINNT_x86-msvc\include\mozilla-config.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\xpconnect\nsAXPCNativeCallContext.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\nsCOMPtr.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\nscore.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\xpcom\nscore.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\nsCycleCollector.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\nsDebug.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\nsError.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\widget\nsEvent.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\nsICategoryManager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\nsIClassInfo.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\nsIClassInfoImpl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\nsIComponentManager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\nsID.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\xpcom\nsIEnumerator.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\xpcom\nsIException.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\xpcom\nsIExceptionService.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\nsIFactory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\nsIGenericFactory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\necko\nsIHttpProtocolHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\xpcom\nsIInterfaceInfo.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\xpcom\nsIInterfaceInfoManager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\xpconnect\nsIJSContextStack.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\nsIMemory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\nsIModule.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\caps\nsIPrincipal.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\nsIProgrammingLanguage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\necko\nsIProtocolHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\necko\nsIProxiedProtocolHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\xpconnect\nsIScriptableInterfaces.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\dom\nsIScriptGlobalObject.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\dom\nsIScriptObjectPrincipal.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\caps\nsISecurityCheckedComponent.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\xpcom\nsISerializable.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\nsIServiceManager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\xpcom\nsISimpleEnumerator.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\nsISimpleEnumerator.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\xpcom\nsISupports.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\nsISupports.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\xpcom\nsISupportsBase.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\nsISupportsBase.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\nsISupportsImpl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\xpcom\nsISupportsUtils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\nsISupportsUtils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\nsIURI.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\xpcom\nsIVariant.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\xpconnect\nsIXPConnect.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\nsMemory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\necko\nsNetCID.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\nsrootidl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\xpcom\nsrootidl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\nsServiceManagerUtils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\nsStringAPI.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\nsTraceRefcnt.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\nsXPCOM.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\nsXPCOMCID.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\nsXPCOMStrings.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\pratom.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\prcpucfg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\prinrval.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\prlock.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\prlog.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\prlong.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\obsolete\protypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\prthread.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\prtime.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\prtypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\xpconnect\xpccomponents.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\xpconnect\xpcexception.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\xpconnect\xpcjsid.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\WINNT_x86-msvc\include\xpcom-config.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\xpcom\xpt_arena.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\xpcom\xpt_struct.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\xpcom\xptinfo.h"
+ >
+ </File>
+ </Filter>
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ >
+ <File
+ RelativePath="..\xpGwtDevPlugin.rc"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\ExternalWrapper.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\FFSessionHandler.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\JavaObject.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\JSRunner.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\ModuleOOPHM.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ GeneratePreprocessedFile="0"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\Preferences.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\XpcomDebug.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\xpGwtDevPlugin.def"
+ >
+ </File>
+ <Filter
+ Name="common"
+ >
+ <File
+ RelativePath="..\..\common\AllowedConnections.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\CheckVersionsMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ChooseTransportMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Debug.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FatalErrorMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FreeValueMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\HostChannel.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeSpecialMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadJsniMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadModuleMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ProtocolVersionMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ReturnMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ServerMethods.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Socket.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\SwitchTransportMessage.cpp"
+ >
+ </File>
+ </Filter>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/plugins/xpcom/VisualStudio/ff90-xpcom.vcproj b/plugins/xpcom/VisualStudio/ff90-xpcom.vcproj
new file mode 100755
index 0000000..51ee65c
--- /dev/null
+++ b/plugins/xpcom/VisualStudio/ff90-xpcom.vcproj
@@ -0,0 +1,845 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="9.00"
+ Name="ff90-xpcom"
+ ProjectGUID="{6BF0C2CE-CB0C-421B-A67C-1E448371D24D}"
+ RootNamespace="ff90-xpcom"
+ Keyword="Win32Proj"
+ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="Debug90"
+ IntermediateDirectory="Debug90"
+ ConfigurationType="2"
+ UseOfMFC="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories=""$(ProjectDir)\..\..\common";..\prebuilt\ff90\include;"..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include";"..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\mozilla";"..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\WINNT_x86-msvc\include";"..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\xpconnect";"..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\WINNT_x86-msvc\include""
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF8;GECKO_VERSION=9000"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ TreatWChar_tAsBuiltInType="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ ResourceOutputFileName="$(IntDir)/$(TargetName).res"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="ws2_32.lib Advapi32.lib xpcomglue_s.lib xpcom.lib nspr4.lib mozalloc.lib xul.lib mozjs.lib"
+ ShowProgress="2"
+ OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff90\xpGwtDevPlugin.dll"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories=""..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\WINNT_x86-msvc\lib""
+ ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
+ SubSystem="2"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ ImportLibrary="$(IntDir)\$(TargetName).lib"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="Release90"
+ IntermediateDirectory="Release90"
+ ConfigurationType="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="3"
+ EnableIntrinsicFunctions="true"
+ AdditionalIncludeDirectories=""$(ProjectDir)\..\..\common";..\prebuilt\ff90\include;"..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include";"..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\mozilla";"..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\WINNT_x86-msvc\include";"..\..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\xpconnect""
+ PreprocessorDefinitions="WIN32;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF8;GECKO_VERSION=9000;$(NOINHERIT)"
+ ExceptionHandling="1"
+ RuntimeLibrary="0"
+ TreatWChar_tAsBuiltInType="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="false"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ ResourceOutputFileName="$(IntDir)/$(TargetName).res"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="ws2_32.lib Advapi32.lib xpcomglue_s.lib xpcom.lib nspr4.lib mozalloc.lib xul.lib mozjs.lib"
+ ShowProgress="2"
+ OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff90\xpGwtDevPlugin.dll"
+ LinkIncremental="0"
+ AdditionalLibraryDirectories=""..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\WINNT_x86-msvc\lib""
+ ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ ImportLibrary="$(IntDir)\$(TargetName).lib"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ <File
+ RelativePath="..\ExternalWrapper.h"
+ >
+ </File>
+ <File
+ RelativePath="..\FFSessionHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\prebuilt\ff90\include\IOOPHM.h"
+ >
+ </File>
+ <File
+ RelativePath="..\JavaObject.h"
+ >
+ </File>
+ <File
+ RelativePath="..\JSRunner.h"
+ >
+ </File>
+ <File
+ RelativePath="..\mozincludes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\Preferences.h"
+ >
+ </File>
+ <File
+ RelativePath="..\RootedObject.h"
+ >
+ </File>
+ <File
+ RelativePath="..\SessionData.h"
+ >
+ </File>
+ <File
+ RelativePath="..\XpcomDebug.h"
+ >
+ </File>
+ <Filter
+ Name="common"
+ >
+ <File
+ RelativePath="..\..\common\AllowedConnections.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\BrowserChannel.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ByteOrder.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\CheckVersionsMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ChooseTransportMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Debug.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\DebugLevel.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FatalErrorMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FreeValueMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\HashMap.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\HostChannel.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeSpecialMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadJsniMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadModuleMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Message.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Platform.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ProtocolVersionMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\QuitMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ReturnMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\scoped_ptr\scoped_ptr.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ServerMethods.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\SessionHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Socket.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\SwitchTransportMessage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Value.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="gecko"
+ >
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\WINNT_x86-msvc\include\js-config.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\js\jsapi.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\js\jsautocfg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\js\jscompat.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\js\jsconfig.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\WINNT_x86-msvc\include\jscpucfg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\jscpucfg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\jsinttypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\js\jslong.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\jsosdep.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\js\jsotypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\js\jsproto.tbl"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\js\jspubtd.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\js\jstypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\js\jsutil.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\js\jsutil.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\js\jsutil.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\js\jsutil.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\WINNT_x86-msvc\include\mozilla-config.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\xpconnect\nsAXPCNativeCallContext.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\nsCOMPtr.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\nscore.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\xpcom\nscore.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\nsCycleCollector.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\nsDebug.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\nsError.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\widget\nsEvent.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\nsICategoryManager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\nsIClassInfo.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\nsIClassInfoImpl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\nsIComponentManager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\nsID.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\xpcom\nsIEnumerator.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\xpcom\nsIException.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\xpcom\nsIExceptionService.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\nsIFactory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\nsIGenericFactory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\necko\nsIHttpProtocolHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\xpcom\nsIInterfaceInfo.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\xpcom\nsIInterfaceInfoManager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\xpconnect\nsIJSContextStack.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\nsIMemory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\nsIModule.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\caps\nsIPrincipal.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\nsIProgrammingLanguage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\necko\nsIProtocolHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\necko\nsIProxiedProtocolHandler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\xpconnect\nsIScriptableInterfaces.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\dom\nsIScriptGlobalObject.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\dom\nsIScriptObjectPrincipal.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\caps\nsISecurityCheckedComponent.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\xpcom\nsISerializable.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\nsIServiceManager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\xpcom\nsISimpleEnumerator.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\nsISimpleEnumerator.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\xpcom\nsISupports.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\nsISupports.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\xpcom\nsISupportsBase.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\nsISupportsBase.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\nsISupportsImpl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\xpcom\nsISupportsUtils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\nsISupportsUtils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\nsIURI.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\xpcom\nsIVariant.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\xpconnect\nsIXPConnect.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\nsMemory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\necko\nsNetCID.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\nsrootidl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\xpcom\nsrootidl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\nsServiceManagerUtils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\nsStringAPI.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\nsTraceRefcnt.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\nsXPCOM.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\nsXPCOMCID.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\nsXPCOMStrings.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\pratom.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\prcpucfg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\prinrval.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\prlock.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\prlog.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\prlong.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\obsolete\protypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\prthread.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\prtime.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\prtypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\xpconnect\xpccomponents.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\xpconnect\xpcexception.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\xpconnect\xpcjsid.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\WINNT_x86-msvc\include\xpcom-config.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\xpcom\xpt_arena.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\xpcom\xpt_struct.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\xpcom\xptinfo.h"
+ >
+ </File>
+ </Filter>
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ >
+ <File
+ RelativePath="..\xpGwtDevPlugin.rc"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\ExternalWrapper.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\FFSessionHandler.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\JavaObject.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\JSRunner.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\ModuleOOPHM.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ GeneratePreprocessedFile="0"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\Preferences.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\XpcomDebug.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\xpGwtDevPlugin.def"
+ >
+ </File>
+ <Filter
+ Name="common"
+ >
+ <File
+ RelativePath="..\..\common\AllowedConnections.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\CheckVersionsMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ChooseTransportMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Debug.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FatalErrorMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\FreeValueMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\HostChannel.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\InvokeSpecialMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadJsniMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\LoadModuleMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ProtocolVersionMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ReturnMessage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\ServerMethods.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\Socket.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\common\SwitchTransportMessage.cpp"
+ >
+ </File>
+ </Filter>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/plugins/xpcom/XpcomDebug.cpp b/plugins/xpcom/XpcomDebug.cpp
new file mode 100644
index 0000000..eddc15b
--- /dev/null
+++ b/plugins/xpcom/XpcomDebug.cpp
@@ -0,0 +1,89 @@
+/*
+ * Copyright 2008 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.
+ */
+
+#include <cstring>
+
+#include "XpcomDebug.h"
+#include "JavaObject.h"
+
+#ifdef _WINDOWS
+// avoid deprecation warnings for strncpy
+#define strncpy(d,s,c) strncpy_s((d),(c),(s),(c))
+
+#include <cstdarg>
+inline int snprintf(char* buf, size_t buflen, const char* fmt, ...) {
+ va_list args;
+ va_start(args, fmt);
+ int n = _vsnprintf_s(buf, buflen, buflen, fmt, args);
+ va_end(args);
+ return n;
+}
+
+#endif
+
+std::string dumpJsVal(JSContext* ctx, jsval v) {
+ char buf[70];
+ if (JSVAL_IS_VOID(v)) {
+ strncpy(buf, "undef", sizeof(buf));
+ } else if (JSVAL_IS_NULL(v)) {
+ strncpy(buf, "null", sizeof(buf));
+#ifdef JSVAL_IS_OBJECT
+ } else if (JSVAL_IS_OBJECT(v)) {
+#else
+ } else if (!JSVAL_IS_PRIMITIVE(v)) {
+#endif
+ JSObject* obj = JSVAL_TO_OBJECT(v);
+ if (JavaObject::isJavaObject(ctx, obj)) {
+ int oid = JavaObject::getObjectId(ctx, obj);
+ snprintf(buf, sizeof(buf), "JavaObj(%d)", oid);
+ } else {
+ JSClass* jsClass = JS_GET_CLASS(ctx, obj);
+ const char* name = jsClass->name ? jsClass->name : "<null>";
+ snprintf(buf, sizeof(buf), "Object(%.20s @ %p)", name, obj);
+ }
+ } else if (JSVAL_IS_INT(v)) {
+ snprintf(buf, sizeof(buf), "int(%d)", JSVAL_TO_INT(v));
+ } else if (JSVAL_IS_DOUBLE(v)) {
+ double d;
+#if GECKO_VERSION < 2000
+ d= *JSVAL_TO_DOUBLE(v);
+#else
+ d = JSVAL_TO_DOUBLE(v);
+#endif //GECKO_VERSION
+ snprintf(buf, sizeof(buf), "double(%lf)", d);
+ } else if (JSVAL_IS_STRING(v)) {
+ JSString* str = JSVAL_TO_STRING(v);
+
+ size_t len = JS_GetStringEncodingLength(ctx, str);
+
+ const char* continued = "";
+ if (len > 20) {
+ len = 20;
+ continued = "...";
+ }
+ // TODO: trashes Unicode
+ snprintf(buf, sizeof(buf), "string(%.*s%s)", static_cast<int>(len),
+ JS_EncodeString(ctx, str), continued);
+ } else if (JSVAL_IS_BOOLEAN(v)) {
+ snprintf(buf, sizeof(buf), "bool(%s)", JSVAL_TO_BOOLEAN(v) ? "true"
+ : " false");
+ } else {
+ // TODO(acleung): When we run into this, use the other api to figure out what v is.
+ // snprintf(buf, sizeof(buf), "unknown(%08x)", (unsigned) v);
+ }
+ buf[sizeof(buf) - 1] = 0;
+ return std::string(buf);
+}
diff --git a/plugins/xpcom/XpcomDebug.h b/plugins/xpcom/XpcomDebug.h
new file mode 100644
index 0000000..4296ad2
--- /dev/null
+++ b/plugins/xpcom/XpcomDebug.h
@@ -0,0 +1,26 @@
+#ifndef _H_XpcomDebug
+#define _H_XpcomDebug
+/*
+ * Copyright 2008 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.
+ */
+
+#include <string>
+
+#include "mozincludes.h"
+#include "jsapi.h"
+
+std::string dumpJsVal(JSContext* ctx, jsval v);
+
+#endif
diff --git a/plugins/xpcom/getversion b/plugins/xpcom/getversion
new file mode 100755
index 0000000..7557e49
--- /dev/null
+++ b/plugins/xpcom/getversion
@@ -0,0 +1,10 @@
+#!/bin/sh
+# Wrapper to prevent failure if svnversion isn't available
+
+V=`svnversion ${PWD}/.. 2>/dev/null`
+if [ $? -gt 0 -o -z "$V" ]
+then
+ V='?'
+fi
+echo $V
+exit 0
diff --git a/plugins/xpcom/install-template.rdf b/plugins/xpcom/install-template.rdf
new file mode 100644
index 0000000..66191a3
--- /dev/null
+++ b/plugins/xpcom/install-template.rdf
@@ -0,0 +1,57 @@
+<?xml version="1.0"?>
+<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:em="http://www.mozilla.org/2004/em-rdf#">
+
+ <Description about="urn:mozilla:install-manifest">
+ <em:id>gwt-dev-plugin@google.com</em:id>
+ <em:name>Google Web Toolkit Developer Plugin for Firefox</em:name>
+ <em:version>GWT_DEV_PLUGIN_VERSION</em:version>
+ <em:type>2</em:type>
+ <em:unpack>true</em:unpack>
+ <em:targetApplication>
+ <Description>
+ <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
+ <em:minVersion>3.0</em:minVersion>
+ <em:maxVersion>15.0.*</em:maxVersion>
+ </Description>
+
+ <!-- TODO: This seems to break Firefox 3.6. With this on, FF gets into a
+ infinity loop of requiring to restart. I suspect it is a bug
+ in that version that was fixed in later version.
+ <em:strictCompatibility>true</em:strictCompatibility>
+ -->
+
+ </em:targetApplication>
+
+ <!-- Front End MetaData -->
+ <em:description>A plugin to support GWT development-mode in XPCOM-based browsers</em:description>
+ <em:creator>Google, Inc.</em:creator>
+ <em:homepageURL>http://code.google.com/webtoolkit/</em:homepageURL>
+ <em:iconURL>chrome://gwt-dev-plugin/skin/icon.png</em:iconURL>
+
+ <em:targetPlatform>Linux_x86-gcc3</em:targetPlatform>
+ <em:targetPlatform>Linux_x86_64-gcc3</em:targetPlatform>
+ <em:targetPlatform>WINNT_x86-msvc</em:targetPlatform>
+ <em:targetPlatform>Darwin_x86-gcc3</em:targetPlatform>
+ <em:targetPlatform>Darwin_x86_64-gcc3</em:targetPlatform>
+ <em:targetPlatform>Darwin_ppc-gcc3</em:targetPlatform>
+
+ <em:optionsURL>chrome://gwt-dev-plugin/content/options.xul</em:optionsURL>
+
+ <!-- updates, see http://developer.mozilla.org/en/docs/Extension_Versioning%2C_Update_and_Compatibility#Update_RDF_Format -->
+ <em:updateURL><![CDATA[https://dl-ssl.google.com/gwt/plugins/firefox/gwt-dev-plugin-updates.rdf?guid=%ITEM_ID%&version=%ITEM_VERSION%&application=%APP_ID%&appversion=%APP_VERSION%&locale=%APP_LOCALE%&os=%APP_OS%&abi=%APP_ABI%]]></em:updateURL>
+
+ <!-- TODO
+ # replace default about dialog
+ <em:aboutURL>chrome://gwt-dmp/content/about.xul</em:aboutURL>
+
+ # more platforms - any others?
+ <em:targetPlatform>SunOS_sparc-sunc</em:targetPlatform>
+ <em:targetPlatform>SunOS_x86-sunc</em:targetPlatform>
+ <em:targetPlatform>SunOS_x86_64-sunc</em:targetPlatform>
+ <em:targetPlatform>FreeBSD_x86-gcc3</em:targetPlatform>
+ <em:targetPlatform>FreeBSD_x86_64-gcc3</em:targetPlatform>
+ -->
+
+ </Description>
+</RDF>
diff --git a/plugins/xpcom/mozincludes.h b/plugins/xpcom/mozincludes.h
new file mode 100755
index 0000000..80961cc
--- /dev/null
+++ b/plugins/xpcom/mozincludes.h
@@ -0,0 +1,30 @@
+#ifndef _H_mozincludes
+#define _H_mozincludes
+
+// Defines private prototypes for copy constructor and assigment operator. Do
+// not implement these methods.
+#define DISALLOW_EVIL_CONSTRUCTORS(CLASS) \
+ private: \
+ CLASS(const CLASS&); \
+ CLASS& operator=(const CLASS&)
+
+#include "xpcom-config.h"
+#include "mozilla-config.h"
+
+// See https://developer.mozilla.org/en/SpiderMonkey/1.8.8
+#if GECKO_VERSION >= 13000
+
+// See https://bugzilla.mozilla.org/show_bug.cgi?id=417710
+// https://bugzilla.mozilla.org/show_bug.cgi?id=723517
+#define JS_GET_CLASS(cx, obj) JS_GetClass(obj)
+#define MOZ_JS_SetPrivate(cx, obj, data) JS_SetPrivate(obj, data)
+#define MOZ_JS_SetReservedSlot(cx, obj, index, v) JS_SetReservedSlot(obj, index, v)
+#define uintN unsigned int
+#define intN int
+#define jsdouble double
+#else
+#define MOZ_JS_SetPrivate(cx, obj, data) JS_SetPrivate(cx, obj, data)
+#define MOZ_JS_SetReservedSlot(cx, obj, index, v) JS_SetReservedSlot(cx, obj, index, v)
+#endif
+
+#endif
diff --git a/plugins/xpcom/prebuilt/LICENSE.txt b/plugins/xpcom/prebuilt/LICENSE.txt
new file mode 100644
index 0000000..326366d
--- /dev/null
+++ b/plugins/xpcom/prebuilt/LICENSE.txt
@@ -0,0 +1,13 @@
+Copyright 2008 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.
diff --git a/plugins/xpcom/prebuilt/README.txt b/plugins/xpcom/prebuilt/README.txt
new file mode 100644
index 0000000..6f54ad5
--- /dev/null
+++ b/plugins/xpcom/prebuilt/README.txt
@@ -0,0 +1,6 @@
+Files common to all platforms should be placed under extension/...
+Files for FF1.5/2 should go under extension-ff2/...
+Files for FF3 should go under extension-ff3/...
+
+Files such as headers that need to be supplied pre-generated should be under
+ff2/ff3.
diff --git a/plugins/xpcom/prebuilt/extension/chrome.manifest b/plugins/xpcom/prebuilt/extension/chrome.manifest
new file mode 100644
index 0000000..71cf50f
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/chrome.manifest
@@ -0,0 +1,92 @@
+content gwt-dev-plugin content/
+skin gwt-dev-plugin classic/1.0 skin/
+
+# This file is parsed top to bottom. List the lowest versions first
+
+# Firefox 4
+binary-component lib/Linux_x86_64-gcc3/ff40/libgwt_dev_ff40.so ABI=Linux_x86_64-gcc3 appversion<=4.0.*
+binary-component lib/Linux_x86-gcc3/ff40/libgwt_dev_ff40.so ABI=Linux_x86-gcc3 appversion<=4.0.*
+binary-component lib/Darwin-gcc3/ff40/libgwt_dev_ff40.dylib ABI=Darwin_x86_64-gcc3 appversion<=4.0.*
+binary-component lib/Darwin-gcc3/ff40/libgwt_dev_ff40.dylib ABI=Darwin_x86-gcc3 appversion<=4.0.*
+binary-component lib/WINNT_x86-msvc/ff40/xpGwtDevPlugin.dll ABI=WINNT_x86-msvc appversion<=4.0.*
+
+# Firefox 5
+binary-component lib/Linux_x86_64-gcc3/ff50/libgwt_dev_ff50.so ABI=Linux_x86_64-gcc3 appversion<=5.0.*
+binary-component lib/Linux_x86-gcc3/ff50/libgwt_dev_ff50.so ABI=Linux_x86-gcc3 appversion<=5.0.*
+binary-component lib/Darwin-gcc3/ff50/libgwt_dev_ff50.dylib ABI=Darwin_x86_64-gcc3 appversion<=5.0.*
+binary-component lib/Darwin-gcc3/ff50/libgwt_dev_ff50.dylib ABI=Darwin_x86-gcc3 appversion<=5.0.*
+binary-component lib/WINNT_x86-msvc/ff50/xpGwtDevPlugin.dll ABI=WINNT_x86-msvc appversion<=5.0.*
+
+# Firefox 6
+binary-component lib/Linux_x86_64-gcc3/ff60/libgwt_dev_ff60.so ABI=Linux_x86_64-gcc3 appversion<=6.0.*
+binary-component lib/Linux_x86-gcc3/ff60/libgwt_dev_ff60.so ABI=Linux_x86-gcc3 appversion<=6.0.*
+binary-component lib/Darwin-gcc3/ff60/libgwt_dev_ff60.dylib ABI=Darwin_x86_64-gcc3 appversion<=6.0.*
+binary-component lib/Darwin-gcc3/ff60/libgwt_dev_ff60.dylib ABI=Darwin_x86-gcc3 appversion<=6.0.*
+binary-component lib/WINNT_x86-msvc/ff60/xpGwtDevPlugin.dll ABI=WINNT_x86-msvc appversion<=6.0.*
+
+# Firefox 7
+binary-component lib/Linux_x86_64-gcc3/ff70/libgwt_dev_ff70.so ABI=Linux_x86_64-gcc3 appversion<=7.0.*
+binary-component lib/Linux_x86-gcc3/ff70/libgwt_dev_ff70.so ABI=Linux_x86-gcc3 appversion<=7.0.*
+binary-component lib/Darwin-gcc3/ff70/libgwt_dev_ff70.dylib ABI=Darwin_x86_64-gcc3 appversion<=7.0.*
+binary-component lib/Darwin-gcc3/ff70/libgwt_dev_ff70.dylib ABI=Darwin_x86-gcc3 appversion<=7.0.*
+binary-component lib/WINNT_x86-msvc/ff70/xpGwtDevPlugin.dll ABI=WINNT_x86-msvc appversion<=7.0.*
+
+# Firefox 8
+binary-component lib/Linux_x86_64-gcc3/ff80/libgwt_dev_ff80.so ABI=Linux_x86_64-gcc3 appversion<=8.0.*
+binary-component lib/Linux_x86-gcc3/ff80/libgwt_dev_ff80.so ABI=Linux_x86-gcc3 appversion<=8.0.*
+binary-component lib/Darwin-gcc3/ff80/libgwt_dev_ff80.dylib ABI=Darwin_x86_64-gcc3 appversion<=8.0.*
+binary-component lib/Darwin-gcc3/ff80/libgwt_dev_ff80.dylib ABI=Darwin_x86-gcc3 appversion<=8.0.*
+binary-component lib/WINNT_x86-msvc/ff80/xpGwtDevPlugin.dll ABI=WINNT_x86-msvc appversion<=8.0.*
+
+# Firefox 9
+binary-component lib/Linux_x86_64-gcc3/ff90/libgwt_dev_ff90.so ABI=Linux_x86_64-gcc3 appversion<=9.0.*
+binary-component lib/Linux_x86-gcc3/ff90/libgwt_dev_ff90.so ABI=Linux_x86-gcc3 appversion<=9.0.*
+binary-component lib/Darwin-gcc3/ff90/libgwt_dev_ff90.dylib ABI=Darwin_x86_64-gcc3 appversion<=9.0.*
+binary-component lib/Darwin-gcc3/ff90/libgwt_dev_ff90.dylib ABI=Darwin_x86-gcc3 appversion<=9.0.*
+binary-component lib/WINNT_x86-msvc/ff90/xpGwtDevPlugin.dll ABI=WINNT_x86-msvc appversion<=9.0.*
+
+# Firefox 10
+binary-component lib/Linux_x86_64-gcc3/ff100/libgwt_dev_ff100.so ABI=Linux_x86_64-gcc3 appversion<=10.0.*
+binary-component lib/Linux_x86-gcc3/ff100/libgwt_dev_ff100.so ABI=Linux_x86-gcc3 appversion<=10.0.*
+binary-component lib/Darwin-gcc3/ff100/libgwt_dev_ff100.dylib ABI=Darwin_x86_64-gcc3 appversion<=10.0.*
+binary-component lib/Darwin-gcc3/ff100/libgwt_dev_ff100.dylib ABI=Darwin_x86-gcc3 appversion<=10.0.*
+binary-component lib/WINNT_x86-msvc/ff100/xpGwtDevPlugin.dll ABI=WINNT_x86-msvc appversion<=10.0.*
+
+# Firefox 11
+binary-component lib/Linux_x86_64-gcc3/ff110/libgwt_dev_ff110.so ABI=Linux_x86_64-gcc3 appversion<=11.0.*
+binary-component lib/Linux_x86-gcc3/ff110/libgwt_dev_ff110.so ABI=Linux_x86-gcc3 appversion<=11.0.*
+binary-component lib/Darwin-gcc3/ff110/libgwt_dev_ff110.dylib ABI=Darwin_x86_64-gcc3 appversion<=11.0.*
+binary-component lib/Darwin-gcc3/ff110/libgwt_dev_ff110.dylib ABI=Darwin_x86-gcc3 appversion<=11.0.*
+binary-component lib/WINNT_x86-msvc/ff110/xpGwtDevPlugin.dll ABI=WINNT_x86-msvc appversion<=11.0.*
+
+# Firefox 12
+binary-component lib/Linux_x86_64-gcc3/ff120/libgwt_dev_ff120.so ABI=Linux_x86_64-gcc3 appversion<=12.0.*
+binary-component lib/Linux_x86-gcc3/ff120/libgwt_dev_ff120.so ABI=Linux_x86-gcc3 appversion<=12.0.*
+binary-component lib/Darwin-gcc3/ff120/libgwt_dev_ff120.dylib ABI=Darwin_x86_64-gcc3 appversion<=12.0.*
+binary-component lib/Darwin-gcc3/ff120/libgwt_dev_ff120.dylib ABI=Darwin_x86-gcc3 appversion<=12.0.*
+binary-component lib/WINNT_x86-msvc/ff120/xpGwtDevPlugin.dll ABI=WINNT_x86-msvc appversion<=12.0.*
+
+# Firefox 13
+binary-component lib/Linux_x86_64-gcc3/ff130/libgwt_dev_ff130.so ABI=Linux_x86_64-gcc3 appversion<=13.0.*
+binary-component lib/Linux_x86-gcc3/ff130/libgwt_dev_ff130.so ABI=Linux_x86-gcc3 appversion<=13.0.*
+binary-component lib/Darwin-gcc3/ff130/libgwt_dev_ff130.dylib ABI=Darwin_x86_64-gcc3 appversion<=13.0.*
+binary-component lib/Darwin-gcc3/ff130/libgwt_dev_ff130.dylib ABI=Darwin_x86-gcc3 appversion<=13.0.*
+binary-component lib/WINNT_x86-msvc/ff130/xpGwtDevPlugin.dll ABI=WINNT_x86-msvc appversion<=13.0.*
+
+# Firefox 14
+binary-component lib/Linux_x86_64-gcc3/ff140/libgwt_dev_ff140.so ABI=Linux_x86_64-gcc3 appversion<=14.0.*
+binary-component lib/Linux_x86-gcc3/ff140/libgwt_dev_ff140.so ABI=Linux_x86-gcc3 appversion<=14.0.*
+binary-component lib/Darwin-gcc3/ff140/libgwt_dev_ff140.dylib ABI=Darwin_x86_64-gcc3 appversion<=14.0.*
+binary-component lib/Darwin-gcc3/ff140/libgwt_dev_ff140.dylib ABI=Darwin_x86-gcc3 appversion<=14.0.*
+binary-component lib/WINNT_x86-msvc/ff140/xpGwtDevPlugin.dll ABI=WINNT_x86-msvc appversion<=14.0.*
+
+# Firefox 15
+binary-component lib/Linux_x86_64-gcc3/ff150/libgwt_dev_ff150.so ABI=Linux_x86_64-gcc3 appversion<=15.0.*
+binary-component lib/Linux_x86-gcc3/ff150/libgwt_dev_ff150.so ABI=Linux_x86-gcc3 appversion<=15.0.*
+binary-component lib/WINNT_x86-msvc/ff150/xpGwtDevPlugin.dll ABI=WINNT_x86-msvc appversion<=15.0.*
+binary-component lib/Darwin-gcc3/ff150/libgwt_dev_ff150.dylib ABI=Darwin_x86_64-gcc3 appversion<=15.0.*
+binary-component lib/Darwin-gcc3/ff150/libgwt_dev_ff150.dylib ABI=Darwin_x86-gcc3 appversion<=15.0.*
+
+
+interfaces components/IOOPHM.xpt
+contract @gwt.google.com/ExternalWrapper;1 {028DD88B-6D65-401D-AAFD-17E497D15D09}
diff --git a/plugins/xpcom/prebuilt/extension/components/IOOPHM.xpt b/plugins/xpcom/prebuilt/extension/components/IOOPHM.xpt
new file mode 100644
index 0000000..683c881
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/components/IOOPHM.xpt
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/components/stub.js b/plugins/xpcom/prebuilt/extension/components/stub.js
new file mode 100644
index 0000000..8df702b
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/components/stub.js
@@ -0,0 +1,115 @@
+// Copyright 2009, Google Inc.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice,
+// this list of conditions and the following disclaimer.
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+// this list of conditions and the following disclaimer in the documentation
+// and/or other materials provided with the distribution.
+// 3. Neither the name of Google Inc. nor the names of its contributors may be
+// used to endorse or promote products derived from this software without
+// specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Our binary is compiled against different versions of the Gecko SDK for
+// different versions of Firefox. But we want a single XPI so that users can
+// switch between versions of Firefox without having to change their Gears
+// version.
+
+// This JavaScript file is detected and loaded by Gecko when our extension is
+// installed. We then use nsIComponentRegistrar to tell Gecko where our real
+// components are located, depending on what version of Firefox we detect we are
+// running in.
+
+// NOTE: This file is only used pre Gecko 2.0 (FF4). The registration mechanism
+// in Gecko 2.0 allows the chrome.manifest to indicate the appropriate binary
+// component for each ABI.
+
+const Cc = Components.classes;
+const Ci = Components.interfaces;
+
+// Detect which version of our lib we should use.
+function getLibFileName() {
+ var appInfo = Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULAppInfo);
+ var geckoVersion = appInfo.platformVersion.substring(0, 3);
+
+ if (geckoVersion == "1.8") {
+ return "ff2";
+ }
+
+ if (geckoVersion.substring(0, 3) == "1.9") {
+ var firefoxVersion = appInfo.version.substring(0, 3);
+
+ if (firefoxVersion == "3.0") {
+ if (isFedora()) {
+ return "ff3+";
+ }
+ return "ff3";
+ }
+
+ if (firefoxVersion == "3.5") {
+ return "ff35";
+ }
+
+ if (firefoxVersion == "3.6") {
+ return "ff36";
+ }
+
+ if (firefoxVersion == "3.7" || firefoxVersion == "4.0") {
+ return "ff40";
+ }
+
+ throw "Unsupported Firefox version: " + firefoxVersion;
+ }
+
+ throw "Unsupported Gecko version: " + geckoVersion;
+}
+
+function getPlatform() {
+ var runtime = Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULRuntime);
+
+ if (runtime.OS == "Darwin") {
+ return runtime.OS + "-gcc3";
+ }
+
+ return runtime.OS + "_" + runtime.XPCOMABI;
+}
+
+function isFedora() {
+ var navigator = Cc["@mozilla.org/network/protocol;1?name=http"].
+ getService(Ci.nsIHttpProtocolHandler);
+
+ return navigator.userAgent.indexOf("Fedora") != -1;
+}
+
+// This function is called by Firefox at installation time.
+function NSGetModule() {
+ return {
+ registerSelf: function(compMgr, location, loaderStr, type) {
+ var libFile = location.parent.parent;
+ libFile.append("lib");
+ libFile.append(getPlatform());
+ libFile.append(getLibFileName());
+
+ // Note: we register a directory instead of an individual file because
+ // Gecko will only load components with a specific file name pattern. We
+ // don't want this file to have to know about that. Luckily, if you
+ // register a directory, Gecko will look inside the directory for files
+ // to load.
+ var compMgr = compMgr.QueryInterface(Ci.nsIComponentRegistrar);
+ compMgr.autoRegister(libFile);
+ }
+ }
+}
diff --git a/plugins/xpcom/prebuilt/extension/content/options.xul b/plugins/xpcom/prebuilt/extension/content/options.xul
new file mode 100644
index 0000000..202844e
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/content/options.xul
@@ -0,0 +1,70 @@
+<?xml version="1.0"?>
+<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
+
+<dialog buttons="accept"
+ id="gwt-dev-prefs"
+ title="GWT Developer Plugin Options"
+ onload="GwtDeveloperPlugin.onload()"
+ ondialogaccept="return true;"
+ xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+
+<script type="application/x-javascript"
+ src="chrome://gwt-dev-plugin/content/prefScript.js"/>
+
+<vbox flex="1">
+
+ <groupbox flex="1">
+ <caption>
+ <hbox>
+ <image src="chrome://gwt-dev-plugin/skin/warning.png"/>
+ <label value="Security Restrictions" style="font-weight: bold"/>
+ </hbox>
+ </caption>
+ <description width="55em">
+ The GWT Developer Plugin will open a TCP/IP connection to an
+ arbitrary host/port at the request of a web page. To minimize security
+ risks, by default it will only connect to the local machine. To allow
+ cross-machine debugging, you can add exceptions here -- include the exact
+ host name of the web and code server you will use for debugging, but do not
+ include any you do not trust.
+ </description>
+ </groupbox>
+
+ <hbox align="top" flex="1">
+ <hbox align="center" flex="1">
+ <label control="hostname" value="Host name: "/>
+ <textbox id="hostname" maxlength="40" flex="1"/>
+ </hbox>
+ <hbox align="center" flex="1">
+ <label control="codeserver" value="Code server: "/>
+ <textbox id="codeserver" maxlength="40" flex="1"/>
+ </hbox>
+ <radiogroup id="incexc">
+ <radio id="include" label="Include" selected="true"/>
+ <radio id="exclude" label="Exclude"/>
+ </radiogroup>
+ <button id="addButton" label="Add Entry" oncommand="GwtDeveloperPlugin.addEntry()"/>
+ </hbox>
+
+ <listbox id="accessListListbox" rows="5">
+ <listhead>
+ <listheader label="Inc/Exc"/>
+ <listheader label="Host Name"/>
+ <listheader label="Code Server"/>
+ </listhead>
+ <listcols>
+ <listcol/>
+ <listcol flex="1"/>
+ <listcol flex="1"/>
+ </listcols>
+ </listbox>
+
+ <hbox>
+ <button id="removeButton" label="Remove Selected"
+ oncommand="GwtDeveloperPlugin.removeEntry()"/>
+ <!-- TODO(jat): add move up/down buttons -->
+ </hbox>
+
+</vbox>
+
+</dialog>
diff --git a/plugins/xpcom/prebuilt/extension/content/prefScript.js b/plugins/xpcom/prebuilt/extension/content/prefScript.js
new file mode 100644
index 0000000..deb34e9
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/content/prefScript.js
@@ -0,0 +1,115 @@
+var GwtDeveloperPlugin = {
+
+// Add a new entry when the Add Entry button is clicked.
+addEntry: function() {
+ var prefs = this.getAccessList();
+ var hostname = document.getElementById("hostname").value;
+ if (!hostname || hostname.length == 0) {
+ alert("No host name provided");
+ return;
+ }
+ if (hostname.indexOf(",") >=0 || hostname.indexOf("!") >= 0 || hostname.indexOf("/") >= 0) {
+ alert("Host name must not contain ',', '!', or '/'");
+ return;
+ }
+ var codeserver = document.getElementById("codeserver").value;
+ if (!codeserver || codeserver.length == 0) {
+ alert("No code server provided");
+ return;
+ }
+ if (codeserver.indexOf(",") >=0 || codeserver.indexOf("!") >= 0 || codeserver.indexOf("/") >= 0) {
+ alert("Code server must not contain ',', '!', or '/'");
+ return;
+ }
+ var exclude = document.getElementById("exclude");
+ var incText;
+ var prefix = "";
+ if (exclude.selected) {
+ incText = "Exclude";
+ prefix = "!";
+ } else {
+ incText = "Include";
+ }
+ var listboxEntry = this.makeLBE(incText, hostname, codeserver);
+ var prefsEntry = prefix + hostname + '/' + codeserver;
+ var listbox = document.getElementById("accessListListbox");
+ listbox.appendChild(listboxEntry);
+ prefs.push(prefsEntry.toString());
+ this.saveAccessList(prefs);
+},
+
+// Remove the selected entry when the Remove Entry button is clicked.
+removeEntry: function() {
+ var listbox = document.getElementById("accessListListbox");
+ var idx = listbox.selectedIndex;
+ if (idx >= 0) {
+ listbox.removeItemAt(idx);
+ var prefs = this.getAccessList();
+ prefs.splice(idx, 1);
+ this.saveAccessList(prefs);
+ }
+},
+
+// Populate the listbox when the dialog window is loaded
+onload: function() {
+ var listbox = document.getElementById("accessListListbox");
+ var prefs = this.getAccessList();
+ for (var i = 0 ; i < prefs.length; ++i) {
+ var pref = prefs[i];
+ var hostname = pref;
+ var incexc = "Include";
+ if (pref.length > 0 && pref.charAt(0) == "!") {
+ hostname = hostname.substr(1);
+ incexc = "Exclude";
+ }
+ var codeserver = "localhost";
+ var slash = hostname.indexOf("/");
+ if( slash >= 0 )
+ {
+ codeserver = hostname.substr(slash+1);
+ hostname = hostname.substr(0,slash);
+ }
+ var listboxEntry = this.makeLBE(incexc, hostname, codeserver);
+ listbox.appendChild(listboxEntry);
+ }
+},
+
+// Internal - create a entry for the list box
+makeLBE: function(inc, hostname, codeserver) {
+ var listboxEntry = document.createElement("listitem");
+ var lbeInc = document.createElement("listcell");
+ lbeInc.setAttribute("label", inc);
+ listboxEntry.appendChild(lbeInc);
+ var lbeHost = document.createElement("listcell");
+ lbeHost.setAttribute("label", hostname);
+ listboxEntry.appendChild(lbeHost);
+ var lbeCode = document.createElement("listcell");
+ lbeCode.setAttribute("label", codeserver);
+ listboxEntry.appendChild(lbeCode);
+ return listboxEntry;
+},
+
+// Internal - load the access list from the gwt-dev-plugin.accessList
+// preference
+getAccessList: function() {
+ var prefServ = Components.classes["@mozilla.org/preferences-service;1"]
+ .getService(Components.interfaces.nsIPrefService);
+ var prefs = prefServ.getBranch("gwt-dev-plugin.");
+ var pref = prefs.getCharPref("accessList");
+ if (!pref) {
+ return [];
+ }
+ return pref.split(",");
+},
+
+// Internal - save the access list to the gwt-dev-plugin.accessList
+// preference
+saveAccessList: function(list) {
+ var prefServ = Components.classes["@mozilla.org/preferences-service;1"]
+ .getService(Components.interfaces.nsIPrefService);
+ var prefs = prefServ.getBranch("gwt-dev-plugin.");
+ prefs.setCharPref("accessList", list.join(","));
+ prefServ.savePrefFile(null);
+}
+
+};
diff --git a/plugins/xpcom/prebuilt/extension/defaults/preferences/defaults.js b/plugins/xpcom/prebuilt/extension/defaults/preferences/defaults.js
new file mode 100644
index 0000000..29b3f76
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/defaults/preferences/defaults.js
@@ -0,0 +1 @@
+pref("gwt-dev-plugin.accessList", "");
diff --git a/plugins/xpcom/prebuilt/extension/icon.png b/plugins/xpcom/prebuilt/extension/icon.png
new file mode 100644
index 0000000..7ba8270
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/icon.png
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff100/libgwt_dev_ff100.dylib b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff100/libgwt_dev_ff100.dylib
new file mode 100755
index 0000000..5d29200
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff100/libgwt_dev_ff100.dylib
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff110/libgwt_dev_ff110.dylib b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff110/libgwt_dev_ff110.dylib
new file mode 100755
index 0000000..2d7b35f
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff110/libgwt_dev_ff110.dylib
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff120/libgwt_dev_ff120.dylib b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff120/libgwt_dev_ff120.dylib
new file mode 100755
index 0000000..68599c2
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff120/libgwt_dev_ff120.dylib
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff130/libgwt_dev_ff130.dylib b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff130/libgwt_dev_ff130.dylib
new file mode 100755
index 0000000..03501fa
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff130/libgwt_dev_ff130.dylib
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff140/libgwt_dev_ff140.dylib b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff140/libgwt_dev_ff140.dylib
new file mode 100755
index 0000000..7d621cc
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff140/libgwt_dev_ff140.dylib
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff150/libgwt_dev_ff150.dylib b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff150/libgwt_dev_ff150.dylib
new file mode 100755
index 0000000..7548240
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff150/libgwt_dev_ff150.dylib
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff3/libgwt_dev_ff3.dylib b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff3/libgwt_dev_ff3.dylib
new file mode 100755
index 0000000..a51473a
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff3/libgwt_dev_ff3.dylib
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff35/libgwt_dev_ff35.dylib b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff35/libgwt_dev_ff35.dylib
new file mode 100755
index 0000000..2226927
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff35/libgwt_dev_ff35.dylib
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff36/libgwt_dev_ff36.dylib b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff36/libgwt_dev_ff36.dylib
new file mode 100755
index 0000000..d030ed1
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff36/libgwt_dev_ff36.dylib
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff40/libgwt_dev_ff40.dylib b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff40/libgwt_dev_ff40.dylib
new file mode 100755
index 0000000..daeaab3
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff40/libgwt_dev_ff40.dylib
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff50/libgwt_dev_ff50.dylib b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff50/libgwt_dev_ff50.dylib
new file mode 100755
index 0000000..6998a72
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff50/libgwt_dev_ff50.dylib
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff60/libgwt_dev_ff60.dylib b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff60/libgwt_dev_ff60.dylib
new file mode 100755
index 0000000..507b1cf
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff60/libgwt_dev_ff60.dylib
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff70/libgwt_dev_ff70.dylib b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff70/libgwt_dev_ff70.dylib
new file mode 100755
index 0000000..5905200
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff70/libgwt_dev_ff70.dylib
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff80/libgwt_dev_ff80.dylib b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff80/libgwt_dev_ff80.dylib
new file mode 100755
index 0000000..52ffe0d
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff80/libgwt_dev_ff80.dylib
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff90/libgwt_dev_ff90.dylib b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff90/libgwt_dev_ff90.dylib
new file mode 100755
index 0000000..8b6b066
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff90/libgwt_dev_ff90.dylib
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff100/libgwt_dev_ff100.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff100/libgwt_dev_ff100.so
new file mode 100755
index 0000000..5cf9327
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff100/libgwt_dev_ff100.so
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff110/libgwt_dev_ff110.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff110/libgwt_dev_ff110.so
new file mode 100755
index 0000000..868bc12
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff110/libgwt_dev_ff110.so
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff120/libgwt_dev_ff120.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff120/libgwt_dev_ff120.so
new file mode 100755
index 0000000..38ca71c
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff120/libgwt_dev_ff120.so
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff130/libgwt_dev_ff130.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff130/libgwt_dev_ff130.so
new file mode 100755
index 0000000..7aca049
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff130/libgwt_dev_ff130.so
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff140/libgwt_dev_ff140.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff140/libgwt_dev_ff140.so
new file mode 100755
index 0000000..ea9ebdb
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff140/libgwt_dev_ff140.so
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff150/libgwt_dev_ff150.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff150/libgwt_dev_ff150.so
new file mode 100755
index 0000000..af04a8e
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff150/libgwt_dev_ff150.so
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff3+/libgwt_dev_ff3+.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff3+/libgwt_dev_ff3+.so
new file mode 100755
index 0000000..68135ba
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff3+/libgwt_dev_ff3+.so
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff3/libgwt_dev_ff3.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff3/libgwt_dev_ff3.so
new file mode 100755
index 0000000..c467d43
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff3/libgwt_dev_ff3.so
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff35/libgwt_dev_ff35.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff35/libgwt_dev_ff35.so
new file mode 100755
index 0000000..8fd8729
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff35/libgwt_dev_ff35.so
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff36/libgwt_dev_ff36.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff36/libgwt_dev_ff36.so
new file mode 100755
index 0000000..b54bcdc
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff36/libgwt_dev_ff36.so
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff40/libgwt_dev_ff40.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff40/libgwt_dev_ff40.so
new file mode 100755
index 0000000..362cf1a
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff40/libgwt_dev_ff40.so
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff50/libgwt_dev_ff50.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff50/libgwt_dev_ff50.so
new file mode 100755
index 0000000..34d0f56
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff50/libgwt_dev_ff50.so
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff60/libgwt_dev_ff60.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff60/libgwt_dev_ff60.so
new file mode 100755
index 0000000..3418aa6
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff60/libgwt_dev_ff60.so
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff70/libgwt_dev_ff70.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff70/libgwt_dev_ff70.so
new file mode 100755
index 0000000..58b452f
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff70/libgwt_dev_ff70.so
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff80/libgwt_dev_ff80.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff80/libgwt_dev_ff80.so
new file mode 100755
index 0000000..fa6a37f
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff80/libgwt_dev_ff80.so
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff90/libgwt_dev_ff90.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff90/libgwt_dev_ff90.so
new file mode 100755
index 0000000..820b2b2
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff90/libgwt_dev_ff90.so
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff100/libgwt_dev_ff100.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff100/libgwt_dev_ff100.so
new file mode 100755
index 0000000..c482702
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff100/libgwt_dev_ff100.so
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff110/libgwt_dev_ff110.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff110/libgwt_dev_ff110.so
new file mode 100755
index 0000000..c612e7a
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff110/libgwt_dev_ff110.so
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff120/libgwt_dev_ff120.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff120/libgwt_dev_ff120.so
new file mode 100755
index 0000000..65df393
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff120/libgwt_dev_ff120.so
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff130/libgwt_dev_ff130.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff130/libgwt_dev_ff130.so
new file mode 100755
index 0000000..cead4df
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff130/libgwt_dev_ff130.so
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff140/libgwt_dev_ff140.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff140/libgwt_dev_ff140.so
new file mode 100755
index 0000000..48ab7ee
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff140/libgwt_dev_ff140.so
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff150/libgwt_dev_ff150.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff150/libgwt_dev_ff150.so
new file mode 100755
index 0000000..8f5a64a
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff150/libgwt_dev_ff150.so
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff3+/libgwt_dev_ff3+.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff3+/libgwt_dev_ff3+.so
new file mode 100755
index 0000000..5751ab2
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff3+/libgwt_dev_ff3+.so
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff3/libgwt_dev_ff3.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff3/libgwt_dev_ff3.so
new file mode 100755
index 0000000..4f4471f
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff3/libgwt_dev_ff3.so
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff35/libgwt_dev_ff35.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff35/libgwt_dev_ff35.so
new file mode 100755
index 0000000..29ff650
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff35/libgwt_dev_ff35.so
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff36/libgwt_dev_ff36.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff36/libgwt_dev_ff36.so
new file mode 100755
index 0000000..f36c567
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff36/libgwt_dev_ff36.so
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff40/libgwt_dev_ff40.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff40/libgwt_dev_ff40.so
new file mode 100755
index 0000000..cd8368b
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff40/libgwt_dev_ff40.so
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff50/libgwt_dev_ff50.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff50/libgwt_dev_ff50.so
new file mode 100755
index 0000000..a54dc00
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff50/libgwt_dev_ff50.so
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff60/libgwt_dev_ff60.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff60/libgwt_dev_ff60.so
new file mode 100755
index 0000000..24bba4e
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff60/libgwt_dev_ff60.so
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff70/libgwt_dev_ff70.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff70/libgwt_dev_ff70.so
new file mode 100755
index 0000000..ac3f55e
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff70/libgwt_dev_ff70.so
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff80/libgwt_dev_ff80.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff80/libgwt_dev_ff80.so
new file mode 100755
index 0000000..3ea691d
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff80/libgwt_dev_ff80.so
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff90/libgwt_dev_ff90.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff90/libgwt_dev_ff90.so
new file mode 100755
index 0000000..87d66a9
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff90/libgwt_dev_ff90.so
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff100/xpGwtDevPlugin.dll b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff100/xpGwtDevPlugin.dll
new file mode 100755
index 0000000..c174d65
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff100/xpGwtDevPlugin.dll
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff110/xpGwtDevPlugin.dll b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff110/xpGwtDevPlugin.dll
new file mode 100755
index 0000000..351b046
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff110/xpGwtDevPlugin.dll
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff120/xpGwtDevPlugin.dll b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff120/xpGwtDevPlugin.dll
new file mode 100755
index 0000000..d23f4f7
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff120/xpGwtDevPlugin.dll
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff130/xpGwtDevPlugin.dll b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff130/xpGwtDevPlugin.dll
new file mode 100755
index 0000000..5b55c0b
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff130/xpGwtDevPlugin.dll
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff140/xpGwtDevPlugin.dll b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff140/xpGwtDevPlugin.dll
new file mode 100755
index 0000000..5a0ed7f
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff140/xpGwtDevPlugin.dll
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff150/xpGwtDevPlugin.dll b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff150/xpGwtDevPlugin.dll
new file mode 100755
index 0000000..63684a0
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff150/xpGwtDevPlugin.dll
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff3/xpGwtDevPlugin.dll b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff3/xpGwtDevPlugin.dll
new file mode 100755
index 0000000..cd065b0
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff3/xpGwtDevPlugin.dll
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff35/xpGwtDevPlugin.dll b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff35/xpGwtDevPlugin.dll
new file mode 100755
index 0000000..9396adf
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff35/xpGwtDevPlugin.dll
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff36/xpGwtDevPlugin.dll b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff36/xpGwtDevPlugin.dll
new file mode 100755
index 0000000..5ef91b3
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff36/xpGwtDevPlugin.dll
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff40/xpGwtDevPlugin.dll b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff40/xpGwtDevPlugin.dll
new file mode 100755
index 0000000..b8b0ee5
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff40/xpGwtDevPlugin.dll
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff50/xpGwtDevPlugin.dll b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff50/xpGwtDevPlugin.dll
new file mode 100755
index 0000000..7f517e2
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff50/xpGwtDevPlugin.dll
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff60/xpGwtDevPlugin.dll b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff60/xpGwtDevPlugin.dll
new file mode 100755
index 0000000..3ef13fb
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff60/xpGwtDevPlugin.dll
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff70/xpGwtDevPlugin.dll b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff70/xpGwtDevPlugin.dll
new file mode 100755
index 0000000..0b72e7c
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff70/xpGwtDevPlugin.dll
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff80/xpGwtDevPlugin.dll b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff80/xpGwtDevPlugin.dll
new file mode 100755
index 0000000..38aaa82
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff80/xpGwtDevPlugin.dll
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff90/xpGwtDevPlugin.dll b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff90/xpGwtDevPlugin.dll
new file mode 100755
index 0000000..bcf7476
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff90/xpGwtDevPlugin.dll
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/skin/README.txt b/plugins/xpcom/prebuilt/extension/skin/README.txt
new file mode 100644
index 0000000..7d212f0
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/skin/README.txt
@@ -0,0 +1,2 @@
+warning.png generated from public domain SVG file found at
+ http://www.wowwiki.com/File:Icon-warning.svg
diff --git a/plugins/xpcom/prebuilt/extension/skin/icon.png b/plugins/xpcom/prebuilt/extension/skin/icon.png
new file mode 100644
index 0000000..7ba8270
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/skin/icon.png
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/skin/warning.png b/plugins/xpcom/prebuilt/extension/skin/warning.png
new file mode 100644
index 0000000..55a203b
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/skin/warning.png
Binary files differ
diff --git a/plugins/xpcom/prebuilt/ff100/include/IOOPHM.h b/plugins/xpcom/prebuilt/ff100/include/IOOPHM.h
new file mode 100644
index 0000000..e37792d
--- /dev/null
+++ b/plugins/xpcom/prebuilt/ff100/include/IOOPHM.h
@@ -0,0 +1,105 @@
+/*
+ * DO NOT EDIT. THIS FILE IS GENERATED FROM IOOPHM.idl
+ */
+
+#ifndef __gen_IOOPHM_h__
+#define __gen_IOOPHM_h__
+
+
+#ifndef __gen_nsISupports_h__
+#include "nsISupports.h"
+#endif
+
+/* For IDL files that don't want to include root IDL files. */
+#ifndef NS_NO_VTABLE
+#define NS_NO_VTABLE
+#endif
+class nsIDOMWindow; /* forward declaration */
+
+
+/* starting interface: IOOPHM */
+#define IOOPHM_IID_STR "90cef17b-c3fe-4251-af68-4381b3d938a0"
+
+#define IOOPHM_IID \
+ {0x90cef17b, 0xc3fe, 0x4251, \
+ { 0xaf, 0x68, 0x43, 0x81, 0xb3, 0xd9, 0x38, 0xa0 }}
+
+class NS_NO_VTABLE NS_SCRIPTABLE IOOPHM : public nsISupports {
+ public:
+
+ NS_DECLARE_STATIC_IID_ACCESSOR(IOOPHM_IID)
+
+ /* boolean init (in nsIDOMWindow window); */
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM) = 0;
+
+ /* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM) = 0;
+
+};
+
+ NS_DEFINE_STATIC_IID_ACCESSOR(IOOPHM, IOOPHM_IID)
+
+/* Use this macro when declaring classes that implement this interface. */
+#define NS_DECL_IOOPHM \
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM); \
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM);
+
+/* Use this macro to declare functions that forward the behavior of this interface to another object. */
+#define NS_FORWARD_IOOPHM(_to) \
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM) { return _to Init(window, _retval); } \
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM) { return _to Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); }
+
+/* Use this macro to declare functions that forward the behavior of this interface to another object in a safe way. */
+#define NS_FORWARD_SAFE_IOOPHM(_to) \
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM) { return !_to ? NS_ERROR_NULL_POINTER : _to->Init(window, _retval); } \
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM) { return !_to ? NS_ERROR_NULL_POINTER : _to->Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); }
+
+#if 0
+/* Use the code below as a template for the implementation class for this interface. */
+
+/* Header file */
+class _MYCLASS_ : public IOOPHM
+{
+public:
+ NS_DECL_ISUPPORTS
+ NS_DECL_IOOPHM
+
+ _MYCLASS_();
+
+private:
+ ~_MYCLASS_();
+
+protected:
+ /* additional members */
+};
+
+/* Implementation file */
+NS_IMPL_ISUPPORTS1(_MYCLASS_, IOOPHM)
+
+_MYCLASS_::_MYCLASS_()
+{
+ /* member initializers and constructor code */
+}
+
+_MYCLASS_::~_MYCLASS_()
+{
+ /* destructor code */
+}
+
+/* boolean init (in nsIDOMWindow window); */
+NS_IMETHODIMP _MYCLASS_::Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
+NS_IMETHODIMP _MYCLASS_::Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* End of implementation class template. */
+#endif
+
+
+#endif /* __gen_IOOPHM_h__ */
diff --git a/plugins/xpcom/prebuilt/ff110/include/IOOPHM.h b/plugins/xpcom/prebuilt/ff110/include/IOOPHM.h
new file mode 100644
index 0000000..e37792d
--- /dev/null
+++ b/plugins/xpcom/prebuilt/ff110/include/IOOPHM.h
@@ -0,0 +1,105 @@
+/*
+ * DO NOT EDIT. THIS FILE IS GENERATED FROM IOOPHM.idl
+ */
+
+#ifndef __gen_IOOPHM_h__
+#define __gen_IOOPHM_h__
+
+
+#ifndef __gen_nsISupports_h__
+#include "nsISupports.h"
+#endif
+
+/* For IDL files that don't want to include root IDL files. */
+#ifndef NS_NO_VTABLE
+#define NS_NO_VTABLE
+#endif
+class nsIDOMWindow; /* forward declaration */
+
+
+/* starting interface: IOOPHM */
+#define IOOPHM_IID_STR "90cef17b-c3fe-4251-af68-4381b3d938a0"
+
+#define IOOPHM_IID \
+ {0x90cef17b, 0xc3fe, 0x4251, \
+ { 0xaf, 0x68, 0x43, 0x81, 0xb3, 0xd9, 0x38, 0xa0 }}
+
+class NS_NO_VTABLE NS_SCRIPTABLE IOOPHM : public nsISupports {
+ public:
+
+ NS_DECLARE_STATIC_IID_ACCESSOR(IOOPHM_IID)
+
+ /* boolean init (in nsIDOMWindow window); */
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM) = 0;
+
+ /* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM) = 0;
+
+};
+
+ NS_DEFINE_STATIC_IID_ACCESSOR(IOOPHM, IOOPHM_IID)
+
+/* Use this macro when declaring classes that implement this interface. */
+#define NS_DECL_IOOPHM \
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM); \
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM);
+
+/* Use this macro to declare functions that forward the behavior of this interface to another object. */
+#define NS_FORWARD_IOOPHM(_to) \
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM) { return _to Init(window, _retval); } \
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM) { return _to Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); }
+
+/* Use this macro to declare functions that forward the behavior of this interface to another object in a safe way. */
+#define NS_FORWARD_SAFE_IOOPHM(_to) \
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM) { return !_to ? NS_ERROR_NULL_POINTER : _to->Init(window, _retval); } \
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM) { return !_to ? NS_ERROR_NULL_POINTER : _to->Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); }
+
+#if 0
+/* Use the code below as a template for the implementation class for this interface. */
+
+/* Header file */
+class _MYCLASS_ : public IOOPHM
+{
+public:
+ NS_DECL_ISUPPORTS
+ NS_DECL_IOOPHM
+
+ _MYCLASS_();
+
+private:
+ ~_MYCLASS_();
+
+protected:
+ /* additional members */
+};
+
+/* Implementation file */
+NS_IMPL_ISUPPORTS1(_MYCLASS_, IOOPHM)
+
+_MYCLASS_::_MYCLASS_()
+{
+ /* member initializers and constructor code */
+}
+
+_MYCLASS_::~_MYCLASS_()
+{
+ /* destructor code */
+}
+
+/* boolean init (in nsIDOMWindow window); */
+NS_IMETHODIMP _MYCLASS_::Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
+NS_IMETHODIMP _MYCLASS_::Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* End of implementation class template. */
+#endif
+
+
+#endif /* __gen_IOOPHM_h__ */
diff --git a/plugins/xpcom/prebuilt/ff120/include/IOOPHM.h b/plugins/xpcom/prebuilt/ff120/include/IOOPHM.h
new file mode 100644
index 0000000..e37792d
--- /dev/null
+++ b/plugins/xpcom/prebuilt/ff120/include/IOOPHM.h
@@ -0,0 +1,105 @@
+/*
+ * DO NOT EDIT. THIS FILE IS GENERATED FROM IOOPHM.idl
+ */
+
+#ifndef __gen_IOOPHM_h__
+#define __gen_IOOPHM_h__
+
+
+#ifndef __gen_nsISupports_h__
+#include "nsISupports.h"
+#endif
+
+/* For IDL files that don't want to include root IDL files. */
+#ifndef NS_NO_VTABLE
+#define NS_NO_VTABLE
+#endif
+class nsIDOMWindow; /* forward declaration */
+
+
+/* starting interface: IOOPHM */
+#define IOOPHM_IID_STR "90cef17b-c3fe-4251-af68-4381b3d938a0"
+
+#define IOOPHM_IID \
+ {0x90cef17b, 0xc3fe, 0x4251, \
+ { 0xaf, 0x68, 0x43, 0x81, 0xb3, 0xd9, 0x38, 0xa0 }}
+
+class NS_NO_VTABLE NS_SCRIPTABLE IOOPHM : public nsISupports {
+ public:
+
+ NS_DECLARE_STATIC_IID_ACCESSOR(IOOPHM_IID)
+
+ /* boolean init (in nsIDOMWindow window); */
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM) = 0;
+
+ /* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM) = 0;
+
+};
+
+ NS_DEFINE_STATIC_IID_ACCESSOR(IOOPHM, IOOPHM_IID)
+
+/* Use this macro when declaring classes that implement this interface. */
+#define NS_DECL_IOOPHM \
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM); \
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM);
+
+/* Use this macro to declare functions that forward the behavior of this interface to another object. */
+#define NS_FORWARD_IOOPHM(_to) \
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM) { return _to Init(window, _retval); } \
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM) { return _to Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); }
+
+/* Use this macro to declare functions that forward the behavior of this interface to another object in a safe way. */
+#define NS_FORWARD_SAFE_IOOPHM(_to) \
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM) { return !_to ? NS_ERROR_NULL_POINTER : _to->Init(window, _retval); } \
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM) { return !_to ? NS_ERROR_NULL_POINTER : _to->Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); }
+
+#if 0
+/* Use the code below as a template for the implementation class for this interface. */
+
+/* Header file */
+class _MYCLASS_ : public IOOPHM
+{
+public:
+ NS_DECL_ISUPPORTS
+ NS_DECL_IOOPHM
+
+ _MYCLASS_();
+
+private:
+ ~_MYCLASS_();
+
+protected:
+ /* additional members */
+};
+
+/* Implementation file */
+NS_IMPL_ISUPPORTS1(_MYCLASS_, IOOPHM)
+
+_MYCLASS_::_MYCLASS_()
+{
+ /* member initializers and constructor code */
+}
+
+_MYCLASS_::~_MYCLASS_()
+{
+ /* destructor code */
+}
+
+/* boolean init (in nsIDOMWindow window); */
+NS_IMETHODIMP _MYCLASS_::Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
+NS_IMETHODIMP _MYCLASS_::Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* End of implementation class template. */
+#endif
+
+
+#endif /* __gen_IOOPHM_h__ */
diff --git a/plugins/xpcom/prebuilt/ff130/include/IOOPHM.h b/plugins/xpcom/prebuilt/ff130/include/IOOPHM.h
new file mode 100644
index 0000000..e37792d
--- /dev/null
+++ b/plugins/xpcom/prebuilt/ff130/include/IOOPHM.h
@@ -0,0 +1,105 @@
+/*
+ * DO NOT EDIT. THIS FILE IS GENERATED FROM IOOPHM.idl
+ */
+
+#ifndef __gen_IOOPHM_h__
+#define __gen_IOOPHM_h__
+
+
+#ifndef __gen_nsISupports_h__
+#include "nsISupports.h"
+#endif
+
+/* For IDL files that don't want to include root IDL files. */
+#ifndef NS_NO_VTABLE
+#define NS_NO_VTABLE
+#endif
+class nsIDOMWindow; /* forward declaration */
+
+
+/* starting interface: IOOPHM */
+#define IOOPHM_IID_STR "90cef17b-c3fe-4251-af68-4381b3d938a0"
+
+#define IOOPHM_IID \
+ {0x90cef17b, 0xc3fe, 0x4251, \
+ { 0xaf, 0x68, 0x43, 0x81, 0xb3, 0xd9, 0x38, 0xa0 }}
+
+class NS_NO_VTABLE NS_SCRIPTABLE IOOPHM : public nsISupports {
+ public:
+
+ NS_DECLARE_STATIC_IID_ACCESSOR(IOOPHM_IID)
+
+ /* boolean init (in nsIDOMWindow window); */
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM) = 0;
+
+ /* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM) = 0;
+
+};
+
+ NS_DEFINE_STATIC_IID_ACCESSOR(IOOPHM, IOOPHM_IID)
+
+/* Use this macro when declaring classes that implement this interface. */
+#define NS_DECL_IOOPHM \
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM); \
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM);
+
+/* Use this macro to declare functions that forward the behavior of this interface to another object. */
+#define NS_FORWARD_IOOPHM(_to) \
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM) { return _to Init(window, _retval); } \
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM) { return _to Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); }
+
+/* Use this macro to declare functions that forward the behavior of this interface to another object in a safe way. */
+#define NS_FORWARD_SAFE_IOOPHM(_to) \
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM) { return !_to ? NS_ERROR_NULL_POINTER : _to->Init(window, _retval); } \
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM) { return !_to ? NS_ERROR_NULL_POINTER : _to->Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); }
+
+#if 0
+/* Use the code below as a template for the implementation class for this interface. */
+
+/* Header file */
+class _MYCLASS_ : public IOOPHM
+{
+public:
+ NS_DECL_ISUPPORTS
+ NS_DECL_IOOPHM
+
+ _MYCLASS_();
+
+private:
+ ~_MYCLASS_();
+
+protected:
+ /* additional members */
+};
+
+/* Implementation file */
+NS_IMPL_ISUPPORTS1(_MYCLASS_, IOOPHM)
+
+_MYCLASS_::_MYCLASS_()
+{
+ /* member initializers and constructor code */
+}
+
+_MYCLASS_::~_MYCLASS_()
+{
+ /* destructor code */
+}
+
+/* boolean init (in nsIDOMWindow window); */
+NS_IMETHODIMP _MYCLASS_::Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
+NS_IMETHODIMP _MYCLASS_::Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* End of implementation class template. */
+#endif
+
+
+#endif /* __gen_IOOPHM_h__ */
diff --git a/plugins/xpcom/prebuilt/ff140/include/IOOPHM.h b/plugins/xpcom/prebuilt/ff140/include/IOOPHM.h
new file mode 100644
index 0000000..e37792d
--- /dev/null
+++ b/plugins/xpcom/prebuilt/ff140/include/IOOPHM.h
@@ -0,0 +1,105 @@
+/*
+ * DO NOT EDIT. THIS FILE IS GENERATED FROM IOOPHM.idl
+ */
+
+#ifndef __gen_IOOPHM_h__
+#define __gen_IOOPHM_h__
+
+
+#ifndef __gen_nsISupports_h__
+#include "nsISupports.h"
+#endif
+
+/* For IDL files that don't want to include root IDL files. */
+#ifndef NS_NO_VTABLE
+#define NS_NO_VTABLE
+#endif
+class nsIDOMWindow; /* forward declaration */
+
+
+/* starting interface: IOOPHM */
+#define IOOPHM_IID_STR "90cef17b-c3fe-4251-af68-4381b3d938a0"
+
+#define IOOPHM_IID \
+ {0x90cef17b, 0xc3fe, 0x4251, \
+ { 0xaf, 0x68, 0x43, 0x81, 0xb3, 0xd9, 0x38, 0xa0 }}
+
+class NS_NO_VTABLE NS_SCRIPTABLE IOOPHM : public nsISupports {
+ public:
+
+ NS_DECLARE_STATIC_IID_ACCESSOR(IOOPHM_IID)
+
+ /* boolean init (in nsIDOMWindow window); */
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM) = 0;
+
+ /* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM) = 0;
+
+};
+
+ NS_DEFINE_STATIC_IID_ACCESSOR(IOOPHM, IOOPHM_IID)
+
+/* Use this macro when declaring classes that implement this interface. */
+#define NS_DECL_IOOPHM \
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM); \
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM);
+
+/* Use this macro to declare functions that forward the behavior of this interface to another object. */
+#define NS_FORWARD_IOOPHM(_to) \
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM) { return _to Init(window, _retval); } \
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM) { return _to Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); }
+
+/* Use this macro to declare functions that forward the behavior of this interface to another object in a safe way. */
+#define NS_FORWARD_SAFE_IOOPHM(_to) \
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM) { return !_to ? NS_ERROR_NULL_POINTER : _to->Init(window, _retval); } \
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM) { return !_to ? NS_ERROR_NULL_POINTER : _to->Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); }
+
+#if 0
+/* Use the code below as a template for the implementation class for this interface. */
+
+/* Header file */
+class _MYCLASS_ : public IOOPHM
+{
+public:
+ NS_DECL_ISUPPORTS
+ NS_DECL_IOOPHM
+
+ _MYCLASS_();
+
+private:
+ ~_MYCLASS_();
+
+protected:
+ /* additional members */
+};
+
+/* Implementation file */
+NS_IMPL_ISUPPORTS1(_MYCLASS_, IOOPHM)
+
+_MYCLASS_::_MYCLASS_()
+{
+ /* member initializers and constructor code */
+}
+
+_MYCLASS_::~_MYCLASS_()
+{
+ /* destructor code */
+}
+
+/* boolean init (in nsIDOMWindow window); */
+NS_IMETHODIMP _MYCLASS_::Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
+NS_IMETHODIMP _MYCLASS_::Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* End of implementation class template. */
+#endif
+
+
+#endif /* __gen_IOOPHM_h__ */
diff --git a/plugins/xpcom/prebuilt/ff150/include/IOOPHM.h b/plugins/xpcom/prebuilt/ff150/include/IOOPHM.h
new file mode 100644
index 0000000..e37792d
--- /dev/null
+++ b/plugins/xpcom/prebuilt/ff150/include/IOOPHM.h
@@ -0,0 +1,105 @@
+/*
+ * DO NOT EDIT. THIS FILE IS GENERATED FROM IOOPHM.idl
+ */
+
+#ifndef __gen_IOOPHM_h__
+#define __gen_IOOPHM_h__
+
+
+#ifndef __gen_nsISupports_h__
+#include "nsISupports.h"
+#endif
+
+/* For IDL files that don't want to include root IDL files. */
+#ifndef NS_NO_VTABLE
+#define NS_NO_VTABLE
+#endif
+class nsIDOMWindow; /* forward declaration */
+
+
+/* starting interface: IOOPHM */
+#define IOOPHM_IID_STR "90cef17b-c3fe-4251-af68-4381b3d938a0"
+
+#define IOOPHM_IID \
+ {0x90cef17b, 0xc3fe, 0x4251, \
+ { 0xaf, 0x68, 0x43, 0x81, 0xb3, 0xd9, 0x38, 0xa0 }}
+
+class NS_NO_VTABLE NS_SCRIPTABLE IOOPHM : public nsISupports {
+ public:
+
+ NS_DECLARE_STATIC_IID_ACCESSOR(IOOPHM_IID)
+
+ /* boolean init (in nsIDOMWindow window); */
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM) = 0;
+
+ /* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM) = 0;
+
+};
+
+ NS_DEFINE_STATIC_IID_ACCESSOR(IOOPHM, IOOPHM_IID)
+
+/* Use this macro when declaring classes that implement this interface. */
+#define NS_DECL_IOOPHM \
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM); \
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM);
+
+/* Use this macro to declare functions that forward the behavior of this interface to another object. */
+#define NS_FORWARD_IOOPHM(_to) \
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM) { return _to Init(window, _retval); } \
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM) { return _to Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); }
+
+/* Use this macro to declare functions that forward the behavior of this interface to another object in a safe way. */
+#define NS_FORWARD_SAFE_IOOPHM(_to) \
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM) { return !_to ? NS_ERROR_NULL_POINTER : _to->Init(window, _retval); } \
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM) { return !_to ? NS_ERROR_NULL_POINTER : _to->Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); }
+
+#if 0
+/* Use the code below as a template for the implementation class for this interface. */
+
+/* Header file */
+class _MYCLASS_ : public IOOPHM
+{
+public:
+ NS_DECL_ISUPPORTS
+ NS_DECL_IOOPHM
+
+ _MYCLASS_();
+
+private:
+ ~_MYCLASS_();
+
+protected:
+ /* additional members */
+};
+
+/* Implementation file */
+NS_IMPL_ISUPPORTS1(_MYCLASS_, IOOPHM)
+
+_MYCLASS_::_MYCLASS_()
+{
+ /* member initializers and constructor code */
+}
+
+_MYCLASS_::~_MYCLASS_()
+{
+ /* destructor code */
+}
+
+/* boolean init (in nsIDOMWindow window); */
+NS_IMETHODIMP _MYCLASS_::Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
+NS_IMETHODIMP _MYCLASS_::Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* End of implementation class template. */
+#endif
+
+
+#endif /* __gen_IOOPHM_h__ */
diff --git a/plugins/xpcom/prebuilt/ff3+/include/IOOPHM.h b/plugins/xpcom/prebuilt/ff3+/include/IOOPHM.h
new file mode 100644
index 0000000..169598e
--- /dev/null
+++ b/plugins/xpcom/prebuilt/ff3+/include/IOOPHM.h
@@ -0,0 +1,105 @@
+/*
+ * DO NOT EDIT. THIS FILE IS GENERATED FROM IOOPHM.idl
+ */
+
+#ifndef __gen_IOOPHM_h__
+#define __gen_IOOPHM_h__
+
+
+#ifndef __gen_nsISupports_h__
+#include "nsISupports.h"
+#endif
+
+/* For IDL files that don't want to include root IDL files. */
+#ifndef NS_NO_VTABLE
+#define NS_NO_VTABLE
+#endif
+class nsIDOMWindow; /* forward declaration */
+
+
+/* starting interface: IOOPHM */
+#define IOOPHM_IID_STR "90cef17b-c3fe-4251-af68-4381b3d938a0"
+
+#define IOOPHM_IID \
+ {0x90cef17b, 0xc3fe, 0x4251, \
+ { 0xaf, 0x68, 0x43, 0x81, 0xb3, 0xd9, 0x38, 0xa0 }}
+
+class NS_NO_VTABLE NS_SCRIPTABLE IOOPHM : public nsISupports {
+ public:
+
+ NS_DECLARE_STATIC_IID_ACCESSOR(IOOPHM_IID)
+
+ /* boolean init (in nsIDOMWindow window); */
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval) = 0;
+
+ /* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval) = 0;
+
+};
+
+ NS_DEFINE_STATIC_IID_ACCESSOR(IOOPHM, IOOPHM_IID)
+
+/* Use this macro when declaring classes that implement this interface. */
+#define NS_DECL_IOOPHM \
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval); \
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval);
+
+/* Use this macro to declare functions that forward the behavior of this interface to another object. */
+#define NS_FORWARD_IOOPHM(_to) \
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval) { return _to Init(window, _retval); } \
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval) { return _to Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); }
+
+/* Use this macro to declare functions that forward the behavior of this interface to another object in a safe way. */
+#define NS_FORWARD_SAFE_IOOPHM(_to) \
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval) { return !_to ? NS_ERROR_NULL_POINTER : _to->Init(window, _retval); } \
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval) { return !_to ? NS_ERROR_NULL_POINTER : _to->Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); }
+
+#if 0
+/* Use the code below as a template for the implementation class for this interface. */
+
+/* Header file */
+class _MYCLASS_ : public IOOPHM
+{
+public:
+ NS_DECL_ISUPPORTS
+ NS_DECL_IOOPHM
+
+ _MYCLASS_();
+
+private:
+ ~_MYCLASS_();
+
+protected:
+ /* additional members */
+};
+
+/* Implementation file */
+NS_IMPL_ISUPPORTS1(_MYCLASS_, IOOPHM)
+
+_MYCLASS_::_MYCLASS_()
+{
+ /* member initializers and constructor code */
+}
+
+_MYCLASS_::~_MYCLASS_()
+{
+ /* destructor code */
+}
+
+/* boolean init (in nsIDOMWindow window); */
+NS_IMETHODIMP _MYCLASS_::Init(nsIDOMWindow *window, PRBool *_retval)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
+NS_IMETHODIMP _MYCLASS_::Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* End of implementation class template. */
+#endif
+
+
+#endif /* __gen_IOOPHM_h__ */
diff --git a/plugins/xpcom/prebuilt/ff3/include/IOOPHM.h b/plugins/xpcom/prebuilt/ff3/include/IOOPHM.h
new file mode 100644
index 0000000..169598e
--- /dev/null
+++ b/plugins/xpcom/prebuilt/ff3/include/IOOPHM.h
@@ -0,0 +1,105 @@
+/*
+ * DO NOT EDIT. THIS FILE IS GENERATED FROM IOOPHM.idl
+ */
+
+#ifndef __gen_IOOPHM_h__
+#define __gen_IOOPHM_h__
+
+
+#ifndef __gen_nsISupports_h__
+#include "nsISupports.h"
+#endif
+
+/* For IDL files that don't want to include root IDL files. */
+#ifndef NS_NO_VTABLE
+#define NS_NO_VTABLE
+#endif
+class nsIDOMWindow; /* forward declaration */
+
+
+/* starting interface: IOOPHM */
+#define IOOPHM_IID_STR "90cef17b-c3fe-4251-af68-4381b3d938a0"
+
+#define IOOPHM_IID \
+ {0x90cef17b, 0xc3fe, 0x4251, \
+ { 0xaf, 0x68, 0x43, 0x81, 0xb3, 0xd9, 0x38, 0xa0 }}
+
+class NS_NO_VTABLE NS_SCRIPTABLE IOOPHM : public nsISupports {
+ public:
+
+ NS_DECLARE_STATIC_IID_ACCESSOR(IOOPHM_IID)
+
+ /* boolean init (in nsIDOMWindow window); */
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval) = 0;
+
+ /* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval) = 0;
+
+};
+
+ NS_DEFINE_STATIC_IID_ACCESSOR(IOOPHM, IOOPHM_IID)
+
+/* Use this macro when declaring classes that implement this interface. */
+#define NS_DECL_IOOPHM \
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval); \
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval);
+
+/* Use this macro to declare functions that forward the behavior of this interface to another object. */
+#define NS_FORWARD_IOOPHM(_to) \
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval) { return _to Init(window, _retval); } \
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval) { return _to Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); }
+
+/* Use this macro to declare functions that forward the behavior of this interface to another object in a safe way. */
+#define NS_FORWARD_SAFE_IOOPHM(_to) \
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval) { return !_to ? NS_ERROR_NULL_POINTER : _to->Init(window, _retval); } \
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval) { return !_to ? NS_ERROR_NULL_POINTER : _to->Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); }
+
+#if 0
+/* Use the code below as a template for the implementation class for this interface. */
+
+/* Header file */
+class _MYCLASS_ : public IOOPHM
+{
+public:
+ NS_DECL_ISUPPORTS
+ NS_DECL_IOOPHM
+
+ _MYCLASS_();
+
+private:
+ ~_MYCLASS_();
+
+protected:
+ /* additional members */
+};
+
+/* Implementation file */
+NS_IMPL_ISUPPORTS1(_MYCLASS_, IOOPHM)
+
+_MYCLASS_::_MYCLASS_()
+{
+ /* member initializers and constructor code */
+}
+
+_MYCLASS_::~_MYCLASS_()
+{
+ /* destructor code */
+}
+
+/* boolean init (in nsIDOMWindow window); */
+NS_IMETHODIMP _MYCLASS_::Init(nsIDOMWindow *window, PRBool *_retval)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
+NS_IMETHODIMP _MYCLASS_::Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* End of implementation class template. */
+#endif
+
+
+#endif /* __gen_IOOPHM_h__ */
diff --git a/plugins/xpcom/prebuilt/ff35/include/IOOPHM.h b/plugins/xpcom/prebuilt/ff35/include/IOOPHM.h
new file mode 100644
index 0000000..0e7be5d
--- /dev/null
+++ b/plugins/xpcom/prebuilt/ff35/include/IOOPHM.h
@@ -0,0 +1,105 @@
+/*
+ * DO NOT EDIT. THIS FILE IS GENERATED FROM IOOPHM.idl
+ */
+
+#ifndef __gen_IOOPHM_h__
+#define __gen_IOOPHM_h__
+
+
+#ifndef __gen_nsISupports_h__
+#include "nsISupports.h"
+#endif
+
+/* For IDL files that don't want to include root IDL files. */
+#ifndef NS_NO_VTABLE
+#define NS_NO_VTABLE
+#endif
+class nsIDOMWindow; /* forward declaration */
+
+
+/* starting interface: IOOPHM */
+#define IOOPHM_IID_STR "90cef17b-c3fe-4251-af68-4381b3d938a0"
+
+#define IOOPHM_IID \
+ {0x90cef17b, 0xc3fe, 0x4251, \
+ { 0xaf, 0x68, 0x43, 0x81, 0xb3, 0xd9, 0x38, 0xa0 }}
+
+class NS_NO_VTABLE NS_SCRIPTABLE IOOPHM : public nsISupports {
+ public:
+
+ NS_DECLARE_STATIC_IID_ACCESSOR(IOOPHM_IID)
+
+ /* boolean init (in nsIDOMWindow window); */
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM) = 0;
+
+ /* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM) = 0;
+
+};
+
+ NS_DEFINE_STATIC_IID_ACCESSOR(IOOPHM, IOOPHM_IID)
+
+/* Use this macro when declaring classes that implement this interface. */
+#define NS_DECL_IOOPHM \
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM); \
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM);
+
+/* Use this macro to declare functions that forward the behavior of this interface to another object. */
+#define NS_FORWARD_IOOPHM(_to) \
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM) { return _to Init(window, _retval); } \
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM) { return _to Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); }
+
+/* Use this macro to declare functions that forward the behavior of this interface to another object in a safe way. */
+#define NS_FORWARD_SAFE_IOOPHM(_to) \
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM) { return !_to ? NS_ERROR_NULL_POINTER : _to->Init(window, _retval); } \
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM) { return !_to ? NS_ERROR_NULL_POINTER : _to->Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); }
+
+#if 0
+/* Use the code below as a template for the implementation class for this interface. */
+
+/* Header file */
+class _MYCLASS_ : public IOOPHM
+{
+public:
+ NS_DECL_ISUPPORTS
+ NS_DECL_IOOPHM
+
+ _MYCLASS_();
+
+private:
+ ~_MYCLASS_();
+
+protected:
+ /* additional members */
+};
+
+/* Implementation file */
+NS_IMPL_ISUPPORTS1(_MYCLASS_, IOOPHM)
+
+_MYCLASS_::_MYCLASS_()
+{
+ /* member initializers and constructor code */
+}
+
+_MYCLASS_::~_MYCLASS_()
+{
+ /* destructor code */
+}
+
+/* boolean init (in nsIDOMWindow window); */
+NS_IMETHODIMP _MYCLASS_::Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
+NS_IMETHODIMP _MYCLASS_::Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* End of implementation class template. */
+#endif
+
+
+#endif /* __gen_IOOPHM_h__ */
diff --git a/plugins/xpcom/prebuilt/ff36/include/IOOPHM.h b/plugins/xpcom/prebuilt/ff36/include/IOOPHM.h
new file mode 100644
index 0000000..0e7be5d
--- /dev/null
+++ b/plugins/xpcom/prebuilt/ff36/include/IOOPHM.h
@@ -0,0 +1,105 @@
+/*
+ * DO NOT EDIT. THIS FILE IS GENERATED FROM IOOPHM.idl
+ */
+
+#ifndef __gen_IOOPHM_h__
+#define __gen_IOOPHM_h__
+
+
+#ifndef __gen_nsISupports_h__
+#include "nsISupports.h"
+#endif
+
+/* For IDL files that don't want to include root IDL files. */
+#ifndef NS_NO_VTABLE
+#define NS_NO_VTABLE
+#endif
+class nsIDOMWindow; /* forward declaration */
+
+
+/* starting interface: IOOPHM */
+#define IOOPHM_IID_STR "90cef17b-c3fe-4251-af68-4381b3d938a0"
+
+#define IOOPHM_IID \
+ {0x90cef17b, 0xc3fe, 0x4251, \
+ { 0xaf, 0x68, 0x43, 0x81, 0xb3, 0xd9, 0x38, 0xa0 }}
+
+class NS_NO_VTABLE NS_SCRIPTABLE IOOPHM : public nsISupports {
+ public:
+
+ NS_DECLARE_STATIC_IID_ACCESSOR(IOOPHM_IID)
+
+ /* boolean init (in nsIDOMWindow window); */
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM) = 0;
+
+ /* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM) = 0;
+
+};
+
+ NS_DEFINE_STATIC_IID_ACCESSOR(IOOPHM, IOOPHM_IID)
+
+/* Use this macro when declaring classes that implement this interface. */
+#define NS_DECL_IOOPHM \
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM); \
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM);
+
+/* Use this macro to declare functions that forward the behavior of this interface to another object. */
+#define NS_FORWARD_IOOPHM(_to) \
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM) { return _to Init(window, _retval); } \
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM) { return _to Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); }
+
+/* Use this macro to declare functions that forward the behavior of this interface to another object in a safe way. */
+#define NS_FORWARD_SAFE_IOOPHM(_to) \
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM) { return !_to ? NS_ERROR_NULL_POINTER : _to->Init(window, _retval); } \
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM) { return !_to ? NS_ERROR_NULL_POINTER : _to->Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); }
+
+#if 0
+/* Use the code below as a template for the implementation class for this interface. */
+
+/* Header file */
+class _MYCLASS_ : public IOOPHM
+{
+public:
+ NS_DECL_ISUPPORTS
+ NS_DECL_IOOPHM
+
+ _MYCLASS_();
+
+private:
+ ~_MYCLASS_();
+
+protected:
+ /* additional members */
+};
+
+/* Implementation file */
+NS_IMPL_ISUPPORTS1(_MYCLASS_, IOOPHM)
+
+_MYCLASS_::_MYCLASS_()
+{
+ /* member initializers and constructor code */
+}
+
+_MYCLASS_::~_MYCLASS_()
+{
+ /* destructor code */
+}
+
+/* boolean init (in nsIDOMWindow window); */
+NS_IMETHODIMP _MYCLASS_::Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
+NS_IMETHODIMP _MYCLASS_::Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* End of implementation class template. */
+#endif
+
+
+#endif /* __gen_IOOPHM_h__ */
diff --git a/plugins/xpcom/prebuilt/ff40/include/IOOPHM.h b/plugins/xpcom/prebuilt/ff40/include/IOOPHM.h
new file mode 100644
index 0000000..0e7be5d
--- /dev/null
+++ b/plugins/xpcom/prebuilt/ff40/include/IOOPHM.h
@@ -0,0 +1,105 @@
+/*
+ * DO NOT EDIT. THIS FILE IS GENERATED FROM IOOPHM.idl
+ */
+
+#ifndef __gen_IOOPHM_h__
+#define __gen_IOOPHM_h__
+
+
+#ifndef __gen_nsISupports_h__
+#include "nsISupports.h"
+#endif
+
+/* For IDL files that don't want to include root IDL files. */
+#ifndef NS_NO_VTABLE
+#define NS_NO_VTABLE
+#endif
+class nsIDOMWindow; /* forward declaration */
+
+
+/* starting interface: IOOPHM */
+#define IOOPHM_IID_STR "90cef17b-c3fe-4251-af68-4381b3d938a0"
+
+#define IOOPHM_IID \
+ {0x90cef17b, 0xc3fe, 0x4251, \
+ { 0xaf, 0x68, 0x43, 0x81, 0xb3, 0xd9, 0x38, 0xa0 }}
+
+class NS_NO_VTABLE NS_SCRIPTABLE IOOPHM : public nsISupports {
+ public:
+
+ NS_DECLARE_STATIC_IID_ACCESSOR(IOOPHM_IID)
+
+ /* boolean init (in nsIDOMWindow window); */
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM) = 0;
+
+ /* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM) = 0;
+
+};
+
+ NS_DEFINE_STATIC_IID_ACCESSOR(IOOPHM, IOOPHM_IID)
+
+/* Use this macro when declaring classes that implement this interface. */
+#define NS_DECL_IOOPHM \
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM); \
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM);
+
+/* Use this macro to declare functions that forward the behavior of this interface to another object. */
+#define NS_FORWARD_IOOPHM(_to) \
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM) { return _to Init(window, _retval); } \
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM) { return _to Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); }
+
+/* Use this macro to declare functions that forward the behavior of this interface to another object in a safe way. */
+#define NS_FORWARD_SAFE_IOOPHM(_to) \
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM) { return !_to ? NS_ERROR_NULL_POINTER : _to->Init(window, _retval); } \
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM) { return !_to ? NS_ERROR_NULL_POINTER : _to->Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); }
+
+#if 0
+/* Use the code below as a template for the implementation class for this interface. */
+
+/* Header file */
+class _MYCLASS_ : public IOOPHM
+{
+public:
+ NS_DECL_ISUPPORTS
+ NS_DECL_IOOPHM
+
+ _MYCLASS_();
+
+private:
+ ~_MYCLASS_();
+
+protected:
+ /* additional members */
+};
+
+/* Implementation file */
+NS_IMPL_ISUPPORTS1(_MYCLASS_, IOOPHM)
+
+_MYCLASS_::_MYCLASS_()
+{
+ /* member initializers and constructor code */
+}
+
+_MYCLASS_::~_MYCLASS_()
+{
+ /* destructor code */
+}
+
+/* boolean init (in nsIDOMWindow window); */
+NS_IMETHODIMP _MYCLASS_::Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
+NS_IMETHODIMP _MYCLASS_::Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* End of implementation class template. */
+#endif
+
+
+#endif /* __gen_IOOPHM_h__ */
diff --git a/plugins/xpcom/prebuilt/ff50/include/IOOPHM.h b/plugins/xpcom/prebuilt/ff50/include/IOOPHM.h
new file mode 100644
index 0000000..0e7be5d
--- /dev/null
+++ b/plugins/xpcom/prebuilt/ff50/include/IOOPHM.h
@@ -0,0 +1,105 @@
+/*
+ * DO NOT EDIT. THIS FILE IS GENERATED FROM IOOPHM.idl
+ */
+
+#ifndef __gen_IOOPHM_h__
+#define __gen_IOOPHM_h__
+
+
+#ifndef __gen_nsISupports_h__
+#include "nsISupports.h"
+#endif
+
+/* For IDL files that don't want to include root IDL files. */
+#ifndef NS_NO_VTABLE
+#define NS_NO_VTABLE
+#endif
+class nsIDOMWindow; /* forward declaration */
+
+
+/* starting interface: IOOPHM */
+#define IOOPHM_IID_STR "90cef17b-c3fe-4251-af68-4381b3d938a0"
+
+#define IOOPHM_IID \
+ {0x90cef17b, 0xc3fe, 0x4251, \
+ { 0xaf, 0x68, 0x43, 0x81, 0xb3, 0xd9, 0x38, 0xa0 }}
+
+class NS_NO_VTABLE NS_SCRIPTABLE IOOPHM : public nsISupports {
+ public:
+
+ NS_DECLARE_STATIC_IID_ACCESSOR(IOOPHM_IID)
+
+ /* boolean init (in nsIDOMWindow window); */
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM) = 0;
+
+ /* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM) = 0;
+
+};
+
+ NS_DEFINE_STATIC_IID_ACCESSOR(IOOPHM, IOOPHM_IID)
+
+/* Use this macro when declaring classes that implement this interface. */
+#define NS_DECL_IOOPHM \
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM); \
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM);
+
+/* Use this macro to declare functions that forward the behavior of this interface to another object. */
+#define NS_FORWARD_IOOPHM(_to) \
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM) { return _to Init(window, _retval); } \
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM) { return _to Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); }
+
+/* Use this macro to declare functions that forward the behavior of this interface to another object in a safe way. */
+#define NS_FORWARD_SAFE_IOOPHM(_to) \
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM) { return !_to ? NS_ERROR_NULL_POINTER : _to->Init(window, _retval); } \
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM) { return !_to ? NS_ERROR_NULL_POINTER : _to->Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); }
+
+#if 0
+/* Use the code below as a template for the implementation class for this interface. */
+
+/* Header file */
+class _MYCLASS_ : public IOOPHM
+{
+public:
+ NS_DECL_ISUPPORTS
+ NS_DECL_IOOPHM
+
+ _MYCLASS_();
+
+private:
+ ~_MYCLASS_();
+
+protected:
+ /* additional members */
+};
+
+/* Implementation file */
+NS_IMPL_ISUPPORTS1(_MYCLASS_, IOOPHM)
+
+_MYCLASS_::_MYCLASS_()
+{
+ /* member initializers and constructor code */
+}
+
+_MYCLASS_::~_MYCLASS_()
+{
+ /* destructor code */
+}
+
+/* boolean init (in nsIDOMWindow window); */
+NS_IMETHODIMP _MYCLASS_::Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
+NS_IMETHODIMP _MYCLASS_::Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* End of implementation class template. */
+#endif
+
+
+#endif /* __gen_IOOPHM_h__ */
diff --git a/plugins/xpcom/prebuilt/ff60/include/IOOPHM.h b/plugins/xpcom/prebuilt/ff60/include/IOOPHM.h
new file mode 100644
index 0000000..0e7be5d
--- /dev/null
+++ b/plugins/xpcom/prebuilt/ff60/include/IOOPHM.h
@@ -0,0 +1,105 @@
+/*
+ * DO NOT EDIT. THIS FILE IS GENERATED FROM IOOPHM.idl
+ */
+
+#ifndef __gen_IOOPHM_h__
+#define __gen_IOOPHM_h__
+
+
+#ifndef __gen_nsISupports_h__
+#include "nsISupports.h"
+#endif
+
+/* For IDL files that don't want to include root IDL files. */
+#ifndef NS_NO_VTABLE
+#define NS_NO_VTABLE
+#endif
+class nsIDOMWindow; /* forward declaration */
+
+
+/* starting interface: IOOPHM */
+#define IOOPHM_IID_STR "90cef17b-c3fe-4251-af68-4381b3d938a0"
+
+#define IOOPHM_IID \
+ {0x90cef17b, 0xc3fe, 0x4251, \
+ { 0xaf, 0x68, 0x43, 0x81, 0xb3, 0xd9, 0x38, 0xa0 }}
+
+class NS_NO_VTABLE NS_SCRIPTABLE IOOPHM : public nsISupports {
+ public:
+
+ NS_DECLARE_STATIC_IID_ACCESSOR(IOOPHM_IID)
+
+ /* boolean init (in nsIDOMWindow window); */
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM) = 0;
+
+ /* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM) = 0;
+
+};
+
+ NS_DEFINE_STATIC_IID_ACCESSOR(IOOPHM, IOOPHM_IID)
+
+/* Use this macro when declaring classes that implement this interface. */
+#define NS_DECL_IOOPHM \
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM); \
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM);
+
+/* Use this macro to declare functions that forward the behavior of this interface to another object. */
+#define NS_FORWARD_IOOPHM(_to) \
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM) { return _to Init(window, _retval); } \
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM) { return _to Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); }
+
+/* Use this macro to declare functions that forward the behavior of this interface to another object in a safe way. */
+#define NS_FORWARD_SAFE_IOOPHM(_to) \
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM) { return !_to ? NS_ERROR_NULL_POINTER : _to->Init(window, _retval); } \
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM) { return !_to ? NS_ERROR_NULL_POINTER : _to->Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); }
+
+#if 0
+/* Use the code below as a template for the implementation class for this interface. */
+
+/* Header file */
+class _MYCLASS_ : public IOOPHM
+{
+public:
+ NS_DECL_ISUPPORTS
+ NS_DECL_IOOPHM
+
+ _MYCLASS_();
+
+private:
+ ~_MYCLASS_();
+
+protected:
+ /* additional members */
+};
+
+/* Implementation file */
+NS_IMPL_ISUPPORTS1(_MYCLASS_, IOOPHM)
+
+_MYCLASS_::_MYCLASS_()
+{
+ /* member initializers and constructor code */
+}
+
+_MYCLASS_::~_MYCLASS_()
+{
+ /* destructor code */
+}
+
+/* boolean init (in nsIDOMWindow window); */
+NS_IMETHODIMP _MYCLASS_::Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
+NS_IMETHODIMP _MYCLASS_::Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* End of implementation class template. */
+#endif
+
+
+#endif /* __gen_IOOPHM_h__ */
diff --git a/plugins/xpcom/prebuilt/ff70/include/IOOPHM.h b/plugins/xpcom/prebuilt/ff70/include/IOOPHM.h
new file mode 100644
index 0000000..0e7be5d
--- /dev/null
+++ b/plugins/xpcom/prebuilt/ff70/include/IOOPHM.h
@@ -0,0 +1,105 @@
+/*
+ * DO NOT EDIT. THIS FILE IS GENERATED FROM IOOPHM.idl
+ */
+
+#ifndef __gen_IOOPHM_h__
+#define __gen_IOOPHM_h__
+
+
+#ifndef __gen_nsISupports_h__
+#include "nsISupports.h"
+#endif
+
+/* For IDL files that don't want to include root IDL files. */
+#ifndef NS_NO_VTABLE
+#define NS_NO_VTABLE
+#endif
+class nsIDOMWindow; /* forward declaration */
+
+
+/* starting interface: IOOPHM */
+#define IOOPHM_IID_STR "90cef17b-c3fe-4251-af68-4381b3d938a0"
+
+#define IOOPHM_IID \
+ {0x90cef17b, 0xc3fe, 0x4251, \
+ { 0xaf, 0x68, 0x43, 0x81, 0xb3, 0xd9, 0x38, 0xa0 }}
+
+class NS_NO_VTABLE NS_SCRIPTABLE IOOPHM : public nsISupports {
+ public:
+
+ NS_DECLARE_STATIC_IID_ACCESSOR(IOOPHM_IID)
+
+ /* boolean init (in nsIDOMWindow window); */
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM) = 0;
+
+ /* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM) = 0;
+
+};
+
+ NS_DEFINE_STATIC_IID_ACCESSOR(IOOPHM, IOOPHM_IID)
+
+/* Use this macro when declaring classes that implement this interface. */
+#define NS_DECL_IOOPHM \
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM); \
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM);
+
+/* Use this macro to declare functions that forward the behavior of this interface to another object. */
+#define NS_FORWARD_IOOPHM(_to) \
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM) { return _to Init(window, _retval); } \
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM) { return _to Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); }
+
+/* Use this macro to declare functions that forward the behavior of this interface to another object in a safe way. */
+#define NS_FORWARD_SAFE_IOOPHM(_to) \
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM) { return !_to ? NS_ERROR_NULL_POINTER : _to->Init(window, _retval); } \
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM) { return !_to ? NS_ERROR_NULL_POINTER : _to->Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); }
+
+#if 0
+/* Use the code below as a template for the implementation class for this interface. */
+
+/* Header file */
+class _MYCLASS_ : public IOOPHM
+{
+public:
+ NS_DECL_ISUPPORTS
+ NS_DECL_IOOPHM
+
+ _MYCLASS_();
+
+private:
+ ~_MYCLASS_();
+
+protected:
+ /* additional members */
+};
+
+/* Implementation file */
+NS_IMPL_ISUPPORTS1(_MYCLASS_, IOOPHM)
+
+_MYCLASS_::_MYCLASS_()
+{
+ /* member initializers and constructor code */
+}
+
+_MYCLASS_::~_MYCLASS_()
+{
+ /* destructor code */
+}
+
+/* boolean init (in nsIDOMWindow window); */
+NS_IMETHODIMP _MYCLASS_::Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
+NS_IMETHODIMP _MYCLASS_::Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* End of implementation class template. */
+#endif
+
+
+#endif /* __gen_IOOPHM_h__ */
diff --git a/plugins/xpcom/prebuilt/ff80/include/IOOPHM.h b/plugins/xpcom/prebuilt/ff80/include/IOOPHM.h
new file mode 100644
index 0000000..0e7be5d
--- /dev/null
+++ b/plugins/xpcom/prebuilt/ff80/include/IOOPHM.h
@@ -0,0 +1,105 @@
+/*
+ * DO NOT EDIT. THIS FILE IS GENERATED FROM IOOPHM.idl
+ */
+
+#ifndef __gen_IOOPHM_h__
+#define __gen_IOOPHM_h__
+
+
+#ifndef __gen_nsISupports_h__
+#include "nsISupports.h"
+#endif
+
+/* For IDL files that don't want to include root IDL files. */
+#ifndef NS_NO_VTABLE
+#define NS_NO_VTABLE
+#endif
+class nsIDOMWindow; /* forward declaration */
+
+
+/* starting interface: IOOPHM */
+#define IOOPHM_IID_STR "90cef17b-c3fe-4251-af68-4381b3d938a0"
+
+#define IOOPHM_IID \
+ {0x90cef17b, 0xc3fe, 0x4251, \
+ { 0xaf, 0x68, 0x43, 0x81, 0xb3, 0xd9, 0x38, 0xa0 }}
+
+class NS_NO_VTABLE NS_SCRIPTABLE IOOPHM : public nsISupports {
+ public:
+
+ NS_DECLARE_STATIC_IID_ACCESSOR(IOOPHM_IID)
+
+ /* boolean init (in nsIDOMWindow window); */
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM) = 0;
+
+ /* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM) = 0;
+
+};
+
+ NS_DEFINE_STATIC_IID_ACCESSOR(IOOPHM, IOOPHM_IID)
+
+/* Use this macro when declaring classes that implement this interface. */
+#define NS_DECL_IOOPHM \
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM); \
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM);
+
+/* Use this macro to declare functions that forward the behavior of this interface to another object. */
+#define NS_FORWARD_IOOPHM(_to) \
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM) { return _to Init(window, _retval); } \
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM) { return _to Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); }
+
+/* Use this macro to declare functions that forward the behavior of this interface to another object in a safe way. */
+#define NS_FORWARD_SAFE_IOOPHM(_to) \
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM) { return !_to ? NS_ERROR_NULL_POINTER : _to->Init(window, _retval); } \
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM) { return !_to ? NS_ERROR_NULL_POINTER : _to->Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); }
+
+#if 0
+/* Use the code below as a template for the implementation class for this interface. */
+
+/* Header file */
+class _MYCLASS_ : public IOOPHM
+{
+public:
+ NS_DECL_ISUPPORTS
+ NS_DECL_IOOPHM
+
+ _MYCLASS_();
+
+private:
+ ~_MYCLASS_();
+
+protected:
+ /* additional members */
+};
+
+/* Implementation file */
+NS_IMPL_ISUPPORTS1(_MYCLASS_, IOOPHM)
+
+_MYCLASS_::_MYCLASS_()
+{
+ /* member initializers and constructor code */
+}
+
+_MYCLASS_::~_MYCLASS_()
+{
+ /* destructor code */
+}
+
+/* boolean init (in nsIDOMWindow window); */
+NS_IMETHODIMP _MYCLASS_::Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
+NS_IMETHODIMP _MYCLASS_::Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* End of implementation class template. */
+#endif
+
+
+#endif /* __gen_IOOPHM_h__ */
diff --git a/plugins/xpcom/prebuilt/ff90/include/IOOPHM.h b/plugins/xpcom/prebuilt/ff90/include/IOOPHM.h
new file mode 100644
index 0000000..0e7be5d
--- /dev/null
+++ b/plugins/xpcom/prebuilt/ff90/include/IOOPHM.h
@@ -0,0 +1,105 @@
+/*
+ * DO NOT EDIT. THIS FILE IS GENERATED FROM IOOPHM.idl
+ */
+
+#ifndef __gen_IOOPHM_h__
+#define __gen_IOOPHM_h__
+
+
+#ifndef __gen_nsISupports_h__
+#include "nsISupports.h"
+#endif
+
+/* For IDL files that don't want to include root IDL files. */
+#ifndef NS_NO_VTABLE
+#define NS_NO_VTABLE
+#endif
+class nsIDOMWindow; /* forward declaration */
+
+
+/* starting interface: IOOPHM */
+#define IOOPHM_IID_STR "90cef17b-c3fe-4251-af68-4381b3d938a0"
+
+#define IOOPHM_IID \
+ {0x90cef17b, 0xc3fe, 0x4251, \
+ { 0xaf, 0x68, 0x43, 0x81, 0xb3, 0xd9, 0x38, 0xa0 }}
+
+class NS_NO_VTABLE NS_SCRIPTABLE IOOPHM : public nsISupports {
+ public:
+
+ NS_DECLARE_STATIC_IID_ACCESSOR(IOOPHM_IID)
+
+ /* boolean init (in nsIDOMWindow window); */
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM) = 0;
+
+ /* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM) = 0;
+
+};
+
+ NS_DEFINE_STATIC_IID_ACCESSOR(IOOPHM, IOOPHM_IID)
+
+/* Use this macro when declaring classes that implement this interface. */
+#define NS_DECL_IOOPHM \
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM); \
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM);
+
+/* Use this macro to declare functions that forward the behavior of this interface to another object. */
+#define NS_FORWARD_IOOPHM(_to) \
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM) { return _to Init(window, _retval); } \
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM) { return _to Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); }
+
+/* Use this macro to declare functions that forward the behavior of this interface to another object in a safe way. */
+#define NS_FORWARD_SAFE_IOOPHM(_to) \
+ NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM) { return !_to ? NS_ERROR_NULL_POINTER : _to->Init(window, _retval); } \
+ NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM) { return !_to ? NS_ERROR_NULL_POINTER : _to->Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); }
+
+#if 0
+/* Use the code below as a template for the implementation class for this interface. */
+
+/* Header file */
+class _MYCLASS_ : public IOOPHM
+{
+public:
+ NS_DECL_ISUPPORTS
+ NS_DECL_IOOPHM
+
+ _MYCLASS_();
+
+private:
+ ~_MYCLASS_();
+
+protected:
+ /* additional members */
+};
+
+/* Implementation file */
+NS_IMPL_ISUPPORTS1(_MYCLASS_, IOOPHM)
+
+_MYCLASS_::_MYCLASS_()
+{
+ /* member initializers and constructor code */
+}
+
+_MYCLASS_::~_MYCLASS_()
+{
+ /* destructor code */
+}
+
+/* boolean init (in nsIDOMWindow window); */
+NS_IMETHODIMP _MYCLASS_::Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
+NS_IMETHODIMP _MYCLASS_::Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* End of implementation class template. */
+#endif
+
+
+#endif /* __gen_IOOPHM_h__ */
diff --git a/plugins/xpcom/prebuilt/gwt-dev-plugin.xpi b/plugins/xpcom/prebuilt/gwt-dev-plugin.xpi
new file mode 100644
index 0000000..d83406a
--- /dev/null
+++ b/plugins/xpcom/prebuilt/gwt-dev-plugin.xpi
Binary files differ
diff --git a/plugins/xpcom/prebuilt/update.rdf b/plugins/xpcom/prebuilt/update.rdf
new file mode 100644
index 0000000..47a3c64
--- /dev/null
+++ b/plugins/xpcom/prebuilt/update.rdf
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<RDF:RDF xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:em="http://www.mozilla.org/2004/em-rdf#">
+
+ <RDF:Description about="urn:mozilla:extension:gwt-dev-plugin@google.com">
+ <em:updates>
+ <RDF:Seq>
+
+ <RDF:li>
+ <RDF:Description>
+ <em:version>0.9.6553M.20091030005401</em:version>
+ <em:targetApplication>
+ <Description>
+ <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
+ <em:minVersion>3.0</em:minVersion>
+ <em:maxVersion>15.0.*</em:maxVersion>
+ <em:updateLink>https://dl-ssl.google.com/gwt/plugins/firefox/gwt-dev-plugin.xpi</em:updateLink>
+ <em:updateInfoURL>https://dl-ssl.google.com/gwt/plugins/firefox/gwt-dev-plugin-info.xhtml?locale=%APP_LOCALE%</em:updateInfoURL>
+
+ </Description>
+ </em:targetApplication>
+ </RDF:Description>
+ </RDF:li>
+
+ </RDF:Seq>
+ </em:updates>
+ </RDF:Description>
+</RDF:RDF>
diff --git a/plugins/xpcom/xpGwtDevPlugin.def b/plugins/xpcom/xpGwtDevPlugin.def
new file mode 100644
index 0000000..b3e5034
--- /dev/null
+++ b/plugins/xpcom/xpGwtDevPlugin.def
@@ -0,0 +1,3 @@
+LIBRARY xpGwtDevPlugin
+
+EXPORTS
diff --git a/plugins/xpcom/xpGwtDevPlugin.rc b/plugins/xpcom/xpGwtDevPlugin.rc
new file mode 100644
index 0000000..de20962
--- /dev/null
+++ b/plugins/xpcom/xpGwtDevPlugin.rc
@@ -0,0 +1,71 @@
+#define APSTUDIO_READONLY_SYMBOLS
+#include "windows.h"
+#undef APSTUDIO_READONLY_SYMBOLS
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
+#ifdef _WIN32
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+#pragma code_page(1252)
+#endif
+
+1 VERSIONINFO
+ FILEVERSION 0,9,0,0
+ PRODUCTVERSION 0,9,0,0
+ FILEFLAGSMASK 0x3fL
+#ifdef _DEBUG
+ FILEFLAGS 0x1L
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS 0x40004L
+ FILETYPE 0x2L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904e4"
+ BEGIN
+ VALUE "CompanyName", "Google Inc"
+ VALUE "FileDescription", "GWT Developer Plugin (XPCOM)"
+#if 0
+ VALUE "FileExtents", ""
+#endif
+ VALUE "FileOpenName", "Plugin to allow debugging of GWT applications in development mode."
+ VALUE "FileVersion", "0.1a"
+ VALUE "InternalName", "GWT Developer Plugin (XPCOM)"
+ VALUE "LegalCopyright", "Copyright © 2008 Google Inc. Licensed under Apache 2.0 license."
+ VALUE "MIMEType", "application/x-gwt-hosted-mode"
+ VALUE "OriginalFilename", "xpGwtDevPlugin.dll"
+ VALUE "ProductName", "GWT Developer Plugin (XPCOM)"
+ VALUE "ProductVersion", "0.9.0.0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1252
+ END
+END
+
+#ifdef APSTUDIO_INVOKED
+1 TEXTINCLUDE
+BEGIN
+ "resource.h\0"
+END
+
+2 TEXTINCLUDE
+BEGIN
+ "#include ""windows.h""\r\n"
+ "\0"
+END
+
+3 TEXTINCLUDE
+BEGIN
+ "\r\n"
+ "\0"
+END
+
+#endif
+
+#else
+
+#endif
diff --git a/reference/dispatch/Dispatch.gwt.xml b/reference/dispatch/Dispatch.gwt.xml
new file mode 100644
index 0000000..fa1c708
--- /dev/null
+++ b/reference/dispatch/Dispatch.gwt.xml
@@ -0,0 +1,6 @@
+<!DOCTYPE document SYSTEM
+ "http://google-web-toolkit.googlecode.com/svn/releases/1.5/distro-source/core/src/gwt-module.dtd">
+<module>
+ <inherits name='com.google.gwt.user.User' />
+ <entry-point class='kellegous.client.Dispatch' />
+</module>
diff --git a/reference/dispatch/client/Dispatch.java b/reference/dispatch/client/Dispatch.java
new file mode 100644
index 0000000..cac6f18
--- /dev/null
+++ b/reference/dispatch/client/Dispatch.java
@@ -0,0 +1,143 @@
+package kellegous.client;
+
+import com.google.gwt.core.client.Duration;
+import com.google.gwt.core.client.EntryPoint;
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.dom.client.DivElement;
+import com.google.gwt.dom.client.Document;
+import com.google.gwt.user.client.Command;
+import com.google.gwt.user.client.Event;
+import com.google.gwt.user.client.EventListener;
+
+public class Dispatch implements EntryPoint {
+ private static native Event createMockEvent() /*-{
+ return { type: "click" };
+ }-*/;
+
+ private static double[] runTrial(int numberOfObservers,
+ int numberOfIterations, int numberOfSamples) {
+ final double[] results = new double[numberOfSamples];
+ final EventListener subject = Subject.create(numberOfObservers);
+ final Event event = createMockEvent();
+ for (int j = 0; j < numberOfSamples; ++j) {
+ final Duration d = new Duration();
+ for (int i = 0; i < numberOfIterations; ++i) {
+ subject.onBrowserEvent(event);
+ }
+ results[j] = d.elapsedMillis();
+ }
+ return results;
+ }
+
+ private static native void schedule(Command command) /*-{
+ $wnd.setTimeout(function() {
+ command.@com.google.gwt.user.client.Command::execute()();
+ }, 0);
+ }-*/;
+
+ // t-distribution for p = 0.05 (used to compute 95% confidence intervals).
+ // This table is based at df = 2.
+ private final static double[] TDIST = new double[] {
+ 4.3027, 3.1824, 2.7765, 2.5706, 2.4469, 2.3646, 2.3060, 2.2622, 2.2281,
+ 2.2010, 2.1788, 2.1604, 2.1448, 2.1315, 2.1199, 2.1098, 2.1009, 2.0930,
+ 2.0860, 2.0796, 2.0739, 2.0687, 2.0639, 2.0595, 2.0555, 2.0518, 2.0484,
+ 2.0452, 2.0423, 2.0395, 2.0369, 2.0345, 2.0322, 2.0301, 2.0281, 2.0262,
+ 2.0244, 2.0227, 2.0211, 2.0195, 2.0181, 2.0167, 2.0154, 2.0141, 2.0129,
+ 2.0117, 2.0106, 2.0096, 2.0086, 2.0076, 2.0066, 2.0057, 2.0049, 2.0040,
+ 2.0032, 2.0025, 2.0017, 2.0010, 2.0003, 1.9996, 1.9990, 1.9983, 1.9977,
+ 1.9971, 1.9966, 1.9960, 1.9955, 1.9949, 1.9944, 1.9939, 1.9935, 1.9930,
+ 1.9925, 1.9921, 1.9917, 1.9913, 1.9908, 1.9905, 1.9901, 1.9897, 1.9893,
+ 1.9890, 1.9886, 1.9883, 1.9879, 1.9876, 1.9873, 1.9870, 1.9867, 1.9864,
+ 1.9861, 1.9858, 1.9855, 1.9852, 1.9850, 1.9847, 1.9845, 1.9842, 1.9840};
+
+ private static double computeT(int df) {
+ return TDIST[df - 2];
+ }
+
+ private static double computeMean(double[] s) {
+ double sum = 0.0;
+ final int n = s.length;
+ for (int i = 0; i < n; ++i) {
+ sum += s[i];
+ }
+ return sum / n;
+ }
+
+ private static double computeStandardError(double[] data, double mean) {
+ final int n = data.length;
+ double sum = 0.0;
+ for (int i = 0; i < n; ++i) {
+ final double d = data[i] - mean;
+ sum += d * d;
+ }
+
+ return Math.sqrt(sum / n) / Math.sqrt(n);
+ }
+
+ private static class Stats {
+ private final double mean, upper, lower;
+
+ Stats(double[] data) {
+ mean = computeMean(data);
+ final double error = computeStandardError(data, mean);
+ final double t = computeT(data.length - 1);
+ upper = mean + t * error;
+ lower = mean - t * error;
+ }
+
+ @Override
+ public String toString() {
+ return mean + ", " + lower + ", " + upper;
+ }
+ }
+
+ public static class Runner {
+ private int n;
+ private final int max, numIterations, numSamples;
+ private Stats[] results;
+
+ Runner(int min, int max, int numIterations, int numSamples) {
+ n = min;
+ this.max = max;
+ this.numIterations = numIterations;
+ this.numSamples = numSamples;
+ results = new Stats[max - min + 1];
+ }
+
+ void finish() {
+ final Document document = Document.get();
+ final DivElement root = document.createDivElement();
+ document.getBody().appendChild(root);
+ for (int i = 0, n = results.length; i < n; ++i) {
+ final DivElement div = document.createDivElement();
+ root.appendChild(div);
+ div.setInnerText("" + results[i].toString());
+ }
+ }
+
+ void next() {
+ schedule(new Command() {
+ public void execute() {
+ final double[] results = runTrial(n, numIterations, numSamples);
+ Runner.this.results[n] = new Stats(results);
+ if (++n <= max) {
+ next();
+ } else {
+ finish();
+ }
+ }
+ });
+ }
+
+ void run() {
+ next();
+ }
+ }
+
+ public void onModuleLoad() {
+ // Don't run this in hosted mode.
+ if (GWT.isScript()) {
+ new Runner(0, 10, 10000, 20).run();
+ }
+ }
+}
diff --git a/reference/dispatch/client/Subject.java b/reference/dispatch/client/Subject.java
new file mode 100644
index 0000000..fc21bee
--- /dev/null
+++ b/reference/dispatch/client/Subject.java
@@ -0,0 +1,22 @@
+package kellegous.client;
+
+import com.google.gwt.user.client.EventListener;
+import com.google.gwt.user.client.ui.Button;
+import com.google.gwt.user.client.ui.ClickListener;
+import com.google.gwt.user.client.ui.Widget;
+
+public class Subject {
+ public static EventListener create(int numberOfObserver) {
+ final Button subject = new Button("a button");
+ for (int i = 0; i < numberOfObserver; ++i) {
+ subject.addClickListener(new ClickListener() {
+ private int count = 0;
+
+ public void onClick(Widget sender) {
+ count++;
+ }
+ });
+ }
+ return subject;
+ }
+}
diff --git a/reference/dispatch/public/Dispatch.html b/reference/dispatch/public/Dispatch.html
new file mode 100644
index 0000000..e87c244
--- /dev/null
+++ b/reference/dispatch/public/Dispatch.html
@@ -0,0 +1,10 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+ <head>
+ <meta http-equiv="content-type" content="text/html; charset=UTF-8">
+ <title>Dispatch5</title>
+ <script type="text/javascript" language="javascript" src="kellegous.Dispatch.nocache.js"></script>
+ </head>
+ <body>
+ </body>
+</html>
diff --git a/reference/html-encyclopedia/FieldSet.html b/reference/html-encyclopedia/FieldSet.html
new file mode 100644
index 0000000..53c5f9a
--- /dev/null
+++ b/reference/html-encyclopedia/FieldSet.html
@@ -0,0 +1,60 @@
+<html>
+<body>
+
+<h1>Fieldset examples</h1>
+
+<h2>Fieldsets take HTML captions</h2>
+Everything below is confirmed to work in FF 1.5, FF 2.0, IE 6, IE 7, Safari 3.1
+
+<fieldset>
+ <legend><b>Bold</b> is supported</legend>
+ <button>Button</button>
+</fieldset>
+
+<fieldset>
+ <legend><u>Underline</u> is supported</legend>
+ <button>Button</button>
+</fieldset>
+
+<fieldset>
+ <legend><button>Buttons</button> are supported</legend>
+ <button>Button</button>
+</fieldset>
+
+<fieldset>
+ <legend><img src="http://www.google.com/images/logo.gif"> (images are supported)</legend>
+ <button>Button</button>
+</fieldset>
+
+<fieldset>
+ <legend>
+ <table>
+ <tr><td colspan="2">Tables work</td></tr>
+ <tr><td>row 1, col 1</td><td>row 1, col 2</td></tr>
+ <tr><td>row 2, col 1</td><td>row 2, col 2</td></tr>
+ </table>
+ </legend>
+ <button>Button</button>
+</fieldset>
+
+<fieldset>
+ <legend>
+ <span><input id="mycheckbox" type="checkbox"><label for="mycheckbox">GWT-structured checkboxes work</label></span>
+ </legend>
+ <button>Button</button>
+</fieldset>
+
+<h2>Fieldsets without a <legend> element shows no gap</h2>
+<fieldset>
+ <button>Button</button>
+</fieldset>
+
+<h2>Fieldsets with an empty <legend> element show a gap in some browsers</h2>
+<fieldset>
+ <legend></legend>
+ <button>Button</button>
+</fieldset>
+
+</body>
+</html>
+
diff --git a/samples/showcase/src/com/google/gwt/sample/showcase/client/ContentWidgetView.java b/samples/showcase/src/com/google/gwt/sample/showcase/client/ContentWidgetView.java
index fddfad0..4797b6b 100644
--- a/samples/showcase/src/com/google/gwt/sample/showcase/client/ContentWidgetView.java
+++ b/samples/showcase/src/com/google/gwt/sample/showcase/client/ContentWidgetView.java
@@ -56,7 +56,7 @@
}
public void setDescription(SafeHtml html) {
- descElem.setInnerSafeHtml(html);
+ descElem.setInnerHTML(html.asString());
}
public void setExample(Widget widget) {
diff --git a/user/build.xml b/user/build.xml
index d49f25f..3290ba5 100755
--- a/user/build.xml
+++ b/user/build.xml
@@ -35,7 +35,7 @@
<property name="gwt.tck.testcase.dev.includes" value="com/google/gwt/validation/tck/**/*GwtSuite.class" />
<property name="gwt.tct.testcase.dev.excludes" value="" />
- <property name="gwt.nongwt.testcase.includes" value="**/*SuiteNoBrowser.class" />
+ <property name="gwt.nongwt.testcase.includes" value="com/google/gwt/dev/jjs/GwtAstBuilderTest.class" />
<property name="gwt.nongwt.testcase.excludes" value="" />
<!--
diff --git a/user/src/com/google/gwt/animation/Animation.gwt.xml b/user/src/com/google/gwt/animation/Animation.gwt.xml
index 8fd4427..bc2a47c 100644
--- a/user/src/com/google/gwt/animation/Animation.gwt.xml
+++ b/user/src/com/google/gwt/animation/Animation.gwt.xml
@@ -32,13 +32,11 @@
<replace-with class="com.google.gwt.animation.client.AnimationSchedulerImplMozilla">
<when-type-is class="com.google.gwt.animation.client.AnimationScheduler"/>
<when-property-is name="user.agent" value="gecko1_8"/>
- <when-property-is name="webApiUsage" value="modern"/>
</replace-with>
<!-- Implementation based on webkitRequestAnimationFrame -->
<replace-with class="com.google.gwt.animation.client.AnimationSchedulerImplWebkit">
<when-type-is class="com.google.gwt.animation.client.AnimationScheduler"/>
<when-property-is name="user.agent" value="safari"/>
- <when-property-is name="webApiUsage" value="modern"/>
</replace-with>
</module>
diff --git a/user/src/com/google/gwt/animation/client/Animation.java b/user/src/com/google/gwt/animation/client/Animation.java
index 800d1fb..cf3530e 100644
--- a/user/src/com/google/gwt/animation/client/Animation.java
+++ b/user/src/com/google/gwt/animation/client/Animation.java
@@ -242,10 +242,8 @@
*
* The value of progress is between 0.0 and 1.0 (inclusive) (unless you
* override the {@link #interpolate(double)} method to provide a wider range
- * of values). There is no guarantee that {@link #onUpdate(double)} is called
- * with 0.0 or 1.0.
- * If you need to perform setup or tear down procedures, you can override
- * {@link #onStart()} and {@link #onComplete()}.
+ * of values). You can override {@link #onStart()} and {@link #onComplete()}
+ * to perform setup and tear down procedures.
*
* @param progress a double, normally between 0.0 and 1.0 (inclusive)
*/
diff --git a/user/src/com/google/gwt/cell/client/AbstractCell.java b/user/src/com/google/gwt/cell/client/AbstractCell.java
index 68899f9..26205ed 100644
--- a/user/src/com/google/gwt/cell/client/AbstractCell.java
+++ b/user/src/com/google/gwt/cell/client/AbstractCell.java
@@ -135,7 +135,7 @@
public void setValue(Context context, Element parent, C value) {
SafeHtmlBuilder sb = new SafeHtmlBuilder();
render(context, value, sb);
- parent.setInnerSafeHtml(sb.toSafeHtml());
+ parent.setInnerHTML(sb.toSafeHtml().asString());
}
/**
diff --git a/user/src/com/google/gwt/cell/client/ImageLoadingCell.java b/user/src/com/google/gwt/cell/client/ImageLoadingCell.java
index 236980b..ea4a6d0 100644
--- a/user/src/com/google/gwt/cell/client/ImageLoadingCell.java
+++ b/user/src/com/google/gwt/cell/client/ImageLoadingCell.java
@@ -195,7 +195,8 @@
imgWrapper.getStyle().setProperty("overflow", "auto");
} else if (BrowserEvents.ERROR.equals(type) && eventOccurredOnImage(event, parent)) {
// Replace the loading indicator with an error message.
- parent.getFirstChildElement().setInnerSafeHtml(errorRenderer.render(value));
+ parent.getFirstChildElement().setInnerHTML(
+ errorRenderer.render(value).asString());
}
}
diff --git a/user/src/com/google/gwt/core/CrossSiteIframeLinker.gwt.xml b/user/src/com/google/gwt/core/CrossSiteIframeLinker.gwt.xml
index 1c45f9d..b988b19 100644
--- a/user/src/com/google/gwt/core/CrossSiteIframeLinker.gwt.xml
+++ b/user/src/com/google/gwt/core/CrossSiteIframeLinker.gwt.xml
@@ -23,17 +23,7 @@
<define-configuration-property name="installScriptJs" is-multi-valued="false" />
<define-configuration-property name="installCode" is-multi-valued="false" />
<define-configuration-property name="computeScriptBaseJs" is-multi-valued="false" />
- <!--
- - Determines whether the GWT compiler generates cache.js files
- - that end with a comment pointing to a sourcemap file, to support source-level
- - debugging in browsers.
- - Specification: http://goo.gl/ZQ3V3
- - Takes on the following values:
- - if false, no sourcemap URL declarations are included at the end of the primary fragment script
- - if true, a relative URL to the standard sourcemap for the primary fragment is included
- - else the value is assumed to be a custom URL -->
- <define-configuration-property name="includeSourceMapUrl" is-multi-valued="false"/>
- <set-configuration-property name="includeSourceMapUrl" value="false"/>
+
<set-configuration-property name="xsiframe.failIfScriptTag" value="TRUE"/>
<replace-with class="com.google.gwt.core.client.impl.ScriptTagLoadingStrategy">
@@ -41,6 +31,4 @@
class="com.google.gwt.core.client.impl.AsyncFragmentLoader.LoadingStrategy" />
<when-linker-added name="xsiframe" />
</replace-with>
-
-
</module>
diff --git a/user/src/com/google/gwt/core/client/ScriptInjector.java b/user/src/com/google/gwt/core/client/ScriptInjector.java
index d07ad4a..4c08242 100644
--- a/user/src/com/google/gwt/core/client/ScriptInjector.java
+++ b/user/src/com/google/gwt/core/client/ScriptInjector.java
@@ -119,7 +119,6 @@
*/
public static class FromUrl {
private Callback<Void, Exception> callback;
- private boolean removeTag = false;
private final String scriptUrl;
private JavaScriptObject window;
@@ -140,8 +139,8 @@
assert doc != null;
JavaScriptObject scriptElement = nativeMakeScriptElement(doc);
assert scriptElement != null;
- if (callback != null || removeTag) {
- attachListeners(scriptElement, callback, removeTag);
+ if (callback != null) {
+ attachListeners(scriptElement, callback);
}
nativeSetSrc(scriptElement, scriptUrl);
nativeAttachToHead(doc, scriptElement);
@@ -176,19 +175,6 @@
}
/**
- * @param removeTag If true, remove the tag after the script finishes
- * loading. This shrinks the DOM, possibly at the expense of
- * readability if you are debugging javaScript.
- *
- * Default value is {@code false}, but this may change in a future
- * release.
- */
- public FromUrl setRemoveTag(boolean removeTag) {
- this.removeTag = removeTag;
- return this;
- }
-
- /**
* This call allows you to specify which DOM window object to install the
* script tag in. To install into the Top level window call
*
@@ -257,27 +243,20 @@
* @param callback callback that runs when the script is loaded and parsed.
*/
private static native void attachListeners(JavaScriptObject scriptElement,
- Callback<Void, Exception> callback, boolean removeTag) /*-{
+ Callback<Void, Exception> callback) /*-{
function clearCallbacks() {
scriptElement.onerror = scriptElement.onreadystatechange = scriptElement.onload = function() {
};
- if (removeTag) {
- @com.google.gwt.core.client.ScriptInjector::nativeRemove(Lcom/google/gwt/core/client/JavaScriptObject;)(scriptElement);
- }
}
scriptElement.onload = $entry(function() {
clearCallbacks();
- if (callback) {
- callback.@com.google.gwt.core.client.Callback::onSuccess(Ljava/lang/Object;)(null);
- }
+ callback.@com.google.gwt.core.client.Callback::onSuccess(Ljava/lang/Object;)(null);
});
- // or possibly more portable script_tag.addEventListener('error', function(){...}, true);
+ // or possibly more portable script_tag.addEventListener('error', function(){...}, true);
scriptElement.onerror = $entry(function() {
clearCallbacks();
- if (callback) {
- var ex = @com.google.gwt.core.client.CodeDownloadException::new(Ljava/lang/String;)("onerror() called.");
- callback.@com.google.gwt.core.client.Callback::onFailure(Ljava/lang/Object;)(ex);
- }
+ var ex = @com.google.gwt.core.client.CodeDownloadException::new(Ljava/lang/String;)("onerror() called.");
+ callback.@com.google.gwt.core.client.Callback::onFailure(Ljava/lang/Object;)(ex)
});
scriptElement.onreadystatechange = $entry(function() {
if (scriptElement.readyState == 'complete' || scriptElement.readyState == 'loaded') {
diff --git a/user/src/com/google/gwt/core/client/impl/Impl.java b/user/src/com/google/gwt/core/client/impl/Impl.java
index f94faea..5a224dd 100644
--- a/user/src/com/google/gwt/core/client/impl/Impl.java
+++ b/user/src/com/google/gwt/core/client/impl/Impl.java
@@ -184,11 +184,11 @@
}-*/;
private static native Object apply(Object jsFunction, Object thisObj,
- Object args) /*-{
+ Object arguments) /*-{
if (@com.google.gwt.core.client.GWT::isScript()()) {
- return jsFunction.apply(thisObj, args);
+ return jsFunction.apply(thisObj, arguments);
} else {
- var _ = jsFunction.apply(thisObj, args);
+ var _ = jsFunction.apply(thisObj, arguments);
if (_ != null) {
// Wrap for Development Mode
_ = Object(_);
diff --git a/user/src/com/google/gwt/core/client/impl/SchedulerImpl.java b/user/src/com/google/gwt/core/client/impl/SchedulerImpl.java
index 14d4381..fd76da9 100644
--- a/user/src/com/google/gwt/core/client/impl/SchedulerImpl.java
+++ b/user/src/com/google/gwt/core/client/impl/SchedulerImpl.java
@@ -149,7 +149,55 @@
return queue;
}
+ /**
+ * Execute a list of Tasks that hold RepeatingCommands.
+ *
+ * @return A replacement array that is possibly a shorter copy of
+ * <code>tasks</code>
+ */
+ private static JsArray<Task> runRepeatingTasks(JsArray<Task> tasks) {
+ assert tasks != null : "tasks";
+ int length = tasks.length();
+ if (length == 0) {
+ return null;
+ }
+
+ boolean canceledSomeTasks = false;
+ double start = Duration.currentTimeMillis();
+
+ while (Duration.currentTimeMillis() - start < TIME_SLICE) {
+ for (int i = 0; i < length; i++) {
+ assert tasks.length() == length : "Working array length changed "
+ + tasks.length() + " != " + length;
+ Task t = tasks.get(i);
+ if (t == null) {
+ continue;
+ }
+
+ assert t.isRepeating() : "Found a non-repeating Task";
+
+ if (!t.executeRepeating()) {
+ tasks.set(i, null);
+ canceledSomeTasks = true;
+ }
+ }
+ }
+
+ if (canceledSomeTasks) {
+ JsArray<Task> newTasks = createQueue();
+ // Remove tombstones
+ for (int i = 0; i < length; i++) {
+ if (tasks.get(i) != null) {
+ newTasks.push(tasks.get(i));
+ }
+ }
+ assert newTasks.length() < length;
+ return newTasks.length() == 0 ? null : newTasks;
+ } else {
+ return tasks;
+ }
+ }
/**
* Execute a list of Tasks that hold both ScheduledCommands and
@@ -326,13 +374,6 @@
}
/**
- * there for testing
- */
- Duration createDuration() {
- return new Duration();
- }
-
- /**
* Called by Flusher.
*/
void flushPostEventPumpCommands() {
@@ -371,59 +412,4 @@
scheduleFixedDelayImpl(rescue, RESCUE_DELAY);
}
}
-
- /**
- * Execute a list of Tasks that hold RepeatingCommands.
- *
- * @return A replacement array that is possibly a shorter copy of <code>tasks</code>
- */
- private JsArray<Task> runRepeatingTasks(JsArray<Task> tasks) {
- assert tasks != null : "tasks";
-
- int length = tasks.length();
- if (length == 0) {
- return null;
- }
-
- boolean canceledSomeTasks = false;
-
- Duration duration = createDuration();
- while (duration.elapsedMillis() < TIME_SLICE) {
- boolean executedSomeTask = false;
- for (int i = 0; i < length; i++) {
- assert tasks.length() == length : "Working array length changed " + tasks.length() + " != "
- + length;
- Task t = tasks.get(i);
- if (t == null) {
- continue;
- }
- executedSomeTask = true;
-
- assert t.isRepeating() : "Found a non-repeating Task";
-
- if (!t.executeRepeating()) {
- tasks.set(i, null);
- canceledSomeTasks = true;
- }
- }
- if (!executedSomeTask) {
- // no work left to do, break to avoid busy waiting until TIME_SLICE is reached
- break;
- }
- }
-
- if (canceledSomeTasks) {
- JsArray<Task> newTasks = createQueue();
- // Remove tombstones
- for (int i = 0; i < length; i++) {
- if (tasks.get(i) != null) {
- newTasks.push(tasks.get(i));
- }
- }
- assert newTasks.length() < length;
- return newTasks.length() == 0 ? null : newTasks;
- } else {
- return tasks;
- }
- }
}
diff --git a/user/src/com/google/gwt/core/client/impl/ScriptTagLoadingStrategy.java b/user/src/com/google/gwt/core/client/impl/ScriptTagLoadingStrategy.java
index 1e88bf5..6b2b97e 100644
--- a/user/src/com/google/gwt/core/client/impl/ScriptTagLoadingStrategy.java
+++ b/user/src/com/google/gwt/core/client/impl/ScriptTagLoadingStrategy.java
@@ -15,8 +15,7 @@
*/
package com.google.gwt.core.client.impl;
-import com.google.gwt.core.client.Callback;
-import com.google.gwt.core.client.ScriptInjector;
+import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.core.client.impl.AsyncFragmentLoader.HttpDownloadFailure;
/**
@@ -24,8 +23,10 @@
* therefore cross site compatible. Note that if this strategy is used, the
* deferred fragments must be wrapped in a callback called runAsyncCallbackX()
* where X is the fragment number.
- *
+ *
* This is the default strategy for the CrossSiteIframeLinker.
+ *
+ * TODO(unnurg): Try to use the ScriptInjector here
*/
public class ScriptTagLoadingStrategy extends LoadingStrategyBase {
@@ -36,57 +37,96 @@
protected static class ScriptTagDownloadStrategy implements DownloadStrategy {
@Override
public void tryDownload(final RequestData request) {
- setAsyncCallback(request.getFragment(), request);
-
- ScriptInjector.fromUrl(request.getUrl()).setRemoveTag(true).setCallback(
- new Callback<Void, Exception>() {
- @Override
- public void onFailure(Exception reason) {
- cleanup(request);
- }
-
- @Override
- public void onSuccess(Void result) {
- cleanup(request);
- }
- }).inject();
+ int fragment = request.getFragment();
+ JavaScriptObject scriptTag = createScriptTag(request.getUrl());
+ setOnSuccess(fragment, onSuccess(fragment, scriptTag, request));
+ setOnFailure(scriptTag, onFailure(fragment, scriptTag, request));
+ installScriptTag(scriptTag);
}
}
-
- private static void asyncCallback(RequestData request, String code) {
- boolean firstTimeCalled = clearAsyncCallback(request.getFragment());
- if (firstTimeCalled) {
- request.tryInstall(code);
- }
+
+ protected static void callOnLoadError(RequestData request) {
+ request.onLoadError(new HttpDownloadFailure(request.getUrl(), 404,
+ "Script Tag Failure - no status available"), true);
}
- private static void cleanup(RequestData request) {
- boolean neverCalled = clearAsyncCallback(request.getFragment());
- if (neverCalled) {
- request.onLoadError(new HttpDownloadFailure(request.getUrl(), 404,
- "Script Tag Failure - no status available"), true);
- }
- }
-
- /**
- * Returns true if the callback existed.
- */
- private static native boolean clearAsyncCallback(int fragment) /*-{
- if (!__gwtModuleFunction['runAsyncCallback' + fragment]) {
+ private static native boolean clearCallbacksAndRemoveTag(
+ int fragment, JavaScriptObject scriptTag) /*-{
+ if (scriptTag.parentNode == null) {
+ // onSuccess or onFailure must have already been called.
return false;
}
- delete __gwtModuleFunction['runAsyncCallback' + fragment];
+ var head = document.getElementsByTagName('head').item(0);
+ @com.google.gwt.core.client.impl.ScriptTagLoadingStrategy::clearOnSuccess(I)(fragment);
+ @com.google.gwt.core.client.impl.ScriptTagLoadingStrategy::clearOnFailure(Lcom/google/gwt/core/client/JavaScriptObject;)(
+ scriptTag);
+ head.removeChild(scriptTag);
return true;
}-*/;
+
+ private static native void clearOnFailure(JavaScriptObject scriptTag) /*-{
+ scriptTag.onerror = scriptTag.onload = scriptTag.onreadystatechange = function(){};
+ }-*/;
- private static native void setAsyncCallback(int fragment, RequestData request) /*-{
- __gwtModuleFunction['runAsyncCallback' + fragment] = $entry(function(code, instance) {
- @com.google.gwt.core.client.impl.ScriptTagLoadingStrategy::asyncCallback(Lcom/google/gwt/core/client/impl/LoadingStrategyBase$RequestData;Ljava/lang/String;)(
- request, code);
- });
+ private static native void clearOnSuccess(int fragment) /*-{
+ delete __gwtModuleFunction['runAsyncCallback' + fragment];
+ }-*/;
+
+ private static native JavaScriptObject createScriptTag(String url) /*-{
+ var head = document.getElementsByTagName('head').item(0);
+ var scriptTag = document.createElement('script');
+ scriptTag.src = url;
+ return scriptTag;
+ }-*/;
+
+ private static native void installScriptTag(JavaScriptObject scriptTag) /*-{
+ var head = document.getElementsByTagName('head').item(0);
+ head.appendChild(scriptTag);
+ }-*/;
+
+ private static native JavaScriptObject onFailure(
+ int fragment, JavaScriptObject scriptTag, RequestData request) /*-{
+ return function() {
+ if (@com.google.gwt.core.client.impl.ScriptTagLoadingStrategy::clearCallbacksAndRemoveTag(ILcom/google/gwt/core/client/JavaScriptObject;)(
+ fragment, scriptTag)) {
+ @com.google.gwt.core.client.impl.ScriptTagLoadingStrategy::callOnLoadError(Lcom/google/gwt/core/client/impl/LoadingStrategyBase$RequestData;)(
+ request)
+ }
+ }
+ }-*/;
+
+ private static native JavaScriptObject onSuccess(int fragment,
+ JavaScriptObject scriptTag, RequestData request) /*-{
+ return function(code, instance) {
+ if (@com.google.gwt.core.client.impl.ScriptTagLoadingStrategy::clearCallbacksAndRemoveTag(ILcom/google/gwt/core/client/JavaScriptObject;)(
+ fragment, scriptTag)) {
+ request.@com.google.gwt.core.client.impl.LoadingStrategyBase.RequestData::tryInstall(Ljava/lang/String;)(
+ code);
+ }
+ }
+ }-*/;
+
+ private static native void setOnFailure(JavaScriptObject script,
+ JavaScriptObject callback) /*-{
+ script.onerror = function() {
+ callback();
+ }
+ script.onload = function() {
+ callback();
+ }
+ script.onreadystatechange = function () {
+ if (script.readyState == 'loaded' || script.readyState == 'complete') {
+ script.onreadystatechange = function () { }
+ callback();
+ }
+ }
+ }-*/;
+
+ private static native void setOnSuccess(int fragment, JavaScriptObject callback) /*-{
+ __gwtModuleFunction['runAsyncCallback'+fragment] = callback;
}-*/;
public ScriptTagLoadingStrategy() {
super(new ScriptTagDownloadStrategy());
- }
+ }
}
diff --git a/user/src/com/google/gwt/core/client/impl/StackTraceCreator.java b/user/src/com/google/gwt/core/client/impl/StackTraceCreator.java
index faff5a5..6b4924a 100644
--- a/user/src/com/google/gwt/core/client/impl/StackTraceCreator.java
+++ b/user/src/com/google/gwt/core/client/impl/StackTraceCreator.java
@@ -338,16 +338,9 @@
index = toReturn.indexOf("(");
if (index == -1) {
- // No bracketed items found, try '@' (used by iOS).
- index = toReturn.indexOf("@");
- if (index == -1) {
- // No bracketed items nor '@' found, hence no function name available
- location = toReturn;
- toReturn = "";
- } else {
- location = toReturn.substring(index + 1).trim();
- toReturn = toReturn.substring(0, index).trim();
- }
+ // No bracketed items found, hence no function name available
+ location = toReturn;
+ toReturn = "";
} else {
// Bracketed items found: strip them off, parse location info
int closeParen = toReturn.indexOf(")", index);
diff --git a/user/src/com/google/gwt/dom/builder/client/DomBuilderImpl.java b/user/src/com/google/gwt/dom/builder/client/DomBuilderImpl.java
index 88ae07d..280d9fb 100644
--- a/user/src/com/google/gwt/dom/builder/client/DomBuilderImpl.java
+++ b/user/src/com/google/gwt/dom/builder/client/DomBuilderImpl.java
@@ -568,7 +568,7 @@
@Override
protected void doHtmlImpl(SafeHtml html) {
- getCurrentElement().setInnerSafeHtml(html);
+ getCurrentElement().setInnerHTML(html.asString());
}
@Override
diff --git a/user/src/com/google/gwt/dom/builder/shared/HtmlBuilderImpl.java b/user/src/com/google/gwt/dom/builder/shared/HtmlBuilderImpl.java
index 66919c5..8488cc2 100644
--- a/user/src/com/google/gwt/dom/builder/shared/HtmlBuilderImpl.java
+++ b/user/src/com/google/gwt/dom/builder/shared/HtmlBuilderImpl.java
@@ -654,7 +654,7 @@
@Override
protected Element doFinishImpl() {
Element tmp = Document.get().createDivElement();
- tmp.setInnerSafeHtml(asSafeHtml());
+ tmp.setInnerHTML(asSafeHtml().asString());
return tmp.getFirstChildElement();
}
diff --git a/user/src/com/google/gwt/dom/client/DOMImplMozilla.java b/user/src/com/google/gwt/dom/client/DOMImplMozilla.java
index 5dd8343..6b306fc 100644
--- a/user/src/com/google/gwt/dom/client/DOMImplMozilla.java
+++ b/user/src/com/google/gwt/dom/client/DOMImplMozilla.java
@@ -141,22 +141,14 @@
@Override
public native int getBodyOffsetLeft(Document doc) /*-{
- var style = $wnd.getComputedStyle(doc.documentElement, null);
- if (style == null) {
- // Works around https://bugzilla.mozilla.org/show_bug.cgi?id=548397
- return 0;
- }
- return parseInt(style.marginLeft, 10) + parseInt(style.borderLeftWidth, 10);
+ var style = $wnd.getComputedStyle(doc.documentElement, '');
+ return parseInt(style.marginLeft) + parseInt(style.borderLeftWidth);
}-*/;
@Override
public native int getBodyOffsetTop(Document doc) /*-{
- var style = $wnd.getComputedStyle(doc.documentElement, null);
- if (style == null) {
- // Works around https://bugzilla.mozilla.org/show_bug.cgi?id=548397
- return 0;
- }
- return parseInt(style.marginTop, 10) + parseInt(style.borderTopWidth, 10);
+ var style = $wnd.getComputedStyle(doc.documentElement, '');
+ return parseInt(style.marginTop) + parseInt(style.borderTopWidth);
}-*/;
@Override
diff --git a/user/src/com/google/gwt/dom/client/Element.java b/user/src/com/google/gwt/dom/client/Element.java
index 7d1fd5b..258d3d3 100644
--- a/user/src/com/google/gwt/dom/client/Element.java
+++ b/user/src/com/google/gwt/dom/client/Element.java
@@ -85,10 +85,9 @@
* present, this method has no effect.
*
* @param className the class name to be added
- * @return <code>true</code> if this element did not already have the specified class name
* @see #setClassName(String)
*/
- public final boolean addClassName(String className) {
+ public final void addClassName(String className) {
assert (className != null) : "Unexpectedly null class name";
className = className.trim();
@@ -96,18 +95,28 @@
// Get the current style string.
String oldClassName = getClassName();
- int idx = indexOfName(oldClassName, className);
+ int idx = oldClassName.indexOf(className);
+
+ // Calculate matching index.
+ while (idx != -1) {
+ if (idx == 0 || oldClassName.charAt(idx - 1) == ' ') {
+ int last = idx + className.length();
+ int lastPos = oldClassName.length();
+ if ((last == lastPos)
+ || ((last < lastPos) && (oldClassName.charAt(last) == ' '))) {
+ break;
+ }
+ }
+ idx = oldClassName.indexOf(className, idx + 1);
+ }
// Only add the style if it's not already present.
if (idx == -1) {
if (oldClassName.length() > 0) {
- setClassName(oldClassName + " " + className);
- } else {
- setClassName(className);
+ oldClassName += " ";
}
- return true;
+ setClassName(oldClassName + className);
}
- return false;
}
/**
@@ -519,11 +528,10 @@
* Removes a name from this element's class property. If the name is not
* present, this method has no effect.
*
- * @param className the class name to be removed
- * @return <code>true</code> if this element had the specified class name
+ * @param className the class name to be added
* @see #setClassName(String)
*/
- public final boolean removeClassName(String className) {
+ public final void removeClassName(String className) {
assert (className != null) : "Unexpectedly null class name";
className = className.trim();
@@ -531,7 +539,20 @@
// Get the current style string.
String oldStyle = getClassName();
- int idx = indexOfName(oldStyle, className);
+ int idx = oldStyle.indexOf(className);
+
+ // Calculate matching index.
+ while (idx != -1) {
+ if (idx == 0 || oldStyle.charAt(idx - 1) == ' ') {
+ int last = idx + className.length();
+ int lastPos = oldStyle.length();
+ if ((last == lastPos)
+ || ((last < lastPos) && (oldStyle.charAt(last) == ' '))) {
+ break;
+ }
+ }
+ idx = oldStyle.indexOf(className, idx + 1);
+ }
// Don't try to remove the style if it's not there.
if (idx != -1) {
@@ -550,35 +571,7 @@
}
setClassName(newClassName);
- return true;
}
- return false;
- }
-
- /**
- * Returns the index of the first occurrence of name in a space-separated list of names,
- * or -1 if not found.
- *
- * @param nameList list of space delimited names
- * @param name a non-empty string. Should be already trimmed.
- */
- static int indexOfName(String nameList, String name) {
- int idx = nameList.indexOf(name);
-
- // Calculate matching index.
- while (idx != -1) {
- if (idx == 0 || nameList.charAt(idx - 1) == ' ') {
- int last = idx + name.length();
- int lastPos = nameList.length();
- if ((last == lastPos)
- || ((last < lastPos) && (nameList.charAt(last) == ' '))) {
- break;
- }
- }
- idx = nameList.indexOf(name, idx + 1);
- }
-
- return idx;
}
/**
diff --git a/user/src/com/google/gwt/dom/client/Style.java b/user/src/com/google/gwt/dom/client/Style.java
index 414483b..29cbc81 100644
--- a/user/src/com/google/gwt/dom/client/Style.java
+++ b/user/src/com/google/gwt/dom/client/Style.java
@@ -1153,7 +1153,7 @@
}
/**
- * Clear the float css property.
+ * Clear the font-size css property.
*/
public final void clearFloat() {
clearProperty(DOMImpl.impl.cssFloatPropertyName());
diff --git a/user/src/com/google/gwt/editor/client/adapters/EditorSource.java b/user/src/com/google/gwt/editor/client/adapters/EditorSource.java
index e2991fa..6a1d779 100644
--- a/user/src/com/google/gwt/editor/client/adapters/EditorSource.java
+++ b/user/src/com/google/gwt/editor/client/adapters/EditorSource.java
@@ -22,7 +22,7 @@
/**
* An entity capable of creating and destroying instances of Editors. This type
- * is used by Editors which operate on ordered data, such as {@link ListEditor}.
+ * is used by Editors which operate on ordered data, sich as {@link ListEditor}.
*
* @param <E> the type of Editor required
* @see com.google.gwt.editor.client.testing.FakeEditorSource
@@ -45,7 +45,6 @@
* @return a List of {@link Editor}s of type E
*/
public List<E> create(int count, int index) {
- assert index >= 0;
List<E> toReturn = new ArrayList<E>(count);
for (int i = 0; i < count; i++) {
toReturn.add(create(index + i));
@@ -54,22 +53,6 @@
}
/**
- * Creates a temporary sub-Editor to use for traversal.
- * <p>
- * For backwards compatibility with GWT 2.5.0 and earlier, the default implementation calls
- * {@code create(0)} and {@link #dispose(Editor) disposes} the editor right away.
- *
- * @return an {@link Editor} of type E
- * @see ListEditor#createEditorForTraversal()
- * @see com.google.gwt.editor.client.EditorContext#traverseSyntheticCompositeEditor
- */
- public E createEditorForTraversal() {
- E toReturn = create(0);
- dispose(toReturn);
- return toReturn;
- }
-
- /**
* Called when an Editor no longer requires a sub-Editor. The default
* implementation is a no-op.
*
@@ -85,6 +68,5 @@
* @param index the index of the Editor
*/
public void setIndex(E editor, int index) {
- assert index >= 0;
}
}
\ No newline at end of file
diff --git a/user/src/com/google/gwt/editor/client/adapters/HasDataEditor.java b/user/src/com/google/gwt/editor/client/adapters/HasDataEditor.java
index a2a781f..f2bb40f 100644
--- a/user/src/com/google/gwt/editor/client/adapters/HasDataEditor.java
+++ b/user/src/com/google/gwt/editor/client/adapters/HasDataEditor.java
@@ -35,30 +35,21 @@
@Override
public IndexedEditor<T> create(int index) {
- assert index >= 0;
return new IndexedEditor<T>(index, data);
}
@Override
- public LeafValueEditor<T> createEditorForTraversal() {
- return new IndexedEditor<T>(-1, null);
- }
-
- @Override
public void dispose(LeafValueEditor<T> subEditor) {
- // We use a negative index as flag in createEditorForTraversal
- assert ((IndexedEditor<T>) subEditor).index >= 0;
data.setRowCount(data.getRowCount() - 1);
}
@Override
public void setIndex(LeafValueEditor<T> editor, int index) {
- assert index >= 0;
((IndexedEditor<T>) editor).setIndex(index);
}
}
- private static class IndexedEditor<Q> implements LeafValueEditor<Q> {
+ static class IndexedEditor<Q> implements LeafValueEditor<Q> {
private int index;
private Q value;
private final HasData<Q> data;
@@ -68,27 +59,22 @@
this.data = data;
}
- @Override
public Q getValue() {
return value;
}
- @Override
+ public void setIndex(int index) {
+ this.index = index;
+ push();
+ }
+
public void setValue(Q value) {
this.value = value;
push();
}
- void setIndex(int index) {
- assert index >= 0;
- this.index = index;
- push();
- }
-
private void push() {
- if (data != null) {
- data.setRowData(index, Collections.singletonList(value));
- }
+ data.setRowData(index, Collections.singletonList(value));
}
}
@@ -106,7 +92,7 @@
/**
* Prevent subclassing.
*/
- private HasDataEditor(HasData<T> data) {
+ HasDataEditor(HasData<T> data) {
super(new HasDataEditorSource<T>(data));
}
}
diff --git a/user/src/com/google/gwt/editor/client/adapters/ListEditor.java b/user/src/com/google/gwt/editor/client/adapters/ListEditor.java
index 0befca9..262ad66 100644
--- a/user/src/com/google/gwt/editor/client/adapters/ListEditor.java
+++ b/user/src/com/google/gwt/editor/client/adapters/ListEditor.java
@@ -66,7 +66,9 @@
* @return an {@link Editor} of type E
*/
public E createEditorForTraversal() {
- return editorSource.createEditorForTraversal();
+ E toReturn = editorSource.create(0);
+ editorSource.dispose(toReturn);
+ return toReturn;
}
public void flush() {
diff --git a/user/src/com/google/gwt/editor/client/impl/ErrorCollector.java b/user/src/com/google/gwt/editor/client/impl/ErrorCollector.java
index 742e180..a51c62a 100644
--- a/user/src/com/google/gwt/editor/client/impl/ErrorCollector.java
+++ b/user/src/com/google/gwt/editor/client/impl/ErrorCollector.java
@@ -1,12 +1,12 @@
/*
* Copyright 2011 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
@@ -57,14 +57,10 @@
// Get the enclosing error domain
List<EditorError> tryConsume = errorStack.pop();
int prefixLength = ctx.getAbsolutePath().length();
+ // Remove trailing dot in non-empty paths
+ prefixLength = prefixLength == 0 ? 0 : prefixLength + 1;
for (EditorError error : tryConsume) {
- if ((prefixLength > 0) && (prefixLength < error.getAbsolutePath().length())) {
- // Remove trailing dot
- ((SimpleError) error).setPathPrefixLength(prefixLength + 1);
- } else {
- assert prefixLength == 0 || error.getAbsolutePath().equals(ctx.getAbsolutePath());
- ((SimpleError) error).setPathPrefixLength(prefixLength);
- }
+ ((SimpleError) error).setPathPrefixLength(prefixLength);
}
/*
* Pass collected errors to the editor. Must pass empty error collection
diff --git a/user/src/com/google/gwt/editor/client/testing/FakeEditorSource.java b/user/src/com/google/gwt/editor/client/testing/FakeEditorSource.java
index 5deff76..073aec3 100644
--- a/user/src/com/google/gwt/editor/client/testing/FakeEditorSource.java
+++ b/user/src/com/google/gwt/editor/client/testing/FakeEditorSource.java
@@ -48,11 +48,6 @@
}
@Override
- public FakeLeafValueEditor<T> createEditorForTraversal() {
- return new FakeLeafValueEditor<T>();
- }
-
- @Override
public void dispose(FakeLeafValueEditor<T> subEditor) {
lastKnownPosition.put(subEditor, DISPOSED);
}
diff --git a/user/src/com/google/gwt/editor/rebind/AbstractEditorDriverGenerator.java b/user/src/com/google/gwt/editor/rebind/AbstractEditorDriverGenerator.java
index 1cf0be9..4039f3cf 100644
--- a/user/src/com/google/gwt/editor/rebind/AbstractEditorDriverGenerator.java
+++ b/user/src/com/google/gwt/editor/rebind/AbstractEditorDriverGenerator.java
@@ -260,7 +260,7 @@
+ editedSourceName + ">");
SourceWriter sw = f.createSourceWriter(context, pw);
- String parentSourceName = parent.getEditedType().getParameterizedQualifiedSourceName();
+ String parentSourceName = parent.getEditedType().getQualifiedSourceName();
sw.println("private final %s parent;", parentSourceName);
sw.println("public %s(%s parent, %s<%s> editor, String path) {",
diff --git a/user/src/com/google/gwt/event/dom/client/HandlesAllTouchEvents.java b/user/src/com/google/gwt/event/dom/client/HandlesAllTouchEvents.java
index c183fe2..1c8ea00 100644
--- a/user/src/com/google/gwt/event/dom/client/HandlesAllTouchEvents.java
+++ b/user/src/com/google/gwt/event/dom/client/HandlesAllTouchEvents.java
@@ -17,10 +17,10 @@
package com.google.gwt.event.dom.client;
/**
- * Receiver used to handle all touch events at once.
+ * Receiver used to handle all mouse events at once.
*
* WARNING, PLEASE READ: As this class is intended for developers who wish to
- * handle all touch events in GWT, new touch handler interfaces will be added to
+ * handle all mouse events in GWT, new mouse handler interfaces will be added to
* it. Therefore, updates to GWT could cause breaking API changes.
*
*/
diff --git a/user/src/com/google/gwt/event/shared/testing/CountingEventBus.java b/user/src/com/google/gwt/event/shared/testing/CountingEventBus.java
index bf102ab..b0aa76b 100644
--- a/user/src/com/google/gwt/event/shared/testing/CountingEventBus.java
+++ b/user/src/com/google/gwt/event/shared/testing/CountingEventBus.java
@@ -76,27 +76,7 @@
castFireEventFromSource(event, source);
}
- /**
- * How many handlers are registered for the given {@code type}.
- *
- * @deprecated Please use {@code getHandlerCount}.
- */
public int getCount(GwtEvent.Type<?> type) {
return real.getCount(type);
}
-
- /**
- * How many events have fired for the given {@code type}. These events may not have been
- * passed to any handlers.
- */
- public int getFiredCount(Type<?> type) {
- return real.getFiredCount(type);
- }
-
- /**
- * How many handlers are registered for the given {@code type}.
- */
- public int getHandlerCount(Type<?> type) {
- return real.getHandlerCount(type);
- }
}
diff --git a/user/src/com/google/gwt/http/HTTP.gwt.xml b/user/src/com/google/gwt/http/HTTP.gwt.xml
index 4d2da5b..c212dd4 100644
--- a/user/src/com/google/gwt/http/HTTP.gwt.xml
+++ b/user/src/com/google/gwt/http/HTTP.gwt.xml
@@ -24,13 +24,4 @@
<!-- Inheriting User module for Window and Timer. These should be factored
out of User soon. -->
<inherits name="com.google.gwt.user.User"/>
-
- <replace-with class="com.google.gwt.http.client.Request.RequestImplIE6To9">
- <when-type-is class="com.google.gwt.http.client.Request.RequestImpl" />
- <any>
- <when-property-is name="user.agent" value="ie6" />
- <when-property-is name="user.agent" value="ie8" />
- <when-property-is name="user.agent" value="ie9" />
- </any>
- </replace-with>
</module>
diff --git a/user/src/com/google/gwt/http/client/Request.java b/user/src/com/google/gwt/http/client/Request.java
index 12608c5..212b13f 100644
--- a/user/src/com/google/gwt/http/client/Request.java
+++ b/user/src/com/google/gwt/http/client/Request.java
@@ -15,7 +15,6 @@
*/
package com.google.gwt.http.client;
-import com.google.gwt.core.shared.GWT;
import com.google.gwt.user.client.Timer;
import com.google.gwt.xhr.client.XMLHttpRequest;
@@ -33,63 +32,6 @@
public class Request {
/**
- * Native implementation associated with {@link Request}. User classes should not use this class
- * directly.
- */
- static class RequestImpl {
-
- /**
- * Creates a {@link Response} instance for the given JavaScript XmlHttpRequest object.
- *
- * @param xmlHttpRequest xmlHttpRequest object for which we need a response
- * @return a {@link Response} object instance
- */
- Response createResponse(final XMLHttpRequest xmlHttpRequest) {
- return new ResponseImpl(xmlHttpRequest);
- }
- }
-
- /**
- * Special {@link RequestImpl} for IE6-9 to work around some IE specialities.
- */
- static class RequestImplIE6To9 extends RequestImpl {
-
- @Override
- Response createResponse(XMLHttpRequest xmlHttpRequest) {
- return new ResponseImpl(xmlHttpRequest) {
-
- @Override
- public int getStatusCode() {
- /*
- * http://code.google.com/p/google-web-toolkit/issues/detail?id=5031
- *
- * The XMLHTTPRequest object in IE will return a status code of 1223 and drop some
- * response headers if the server returns a HTTP/204.
- *
- * This issue is fixed in IE10.
- */
- int statusCode = super.getStatusCode();
- return (statusCode == 1223) ? SC_NO_CONTENT : statusCode;
- }
- };
- }
- }
-
- /*
- * Although Request is a client-side class, it's a transitive dependency of
- * some GWT servlet code. Because GWT.create() isn't safe to call on the
- * server, we use the "Initialization On Demand Holder" idiom to lazily
- * initialize the RequestImpl.
- */
- private static class ImplHolder {
- private static final RequestImpl impl = GWT.create(RequestImpl.class);
-
- public static RequestImpl get() {
- return impl;
- }
- }
-
- /**
* Creates a {@link Response} instance for the given JavaScript XmlHttpRequest
* object.
*
@@ -97,7 +39,94 @@
* @return a {@link Response} object instance
*/
private static Response createResponse(final XMLHttpRequest xmlHttpRequest) {
- return ImplHolder.get().createResponse(xmlHttpRequest);
+ assert (isResponseReady(xmlHttpRequest));
+ Response response = new Response() {
+ @Override
+ public String getHeader(String header) {
+ StringValidator.throwIfEmptyOrNull("header", header);
+
+ return xmlHttpRequest.getResponseHeader(header);
+ }
+
+ @Override
+ public Header[] getHeaders() {
+ return Request.getHeaders(xmlHttpRequest);
+ }
+
+ @Override
+ public String getHeadersAsString() {
+ return xmlHttpRequest.getAllResponseHeaders();
+ }
+
+ @Override
+ public int getStatusCode() {
+ return xmlHttpRequest.getStatus();
+ }
+
+ @Override
+ public String getStatusText() {
+ return xmlHttpRequest.getStatusText();
+ }
+
+ @Override
+ public String getText() {
+ return xmlHttpRequest.getResponseText();
+ }
+ };
+ return response;
+ }
+
+ /**
+ * Returns an array of headers built by parsing the string of headers returned
+ * by the JavaScript <code>XmlHttpRequest</code> object.
+ *
+ * @param xmlHttpRequest
+ * @return array of Header items
+ */
+ private static Header[] getHeaders(XMLHttpRequest xmlHttp) {
+ String allHeaders = xmlHttp.getAllResponseHeaders();
+ String[] unparsedHeaders = allHeaders.split("\n");
+ Header[] parsedHeaders = new Header[unparsedHeaders.length];
+
+ for (int i = 0, n = unparsedHeaders.length; i < n; ++i) {
+ String unparsedHeader = unparsedHeaders[i];
+
+ if (unparsedHeader.length() == 0) {
+ continue;
+ }
+
+ int endOfNameIdx = unparsedHeader.indexOf(':');
+ if (endOfNameIdx < 0) {
+ continue;
+ }
+
+ final String name = unparsedHeader.substring(0, endOfNameIdx).trim();
+ final String value = unparsedHeader.substring(endOfNameIdx + 1).trim();
+ Header header = new Header() {
+ @Override
+ public String getName() {
+ return name;
+ }
+
+ @Override
+ public String getValue() {
+ return value;
+ }
+
+ @Override
+ public String toString() {
+ return name + " : " + value;
+ }
+ };
+
+ parsedHeaders[i] = header;
+ }
+
+ return parsedHeaders;
+ }
+
+ private static boolean isResponseReady(XMLHttpRequest xhr) {
+ return xhr.getReadyState() == XMLHttpRequest.DONE;
}
/**
diff --git a/user/src/com/google/gwt/http/client/RequestBuilder.java b/user/src/com/google/gwt/http/client/RequestBuilder.java
index 3168a8d..27685cd 100644
--- a/user/src/com/google/gwt/http/client/RequestBuilder.java
+++ b/user/src/com/google/gwt/http/client/RequestBuilder.java
@@ -91,11 +91,6 @@
private final String httpMethod;
/**
- * Whether to include credentials for a Cross Origin Request.
- */
- private boolean includeCredentials;
-
- /**
* Password to use when opening a JavaScript XmlHttpRequest object.
*/
private String password;
@@ -360,15 +355,6 @@
}
/**
- * Sets whether the cross origin request will include credentials.
- *
- * @param withCredentials whether to include credentials in XHR
- */
- public void setIncludeCredentials(boolean includeCredentials) {
- this.includeCredentials = includeCredentials;
- }
-
- /**
* Sends an HTTP request based on the current builder configuration. If no
* request headers have been set, the header "Content-Type" will be used with
* a value of "text/plain; charset=utf-8".
@@ -398,9 +384,6 @@
}
setHeaders(xmlHttpRequest);
- if (includeCredentials) {
- xmlHttpRequest.setWithCredentials(true);
- }
final Request request = new Request(xmlHttpRequest, timeoutMillis, callback);
diff --git a/user/src/com/google/gwt/http/client/ResponseImpl.java b/user/src/com/google/gwt/http/client/ResponseImpl.java
deleted file mode 100644
index 8927aef..0000000
--- a/user/src/com/google/gwt/http/client/ResponseImpl.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright 2008 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.http.client;
-
-import com.google.gwt.xhr.client.XMLHttpRequest;
-
-/**
- * A {@link Response} implementation based on a {@link XMLHttpRequest}.
- */
-class ResponseImpl extends Response {
-
- private final XMLHttpRequest xmlHttpRequest;
-
- public ResponseImpl(XMLHttpRequest xmlHttpRequest) {
- this.xmlHttpRequest = xmlHttpRequest;
-
- assert isResponseReady();
- }
-
- @Override
- public String getHeader(String header) {
- StringValidator.throwIfEmptyOrNull("header", header);
-
- return xmlHttpRequest.getResponseHeader(header);
- }
-
- @Override
- public Header[] getHeaders() {
- String allHeaders = xmlHttpRequest.getAllResponseHeaders();
- String[] unparsedHeaders = allHeaders.split("\n");
- Header[] parsedHeaders = new Header[unparsedHeaders.length];
-
- for (int i = 0, n = unparsedHeaders.length; i < n; ++i) {
- String unparsedHeader = unparsedHeaders[i];
-
- if (unparsedHeader.length() == 0) {
- continue;
- }
-
- int endOfNameIdx = unparsedHeader.indexOf(':');
- if (endOfNameIdx < 0) {
- continue;
- }
-
- final String name = unparsedHeader.substring(0, endOfNameIdx).trim();
- final String value = unparsedHeader.substring(endOfNameIdx + 1).trim();
- Header header = new Header() {
- @Override
- public String getName() {
- return name;
- }
-
- @Override
- public String getValue() {
- return value;
- }
-
- @Override
- public String toString() {
- return name + " : " + value;
- }
- };
-
- parsedHeaders[i] = header;
- }
-
- return parsedHeaders;
- }
-
- @Override
- public String getHeadersAsString() {
- return xmlHttpRequest.getAllResponseHeaders();
- }
-
- @Override
- public int getStatusCode() {
- return xmlHttpRequest.getStatus();
- }
-
- @Override
- public String getStatusText() {
- return xmlHttpRequest.getStatusText();
- }
-
- @Override
- public String getText() {
- return xmlHttpRequest.getResponseText();
- }
-
- private boolean isResponseReady() {
- return xmlHttpRequest.getReadyState() == XMLHttpRequest.DONE;
- }
-}
diff --git a/user/src/com/google/gwt/i18n/client/Messages.java b/user/src/com/google/gwt/i18n/client/Messages.java
index 22d93a1..d442349 100644
--- a/user/src/com/google/gwt/i18n/client/Messages.java
+++ b/user/src/com/google/gwt/i18n/client/Messages.java
@@ -129,17 +129,17 @@
* @DefaultLocale("en_US")
* public interface MyMessages extends Messages {
* @Key("1234")
- * @DefaultMessage("This is a plain string.")
+ * @DefaultText("This is a plain string.")
* String oneTwoThreeFour();
*
- * @DefaultMessage("You have {0} widgets")
+ * @DefaultText("You have {0} widgets")
* @PluralText({"one", "You have one widget")
* String widgetCount(@PluralCount int count);
*
- * @DefaultMessage("No reference to the argument")
+ * @DefaultText("No reference to the argument")
* String optionalArg(@Optional String ignored);
*
- * @DefaultMessage("Your cart total is {0,number,currency}")
+ * @DefaultText("Your cart total is {0,number,currency}")
* @Description("The total value of the items in the shopping cart in local currency")
* String totalAmount(@Example("$5.00") double amount);
*
diff --git a/user/src/com/google/gwt/i18n/client/TimeZoneInfo.java b/user/src/com/google/gwt/i18n/client/TimeZoneInfo.java
index 60d85e3..a0ab0a3 100644
--- a/user/src/com/google/gwt/i18n/client/TimeZoneInfo.java
+++ b/user/src/com/google/gwt/i18n/client/TimeZoneInfo.java
@@ -19,7 +19,6 @@
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.core.client.JsArrayInteger;
import com.google.gwt.core.client.JsArrayString;
-import com.google.gwt.core.client.JsonUtils;
/**
* A JavaScript Overlay type on top of the JSON data describing everything we
@@ -39,9 +38,13 @@
* @return a TimeZoneInfo object made from the supplied JSON.
*/
public static TimeZoneInfo buildTimeZoneData(String json) {
- return JsonUtils.safeEval(json);
+ return (TimeZoneInfo) eval(json);
}
+ private static native JavaScriptObject eval(String json) /*-{
+ return eval("(" + json + ")");
+ }-*/;
+
protected TimeZoneInfo() { }
public final native String getID() /*-{ return this.id; }-*/;
diff --git a/user/src/com/google/gwt/i18n/client/constants/CurrencyExtra.properties b/user/src/com/google/gwt/i18n/client/constants/CurrencyExtra.properties
index 6b5547f..35c09a4 100644
--- a/user/src/com/google/gwt/i18n/client/constants/CurrencyExtra.properties
+++ b/user/src/com/google/gwt/i18n/client/constants/CurrencyExtra.properties
@@ -151,7 +151,7 @@
QAR = |||Rial
RON = |||RON
RSD = |||din
-RUB = руб.|||руб.
+RUB = руб|||Rup
RWF = |||RF
SAR = SR|||Rial
SBD = |||$
diff --git a/user/src/com/google/gwt/i18n/client/impl/plurals/DefaultRule_1_paucal_n.java b/user/src/com/google/gwt/i18n/client/impl/plurals/DefaultRule_1_paucal_n.java
index 8bb77b7..7f43656 100644
--- a/user/src/com/google/gwt/i18n/client/impl/plurals/DefaultRule_1_paucal_n.java
+++ b/user/src/com/google/gwt/i18n/client/impl/plurals/DefaultRule_1_paucal_n.java
@@ -19,13 +19,8 @@
import com.google.gwt.i18n.client.PluralRule.PluralForm;
/**
- * Common plural rule for languages that have singular, two plural forms
- * (based on the units and tens digits) and a fractional form ("other").
- *
- * Polish is the only language that uses this plural rule.
- *
- * Note: Perhaps this class should have been named: DefaultRule_1_x234_n
- *
+ * Common plural rule for languages that have 1, few, and other forms.
+ *
* @see DefaultRule_0_1_2_n
* @see DefaultRule_0_1_n
* @see DefaultRule_01_n
@@ -40,18 +35,16 @@
return new PluralForm[] {
new PluralForm("other", "Default plural form"),
new PluralForm("one", "Count is 1"),
- new PluralForm("few", "Count ends in 2-4 but not 12-14"),
- new PluralForm("many", "Count is not 1 and does not end in 2-4 except 12-14"),
+ new PluralForm("paucal", "Count ends in 2-4 but not 12-14 or 22-24"),
};
}
public static int select(int n) {
/*
- * This method will only return a 1, 2, or 3 ("one", "few", or "many").
- * This method will never return 0 because "other" is the fractional form.
+ * For Polish, numbers that end in 2-4, except 12-14 and 22-24, have a special plural form.
*/
return n == 1 ? 1
- : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 > 20) ? 2
- : 3;
+ : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 > 29) ? 2
+ : 0;
}
}
diff --git a/user/src/com/google/gwt/i18n/rebind/AnnotationsResource.java b/user/src/com/google/gwt/i18n/rebind/AnnotationsResource.java
index 90ee633..8fde38c 100644
--- a/user/src/com/google/gwt/i18n/rebind/AnnotationsResource.java
+++ b/user/src/com/google/gwt/i18n/rebind/AnnotationsResource.java
@@ -335,7 +335,7 @@
if (!isConstants) {
if (constantsCount > 0) {
throw new AnnotationsError(
- "@Default*Value is not permitted on a Messages interface; see @DefaultMessage");
+ "@Default*Value is not permitted on a Messages interface; see @DefaultText");
}
if (defaultText != null) {
return defaultText.value();
@@ -343,7 +343,7 @@
} else {
if (defaultText != null) {
throw new AnnotationsError(
- "@DefaultMessage is not permitted on a Constants interface; see @Default*Value");
+ "@DefaultText is not permitted on a Constants interface; see @Default*Value");
}
if (constantsCount > 1) {
throw new AnnotationsError(
diff --git a/user/src/com/google/gwt/i18n/shared/DateTimeFormat.java b/user/src/com/google/gwt/i18n/shared/DateTimeFormat.java
index 471314d..7996850 100644
--- a/user/src/com/google/gwt/i18n/shared/DateTimeFormat.java
+++ b/user/src/com/google/gwt/i18n/shared/DateTimeFormat.java
@@ -1473,7 +1473,7 @@
if (part.count > 0) {
if (abutPat < 0 && part.abutStart) {
abutPat = i;
- abutStart = parsePos[0];
+ abutStart = start;
abutPass = 0;
}
diff --git a/user/src/com/google/gwt/junit/client/impl/JUnitHost.java b/user/src/com/google/gwt/junit/client/impl/JUnitHost.java
index 9d82121..711b6da 100644
--- a/user/src/com/google/gwt/junit/client/impl/JUnitHost.java
+++ b/user/src/com/google/gwt/junit/client/impl/JUnitHost.java
@@ -146,22 +146,13 @@
public boolean equals(Object o) {
if (o instanceof TestInfo) {
TestInfo other = (TestInfo) o;
- return equals(testModule, other.testModule)
- && equals(testClass, other.testClass)
- && equals(testMethod, other.testMethod);
+ return getTestModule().equals(other.getTestModule())
+ && getTestClass().equals(other.getTestClass())
+ && getTestMethod().equals(other.getTestMethod());
}
return false;
}
- /*
- * Helper method for TestInfo.equals.
- *
- * TODO: Replace with Objects.equals() once we can rely on JDK7.
- */
- private static boolean equals(Object a, Object b) {
- return a == null ? b == null : a.equals(b);
- }
-
public String getTestClass() {
return testClass;
}
diff --git a/user/src/com/google/gwt/junit/public/junit-standards.html b/user/src/com/google/gwt/junit/public/junit-standards.html
index 0d6fe07..490ee0c 100644
--- a/user/src/com/google/gwt/junit/public/junit-standards.html
+++ b/user/src/com/google/gwt/junit/public/junit-standards.html
@@ -47,12 +47,12 @@
}
function loadSelectionScript() {
- var moduleName = location.pathname;
+ var moduleName = document.location.href;
var pos = moduleName.lastIndexOf('/');
moduleName = moduleName.substr(0, pos);
pos = moduleName.lastIndexOf('/');
moduleName = moduleName.substr(pos + 1);
- document.write('<script language="javascript" src="' + encodeURIComponent(moduleName) + '.nocache.js"><\/script>');
+ document.write("<script language='javascript' src='" + moduleName + ".nocache.js'><\/script>");
}
loadSelectionScript();
-->
diff --git a/user/src/com/google/gwt/junit/public/junit.html b/user/src/com/google/gwt/junit/public/junit.html
index e58ebce..efb2d26 100644
--- a/user/src/com/google/gwt/junit/public/junit.html
+++ b/user/src/com/google/gwt/junit/public/junit.html
@@ -45,12 +45,12 @@
}
function loadSelectionScript() {
- var moduleName = location.pathname;
+ var moduleName = document.location.href;
var pos = moduleName.lastIndexOf('/');
moduleName = moduleName.substr(0, pos);
pos = moduleName.lastIndexOf('/');
moduleName = moduleName.substr(pos + 1);
- document.write('<script language="javascript" src="' + encodeURIComponent(moduleName) + '.nocache.js"><\/script>');
+ document.write("<script language='javascript' src='" + moduleName + ".nocache.js'></script>");
}
loadSelectionScript();
-->
diff --git a/user/src/com/google/gwt/layout/client/LayoutImpl.java b/user/src/com/google/gwt/layout/client/LayoutImpl.java
index 1118a38..9816333 100644
--- a/user/src/com/google/gwt/layout/client/LayoutImpl.java
+++ b/user/src/com/google/gwt/layout/client/LayoutImpl.java
@@ -28,7 +28,6 @@
import com.google.gwt.dom.client.Style.Overflow;
import com.google.gwt.dom.client.Style.Position;
import com.google.gwt.dom.client.Style.Unit;
-import com.google.gwt.dom.client.Style.Visibility;
import com.google.gwt.layout.client.Layout.Layer;
/**
@@ -65,7 +64,6 @@
style.setWidth(10, widthUnit);
style.setHeight(10, heightUnit);
- style.setVisibility(Visibility.HIDDEN);
State.HIDDEN.set(ruler, true);
return ruler;
}
diff --git a/user/src/com/google/gwt/logging/server/StackTraceDeobfuscator.java b/user/src/com/google/gwt/logging/server/StackTraceDeobfuscator.java
index 59bef01..e82e963 100644
--- a/user/src/com/google/gwt/logging/server/StackTraceDeobfuscator.java
+++ b/user/src/com/google/gwt/logging/server/StackTraceDeobfuscator.java
@@ -27,11 +27,8 @@
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
-import java.util.HashSet;
import java.util.Map;
import java.util.Scanner;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
import java.util.logging.LogRecord;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -52,109 +49,39 @@
*/
public class StackTraceDeobfuscator {
- /**
- * A cache that maps obfuscated symbols to arbitrary non-null string values.
- * The cache can assume each (strongName, symbol) pair always maps to the
- * same value (never goes invalid), but must treat data as an opaque string.
- */
- private static class SymbolCache {
- // TODO(srogoff): This SymbolCache implementation never drops old entries. If clients ever need
- // to cap memory usage even with lazy loading, consider making SymbolCache an interface.
- // This could allow clients to pass their own implementation to the StackTraceDeobfuscator
- // constructor, backed by a Guava Cache or other entry-evicting mapping.
-
- private final ConcurrentHashMap<String, HashMap<String, String>> symbolMaps;
-
- SymbolCache() {
- symbolMaps = new ConcurrentHashMap<String, HashMap<String, String>>();
- }
-
- /**
- * Adds some symbol data to the cache for the given strong name.
- */
- void putAll(String strongName, Map<String, String> symbolMap) {
- if (strongName == null || symbolMap.size() == 0) {
- return;
- }
- symbolMaps.putIfAbsent(strongName, new HashMap<String, String>());
- HashMap<String, String> existingMap = symbolMaps.get(strongName);
- synchronized (existingMap) {
- existingMap.putAll(symbolMap);
- }
- }
-
- /**
- * Returns the data for each of the specified symbols that's currently cached for the
- * given strong name. There will be no entry for symbols that are not in the cache.
- * If none of the symbols are cached, an empty Map is returned.
- */
- Map<String, String> getAll(String strongName, Set<String> symbols) {
- Map<String, String> toReturn = new HashMap<String, String>();
- if (strongName == null || !symbolMaps.containsKey(strongName) || symbols.isEmpty()) {
- return toReturn;
- }
- HashMap<String, String> existingMap = symbolMaps.get(strongName);
- synchronized (existingMap) {
- for (String symbol : symbols) {
- if (existingMap.containsKey(symbol)) {
- toReturn.put(symbol, existingMap.get(symbol));
- }
- }
- }
- return toReturn;
- }
+ private static class SymbolMap extends HashMap<String, String> {
}
// From JsniRef class, which is in gwt-dev and so can't be accessed here
// TODO(unnurg) once there is a place for shared code, move this to there.
- private static final Pattern JsniRefPattern =
+ private static Pattern JsniRefPattern =
Pattern.compile("@?([^:]+)::([^(]+)(\\((.*)\\))?");
// The javadoc for StackTraceElement.getLineNumber() says it returns -1 when
// the line number is unavailable
private static final int LINE_NUMBER_UNKNOWN = -1;
- // Data to store in the symbol cache if no symbol data can be found on disk.
- private static final String SYMBOL_DATA_UNKNOWN = "";
-
- final Pattern fragmentIdPattern = Pattern.compile(".*(\\d+)\\.js");
-
- private final boolean lazyLoad;
+ Pattern fragmentIdPattern = Pattern.compile(".*(\\d+)\\.js");
protected File symbolMapsDirectory;
// Map of strongName + fragmentId to sourceMap
- private final Map<String, SourceMapping> sourceMaps =
+ private Map<String, SourceMapping> sourceMaps =
new HashMap<String, SourceMapping>();
- private final SymbolCache symbolCache = new SymbolCache();
+ private Map<String, SymbolMap> symbolMaps =
+ new HashMap<String, SymbolMap>();
/**
- * Creates a deobfuscator that loads symbol map files from the given directory. Symbol maps are
+ * Constructor, which takes a <code>symbolMaps</code> directory as its argument. Symbol maps are
* generated into the location specified by the GWT compiler <code>-deploy</code> command line
* argument.
*
- * @param symbolMapsDirectory the <code>symbolMaps</code> directory, with or without trailing
+ * @param symbolMapsDirectory the <code>symbolMaps</code> directory with, or without trailing
* directory separator character
*/
public StackTraceDeobfuscator(String symbolMapsDirectory) {
setSymbolMapsDirectory(symbolMapsDirectory);
- this.lazyLoad = false;
- }
-
- /**
- * Creates a deobfuscator that loads symbol map files from the given directory. Symbol maps are
- * generated into the location specified by the GWT compiler <code>-deploy</code> command line
- * argument.
- *
- * @param symbolMapsDirectory the <code>symbolMaps</code> directory, with or without trailing
- * directory separator character
- * @param lazyLoad if true, only symbols requested to be deobfuscated are cached. This provides
- * a large memory savings at the expense of occasional extra disk reads.
- */
- public StackTraceDeobfuscator(String symbolMapsDirectory, boolean lazyLoad) {
- setSymbolMapsDirectory(symbolMapsDirectory);
- this.lazyLoad = lazyLoad;
}
/**
@@ -180,13 +107,6 @@
*/
public StackTraceElement[] deobfuscateStackTrace(
StackTraceElement[] st, String strongName) {
- // Warm the symbol cache for all symbols in this stack trace.
- Set<String> requiredSymbols = new HashSet<String>();
- for (StackTraceElement ste : st) {
- requiredSymbols.add(ste.getMethodName());
- }
- loadSymbolMap(strongName, requiredSymbols);
-
StackTraceElement[] newSt = new StackTraceElement[st.length];
for (int i = 0; i < st.length; i++) {
newSt[i] = resymbolize(st[i], strongName);
@@ -194,21 +114,8 @@
return newSt;
}
- public Throwable deobfuscateThrowable(Throwable old, String strongName) {
- Throwable t = new Throwable(old.getMessage());
- if (old.getStackTrace() != null) {
- t.setStackTrace(deobfuscateStackTrace(old.getStackTrace(), strongName));
- } else {
- t.setStackTrace(new StackTraceElement[0]);
- }
- if (old.getCause() != null) {
- t.initCause(deobfuscateThrowable(old.getCause(), strongName));
- }
- return t;
- }
-
/**
- * Best effort resymbolization of a single stack trace element.
+ * Best effort resymbolization of a a single stack trace element.
*
* @param ste the stack trace element to resymbolize
* @param strongName the GWT permutation strong name
@@ -223,7 +130,8 @@
int fragmentId = -1;
String steFilename = ste.getFileName();
- String symbolData = loadOneSymbol(strongName, ste.getMethodName());
+ SymbolMap map = loadSymbolMap(strongName);
+ String symbolData = map == null ? null : map.get(ste.getMethodName());
boolean sourceMapCapable = false;
@@ -242,7 +150,7 @@
}
// first use symbolMap, then refine via sourceMap if possible
- if (!symbolData.isEmpty()) {
+ if (symbolData != null) {
// jsniIdent, className, memberName, sourceUri, sourceLine, fragmentId
String[] parts = symbolData.split(",");
if (parts.length == 6) {
@@ -350,6 +258,19 @@
return new FileInputStream(filename);
}
+ private Throwable deobfuscateThrowable(Throwable old, String strongName) {
+ Throwable t = new Throwable(old.getMessage());
+ if (old.getStackTrace() != null) {
+ t.setStackTrace(deobfuscateStackTrace(old.getStackTrace(), strongName));
+ } else {
+ t.setStackTrace(new StackTraceElement[0]);
+ }
+ if (old.getCause() != null) {
+ t.initCause(deobfuscateThrowable(old.getCause(), strongName));
+ }
+ return t;
+ }
+
private SourceMapping loadSourceMap(String permutationStrongName, int fragmentId) {
SourceMapping toReturn = sourceMaps.get(permutationStrongName + fragmentId);
if (toReturn == null) {
@@ -368,60 +289,36 @@
return new Scanner(stream).useDelimiter("\\A").next();
}
- private String loadOneSymbol(String strongName, String symbol) {
- Set<String> symbolSet = new HashSet<String>();
- symbolSet.add(symbol);
- Map<String, String> symbolMap = loadSymbolMap(strongName, symbolSet);
- return symbolMap.get(symbol);
- }
-
- /**
- * Returns a symbol map for the given strong name containing symbol data for
- * all of the given required symbols. First checks the symbol cache, then
- * reads from disk if any symbol is missing. If a symbol cannot be loaded for
- * some reason, it will be mapped to empty string.
- */
- private Map<String, String> loadSymbolMap(
- String strongName, Set<String> requiredSymbols) {
- Map<String, String> toReturn = symbolCache.getAll(strongName, requiredSymbols);
- if (toReturn.size() == requiredSymbols.size()) {
+ private SymbolMap loadSymbolMap(
+ String strongName) {
+ SymbolMap toReturn = symbolMaps.get(strongName);
+ if (toReturn != null) {
return toReturn;
}
-
- Set<String> symbolsLeftToFind = new HashSet<String>(requiredSymbols);
- toReturn = new HashMap<String, String>();
+ toReturn = new SymbolMap();
String line;
try {
BufferedReader bin = new BufferedReader(
new InputStreamReader(getSymbolMapInputStream(strongName)));
try {
- while ((line = bin.readLine()) != null && (symbolsLeftToFind.size() > 0 || !lazyLoad)) {
+ while ((line = bin.readLine()) != null) {
if (line.charAt(0) == '#') {
continue;
}
int idx = line.indexOf(',');
- String symbol = line.substring(0, idx);
- String symbolData = line.substring(idx + 1);
- if (requiredSymbols.contains(symbol) || !lazyLoad) {
- symbolsLeftToFind.remove(symbol);
- toReturn.put(symbol, symbolData);
- }
+ toReturn.put(new String(line.substring(0, idx)),
+ line.substring(idx + 1));
}
} finally {
bin.close();
}
} catch (IOException e) {
- // If the symbol map isn't found or there's an I/O error reading the file, the returned
- // mapping may contain some or all empty data (see below).
- }
- for (String symbol : symbolsLeftToFind) {
- // Store the empty string in the symbolCache to show we actually looked on disk and couldn't
- // find the symbols. This avoids reading disk repeatedly for symbols that can't be translated.
- toReturn.put(symbol, SYMBOL_DATA_UNKNOWN);
+ // use empty symbol map to avoid repeated lookups
+ toReturn = new SymbolMap();
}
- symbolCache.putAll(strongName, toReturn);
+ symbolMaps.put(strongName, toReturn);
return toReturn;
}
diff --git a/user/src/com/google/gwt/resources/css/CssGenerationVisitor.java b/user/src/com/google/gwt/resources/css/CssGenerationVisitor.java
index cc3065a..da35a2d 100644
--- a/user/src/com/google/gwt/resources/css/CssGenerationVisitor.java
+++ b/user/src/com/google/gwt/resources/css/CssGenerationVisitor.java
@@ -185,16 +185,9 @@
@Override
public boolean visit(CssMediaRule x, Context ctx) {
- out.print("@media");
- boolean isFirst = true;
+ out.print("@MEDIA");
for (String m : x.getMedias()) {
- if (isFirst) {
- out.print(" ");
- isFirst = false;
- } else {
- comma();
- }
- out.print(m);
+ out.print(" " + m);
}
spaceOpt();
out.print("{");
diff --git a/user/src/com/google/gwt/resources/css/ast/CssNodeCloner.java b/user/src/com/google/gwt/resources/css/ast/CssNodeCloner.java
index 1620fe7..bffbd36 100644
--- a/user/src/com/google/gwt/resources/css/ast/CssNodeCloner.java
+++ b/user/src/com/google/gwt/resources/css/ast/CssNodeCloner.java
@@ -180,7 +180,7 @@
@Override
public boolean visit(CssMediaRule x, Context ctx) {
CssMediaRule newRule = new CssMediaRule();
- newRule.getMedias().addAll(x.getMedias());
+ newRule.getMedias().addAll(newRule.getMedias());
pushNodes(newRule);
return true;
diff --git a/user/src/com/google/gwt/resources/ext/ResourceGeneratorUtil.java b/user/src/com/google/gwt/resources/ext/ResourceGeneratorUtil.java
index 59007b5..3d3442a 100644
--- a/user/src/com/google/gwt/resources/ext/ResourceGeneratorUtil.java
+++ b/user/src/com/google/gwt/resources/ext/ResourceGeneratorUtil.java
@@ -498,7 +498,7 @@
if (resourceURL == null) {
error = true;
logger.log(TreeLogger.ERROR, "Resource " + resource
- + " not found. Is the name specified as ClassLoader.getResource()"
+ + " not found. Is the name specified as Class.getResource()"
+ " would expect?");
}
diff --git a/user/src/com/google/gwt/resources/rg/CssObfuscationStyle.java b/user/src/com/google/gwt/resources/rg/CssObfuscationStyle.java
index d46fe93..fc582ae 100644
--- a/user/src/com/google/gwt/resources/rg/CssObfuscationStyle.java
+++ b/user/src/com/google/gwt/resources/rg/CssObfuscationStyle.java
@@ -23,7 +23,6 @@
*/
public enum CssObfuscationStyle {
VERBOSE (true, false, true, true),
- DEBUG (true, false, true, false),
STABLE_FULL_CLASSNAME (true, true, true, true),
STABLE_SHORT_CLASSNAME (true, true, true, false),
STABLE_NO_CLASSNAME (true, true, false, false),
@@ -32,8 +31,6 @@
static CssObfuscationStyle getObfuscationStyle(String name) {
if (name.equalsIgnoreCase("pretty")) {
return VERBOSE;
- } else if (name.equalsIgnoreCase("debug")) {
- return DEBUG;
} else if (name.equalsIgnoreCase("stable")) {
return STABLE_FULL_CLASSNAME;
} else if (name.equalsIgnoreCase("stable-shorttype")) {
@@ -71,9 +68,9 @@
*/
if (showClassName) {
if (showPackageName) {
- toReturn = getPrettyCssClass(type.getQualifiedSourceName(), toReturn);
+ toReturn = type.getQualifiedSourceName().replaceAll("[.$]", "-") + "-" + toReturn;
} else {
- toReturn = getPrettyCssClass(type.getName(), toReturn);
+ toReturn = type.getName() + "-" + toReturn;
}
}
@@ -91,8 +88,4 @@
public boolean isPretty() {
return isPretty;
}
-
- private static String getPrettyCssClass(String typeName, String cssClass) {
- return typeName.replaceAll("[.$]", "-") + "-" + cssClass;
- }
}
diff --git a/user/src/com/google/gwt/resources/rg/ImageBundleBuilder.java b/user/src/com/google/gwt/resources/rg/ImageBundleBuilder.java
index 931d2b2..429acfa 100644
--- a/user/src/com/google/gwt/resources/rg/ImageBundleBuilder.java
+++ b/user/src/com/google/gwt/resources/rg/ImageBundleBuilder.java
@@ -24,7 +24,6 @@
import org.w3c.dom.Node;
import java.awt.Graphics2D;
-import java.awt.RenderingHints;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
@@ -539,8 +538,6 @@
Graphics2D g2d = bundledImage.createGraphics();
createGraphicsEvent.end();
- setBetterRenderingQuality(g2d);
-
g2d.drawImage(rect.getImage(), rect.transform(), null);
g2d.dispose();
@@ -596,13 +593,6 @@
return b / gcd(a, b) * a;
}
- private static void setBetterRenderingQuality(Graphics2D g2d) {
- g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
- RenderingHints.VALUE_INTERPOLATION_BICUBIC);
- g2d.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION,
- RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
- }
-
private final Map<String, ImageRect> imageNameToImageRectMap = new HashMap<String, ImageRect>();
public ImageBundleBuilder() {
@@ -828,9 +818,6 @@
SpeedTracerLogger.Event graphicsEvent = SpeedTracerLogger.start(CompilerEventType.GRAPHICS_INIT,
"java.awt.headless", System.getProperty("java.awt.headless"));
Graphics2D g2d = bundledImage.createGraphics();
-
- setBetterRenderingQuality(g2d);
-
graphicsEvent.end();
for (ImageRect imageRect : imageRects) {
diff --git a/user/src/com/google/gwt/uibinder/rebind/FieldManager.java b/user/src/com/google/gwt/uibinder/rebind/FieldManager.java
index 10456e5..706c6ec 100644
--- a/user/src/com/google/gwt/uibinder/rebind/FieldManager.java
+++ b/user/src/com/google/gwt/uibinder/rebind/FieldManager.java
@@ -335,8 +335,7 @@
public FieldWriter require(String fieldName) {
FieldWriter fieldWriter = lookup(fieldName);
if (fieldWriter == null) {
- throw new RuntimeException(String.format("The required field \"%s\" doesn't exist.",
- fieldName));
+ throw new RuntimeException("The required field %s doesn't exist.");
}
return fieldWriter;
}
diff --git a/user/src/com/google/gwt/user/cellview/client/AbstractCellTable.java b/user/src/com/google/gwt/user/cellview/client/AbstractCellTable.java
index 91e2c6d..d489cae 100644
--- a/user/src/com/google/gwt/user/cellview/client/AbstractCellTable.java
+++ b/user/src/com/google/gwt/user/cellview/client/AbstractCellTable.java
@@ -475,11 +475,11 @@
*/
sectionTag = sectionTag.toLowerCase();
if ("tbody".equals(sectionTag)) {
- tmpElem.setInnerSafeHtml(template.tbody(rowHtml));
+ tmpElem.setInnerHTML(template.tbody(rowHtml).asString());
} else if ("thead".equals(sectionTag)) {
- tmpElem.setInnerSafeHtml(template.thead(rowHtml));
+ tmpElem.setInnerHTML(template.thead(rowHtml).asString());
} else if ("tfoot".equals(sectionTag)) {
- tmpElem.setInnerSafeHtml(template.tfoot(rowHtml));
+ tmpElem.setInnerHTML(template.tfoot(rowHtml).asString());
} else {
throw new IllegalArgumentException("Invalid table section tag: " + sectionTag);
}
@@ -633,7 +633,7 @@
*/
protected void replaceAllRowsImpl(AbstractCellTable<?> table, TableSectionElement section,
SafeHtml html) {
- section.setInnerSafeHtml(html);
+ section.setInnerHTML(html.asString());
}
}
@@ -1793,16 +1793,6 @@
{
Element maybeTableCell = null;
Element cur = target;
-
- /*
- * If an event happens in the TD element but outside the cell's div, we want
- * to handle it as if it happened within the table cell.
- */
- if (TableCellElement.TAG_TD.equalsIgnoreCase(cur.getTagName()) &&
- tableBuilder.isColumn(cur.getFirstChildElement())) {
- cur = cur.getFirstChildElement();
- }
-
while (cur != null && targetTableSection == null) {
/*
* Found the table section. Return the most recent cell element that we
diff --git a/user/src/com/google/gwt/user/cellview/client/AbstractCellTableBuilder.java b/user/src/com/google/gwt/user/cellview/client/AbstractCellTableBuilder.java
index e1da850..0e4fde0 100644
--- a/user/src/com/google/gwt/user/cellview/client/AbstractCellTableBuilder.java
+++ b/user/src/com/google/gwt/user/cellview/client/AbstractCellTableBuilder.java
@@ -254,20 +254,10 @@
TableRowBuilder row = tbody.startTR();
row.attribute(ROW_ATTRIBUTE, rowIndex);
row.attribute(SUBROW_ATTRIBUTE, subrowIndex);
- addRowAttributes(row);
subrowIndex++;
return row;
}
-
- /**
- * Hook for subclasses to add their own attributes to each row in the table.
- * The default does nothing.
- *
- * @param row the row element
- */
- protected void addRowAttributes(TableRowBuilder row) {
- }
-
+
/**
* Build zero or more table rows for the specified row value.
*
diff --git a/user/src/com/google/gwt/user/cellview/client/AbstractHasData.java b/user/src/com/google/gwt/user/cellview/client/AbstractHasData.java
index fe84f8f..05ba50c 100644
--- a/user/src/com/google/gwt/user/cellview/client/AbstractHasData.java
+++ b/user/src/com/google/gwt/user/cellview/client/AbstractHasData.java
@@ -363,7 +363,7 @@
// cached images.
DOM.setEventListener(tmpElem, widget);
- tmpElem.setInnerSafeHtml(html);
+ tmpElem.setInnerHTML(html.asString());
// Detach the event listener.
DOM.setEventListener(tmpElem, null);
@@ -386,7 +386,7 @@
}
// Render the HTML.
- childContainer.setInnerSafeHtml(CellBasedWidgetImpl.get().processHtml(html));
+ childContainer.setInnerHTML(CellBasedWidgetImpl.get().processHtml(html).asString());
// Detach the event listener.
if (!widget.isAttached()) {
diff --git a/user/src/com/google/gwt/user/cellview/client/CellBrowser.java b/user/src/com/google/gwt/user/cellview/client/CellBrowser.java
index 34e5c7b..b6dd0292 100644
--- a/user/src/com/google/gwt/user/cellview/client/CellBrowser.java
+++ b/user/src/com/google/gwt/user/cellview/client/CellBrowser.java
@@ -375,7 +375,7 @@
} else {
image = closedImageHtml;
}
- tmpElem.setInnerSafeHtml(image);
+ tmpElem.setInnerHTML(image.asString());
elem.replaceChild(tmpElem.getFirstChildElement(), elem.getFirstChildElement());
// Update the open state.
diff --git a/user/src/com/google/gwt/user/cellview/client/CellTreeNodeView.java b/user/src/com/google/gwt/user/cellview/client/CellTreeNodeView.java
index 503c7ba..95d8573 100644
--- a/user/src/com/google/gwt/user/cellview/client/CellTreeNodeView.java
+++ b/user/src/com/google/gwt/user/cellview/client/CellTreeNodeView.java
@@ -860,7 +860,7 @@
* @param parentNodeInfo the {@link NodeInfo} of the parent
* @param elem the outer element of this {@link CellTreeNodeView}
* @param value the value of this node
- * @param messages translation messages
+ * @param messages tranlation messages
*/
CellTreeNodeView(final CellTree tree, final CellTreeNodeView<?> parent,
NodeInfo<T> parentNodeInfo, Element elem, T value, CellTreeMessages messages) {
@@ -1394,7 +1394,7 @@
html = LEAF_IMAGE;
}
Element tmp = Document.get().createDivElement();
- tmp.setInnerSafeHtml(html);
+ tmp.setInnerHTML(html.asString());
Element imageElem = tmp.getFirstChildElement();
Element oldImg = getImageElement();
diff --git a/user/src/com/google/gwt/user/cellview/client/CellWidget.java b/user/src/com/google/gwt/user/cellview/client/CellWidget.java
index f644cde..0c5b44b 100644
--- a/user/src/com/google/gwt/user/cellview/client/CellWidget.java
+++ b/user/src/com/google/gwt/user/cellview/client/CellWidget.java
@@ -35,8 +35,6 @@
import com.google.gwt.view.client.HasKeyProvider;
import com.google.gwt.view.client.ProvidesKey;
-import java.util.Set;
-
/**
* A {@link Widget} that wraps a {@link Cell}.
*
@@ -195,8 +193,7 @@
// Forward the event to the cell.
String eventType = event.getType();
- Set<String> consumedEvents = cell.getConsumedEvents();
- if (consumedEvents != null && consumedEvents.contains(eventType)) {
+ if (cell.getConsumedEvents().contains(eventType)) {
cell.onBrowserEvent(createContext(), getElement(), value, event, valueUpdater);
}
}
@@ -207,7 +204,7 @@
public void redraw() {
SafeHtmlBuilder sb = new SafeHtmlBuilder();
cell.render(createContext(), value, sb);
- getElement().setInnerSafeHtml(sb.toSafeHtml());
+ getElement().setInnerHTML(sb.toSafeHtml().asString());
/*
* The rendered Cell should fill the root element so height and width styles
@@ -285,4 +282,4 @@
private Object getKey(C value) {
return (keyProvider == null || value == null) ? value : keyProvider.getKey(value);
}
-}
+}
\ No newline at end of file
diff --git a/user/src/com/google/gwt/user/cellview/client/SimplePager.java b/user/src/com/google/gwt/user/cellview/client/SimplePager.java
index 14499c2..3645a00 100644
--- a/user/src/com/google/gwt/user/cellview/client/SimplePager.java
+++ b/user/src/com/google/gwt/user/cellview/client/SimplePager.java
@@ -260,6 +260,7 @@
* @param location the location of the text relative to the buttons
*/
@UiConstructor
+ // Hack for Google I/O demo
public SimplePager(TextLocation location) {
this(location, getDefaultResources(), true, DEFAULT_FAST_FORWARD_ROWS,
false);
diff --git a/user/src/com/google/gwt/user/client/Window.java b/user/src/com/google/gwt/user/client/Window.java
index 68eec21..aec4a14 100644
--- a/user/src/com/google/gwt/user/client/Window.java
+++ b/user/src/com/google/gwt/user/client/Window.java
@@ -118,7 +118,7 @@
*
*/
public static class Location {
- private static String cachedQueryString = "";
+ private static Map<String, String> paramMap;
private static Map<String, List<String>> listParamMap;
/**
@@ -206,28 +206,24 @@
* returned.
*
* @param name the name of the URL's parameter
- * @return the value of the URL's parameter, or null if missing
+ * @return the value of the URL's parameter
*/
public static String getParameter(String name) {
- ensureListParameterMap();
- List<String> paramsForName = listParamMap.get(name);
- if (paramsForName == null) {
- return null;
- } else {
- return paramsForName.get(paramsForName.size() - 1);
- }
+ ensureParameterMap();
+ return paramMap.get(name);
}
/**
- * Returns an immutable Map of the URL query parameters for the host page
- * at the time this method was called.
- * Any changes to the window's location will be reflected in the result
- * of subsequent calls.
+ * Returns a Map of the URL query parameters for the host page; since
+ * changing the map would not change the window's location, the map returned
+ * is immutable.
*
* @return a map from URL query parameter names to a list of values
*/
public static Map<String, List<String>> getParameterMap() {
- ensureListParameterMap();
+ if (listParamMap == null) {
+ listParamMap = buildListParamMap(getQueryString());
+ }
return listParamMap;
}
@@ -320,12 +316,21 @@
return out;
}
- private static void ensureListParameterMap() {
- final String currentQueryString = getQueryString();
- if (listParamMap == null ||
- !cachedQueryString.equals(currentQueryString)) {
- listParamMap = buildListParamMap(currentQueryString);
- cachedQueryString = currentQueryString;
+ private static void ensureParameterMap() {
+ if (paramMap == null) {
+ paramMap = new HashMap<String, String>();
+ String queryString = getQueryString();
+ if (queryString != null && queryString.length() > 1) {
+ String qs = queryString.substring(1);
+ for (String kvPair : qs.split("&")) {
+ String[] kv = kvPair.split("=", 2);
+ if (kv.length > 1) {
+ paramMap.put(kv[0], URL.decodeQueryString(kv[1]));
+ } else {
+ paramMap.put(kv[0], "");
+ }
+ }
+ }
}
}
@@ -766,8 +771,8 @@
* defined. The top left corner will not be moved (it stays in its original
* coordinates).
* <p>
- * NOTE: In most modern browsers, this method only works with windows created
- * by Window.open() with a supplied width and height.
+ * NOTE: In Chrome, this method only works with windows created by
+ * Window.open().
* </p>
*
* @param width A positive or a negative number that specifies how many pixels
@@ -782,8 +787,8 @@
/**
* Resizes the window to the specified width and height.
* <p>
- * NOTE: In most modern browsers, this method only works with windows created
- * by Window.open() with a supplied width and height.
+ * NOTE: In Chrome, this method only works with windows created by
+ * Window.open().
* </p>
*
* @param width The width of the window, in pixels
diff --git a/user/src/com/google/gwt/user/client/rpc/core/java/util/Arrays.java b/user/src/com/google/gwt/user/client/rpc/core/java/util/Arrays.java
index 3ffb204..2c41d4a 100644
--- a/user/src/com/google/gwt/user/client/rpc/core/java/util/Arrays.java
+++ b/user/src/com/google/gwt/user/client/rpc/core/java/util/Arrays.java
@@ -15,7 +15,7 @@
*/
package com.google.gwt.user.client.rpc.core.java.util;
-import com.google.gwt.core.shared.GWT;
+import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.rpc.CustomFieldSerializer;
import com.google.gwt.user.client.rpc.SerializationException;
import com.google.gwt.user.client.rpc.SerializationStreamReader;
diff --git a/user/src/com/google/gwt/user/client/rpc/impl/SerializerBase.java b/user/src/com/google/gwt/user/client/rpc/impl/SerializerBase.java
index 20e67b6..5174790 100644
--- a/user/src/com/google/gwt/user/client/rpc/impl/SerializerBase.java
+++ b/user/src/com/google/gwt/user/client/rpc/impl/SerializerBase.java
@@ -15,7 +15,7 @@
*/
package com.google.gwt.user.client.rpc.impl;
-import com.google.gwt.core.shared.GWT;
+import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.core.client.JsArray;
import com.google.gwt.core.client.JsArrayString;
diff --git a/user/src/com/google/gwt/user/client/ui/CustomScrollPanel.java b/user/src/com/google/gwt/user/client/ui/CustomScrollPanel.java
index 8b62d94..4f5a9b3 100644
--- a/user/src/com/google/gwt/user/client/ui/CustomScrollPanel.java
+++ b/user/src/com/google/gwt/user/client/ui/CustomScrollPanel.java
@@ -557,7 +557,7 @@
* corner.
*
* <p>
- * In RTL, the vertical scrollbar appears on the left.
+ * In RTL, the vertical scrollbar appears on the right.
*/
private void maybeUpdateScrollbars() {
if (!isAttached()) {
diff --git a/user/src/com/google/gwt/user/client/ui/DeckPanel.java b/user/src/com/google/gwt/user/client/ui/DeckPanel.java
index 919f5a8..393a1ed 100644
--- a/user/src/com/google/gwt/user/client/ui/DeckPanel.java
+++ b/user/src/com/google/gwt/user/client/ui/DeckPanel.java
@@ -266,9 +266,9 @@
}
/**
- * Gets the index of the currently-visible widget, if any.
+ * Gets the index of the currently-visible widget.
*
- * @return the visible widget's index, or -1 if there is no such widget
+ * @return the visible widget's index
*/
public int getVisibleWidget() {
return getWidgetIndex(visibleWidget);
diff --git a/user/src/com/google/gwt/user/client/ui/LoadListener.java b/user/src/com/google/gwt/user/client/ui/LoadListener.java
index 1d3d3b0..8164979 100644
--- a/user/src/com/google/gwt/user/client/ui/LoadListener.java
+++ b/user/src/com/google/gwt/user/client/ui/LoadListener.java
@@ -5,7 +5,7 @@
* 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
+ * 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
diff --git a/user/src/com/google/gwt/user/client/ui/NamedFrame.java b/user/src/com/google/gwt/user/client/ui/NamedFrame.java
index fb65033..9fe635b 100644
--- a/user/src/com/google/gwt/user/client/ui/NamedFrame.java
+++ b/user/src/com/google/gwt/user/client/ui/NamedFrame.java
@@ -38,10 +38,8 @@
interface IFrameTemplate extends SafeHtmlTemplates {
static final IFrameTemplate INSTANCE = GWT.create(IFrameTemplate.class);
- // Setting a src prevents mixed-content warnings.
- // http://weblogs.asp.net/bleroy/archive/2005/08/09/how-to-put-a-div-over-a-select-in-ie.aspx
- @Template("<iframe src=\"javascript:''\" name='{0}'>")
- SafeHtml get(String name);
+ @Template("<iframe src='{0}' name='{1}'>")
+ SafeHtml get(String src, String name);
}
// Used inside JSNI, so please don't delete this field just because
@@ -55,8 +53,9 @@
}
/**
- * Creates an HTML IFRAME element with a name.
+ * Creates an HTML IFRAME element with a src and name.
*
+ * @param src the src of the frame
* @param name the name of the frame, which must contain at least one
* non-whitespace character and must not contain reserved HTML markup
* characters such as '<code><</code>', '<code>></code>',
@@ -64,7 +63,7 @@
* @return the newly-created element
* @throws IllegalArgumentException if the supplied name is not allowed
*/
- private static IFrameElement createIFrame(String name) {
+ private static IFrameElement createIFrame(String src, String name) {
if (name == null || !isValidName(name.trim())) {
throw new IllegalArgumentException(
"expecting one or more non-whitespace chars with no '<', '>', or '&'");
@@ -73,7 +72,7 @@
// Use innerHTML to implicitly create the <iframe>. This is necessary
// because most browsers will not respect a dynamically-set iframe name.
Element div = DOM.createDiv();
- div.setInnerSafeHtml(IFrameTemplate.INSTANCE.get(name));
+ div.setInnerSafeHtml(IFrameTemplate.INSTANCE.get(src, name));
return div.getFirstChild().cast();
}
@@ -102,7 +101,9 @@
*/
@UiConstructor
public NamedFrame(String name) {
- super(createIFrame(name));
+ // Setting a src prevents mixed-content warnings.
+ // http://weblogs.asp.net/bleroy/archive/2005/08/09/how-to-put-a-div-over-a-select-in-ie.aspx
+ super(createIFrame("javascript:''", name));
setStyleName(DEFAULT_STYLENAME);
}
diff --git a/user/src/com/google/gwt/user/client/ui/PopupPanel.java b/user/src/com/google/gwt/user/client/ui/PopupPanel.java
index ddcad33..2434496 100644
--- a/user/src/com/google/gwt/user/client/ui/PopupPanel.java
+++ b/user/src/com/google/gwt/user/client/ui/PopupPanel.java
@@ -904,7 +904,7 @@
* popup. The callback allows positioning to be performed based on the
* offsetWidth and offsetHeight of the popup, which are normally not available
* until the popup is showing. By positioning the popup before it is shown,
- * the popup will not jump from its original position to the new position.
+ * the the popup will not jump from its original position to the new position.
*
* @param callback the callback to set the position of the popup
* @see PositionCallback#setPosition(int offsetWidth, int offsetHeight)
diff --git a/user/src/com/google/gwt/user/client/ui/PrefixTree.java b/user/src/com/google/gwt/user/client/ui/PrefixTree.java
index 55d97f1..302b696 100644
--- a/user/src/com/google/gwt/user/client/ui/PrefixTree.java
+++ b/user/src/com/google/gwt/user/client/ui/PrefixTree.java
@@ -365,7 +365,7 @@
/**
* Retrieve suggestions from the PrefixTree. The number of items returned from
- * getSuggestions may slightly exceed <code>limit</code> so that all
+ * getSuggesstions may slightly exceed <code>limit</code> so that all
* suffixes and partial stems will be returned. This prevents the search space
* from changing size if the PrefixTree is used in an interactive manner.
* <br/> The returned List is guaranteed to be safe; changing its contents
diff --git a/user/src/com/google/gwt/user/client/ui/RenderablePanel.java b/user/src/com/google/gwt/user/client/ui/RenderablePanel.java
index 3656ecb..165fc66 100644
--- a/user/src/com/google/gwt/user/client/ui/RenderablePanel.java
+++ b/user/src/com/google/gwt/user/client/ui/RenderablePanel.java
@@ -233,7 +233,7 @@
// Build the div that'll container the panel's HTML.
Element element = Document.get().createDivElement();
- element.setInnerSafeHtml(getInnerHtml());
+ element.setInnerHTML(getInnerHtml().asString());
// TODO(rdcastro): Implement something like
// element.mergeFrom(getElement());
diff --git a/user/src/com/google/gwt/user/client/ui/ResizeComposite.java b/user/src/com/google/gwt/user/client/ui/ResizeComposite.java
index 1054249..7d0bab3 100644
--- a/user/src/com/google/gwt/user/client/ui/ResizeComposite.java
+++ b/user/src/com/google/gwt/user/client/ui/ResizeComposite.java
@@ -26,7 +26,7 @@
@Override
protected void initWidget(Widget widget) {
assert widget instanceof RequiresResize :
- "ResizeComposite requires that its wrapped widget implement RequiresResize";
+ "LayoutComposite requires that its wrapped widget implement RequiresResize";
super.initWidget(widget);
}
diff --git a/user/src/com/google/gwt/user/client/ui/ResizeLayoutPanel.java b/user/src/com/google/gwt/user/client/ui/ResizeLayoutPanel.java
index 49f1278..2f4dac6 100644
--- a/user/src/com/google/gwt/user/client/ui/ResizeLayoutPanel.java
+++ b/user/src/com/google/gwt/user/client/ui/ResizeLayoutPanel.java
@@ -140,7 +140,6 @@
expandable.getStyle().setHeight(100.0, Unit.PCT);
expandable.getStyle().setWidth(100.0, Unit.PCT);
expandable.getStyle().setOverflow(Overflow.SCROLL);
- expandable.getStyle().setZIndex(-1);
elem.appendChild(expandable);
expandableInner = Document.get().createDivElement().cast();
expandable.appendChild(expandableInner);
@@ -161,7 +160,6 @@
collapsible.getStyle().setHeight(100.0, Unit.PCT);
collapsible.getStyle().setWidth(100.0, Unit.PCT);
collapsible.getStyle().setOverflow(Overflow.SCROLL);
- collapsible.getStyle().setZIndex(-1);
elem.appendChild(collapsible);
collapsibleInner = Document.get().createDivElement().cast();
collapsibleInner.getStyle().setWidth(200, Unit.PCT);
diff --git a/user/src/com/google/gwt/user/client/ui/SplitLayoutPanel.java b/user/src/com/google/gwt/user/client/ui/SplitLayoutPanel.java
index a0acd62..6cb8462 100644
--- a/user/src/com/google/gwt/user/client/ui/SplitLayoutPanel.java
+++ b/user/src/com/google/gwt/user/client/ui/SplitLayoutPanel.java
@@ -141,7 +141,7 @@
mouseDown = false;
glassElem.removeFromParent();
-
+
// Handle double-clicks.
// Fake them since the double-click event aren't fired.
if (this.toggleDisplayAllowed) {
@@ -377,16 +377,6 @@
return false;
}
- @Override
- public void setWidgetHidden(Widget widget, boolean hidden) {
- super.setWidgetHidden(widget, hidden);
- Splitter splitter = getAssociatedSplitter(widget);
- if (splitter != null) {
- // The splitter is null for the center element.
- super.setWidgetHidden(splitter, hidden);
- }
- }
-
/**
* Sets the minimum allowable size for the given widget.
*
diff --git a/user/src/com/google/gwt/user/client/ui/Tree.java b/user/src/com/google/gwt/user/client/ui/Tree.java
index 5d062a5..a83796c 100644
--- a/user/src/com/google/gwt/user/client/ui/Tree.java
+++ b/user/src/com/google/gwt/user/client/ui/Tree.java
@@ -243,8 +243,6 @@
private TreeItem root;
- private boolean scrollOnSelectEnabled = true;
-
private boolean useLeafImages;
/**
@@ -637,13 +635,6 @@
return isAnimationEnabled;
}
- /**
- * Determines whether selecting a tree item will scroll it into view.
- */
- public boolean isScrollOnSelectEnabled() {
- return scrollOnSelectEnabled;
- }
-
@Override
public Iterator<Widget> iterator() {
final Widget[] widgets = new Widget[childWidgets.size()];
@@ -862,14 +853,6 @@
}
/**
- * Enable or disable scrolling a tree item into view when it is selected. Scrolling into view is
- * enabled by default.
- */
- public void setScrollOnSelectEnabled(boolean enable) {
- scrollOnSelectEnabled = enable;
- }
-
- /**
* Selects a specified item.
*
* @param item the item to be selected, or <code>null</code> to deselect all
@@ -1238,40 +1221,36 @@
Focusable focusableWidget = curSelection.getFocusable();
if (focusableWidget != null) {
focusableWidget.setFocus(true);
- if (scrollOnSelectEnabled) {
- DOM.scrollIntoView(((Widget) focusableWidget).getElement());
- }
+ DOM.scrollIntoView(((Widget) focusableWidget).getElement());
} else {
- if (scrollOnSelectEnabled) {
- // Get the location and size of the given item's content element relative
- // to the tree.
- Element selectedElem = curSelection.getContentElem();
- int containerLeft = getAbsoluteLeft();
- int containerTop = getAbsoluteTop();
-
- int left = DOM.getAbsoluteLeft(selectedElem) - containerLeft;
- int top = DOM.getAbsoluteTop(selectedElem) - containerTop;
- int width = DOM.getElementPropertyInt(selectedElem, "offsetWidth");
- int height = DOM.getElementPropertyInt(selectedElem, "offsetHeight");
+ // Get the location and size of the given item's content element relative
+ // to the tree.
+ Element selectedElem = curSelection.getContentElem();
+ int containerLeft = getAbsoluteLeft();
+ int containerTop = getAbsoluteTop();
- // If the item is not visible, quite here
- if (width == 0 || height == 0) {
- DOM.setIntStyleAttribute(focusable, "left", 0);
- DOM.setIntStyleAttribute(focusable, "top", 0);
- return;
- }
-
- // Set the focusable element's position and size to exactly underlap the
- // item's content element.
- DOM.setStyleAttribute(focusable, "left", left + "px");
- DOM.setStyleAttribute(focusable, "top", top + "px");
- DOM.setStyleAttribute(focusable, "width", width + "px");
- DOM.setStyleAttribute(focusable, "height", height + "px");
-
- // Scroll it into view.
- DOM.scrollIntoView(focusable);
+ int left = DOM.getAbsoluteLeft(selectedElem) - containerLeft;
+ int top = DOM.getAbsoluteTop(selectedElem) - containerTop;
+ int width = DOM.getElementPropertyInt(selectedElem, "offsetWidth");
+ int height = DOM.getElementPropertyInt(selectedElem, "offsetHeight");
+
+ // If the item is not visible, quite here
+ if (width == 0 || height == 0) {
+ DOM.setIntStyleAttribute(focusable, "left", 0);
+ DOM.setIntStyleAttribute(focusable, "top", 0);
+ return;
}
+ // Set the focusable element's position and size to exactly underlap the
+ // item's content element.
+ DOM.setStyleAttribute(focusable, "left", left + "px");
+ DOM.setStyleAttribute(focusable, "top", top + "px");
+ DOM.setStyleAttribute(focusable, "width", width + "px");
+ DOM.setStyleAttribute(focusable, "height", height + "px");
+
+ // Scroll it into view.
+ DOM.scrollIntoView(focusable);
+
// Update ARIA attributes to reflect the information from the
// newly-selected item.
updateAriaAttributes();
diff --git a/user/src/com/google/gwt/user/client/ui/impl/ClippedImageImpl.java b/user/src/com/google/gwt/user/client/ui/impl/ClippedImageImpl.java
index a772f1d..85da019 100644
--- a/user/src/com/google/gwt/user/client/ui/impl/ClippedImageImpl.java
+++ b/user/src/com/google/gwt/user/client/ui/impl/ClippedImageImpl.java
@@ -63,7 +63,7 @@
public Element createStructure(SafeUri url, int left, int top, int width, int height) {
Element tmp = Document.get().createSpanElement();
- tmp.setInnerSafeHtml(getSafeHtml(url, left, top, width, height));
+ tmp.setInnerHTML(getSafeHtml(url, left, top, width, height).asString());
return tmp.getFirstChildElement();
}
diff --git a/user/src/com/google/gwt/user/client/ui/impl/RichTextAreaImplMozilla.java b/user/src/com/google/gwt/user/client/ui/impl/RichTextAreaImplMozilla.java
index fe3bbcb..3593855 100644
--- a/user/src/com/google/gwt/user/client/ui/impl/RichTextAreaImplMozilla.java
+++ b/user/src/com/google/gwt/user/client/ui/impl/RichTextAreaImplMozilla.java
@@ -27,11 +27,6 @@
boolean isFirstFocus;
@Override
- public String getBackColor() {
- return queryCommandValue("HiliteColor");
- }
-
- @Override
public native void initElement() /*-{
// Mozilla doesn't allow designMode to be set reliably until the iframe is
// fully loaded.
diff --git a/user/src/com/google/gwt/user/client/ui/impl/RichTextAreaImplStandard.java b/user/src/com/google/gwt/user/client/ui/impl/RichTextAreaImplStandard.java
index 28aea46..67a6737 100644
--- a/user/src/com/google/gwt/user/client/ui/impl/RichTextAreaImplStandard.java
+++ b/user/src/com/google/gwt/user/client/ui/impl/RichTextAreaImplStandard.java
@@ -95,15 +95,11 @@
var _this = this;
_this.@com.google.gwt.user.client.ui.impl.RichTextAreaImplStandard::onElementInitializing()();
setTimeout($entry(function() {
- // We need to check to see if the content window still is there. It might not be if the RTA
- // first was attached to the DOM and then quickly was removed before the timeout fired.
- if (_this.@com.google.gwt.user.client.ui.impl.RichTextAreaImpl::elem.contentWindow != null) {
- // Turn on design mode.
- _this.@com.google.gwt.user.client.ui.impl.RichTextAreaImpl::elem.contentWindow.document.designMode = 'On';
+ // Turn on design mode.
+ _this.@com.google.gwt.user.client.ui.impl.RichTextAreaImpl::elem.contentWindow.document.designMode = 'On';
- // Send notification that the iframe has reached design mode.
- _this.@com.google.gwt.user.client.ui.impl.RichTextAreaImplStandard::onElementInitialized()();
- }
+ // Send notification that the iframe has reached design mode.
+ _this.@com.google.gwt.user.client.ui.impl.RichTextAreaImplStandard::onElementInitialized()();
}), 1);
}-*/;
diff --git a/user/src/com/google/gwt/user/rebind/rpc/SerializableTypeOracleBuilder.java b/user/src/com/google/gwt/user/rebind/rpc/SerializableTypeOracleBuilder.java
index 29bfa07..f49e003 100644
--- a/user/src/com/google/gwt/user/rebind/rpc/SerializableTypeOracleBuilder.java
+++ b/user/src/com/google/gwt/user/rebind/rpc/SerializableTypeOracleBuilder.java
@@ -114,7 +114,18 @@
*/
public class SerializableTypeOracleBuilder {
- static class TypeInfoComputed {
+ class TypeInfoComputed {
+ /**
+ * <code>true</code> if the type is assignable to {@link IsSerializable} or
+ * {@link java.io.Serializable Serializable}.
+ */
+ private final boolean autoSerializable;
+
+ /**
+ * <code>true</code> if the this type directly implements one of the marker
+ * interfaces.
+ */
+ private final boolean directlyImplementsMarker;
/**
* <code>true</code> if the type is automatically or manually serializable
@@ -134,10 +145,10 @@
private boolean instantiableSubtypes;
/**
- * All instantiable types found when this type was queried, including the
- * type itself. (Null until calculated.)
+ * All instantiable types found when this type was quaried, including the
+ * type itself.
*/
- private Set<JClassType> instantiableTypes;
+ private Set<JClassType> instantiableTypes = new HashSet<JClassType>();
/**
* Custom field serializer or <code>null</code> if there isn't one.
@@ -165,19 +176,38 @@
*/
private final JType type;
- private TypeInfoComputed(JType type, TypePath path, TypeOracle typeOracle) {
+ public TypeInfoComputed(JType type, TypePath path) {
this.type = type;
this.path = path;
if (type instanceof JClassType) {
JClassType typeClass = (JClassType) type;
+ autoSerializable = SerializableTypeOracleBuilder.isAutoSerializable(typeClass);
manualSerializer = findCustomFieldSerializer(typeOracle, typeClass);
+ directlyImplementsMarker = directlyImplementsMarkerInterface(typeClass);
maybeEnhanced = hasJdoAnnotation(typeClass) || hasJpaAnnotation(typeClass);
} else {
+ autoSerializable = false;
manualSerializer = null;
+ directlyImplementsMarker = false;
maybeEnhanced = false;
}
}
+ /**
+ * Returns the internal set of instantiable types for this TIC.
+ * Modifications to this set are immediately recorded into the TIC as well.
+ * TODO(spoon) maybe pass the TIC around instead of the set? then there
+ * could be addInstantiableType(JClassType) instead of speccing this to be
+ * mutable.
+ */
+ public Set<JClassType> getInstantiableTypes() {
+ return instantiableTypes;
+ }
+
+ public JClassType getManualSerializer() {
+ return manualSerializer;
+ }
+
public TypePath getPath() {
return path;
}
@@ -187,7 +217,19 @@
}
public boolean hasInstantiableSubtypes() {
- return instantiable || instantiableSubtypes || state == TypeState.CHECK_IN_PROGRESS;
+ return isInstantiable() || instantiableSubtypes || isPendingInstantiable();
+ }
+
+ public boolean isAutoSerializable() {
+ return autoSerializable;
+ }
+
+ public boolean isDeclaredSerializable() {
+ return autoSerializable || isManuallySerializable();
+ }
+
+ public boolean isDirectlySerializable() {
+ return directlyImplementsMarker || isManuallySerializable();
}
public boolean isDone() {
@@ -808,40 +850,29 @@
if (!entrySucceeded) {
problems.report(logger, TreeLogger.ERROR, TreeLogger.INFO);
} else {
- maybeReport(logger, problems);
+ if (problems.hasFatalProblems()) {
+ entrySucceeded = false;
+ problems.reportFatalProblems(logger, TreeLogger.ERROR);
+ }
+ // if entrySucceeded, there may still be "warning" problems, but too
+ // often they're expected (e.g. non-instantiable subtypes of List), so
+ // we log them at DEBUG.
+ // TODO(fabbott): we could blacklist or graylist those types here, so
+ // instantiation during code generation would flag them for us.
+ problems.report(logger, TreeLogger.DEBUG, TreeLogger.DEBUG);
}
- allSucceeded &= entrySucceeded & !problems.hasFatalProblems();
+
+ allSucceeded &= entrySucceeded;
}
if (!allSucceeded) {
throw new UnableToCompleteException();
}
- assertNothingPending();
- // Add covariant arrays in a separate pass. We want to ensure that nothing is pending
- // so that the leaf type's instantiableTypes variable is ready (if it's computed at all)
- // and all of the leaf's subtypes are ready.
- // (Copy values to avoid concurrent modification.)
- List<TypeInfoComputed> ticsToCheck = new ArrayList<TypeInfoComputed>();
- ticsToCheck.addAll(typeToTypeInfoComputed.values());
- for (TypeInfoComputed tic : ticsToCheck) {
- JArrayType type = tic.getType().isArray();
- if (type != null && tic.instantiable) {
- ProblemReport problems = new ProblemReport();
- problems.setContextType(type);
-
- markArrayTypes(logger, type, tic.getPath(), problems);
-
- maybeReport(logger, problems);
- allSucceeded &= !problems.hasFatalProblems();
- }
+ for (TypeInfoComputed tic : typeToTypeInfoComputed.values()) {
+ assert (!tic.isPendingInstantiable());
}
- if (!allSucceeded) {
- throw new UnableToCompleteException();
- }
- assertNothingPending();
-
pruneUnreachableTypes();
logReachableTypes(logger);
@@ -912,7 +943,7 @@
ProblemReport problems) {
assert (type != null);
if (type.isPrimitive() != null) {
- TypeInfoComputed tic = ensureTypeInfoComputed(type, path);
+ TypeInfoComputed tic = getTypeInfoComputed(type, path, true);
tic.setInstantiableSubtypes(true);
tic.setInstantiable(false);
return tic;
@@ -922,7 +953,7 @@
JClassType classType = (JClassType) type;
- TypeInfoComputed tic = typeToTypeInfoComputed.get(classType);
+ TypeInfoComputed tic = getTypeInfoComputed(classType, path, false);
if (tic != null && tic.isDone()) {
// we have an answer already; use it.
return tic;
@@ -943,7 +974,7 @@
* caller's responsibility to deal with it. We assume that it is
* indirectly instantiable here.
*/
- tic = ensureTypeInfoComputed(classType, path);
+ tic = getTypeInfoComputed(classType, path, true);
tic.setInstantiableSubtypes(true);
tic.setInstantiable(false);
return tic;
@@ -957,7 +988,7 @@
computeTypeInstantiability(localLogger, bound, path, problems)
.hasInstantiableSubtypes();
}
- tic = ensureTypeInfoComputed(classType, path);
+ tic = getTypeInfoComputed(classType, path, true);
tic.setInstantiableSubtypes(success);
tic.setInstantiable(false);
return tic;
@@ -966,7 +997,7 @@
JArrayType isArray = classType.isArray();
if (isArray != null) {
TypeInfoComputed arrayTic = checkArrayInstantiable(localLogger, isArray, path, problems);
- assert typeToTypeInfoComputed.get(classType) != null;
+ assert getTypeInfoComputed(classType, path, false) != null;
return arrayTic;
}
@@ -978,7 +1009,7 @@
*/
problems.add(classType, "In order to produce smaller client-side code, 'Object' is not "
+ "allowed; please use a more specific type", Priority.DEFAULT);
- tic = ensureTypeInfoComputed(classType, path);
+ tic = getTypeInfoComputed(classType, path, true);
tic.setInstantiable(false);
return tic;
}
@@ -997,16 +1028,13 @@
// TreeLogger subtypesLogger = localLogger.branch(TreeLogger.DEBUG,
// "Analyzing subclasses:", null);
- tic = ensureTypeInfoComputed(classType, path);
- Set<JClassType> instantiableTypes = new HashSet<JClassType>();
+ tic = getTypeInfoComputed(classType, path, true);
boolean anySubtypes =
- checkSubtypes(localLogger, originalType, instantiableTypes, path, problems);
+ checkSubtypes(localLogger, originalType, tic.getInstantiableTypes(), path, problems);
if (!tic.isDone()) {
tic.setInstantiableSubtypes(anySubtypes);
tic.setInstantiable(false);
}
- // Don't publish this until complete to ensure nobody depends on partial results.
- tic.instantiableTypes = instantiableTypes;
return tic;
}
@@ -1024,16 +1052,10 @@
return shouldConsiderFieldsForSerialization(type, typeFilter, problems);
}
- private void assertNothingPending() {
- if (getClass().desiredAssertionStatus()) {
- for (TypeInfoComputed tic : typeToTypeInfoComputed.values()) {
- assert (!tic.isPendingInstantiable());
- }
- }
- }
-
/**
* Consider any subtype of java.lang.Object which qualifies for serialization.
+ *
+ * @param logger
*/
private void checkAllSubtypesOfObject(TreeLogger logger, TypePath parent, ProblemReport problems) {
if (alreadyCheckedObject) {
@@ -1069,16 +1091,12 @@
return checkArrayInstantiable(logger, arrayType, path, problems);
}
- TypeInfoComputed tic = ensureTypeInfoComputed(array, path);
- if (tic.isDone() || tic.isPendingInstantiable()) {
- return tic;
- }
- tic.setPendingInstantiable();
-
+ JClassType leafClass = leafType.isClassOrInterface();
JTypeParameter isLeafTypeParameter = leafType.isTypeParameter();
if (isLeafTypeParameter != null && !typeParametersInRootTypes.contains(isLeafTypeParameter)) {
// Don't deal with non root type parameters, but make a TIC entry to
// save time if it recurs. We assume they're indirectly instantiable.
+ TypeInfoComputed tic = getTypeInfoComputed(array, path, true);
tic.setInstantiableSubtypes(true);
tic.setInstantiable(false);
return tic;
@@ -1087,12 +1105,18 @@
if (!isAllowedByFilter(array, problems)) {
// Don't deal with filtered out types either, but make a TIC entry to
// save time if it recurs. We assume they're not instantiable.
+ TypeInfoComputed tic = getTypeInfoComputed(array, path, true);
tic.setInstantiable(false);
return tic;
}
- // An array is instantiable provided that any leaf subtype is instantiable.
- // (Ignores the possibility of empty arrays of non-instantiable types.)
+ TypeInfoComputed tic = getTypeInfoComputed(array, path, true);
+ if (tic.isDone()) {
+ return tic;
+ } else if (tic.isPendingInstantiable()) {
+ return tic;
+ }
+ tic.setPendingInstantiable();
TreeLogger branch = logger.branch(TreeLogger.DEBUG, "Analyzing component type:", null);
@@ -1100,6 +1124,32 @@
computeTypeInstantiability(branch, leafType, TypePaths
.createArrayComponentPath(array, path), problems);
boolean succeeded = leafTic.hasInstantiableSubtypes();
+ if (succeeded) {
+ if (leafClass == null) {
+ assert leafType.isPrimitive() != null;
+ markArrayTypesInstantiable(leafType, array.getRank(), path);
+ } else {
+ TreeLogger covariantArrayLogger = logger.branch(TreeLogger.DEBUG, "Covariant array types");
+
+ /*
+ * Compute covariant arrays for arrays of reference types.
+ */
+ for (JClassType instantiableType : TypeHierarchyUtils.getAllTypesBetweenRootTypeAndLeaves(
+ leafClass, leafTic.getInstantiableTypes())) {
+ if (!isAccessibleToSerializer(instantiableType)) {
+ // Skip types that are not accessible from a serializer
+ continue;
+ }
+
+ if (covariantArrayLogger.isLoggable(TreeLogger.DEBUG)) {
+ covariantArrayLogger.branch(TreeLogger.DEBUG, getArrayType(typeOracle, array.getRank(),
+ instantiableType).getParameterizedQualifiedSourceName());
+ }
+
+ markArrayTypesInstantiable(instantiableType, array.getRank(), path);
+ }
+ }
+ }
tic.setInstantiable(succeeded);
return tic;
@@ -1216,7 +1266,7 @@
}
}
- TypeInfoComputed tic = ensureTypeInfoComputed(classOrInterface, parent);
+ TypeInfoComputed tic = getTypeInfoComputed(classOrInterface, parent, true);
return checkDeclaredFields(logger, tic, parent, problems);
}
@@ -1226,7 +1276,7 @@
*/
private boolean checkSubtypes(TreeLogger logger, JClassType originalType,
Set<JClassType> instSubtypes, TypePath path, ProblemReport problems) {
- JRealClassType baseType = getBaseType(originalType);
+ JClassType baseType = getBaseType(originalType);
TreeLogger computationLogger =
logger.branch(TreeLogger.DEBUG, "Finding possibly instantiable subtypes");
List<JClassType> candidates =
@@ -1250,7 +1300,7 @@
}
TypePath subtypePath = TypePaths.createSubtypePath(path, candidate, originalType);
- TypeInfoComputed tic = ensureTypeInfoComputed(candidate, subtypePath);
+ TypeInfoComputed tic = getTypeInfoComputed(candidate, subtypePath, true);
if (tic.isDone()) {
if (tic.isInstantiable()) {
anySubtypes = true;
@@ -1279,7 +1329,7 @@
// Note we are leaving hasInstantiableSubtypes() as false which might be
// wrong but it is only used by arrays and thus it will never be looked at
// for this tic.
- if (instantiable) {
+ if (instantiable && instSubtypes != null) {
instSubtypes.add(candidate);
}
}
@@ -1292,7 +1342,8 @@
* it is applied to be serializable. As a side effect, populates
* {@link #typeToTypeInfoComputed} in the same way as
* {@link #computeTypeInstantiability}.
- *
+ *
+ * @param logger
* @param baseType - The generic type the parameter is on
* @param paramIndex - The index of the parameter in the generic type
* @param typeArg - An upper bound on the actual argument being applied to the
@@ -1384,8 +1435,8 @@
/**
* Returns the subtypes of a given base type as parameterized by wildcards.
*/
- private List<JClassType> getPossiblyInstantiableSubtypes(TreeLogger logger,
- JRealClassType baseType, ProblemReport problems) {
+ private List<JClassType> getPossiblyInstantiableSubtypes(TreeLogger logger, JClassType baseType,
+ ProblemReport problems) {
assert (baseType == getBaseType(baseType));
List<JClassType> possiblyInstantiableTypes = new ArrayList<JClassType>();
@@ -1436,10 +1487,10 @@
return possiblyInstantiableTypes;
}
- private TypeInfoComputed ensureTypeInfoComputed(JType type, TypePath path) {
+ private TypeInfoComputed getTypeInfoComputed(JType type, TypePath path, boolean createIfNeeded) {
TypeInfoComputed tic = typeToTypeInfoComputed.get(type);
- if (tic == null) {
- tic = new TypeInfoComputed(type, path, typeOracle);
+ if (tic == null && createIfNeeded) {
+ tic = new TypeInfoComputed(type, path);
typeToTypeInfoComputed.put(type, tic);
}
return tic;
@@ -1531,81 +1582,11 @@
for (int rank = 1; rank <= maxRank; ++rank) {
JArrayType covariantArray = getArrayType(typeOracle, rank, leafType);
- TypeInfoComputed covariantArrayTic = ensureTypeInfoComputed(covariantArray, path);
+ TypeInfoComputed covariantArrayTic = getTypeInfoComputed(covariantArray, path, true);
covariantArrayTic.setInstantiable(true);
}
}
- /**
- * Marks all covariant and lesser-ranked arrays as instantiable for all leaf types between
- * the given array's leaf type and its instantiable subtypes. (Note: this adds O(S * R)
- * array types to the output where S is the number of subtypes and R is the rank.)
- * Prerequisite: The leaf type's tic and its subtypes must already be created.
- * @see #checkArrayInstantiable
- */
- private void markArrayTypes(TreeLogger logger, JArrayType array, TypePath path,
- ProblemReport problems) {
- logger = logger.branch(TreeLogger.DEBUG, "Adding array types for " + array);
-
- JType leafType = array.getLeafType();
- JTypeParameter isLeafTypeParameter = leafType.isTypeParameter();
- if (isLeafTypeParameter != null) {
- if (typeParametersInRootTypes.contains(isLeafTypeParameter)) {
- leafType = isLeafTypeParameter.getFirstBound(); // to match computeTypeInstantiability
- } else {
- // skip non-root leaf parameters, to match checkArrayInstantiable
- return;
- }
- }
-
- TypeInfoComputed leafTic = typeToTypeInfoComputed.get(leafType);
- if (leafTic == null) {
- problems.add(array, "internal error: leaf type not computed: " +
- leafType.getQualifiedSourceName(), Priority.FATAL);
- return;
- }
-
- if (leafType.isClassOrInterface() == null) {
- // Simple case: no covariance, just lower ranks.
- assert leafType.isPrimitive() != null;
- markArrayTypesInstantiable(leafType, array.getRank(), path);
- return;
- }
-
- JRealClassType baseClass = getBaseType(leafType.isClassOrInterface());
-
- TreeLogger covariantArrayLogger =
- logger.branch(TreeLogger.DEBUG, "Covariant array types:");
-
- Set<JClassType> instantiableTypes = leafTic.instantiableTypes;
- if (instantiableTypes == null) {
- // The types are there (due to a supertype) but the Set wasn't computed, so compute it now.
- instantiableTypes = new HashSet<JClassType>();
- List<JClassType> candidates =
- getPossiblyInstantiableSubtypes(logger, baseClass, problems);
- for (JClassType candidate : candidates) {
- TypeInfoComputed tic = typeToTypeInfoComputed.get(candidate);
- if (tic != null && tic.instantiable) {
- instantiableTypes.add(candidate);
- }
- }
- }
- for (JClassType instantiableType : TypeHierarchyUtils.getAllTypesBetweenRootTypeAndLeaves(
- baseClass, instantiableTypes)) {
- if (!isAccessibleToSerializer(instantiableType)) {
- // Skip types that are not accessible from a serializer
- continue;
- }
-
- if (covariantArrayLogger.isLoggable(TreeLogger.DEBUG)) {
- covariantArrayLogger.branch(TreeLogger.DEBUG, getArrayType(typeOracle, array.getRank(),
- instantiableType).getParameterizedQualifiedSourceName());
- }
-
- markArrayTypesInstantiable(instantiableType, array.getRank(), path);
- }
- }
-
private boolean maybeInstantiable(TreeLogger logger, JClassType type, ProblemReport problems) {
boolean success =
canBeInstantiated(type, problems) && shouldConsiderFieldsForSerialization(type, problems);
@@ -1618,21 +1599,6 @@
return success;
}
- /**
- * Report problems if they are fatal or we're debugging.
- */
- private void maybeReport(TreeLogger logger, ProblemReport problems) {
- if (problems.hasFatalProblems()) {
- problems.reportFatalProblems(logger, TreeLogger.ERROR);
- }
- // if entrySucceeded, there may still be "warning" problems, but too
- // often they're expected (e.g. non-instantiable subtypes of List), so
- // we log them at DEBUG.
- // TODO(fabbott): we could blacklist or graylist those types here, so
- // instantiation during code generation would flag them for us.
- problems.report(logger, TreeLogger.DEBUG, TreeLogger.DEBUG);
- }
-
private boolean mightNotBeExposed(JGenericType baseType, int paramIndex) {
TypeParameterFlowInfo flowInfo = getFlowInfo(baseType, paramIndex);
return flowInfo.getMightNotBeExposed() || isManuallySerializable(baseType);
@@ -1653,7 +1619,8 @@
Set<JType> supersOfInstantiableTypes = new LinkedHashSet<JType>();
for (TypeInfoComputed tic : typeToTypeInfoComputed.values()) {
if (tic.isInstantiable() && tic.getType() instanceof JClassType) {
- JClassType sup = (JClassType) tic.getType().getErasedType();
+ JClassType type = (JClassType) tic.getType().getErasedType();
+ JClassType sup = type;
while (sup != null) {
supersOfInstantiableTypes.add(sup.getErasedType());
sup = sup.getErasedType().getSuperclass();
diff --git a/user/src/com/google/gwt/user/rebind/rpc/SerializationUtils.java b/user/src/com/google/gwt/user/rebind/rpc/SerializationUtils.java
index 0d6f826..17cc6a0 100644
--- a/user/src/com/google/gwt/user/rebind/rpc/SerializationUtils.java
+++ b/user/src/com/google/gwt/user/rebind/rpc/SerializationUtils.java
@@ -18,7 +18,6 @@
import com.google.gwt.core.ext.TreeLogger;
import com.google.gwt.core.ext.typeinfo.JArrayType;
import com.google.gwt.core.ext.typeinfo.JClassType;
-import com.google.gwt.core.ext.typeinfo.JEnumConstant;
import com.google.gwt.core.ext.typeinfo.JField;
import com.google.gwt.core.ext.typeinfo.JParameterizedType;
import com.google.gwt.core.ext.typeinfo.JPrimitiveType;
@@ -28,7 +27,6 @@
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
@@ -270,26 +268,6 @@
} else if (type.isArray() != null) {
JArrayType isArray = type.isArray();
generateSerializationSignature(typeOracle, isArray.getComponentType(), crc);
- } else if (type.isEnum() != null) {
- List<JEnumConstant> constants = Arrays.asList(type.isEnum().getEnumConstants());
- // Make sure the list is sorted; the getEnumConstants contract doesn't guarantees it.
- Collections.sort(constants, new Comparator<JEnumConstant>() {
- @Override
- public int compare(JEnumConstant o1, JEnumConstant o2) {
- int i1 = o1.getOrdinal();
- int i2 = o2.getOrdinal();
- if (i1 < i2) {
- return -1;
- } else if (i1 > i2) {
- return 1;
- } else {
- return 0;
- }
- }
- });
- for (JEnumConstant constant : constants) {
- crc.update(constant.getName().getBytes(Util.DEFAULT_ENCODING));
- }
} else if (type.isClassOrInterface() != null) {
JClassType isClassOrInterface = type.isClassOrInterface();
JField[] fields = getSerializableFields(typeOracle, isClassOrInterface);
diff --git a/user/src/com/google/gwt/user/rebind/ui/ImageBundleBuilder.java b/user/src/com/google/gwt/user/rebind/ui/ImageBundleBuilder.java
index 574a30d..3ad43e9 100644
--- a/user/src/com/google/gwt/user/rebind/ui/ImageBundleBuilder.java
+++ b/user/src/com/google/gwt/user/rebind/ui/ImageBundleBuilder.java
@@ -389,7 +389,7 @@
// before this point.
logger.log(TreeLogger.ERROR,
"Resource not found on classpath (is the name specified as "
- + "ClassLoader.getResource() would expect?)", null);
+ + "Class.getResource() would expect?)", null);
throw new UnableToCompleteException();
}
diff --git a/user/src/com/google/gwt/user/server/rpc/impl/SerializabilityUtil.java b/user/src/com/google/gwt/user/server/rpc/impl/SerializabilityUtil.java
index c62f0ec..2dd668d 100644
--- a/user/src/com/google/gwt/user/server/rpc/impl/SerializabilityUtil.java
+++ b/user/src/com/google/gwt/user/server/rpc/impl/SerializabilityUtil.java
@@ -219,50 +219,25 @@
}
/**
- * Resolve type variables to concrete types if possible. Otherwise, just return
- * the type variable.
+ * Return the concrete type that a generic type maps to, if known.
*
- * @param unresolved The type to resolve
+ * @param genericType The generic type to resolve.
* @param resolvedTypes A map of generic types to actual types.
* @return The actual type, which may be of any subclass of Type.
*/
- public static Type findActualType(Type unresolved,
+ public static Type findActualType(Type genericType,
DequeMap<TypeVariable<?>, Type> resolvedTypes) {
-
- // Handle simple cases quickly.
- if (!(unresolved instanceof TypeVariable<?>)) {
- return unresolved;
- }
- TypeVariable<?> var = (TypeVariable<?>) unresolved;
- Type target = resolvedTypes.get(var);
- if (target == null || target == var) {
- return var;
- }
- if (!(target instanceof TypeVariable<?>)) {
- return target;
+ Type result = genericType;
+ // Look for things that TypeVariables are mapped to, but stop if mapped
+ // to itself. We map a TypeVariable to itself when we wish to explicitly
+ // mark it as unmapped.
+ while (result instanceof TypeVariable<?> &&
+ resolvedTypes.get((TypeVariable<?>) result) != result &&
+ resolvedTypes.get((TypeVariable<?>) result) != null) {
+ result = resolvedTypes.get((TypeVariable<?>) result);
}
- // Type variables that point to other type variables might form a cycle, which
- // means they're all equivalent. Keep track of visited type variables to detect this.
- Set<TypeVariable<?>> seen = new HashSet<TypeVariable<?>>();
- seen.add(var);
- var = (TypeVariable<?>) target;
- seen.add(var);
-
- while (true) {
- target = resolvedTypes.get(var);
- if (target == null || target == var) {
- return var;
- }
- if (!(target instanceof TypeVariable<?>)) {
- return target;
- }
- var = (TypeVariable<?>) target;
- if (!seen.add(var)) {
- // Cycle detected; returning an arbitrary var in the cycle.
- return var;
- }
- }
+ return result;
}
/**
@@ -895,14 +870,6 @@
generateSerializationSignature(customSerializer, crc, policy);
} else if (instanceType.isArray()) {
generateSerializationSignature(instanceType.getComponentType(), crc, policy);
- } else if (Enum.class.isAssignableFrom(instanceType) && !Enum.class.equals(instanceType)) {
- if (!instanceType.isEnum()) {
- instanceType = instanceType.getSuperclass();
- }
- Enum<?>[] constants = instanceType.asSubclass(Enum.class).getEnumConstants();
- for (Enum<?> constant : constants) {
- crc.update(constant.name().getBytes(RPCServletUtils.CHARSET_UTF8));
- }
} else if (!instanceType.isPrimitive()) {
Field[] fields = applyFieldSerializationPolicy(instanceType);
Set<String> clientFieldNames = policy.getClientFieldNamesForEnhancedClass(instanceType);
diff --git a/user/src/com/google/gwt/user/server/rpc/impl/ServerSerializationStreamWriter.java b/user/src/com/google/gwt/user/server/rpc/impl/ServerSerializationStreamWriter.java
index 0348bdf..b1df67d 100644
--- a/user/src/com/google/gwt/user/server/rpc/impl/ServerSerializationStreamWriter.java
+++ b/user/src/com/google/gwt/user/server/rpc/impl/ServerSerializationStreamWriter.java
@@ -337,6 +337,7 @@
* JavaScript Vertical Tab character '\v' into 'v'. As such, we do not use
* the short form of the unicode escape here.
*/
+ JS_CHARS_ESCAPED['\u0000'] = '0';
JS_CHARS_ESCAPED['\b'] = 'b';
JS_CHARS_ESCAPED['\t'] = 't';
JS_CHARS_ESCAPED['\n'] = 'n';
@@ -502,9 +503,6 @@
case NON_BREAKING_HYPHEN:
// This can be expanded into a break followed by a hyphen
return true;
- case '\'': case '&': case '<': case '=': case '>':
- // These can cause HTML content sniffing
- return true;
default:
if (ch < ' ') {
// Chrome 11 mangles control characters
diff --git a/user/src/com/google/gwt/useragent/UserAgent.gwt.xml b/user/src/com/google/gwt/useragent/UserAgent.gwt.xml
index 3039a35..16a65ec 100644
--- a/user/src/com/google/gwt/useragent/UserAgent.gwt.xml
+++ b/user/src/com/google/gwt/useragent/UserAgent.gwt.xml
@@ -33,15 +33,6 @@
is-multi-valued="false" />
<set-configuration-property name="user.agent.runtimeWarning" value="true"/>
- <!--
- If set to "modern", GWT widgets will sometimes attempt to use new web API's that
- aren't yet standardized (such as prefixed API's). The "stable" setting turns this off.
- If recompiling and redeploying your GWT app when someone reports a browser bug would be
- a problem, you should choose "stable".
- -->
- <define-property name="webApiUsage" values="stable,modern"/>
- <set-property name="webApiUsage" value="modern"/>
-
<!-- Asserts that the compile time user.agent value matches the runtime -->
<!-- user.agent value -->
<entry-point class="com.google.gwt.useragent.client.UserAgentAsserter" />
diff --git a/user/src/com/google/gwt/validation/rebind/GwtSpecificValidatorCreator.java b/user/src/com/google/gwt/validation/rebind/GwtSpecificValidatorCreator.java
index 4ee9674..dfcd5a7 100644
--- a/user/src/com/google/gwt/validation/rebind/GwtSpecificValidatorCreator.java
+++ b/user/src/com/google/gwt/validation/rebind/GwtSpecificValidatorCreator.java
@@ -1112,14 +1112,14 @@
private void writeFieldWrapperMethod(SourceWriter sw, JField field) {
writeUnsafeNativeLongIfNeeded(sw, field.getType());
- // private native fieldType _fieldName(com.example.Bean object) /*-{
+ // private native fieldType _fieldName(Bean object) /*-{
sw.print("private native ");
sw.print(field.getType().getQualifiedSourceName());
sw.print(" ");
sw.print(toWrapperName(field));
sw.print("(");
- sw.print(field.getEnclosingType().getQualifiedSourceName());
+ sw.print(beanType.getName());
sw.println(" object) /*-{");
sw.indent();
diff --git a/user/src/com/google/gwt/xhr/client/XMLHttpRequest.java b/user/src/com/google/gwt/xhr/client/XMLHttpRequest.java
index 19a1d68..d3e4c95 100644
--- a/user/src/com/google/gwt/xhr/client/XMLHttpRequest.java
+++ b/user/src/com/google/gwt/xhr/client/XMLHttpRequest.java
@@ -366,18 +366,6 @@
}-*/;
/**
- * Sets withCredentials attribute.
- * <p>
- * See <a href="http://www.w3.org/TR/XMLHttpRequest/#the-withcredentials-attribute"
- * >http://www.w3.org/TR/XMLHttpRequest/#the-withcredentials-attribute</a>.
- *
- * @param withCredentials whether to include credentials in XHR
- */
- public final native void setWithCredentials(boolean withCredentials) /*-{
- this.withCredentials = withCredentials;
- }-*/;
-
- /**
* Sets the response type.
* <p>
* See <a href="http://www.w3.org/TR/XMLHttpRequest/#the-responsetype-attribute"
diff --git a/user/src/com/google/web/bindery/event/shared/SimpleEventBus.java b/user/src/com/google/web/bindery/event/shared/SimpleEventBus.java
index de48103..7e33728 100644
--- a/user/src/com/google/web/bindery/event/shared/SimpleEventBus.java
+++ b/user/src/com/google/web/bindery/event/shared/SimpleEventBus.java
@@ -214,7 +214,7 @@
List<H> l = getHandlerList(type, source);
boolean removed = l.remove(handler);
-
+ assert removed : "redundant remove call";
if (removed && l.isEmpty()) {
prune(type, source);
}
diff --git a/user/src/com/google/web/bindery/requestfactory/apt/ValidationTool.java b/user/src/com/google/web/bindery/requestfactory/apt/ValidationTool.java
index 5f54312..206b9e9 100644
--- a/user/src/com/google/web/bindery/requestfactory/apt/ValidationTool.java
+++ b/user/src/com/google/web/bindery/requestfactory/apt/ValidationTool.java
@@ -212,11 +212,7 @@
/**
* A testable "main" method.
*/
- public static boolean exec(String[] args) throws IOException {
- return exec(args, ToolProvider.getSystemJavaCompiler());
- }
-
- public static boolean exec(String[] args, JavaCompiler compiler) throws IOException {
+ static boolean exec(String[] args) throws IOException {
if (args.length < 2) {
System.err.println("java -cp requestfactory-client.jar:your_server-code.jar "
+ ValidationTool.class.getCanonicalName()
@@ -226,6 +222,7 @@
+ "for more information.");
return false;
}
+ JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
if (compiler == null) {
System.err.println("This tool must be run with a JDK, not a JRE");
return false;
diff --git a/user/src/com/google/web/bindery/requestfactory/server/RequestState.java b/user/src/com/google/web/bindery/requestfactory/server/RequestState.java
index c1d698a..93e7078 100644
--- a/user/src/com/google/web/bindery/requestfactory/server/RequestState.java
+++ b/user/src/com/google/web/bindery/requestfactory/server/RequestState.java
@@ -157,8 +157,7 @@
/**
* EntityCodex support. This method is identical to
* {@link IdFactory#getHistoryToken(SimpleProxyId)} except that it
- * base64-encodes the server ids and adds client ids for stable ids
- * that were ephemeral.
+ * base64-encodes the server ids.
* <p>
* XXX: Merge this with AbstsractRequestContext's implementation
*/
@@ -173,9 +172,6 @@
ref.setStrength(Strength.EPHEMERAL);
ref.setClientId(stableId.getClientId());
} else {
- if (stableId.wasEphemeral()) {
- ref.setClientId(stableId.getClientId());
- }
ref.setServerId(SimpleRequestProcessor.toBase64(stableId.getServerId()));
}
return AutoBeanCodex.encode(bean);
diff --git a/user/src/com/google/web/bindery/requestfactory/shared/impl/AbstractRequestContext.java b/user/src/com/google/web/bindery/requestfactory/shared/impl/AbstractRequestContext.java
index 3bcffa3..c4f68b3 100644
--- a/user/src/com/google/web/bindery/requestfactory/shared/impl/AbstractRequestContext.java
+++ b/user/src/com/google/web/bindery/requestfactory/shared/impl/AbstractRequestContext.java
@@ -1269,8 +1269,6 @@
}
processReturnOperation(id, op, toPropagate);
}
-
- assert state.returnedProxies.size() == ops.size();
}
/**
diff --git a/user/src/com/google/web/bindery/requestfactory/vm/impl/OperationData.java b/user/src/com/google/web/bindery/requestfactory/vm/impl/OperationData.java
index b63feb2..04225bf 100644
--- a/user/src/com/google/web/bindery/requestfactory/vm/impl/OperationData.java
+++ b/user/src/com/google/web/bindery/requestfactory/vm/impl/OperationData.java
@@ -15,6 +15,9 @@
*/
package com.google.web.bindery.requestfactory.vm.impl;
+import com.google.gwt.dev.asm.Type;
+import com.google.gwt.dev.asm.commons.Method;
+
/**
* Describes operations that the client may ask the server to perform.
*/
@@ -29,14 +32,18 @@
OperationData toReturn = d;
d = null;
- // Strip return types
if (toReturn.clientMethodDescriptor != null) {
- toReturn.clientMethodDescriptor =
- OperationKey.stripReturnType(toReturn.clientMethodDescriptor);
+ // Strip return types
+ Method noReturn =
+ new Method(toReturn.methodName, Type.VOID_TYPE, Type
+ .getArgumentTypes(toReturn.clientMethodDescriptor));
+ toReturn.clientMethodDescriptor = noReturn.getDescriptor();
}
if (toReturn.domainMethodDescriptor != null) {
- toReturn.domainMethodDescriptor =
- OperationKey.stripReturnType(toReturn.domainMethodDescriptor);
+ Method noReturn =
+ new Method(toReturn.methodName, Type.VOID_TYPE, Type
+ .getArgumentTypes(toReturn.domainMethodDescriptor));
+ toReturn.domainMethodDescriptor = noReturn.getDescriptor();
}
return toReturn;
@@ -94,4 +101,4 @@
public String toString() {
return getRequestContext() + "::" + getMethodName() + getDomainMethodDescriptor();
}
-}
+}
\ No newline at end of file
diff --git a/user/src/com/google/web/bindery/requestfactory/vm/impl/OperationKey.java b/user/src/com/google/web/bindery/requestfactory/vm/impl/OperationKey.java
index 84ea217..87b9d2c 100644
--- a/user/src/com/google/web/bindery/requestfactory/vm/impl/OperationKey.java
+++ b/user/src/com/google/web/bindery/requestfactory/vm/impl/OperationKey.java
@@ -15,6 +15,8 @@
*/
package com.google.web.bindery.requestfactory.vm.impl;
+import com.google.gwt.dev.asm.Type;
+import com.google.gwt.dev.asm.commons.Method;
import com.google.gwt.dev.util.StringKey;
import com.google.gwt.user.server.Base64Utils;
@@ -51,13 +53,9 @@
}
}
- static String stripReturnType(String descriptor) {
- assert descriptor.contains(")") : descriptor + " does not look like a method descriptor";
- return descriptor.substring(0, descriptor.lastIndexOf(')')) + ")V";
- }
-
private static String key(String requestContextBinaryName, String methodName, String descriptor) {
- String raw = requestContextBinaryName + "::" + methodName + stripReturnType(descriptor);
+ Method m = new Method(methodName, Type.VOID_TYPE, Type.getArgumentTypes(descriptor));
+ String raw = requestContextBinaryName + "::" + methodName + m.getDescriptor();
return raw.length() >= HASH_LENGTH ? hash(raw) : raw;
}
diff --git a/user/src/com/google/web/bindery/requestfactory/vm/testing/UrlRequestTransport.java b/user/src/com/google/web/bindery/requestfactory/vm/testing/UrlRequestTransport.java
index 183d399..06b4f12 100644
--- a/user/src/com/google/web/bindery/requestfactory/vm/testing/UrlRequestTransport.java
+++ b/user/src/com/google/web/bindery/requestfactory/vm/testing/UrlRequestTransport.java
@@ -19,11 +19,14 @@
import com.google.web.bindery.requestfactory.shared.RequestTransport;
import com.google.web.bindery.requestfactory.shared.ServerFailure;
+import org.json.Cookie;
+import org.json.JSONException;
+import org.json.JSONObject;
+
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
-import java.net.HttpCookie;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
@@ -94,22 +97,18 @@
List<String> cookieHeaders = connection.getHeaderFields().get("Set-Cookie");
if (cookieHeaders != null) {
for (String header : cookieHeaders) {
- List<HttpCookie> headerCookies;
try {
- headerCookies = HttpCookie.parse(header);
- } catch (IllegalArgumentException e) {
- // if we can't parse it, ignore it
- continue;
- }
-
- for (HttpCookie cookie : headerCookies) {
- String domain = cookie.getDomain();
+ JSONObject cookie = Cookie.toJSONObject(header);
+ String name = cookie.getString("name");
+ String value = cookie.getString("value");
+ String domain = cookie.optString("Domain");
if (domain == null || url.getHost().endsWith(domain)) {
- String path = cookie.getPath();
+ String path = cookie.optString("Path");
if (path == null || url.getPath().startsWith(path)) {
- cookies.put(cookie.getName(), cookie.getValue());
+ cookies.put(name, value);
}
}
+ } catch (JSONException ignored) {
}
}
}
diff --git a/user/super/com/google/gwt/emul/java/lang/Number.java b/user/super/com/google/gwt/emul/java/lang/Number.java
index ab89197..04a85e1 100644
--- a/user/super/com/google/gwt/emul/java/lang/Number.java
+++ b/user/super/com/google/gwt/emul/java/lang/Number.java
@@ -74,12 +74,12 @@
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, // base 22-35
5 // base 36
};
-
+
/**
* A table of values radix*maxDigitsForRadix[radix].
*/
private static final int[] maxDigitsRadixPower = new int[37];
-
+
/**
* The largest number of digits (excluding minus sign and leading zeros) that
* can fit into a long for a given radix between 2 and 36, inclusive.
@@ -121,12 +121,12 @@
13, // base 35
13 // base 36
};
-
+
/**
* A table of floor(MAX_VALUE / maxDigitsRadixPower).
*/
private static final long[] maxValueForRadix = new long[37];
-
+
static {
for (int i = 2; i <= 36; i++) {
maxDigitsRadixPower[i] = (int) Math.pow(i, maxDigitsForRadix[i]);
@@ -183,21 +183,27 @@
* This function contains common logic for parsing a String as a floating-
* point number and validating the range.
*/
- protected static double __parseAndValidateDouble(String s) throws NumberFormatException {
- if (!__isValidDouble(s)) {
+ protected static double __parseAndValidateDouble(String s)
+ throws NumberFormatException {
+
+ double toReturn = __parseDouble(s);
+
+ if (__isNaN(toReturn)) {
throw NumberFormatException.forInputString(s);
}
- return __parseDouble(s);
- }
+ return toReturn;
+ }
+
/**
* @skip
*
* This function contains common logic for parsing a String in a given radix
* and validating the result.
*/
- protected static int __parseAndValidateInt(String s, int radix, int lowerBound, int upperBound)
- throws NumberFormatException {
+ protected static int __parseAndValidateInt(String s, int radix,
+ int lowerBound, int upperBound) throws NumberFormatException {
+
if (s == null) {
throw new NumberFormatException("null");
}
@@ -223,14 +229,16 @@
return toReturn;
}
-
+
/**
* @skip
*
* This function contains common logic for parsing a String in a given radix
* and validating the result.
*/
- protected static long __parseAndValidateLong(String s, int radix) throws NumberFormatException {
+ protected static long __parseAndValidateLong(String s, int radix)
+ throws NumberFormatException {
+
if (s == null) {
throw new NumberFormatException("null");
}
@@ -238,8 +246,6 @@
throw new NumberFormatException("radix " + radix + " out of range");
}
- final String orig = s;
-
int length = s.length();
boolean negative = (length > 0) && (s.charAt(0) == '-');
if (negative) {
@@ -247,7 +253,7 @@
length--;
}
if (length == 0) {
- throw NumberFormatException.forInputString(orig);
+ throw NumberFormatException.forInputString(s);
}
// Strip leading zeros
@@ -255,13 +261,13 @@
s = s.substring(1);
length--;
}
-
+
// Immediately eject numbers that are too long -- this avoids more complex
// overflow handling below
if (length > __ParseLong.maxLengthForRadix[radix]) {
- throw NumberFormatException.forInputString(orig);
+ throw NumberFormatException.forInputString(s);
}
-
+
// Validate the digits
int maxNumericDigit = '0' + Math.min(radix, 10);
int maxLowerCaseDigit = radix + 'a' - 10;
@@ -277,56 +283,50 @@
if (c >= 'A' && c < maxUpperCaseDigit) {
continue;
}
- throw NumberFormatException.forInputString(orig);
+ throw NumberFormatException.forInputString(s);
}
long toReturn = 0;
int maxDigits = __ParseLong.maxDigitsForRadix[radix];
long radixPower = __ParseLong.maxDigitsRadixPower[radix];
- long minValue = -__ParseLong.maxValueForRadix[radix];
-
+ long maxValue = __ParseLong.maxValueForRadix[radix];
+
boolean firstTime = true;
int head = length % maxDigits;
if (head > 0) {
- // accumulate negative numbers, as -Long.MAX_VALUE == Long.MIN_VALUE + 1
- // (in other words, -Long.MIN_VALUE overflows, see issue 7308)
- toReturn = - __parseInt(s.substring(0, head), radix);
+ toReturn = __parseInt(s.substring(0, head), radix);
s = s.substring(head);
length -= head;
firstTime = false;
}
-
+
while (length >= maxDigits) {
head = __parseInt(s.substring(0, maxDigits), radix);
s = s.substring(maxDigits);
length -= maxDigits;
if (!firstTime) {
// Check whether multiplying by radixPower will overflow
- if (toReturn < minValue) {
+ if (toReturn > maxValue) {
throw new NumberFormatException(s);
}
- toReturn *= radixPower;
+ toReturn *= radixPower;
} else {
firstTime = false;
}
- toReturn -= head;
+ toReturn += head;
}
- // A positive value means we overflowed Long.MIN_VALUE
- if (toReturn > 0) {
- throw NumberFormatException.forInputString(orig);
+ // A negative value means we overflowed Long.MAX_VALUE
+ if (toReturn < 0) {
+ throw NumberFormatException.forInputString(s);
}
- if (!negative) {
+ if (negative) {
toReturn = -toReturn;
- // A negative value means we overflowed Long.MAX_VALUE
- if (toReturn < 0) {
- throw NumberFormatException.forInputString(orig);
- }
}
return toReturn;
}
-
+
/**
* @skip
*/
@@ -337,26 +337,21 @@
/**
* @skip
*
- * @param str
- * @return {@code true} if the string matches {@link #floatRegex}, {@code false} otherwise
+ * @return The floating-point representation of <code>str</code> or
+ * <code>Number.NaN</code> if the string does not match
+ * {@link #floatRegex}.
*/
- private static native boolean __isValidDouble(String str) /*-{
+ private static native double __parseDouble(String str) /*-{
var floatRegex = @java.lang.Number::floatRegex;
if (!floatRegex) {
// Disallow '.' with no digits on either side
- floatRegex = @java.lang.Number::floatRegex =
- /^\s*[+-]?(NaN|Infinity|((\d+\.?\d*)|(\.\d+))([eE][+-]?\d+)?[dDfF]?)\s*$/;
+ floatRegex = @java.lang.Number::floatRegex = /^\s*[+-]?((\d+\.?\d*)|(\.\d+))([eE][+-]?\d+)?[dDfF]?\s*$/i;
}
- return floatRegex.test(str);
- }-*/;
-
- /**
- * @skip
- *
- * @return The floating-point representation of <code>str</code>.
- */
- private static native double __parseDouble(String str) /*-{
- return parseFloat(str);
+ if (floatRegex.test(str)) {
+ return parseFloat(str);
+ } else {
+ return Number.NaN;
+ }
}-*/;
/**
diff --git a/user/super/com/google/gwt/emul/java/lang/String.java b/user/super/com/google/gwt/emul/java/lang/String.java
index 6fab967..032e04c 100644
--- a/user/super/com/google/gwt/emul/java/lang/String.java
+++ b/user/super/com/google/gwt/emul/java/lang/String.java
@@ -764,9 +764,10 @@
* TODO(jat): properly handle Java regex syntax
*/
public native boolean matches(String regex) /*-{
- // We surround the regex with '^' and '$' because it must match
- // the entire string.
- return new RegExp('^(' + regex + ')$').test(this);
+ var matchObj = new RegExp(regex).exec(this);
+ // if there is no match at all, matchObj will be null
+ // matchObj[0] is the entire matched string
+ return (matchObj == null) ? false : (this == matchObj[0]);
}-*/;
public int offsetByCodePoints(int index, int codePointOffset) {
diff --git a/user/super/com/google/gwt/emul/java/math/BigDecimal.java b/user/super/com/google/gwt/emul/java/math/BigDecimal.java
index ffbdfb7..7cc988b 100644
--- a/user/super/com/google/gwt/emul/java/math/BigDecimal.java
+++ b/user/super/com/google/gwt/emul/java/math/BigDecimal.java
@@ -2615,10 +2615,18 @@
throw new NumberFormatException("For input string: \"" + val + "\"");
}
}
+ int counter = 0;
+ boolean wasNonZero = false;
// Accumulating all digits until a possible decimal point
- while ((offset < last) && (val.charAt(offset) != '.')
- && (val.charAt(offset) != 'e') && (val.charAt(offset) != 'E')) {
- offset++;
+ for (; (offset < last) && (val.charAt(offset) != '.')
+ && (val.charAt(offset) != 'e') && (val.charAt(offset) != 'E'); offset++) {
+ if (!wasNonZero) {
+ if (val.charAt(offset) == '0') {
+ counter++;
+ } else {
+ wasNonZero = true;
+ }
+ }
}
unscaledBuffer.append(val, begin, offset);
// A decimal point was found
@@ -2626,9 +2634,15 @@
offset++;
// Accumulating all digits until a possible exponent
begin = offset;
- while ((offset < last) && (val.charAt(offset) != 'e')
- && (val.charAt(offset) != 'E')) {
- offset++;
+ for (; (offset < last) && (val.charAt(offset) != 'e')
+ && (val.charAt(offset) != 'E'); offset++) {
+ if (!wasNonZero) {
+ if (val.charAt(offset) == '0') {
+ counter++;
+ } else {
+ wasNonZero = true;
+ }
+ }
}
scale = offset - begin;
unscaledBuffer.append(val, begin, offset);
@@ -2667,7 +2681,7 @@
} else {
setUnscaledValue(new BigInteger(unscaled));
}
- precision = unscaledBuffer.length();
+ precision = unscaledBuffer.length() - counter;
// Don't count leading zeros in the precision
for (int i = 0; i < unscaledBuffer.length(); ++i) {
char ch = unscaledBuffer.charAt(i);
@@ -2676,10 +2690,6 @@
}
--precision;
}
- // The precision of a zero value is 1
- if (precision == 0) {
- precision = 1;
- }
}
/**
diff --git a/user/super/com/google/gwt/emul/java/util/AbstractMap.java b/user/super/com/google/gwt/emul/java/util/AbstractMap.java
index bdeb8ee..93606f5 100644
--- a/user/super/com/google/gwt/emul/java/util/AbstractMap.java
+++ b/user/super/com/google/gwt/emul/java/util/AbstractMap.java
@@ -207,7 +207,6 @@
K k = entry.getKey();
if (key == null ? k == null : key.equals(k)) {
if (remove) {
- entry = new MapEntryImpl<K, V>(entry.getKey(), entry.getValue());
iter.remove();
}
return entry;
diff --git a/user/super/com/google/gwt/junit/translatable/com/google/gwt/junit/client/impl/GWTRunner.java b/user/super/com/google/gwt/junit/translatable/com/google/gwt/junit/client/impl/GWTRunner.java
index b4a1791..bf2a6bf 100644
--- a/user/super/com/google/gwt/junit/translatable/com/google/gwt/junit/client/impl/GWTRunner.java
+++ b/user/super/com/google/gwt/junit/translatable/com/google/gwt/junit/client/impl/GWTRunner.java
@@ -334,8 +334,7 @@
builder.setParameter(SESSIONID_QUERY_PARAM,
String.valueOf(clientInfo.getSessionId()));
}
- // Replace "%3A" with ":" as a hack to support broken DevMode plugins.
- Window.Location.replace(builder.buildString().replaceAll("%3A", ":"));
+ Window.Location.replace(builder.buildString());
currentBlock = null;
currentTestIndex = 0;
}
diff --git a/user/test/com/google/gwt/animation/AnimationApiUsage.gwt.xml b/user/test/com/google/gwt/animation/AnimationApiUsage.gwt.xml
deleted file mode 100644
index b8afd4c..0000000
--- a/user/test/com/google/gwt/animation/AnimationApiUsage.gwt.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<!-- -->
-<!-- Copyright 2013 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 -->
-<!-- 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. License for the specific language governing permissions and -->
-<!-- limitations under the License. -->
-
-<!-- Module used to test Animation API usage. -->
-<module>
- <inherits name="com.google.gwt.animation.Animation"/>
- <set-property name="webApiUsage" value="stable"/>
-</module>
\ No newline at end of file
diff --git a/user/test/com/google/gwt/animation/AnimationSuite.java b/user/test/com/google/gwt/animation/AnimationSuite.java
index 8302101..ef8551f 100644
--- a/user/test/com/google/gwt/animation/AnimationSuite.java
+++ b/user/test/com/google/gwt/animation/AnimationSuite.java
@@ -15,7 +15,6 @@
*/
package com.google.gwt.animation;
-import com.google.gwt.animation.client.AnimationApiUsageTest;
import com.google.gwt.animation.client.AnimationSchedulerImplTimerTest;
import com.google.gwt.animation.client.AnimationTest;
@@ -29,7 +28,6 @@
public static Test suite() {
TestSuite suite = new TestSuite("Tests of the animation package");
- suite.addTestSuite(AnimationApiUsageTest.class);
suite.addTestSuite(AnimationSchedulerImplTimerTest.class);
suite.addTestSuite(AnimationTest.class);
diff --git a/user/test/com/google/gwt/animation/client/AnimationApiUsageTest.java b/user/test/com/google/gwt/animation/client/AnimationApiUsageTest.java
deleted file mode 100644
index 27a6c64..0000000
--- a/user/test/com/google/gwt/animation/client/AnimationApiUsageTest.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright 2013 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.animation.client;
-
-import com.google.gwt.junit.client.GWTTestCase;
-
-/**
- * Verifies that we always use timers in 'resistance' mode.
- */
-public class AnimationApiUsageTest extends GWTTestCase {
- @Override
- public String getModuleName() {
- return "com.google.gwt.animation.AnimationApiUsage";
- }
-
- public void testAnimationSchedulerUsesTimer() {
- AnimationScheduler scheduler = AnimationScheduler.get();
- assertEquals("Expected timer implementation but got: " + scheduler.getClass().getName(),
- AnimationSchedulerImplTimer.class, scheduler.getClass());
- }
-}
diff --git a/user/test/com/google/gwt/canvas/dom/client/Context2dTest.java b/user/test/com/google/gwt/canvas/dom/client/Context2dTest.java
index 3925bd7..49a6aa0 100644
--- a/user/test/com/google/gwt/canvas/dom/client/Context2dTest.java
+++ b/user/test/com/google/gwt/canvas/dom/client/Context2dTest.java
@@ -199,8 +199,8 @@
}
Context2d context = canvas1.getContext2d();
- context.setFont("40px \"Times New Roman\"");
- assertEquals("40px \"Times New Roman\"", context.getFont());
+ context.setFont("40px Times New Roman");
+ assertEquals("40px Times New Roman", context.getFont());
}
public void testGlobalAlpha() {
diff --git a/user/test/com/google/gwt/cell/client/ImageLoadingCellTest.java b/user/test/com/google/gwt/cell/client/ImageLoadingCellTest.java
index 9c4e477..87d7beb 100644
--- a/user/test/com/google/gwt/cell/client/ImageLoadingCellTest.java
+++ b/user/test/com/google/gwt/cell/client/ImageLoadingCellTest.java
@@ -36,7 +36,7 @@
// Render the html.
Element elem = Document.get().createDivElement();
- elem.setInnerSafeHtml(sb.toSafeHtml());
+ elem.setInnerHTML(sb.toSafeHtml().asString());
// Verify the image.
assertEquals(2, elem.getChildCount());
@@ -56,7 +56,7 @@
// Render the html.
Element elem = Document.get().createDivElement();
- elem.setInnerSafeHtml(sb.toSafeHtml());
+ elem.setInnerHTML(sb.toSafeHtml().asString());
// Verify the image.
assertEquals(2, elem.getChildCount());
diff --git a/user/test/com/google/gwt/core/client/ScriptInjectorTest.java b/user/test/com/google/gwt/core/client/ScriptInjectorTest.java
index f245a1c..7596688 100644
--- a/user/test/com/google/gwt/core/client/ScriptInjectorTest.java
+++ b/user/test/com/google/gwt/core/client/ScriptInjectorTest.java
@@ -204,8 +204,7 @@
this.delayTestFinish(TEST_DELAY);
final String scriptUrl = "script_injector_test4.js";
assertFalse(nativeTest4Worked());
- final JavaScriptObject injectedElement =
- ScriptInjector.fromUrl(scriptUrl).setRemoveTag(false).inject();
+ final JavaScriptObject injectedElement = ScriptInjector.fromUrl(scriptUrl).inject();
// We'll check using a callback in another test. This test will poll to see
// that the script had an effect.
@@ -243,8 +242,8 @@
delayTestFinish(TEST_DELAY);
final String scriptUrl = "script_injector_test5.js";
assertFalse(nativeTest5Worked());
- JavaScriptObject injectedElement = ScriptInjector.fromUrl(scriptUrl).setRemoveTag(false)
- .setCallback(new Callback<Void, Exception>() {
+ JavaScriptObject injectedElement =
+ ScriptInjector.fromUrl(scriptUrl).setCallback(new Callback<Void, Exception>() {
@Override
public void onFailure(Exception reason) {
assertNotNull(reason);
@@ -273,8 +272,8 @@
public void testInjectUrlTopWindow() {
final String scriptUrl = "script_injector_test6.js";
assertFalse(nativeTest6Worked());
- JavaScriptObject injectedElement = ScriptInjector.fromUrl(scriptUrl).setRemoveTag(false)
- .setWindow(ScriptInjector.TOP_WINDOW).inject();
+ JavaScriptObject injectedElement =
+ ScriptInjector.fromUrl(scriptUrl).setWindow(ScriptInjector.TOP_WINDOW).inject();
// We'll check using a callback in another test. This test will poll to see
// that the script had an effect.
Scheduler.get().scheduleFixedDelay(new RepeatingCommand() {
@@ -310,8 +309,8 @@
delayTestFinish(TEST_DELAY);
final String scriptUrl = "script_injector_test7.js";
assertFalse(nativeTest7Worked());
- JavaScriptObject injectedElement = ScriptInjector.fromUrl(scriptUrl).setRemoveTag(false)
- .setWindow(ScriptInjector.TOP_WINDOW).setCallback(
+ JavaScriptObject injectedElement =
+ ScriptInjector.fromUrl(scriptUrl).setWindow(ScriptInjector.TOP_WINDOW).setCallback(
new Callback<Void, Exception>() {
@Override
diff --git a/user/test/com/google/gwt/core/client/impl/SchedulerImplTest.java b/user/test/com/google/gwt/core/client/impl/SchedulerImplTest.java
index 86a4abd..47f70ad 100644
--- a/user/test/com/google/gwt/core/client/impl/SchedulerImplTest.java
+++ b/user/test/com/google/gwt/core/client/impl/SchedulerImplTest.java
@@ -15,7 +15,6 @@
*/
package com.google.gwt.core.client.impl;
-import com.google.gwt.core.client.Duration;
import com.google.gwt.core.client.JsArray;
import com.google.gwt.core.client.Scheduler.RepeatingCommand;
import com.google.gwt.core.client.Scheduler.ScheduledCommand;
@@ -76,22 +75,6 @@
void schedule(ScheduledCommand cmd);
}
- private static class RepeatingCommandImpl implements RepeatingCommand {
- private boolean firstTime = true;
- private boolean commandRanSecondTime = false;
-
- @Override
- public boolean execute() {
- // Command needs to run for the second time to be executed in runScheduledTasks
- if (firstTime) {
- firstTime = false;
- return true;
- }
- commandRanSecondTime = true;
- return false;
- }
- }
-
private static final int TEST_DELAY = 5000;
@Override
@@ -123,45 +106,6 @@
delayTestFinish(TEST_DELAY);
}
- /**
- * This test could potentially timeout since loop in {@link SchedulerImpl#runRepeatingTasks} would
- * run indefinitely since we are mocking Duration to always return zero.
- *
- * see for details: https://code.google.com/p/google-web-toolkit/issues/detail?id=7307
- */
- public void testEarlyBreakIfAllTaskAreFinished() {
- final SchedulerImpl impl = new SchedulerImpl() {
- @Override
- Duration createDuration() {
- return new Duration() {
- @Override
- public int elapsedMillis() {
- // never expire
- return 0;
- }
- };
- }
- };
-
- final RepeatingCommandImpl command = new RepeatingCommandImpl();
-
- impl.scheduleIncremental(command);
-
- impl.scheduleDeferred(new ScheduledCommand() {
- @Override
- public void execute() {
-
- if (command.commandRanSecondTime) {
- finishTest();
- } else {
- impl.scheduleDeferred(this);
- }
- }
- });
-
- delayTestFinish(TEST_DELAY);
- }
-
public void testEntryCommands() {
final SchedulerImpl impl = new SchedulerImpl();
diff --git a/user/test/com/google/gwt/core/client/impl/StackTraceCreatorTest.java b/user/test/com/google/gwt/core/client/impl/StackTraceCreatorTest.java
index 6b71d59..e4bfe0d 100644
--- a/user/test/com/google/gwt/core/client/impl/StackTraceCreatorTest.java
+++ b/user/test/com/google/gwt/core/client/impl/StackTraceCreatorTest.java
@@ -192,10 +192,6 @@
c.extractName(" at Type.functionName (file.js:1:2)"));
assertEquals("functionName@@file.js:1:2",
c.extractName(" at Type.functionName [as methodName] (file.js:1:2)"));
-
- // iOS style
- assertEquals("functionName@@file.js:1",
- c.extractName("functionName@file.js:1"));
}
public void testFirefox14ExtractName() {
diff --git a/user/test/com/google/gwt/dev/jjs/test/CompilerTest.java b/user/test/com/google/gwt/dev/jjs/test/CompilerTest.java
index 4107144..e480282 100644
--- a/user/test/com/google/gwt/dev/jjs/test/CompilerTest.java
+++ b/user/test/com/google/gwt/dev/jjs/test/CompilerTest.java
@@ -16,7 +16,6 @@
package com.google.gwt.dev.jjs.test;
import com.google.gwt.core.client.JavaScriptException;
-import com.google.gwt.dev.jjs.test.compilertests.MethodNamedSameAsClass;
import com.google.gwt.junit.client.GWTTestCase;
import junit.framework.Assert;
@@ -952,7 +951,6 @@
ai = foo;
}
- @SuppressWarnings("ReturnValueIgnored")
@Override
public String toString() {
// this line used to cause ICE due to no synthetic path to bar
@@ -969,14 +967,6 @@
assertEquals(result, "foofoofoofoo");
}
- /**
- * test for issue 7824.
- */
- public void testMethodNamedSameAsClass() {
- MethodNamedSameAsClass obj = new MethodNamedSameAsClass();
- obj.MethodNamedSameAsClass();
- }
-
public void testNotOptimizations() {
assertFalse(!true);
assertTrue(!false);
diff --git a/user/test/com/google/gwt/dev/jjs/test/InnerClassTest.java b/user/test/com/google/gwt/dev/jjs/test/InnerClassTest.java
index 9b8e651..072974a 100644
--- a/user/test/com/google/gwt/dev/jjs/test/InnerClassTest.java
+++ b/user/test/com/google/gwt/dev/jjs/test/InnerClassTest.java
@@ -111,90 +111,12 @@
}
}
-
- /**
- * Used in test {@link #testExtendsNested()}
- */
- private static class ESOuter {
- class ESInner {
- public int value;
- public ESInner() {
- value = 1;
- }
- public ESInner(int value) {
- this.value = value;
- }
- }
-
- public ESInner newESInner() {
- return new ESInner();
- }
- }
-
- private static class ESInnerSubclass extends ESOuter.ESInner {
- ESInnerSubclass(ESOuter outer) {
- outer.super();
- }
-
- ESInnerSubclass(int value, ESOuter outer) {
- outer.super(value);
- }
- }
-
- /**
- * Used in test {@link #testExtendsNestedWithGenerics()}
- */
- private static class ESWGOuter<T> {
- class ESWGInner {
- public int value;
- public ESWGInner() {
- value = 1;
- }
- public ESWGInner(int value) {
- this.value = value;
- }
- }
-
- public ESWGInner newESWGInner() {
- return new ESWGInner();
- }
- }
-
- private static class ESWGInnerSubclass extends ESWGOuter<String>.ESWGInner {
- ESWGInnerSubclass(ESWGOuter<String> outer) {
- outer.super();
- }
-
- ESWGInnerSubclass(int value, ESWGOuter<String> outer) {
- outer.super(value);
- }
- }
-
private StringBuffer testAppend = new StringBuffer();
public String getModuleName() {
return "com.google.gwt.dev.jjs.CompilerSuite";
}
- public void testExtendsNested() {
- ESOuter o = new ESOuter();
- assertEquals(1, o.new ESInner().value);
- assertEquals(2, o.new ESInner(2).value);
- assertEquals(1, new ESInnerSubclass(o).value);
- assertEquals(2, new ESInnerSubclass(2, o).value);
- }
-
- /**
- * Test for Issue 7789
- */
- public void testExtendsNestedWithGenerics() {
- ESWGOuter<String> o = new ESWGOuter<String>();
- assertEquals(1, o.new ESWGInner().value);
- assertEquals(2, o.new ESWGInner(2).value);
- assertEquals(1, new ESWGInnerSubclass(o).value);
- assertEquals(2, new ESWGInnerSubclass(2, o).value);
- }
-
public void testInnerClassCtors() {
P1<?> p1 = new P1<Object>();
assertEquals(1, p1.value);
diff --git a/user/test/com/google/gwt/dev/jjs/test/JsoTest.java b/user/test/com/google/gwt/dev/jjs/test/JsoTest.java
index 059d1c9..5bf60b0 100644
--- a/user/test/com/google/gwt/dev/jjs/test/JsoTest.java
+++ b/user/test/com/google/gwt/dev/jjs/test/JsoTest.java
@@ -370,7 +370,7 @@
assertFalse(o instanceof String);
try {
String s = (String) o;
- s = s.toString();
+ s.toString();
fail("Expected ClassCastException");
} catch (ClassCastException expected) {
}
diff --git a/user/test/com/google/gwt/dev/jjs/test/VarargsTest.java b/user/test/com/google/gwt/dev/jjs/test/VarargsTest.java
index a615d1f..0285390 100644
--- a/user/test/com/google/gwt/dev/jjs/test/VarargsTest.java
+++ b/user/test/com/google/gwt/dev/jjs/test/VarargsTest.java
@@ -28,7 +28,6 @@
return "com.google.gwt.dev.jjs.CompilerSuite";
}
- @SuppressWarnings("all")
public void testNullEmpty() {
assertNotNull(vararg());
assertNull(vararg(null));
diff --git a/user/test/com/google/gwt/dev/jjs/test/compilertests/MethodNamedSameAsClass.java b/user/test/com/google/gwt/dev/jjs/test/compilertests/MethodNamedSameAsClass.java
deleted file mode 100644
index bdfe2f8..0000000
--- a/user/test/com/google/gwt/dev/jjs/test/compilertests/MethodNamedSameAsClass.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright 2013 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.dev.jjs.test.compilertests;
-
-/**
- * Test for issue 7824
- */
-public class MethodNamedSameAsClass {
- public void MethodNamedSameAsClass() { }
-}
diff --git a/user/test/com/google/gwt/dev/shell/test/MultiModuleTest.java b/user/test/com/google/gwt/dev/shell/test/MultiModuleTest.java
index 8eb5f6f..ff3a48c 100644
--- a/user/test/com/google/gwt/dev/shell/test/MultiModuleTest.java
+++ b/user/test/com/google/gwt/dev/shell/test/MultiModuleTest.java
@@ -23,6 +23,7 @@
import com.google.gwt.user.client.ui.VerticalPanel;
import java.util.HashMap;
+import java.util.Iterator;
import java.util.Map;
/**
@@ -110,14 +111,14 @@
*/
public void testInnerModules() {
String url = getURL();
- Map<String, String> params = getURLParams(url);
+ Map params = getURLParams(url);
if (!params.containsKey("gwt.junit.testfuncname")) {
// if this test is being run as a normal JUnit test, return success
return;
}
// we were invoked by testMultipleModules, get the frame to load
- String frameName = params.get("frame");
+ String frameName = (String) params.get("frame");
VerticalPanel panel = new VerticalPanel();
RootPanel.get().add(panel);
@@ -166,7 +167,7 @@
// build new URL from current one
String url = getURL();
- Map<String, String> params = getURLParams(url);
+ Map params = getURLParams(url);
params.put("frame", "top");
params.put("gwt.junit.testclassname", MultiModuleTest.class.getName());
params.put("gwt.junit.testfuncname", "testInnerModules");
@@ -206,7 +207,7 @@
* @param params a map of parameter names to values
* @return the revised URL
*/
- private String buildURL(String url, Map<String, String> params) {
+ private String buildURL(String url, Map params) {
// strip off the query string if present
int pos = url.indexOf("?");
@@ -224,8 +225,9 @@
}
// now add the rest of the parameters, excluding gwt.hybrid
- for (Map.Entry<String, String> entry : params.entrySet()) {
- String param = entry.getKey();
+ for (Iterator it = params.entrySet().iterator(); it.hasNext();) {
+ Map.Entry entry = (Map.Entry) it.next();
+ String param = (String) entry.getKey();
if (param.equals("gwt.hybrid")) {
// we already included gwt.hybrid if it was present
@@ -242,7 +244,7 @@
url += param;
// add the value if necessary
- String value = entry.getValue();
+ String value = (String) entry.getValue();
if (value != null) {
url += "=" + value;
}
@@ -266,7 +268,7 @@
*/
private void doneLoading() {
String url = getURL();
- Map<String, String> params = getURLParams(url);
+ Map params = getURLParams(url);
mainPanel.add(new Label("done loading"));
if (++state == 4) {
// all tests complete, notify parent
@@ -304,8 +306,8 @@
* @param url the full or partial (ie, only location.search) URL to parse
* @return the map of parameter names to values
*/
- private Map<String, String> getURLParams(String url) {
- HashMap<String, String> map = new HashMap<String, String>();
+ private Map getURLParams(String url) {
+ HashMap map = new HashMap();
int pos = url.indexOf("?");
// loop precondition: pos is the index of the next ? or & character in url
@@ -370,7 +372,7 @@
*
* @param frameNumber the number of the frame to replace, starting with 0
*/
- private void toggleFrame(int frameNumber, String url, Map<String, String> params) {
+ private void toggleFrame(int frameNumber, String url, Map params) {
params.put("frame", (frameNumber + 1) + (frameB[frameNumber] ? "a" : "b"));
frame[frameNumber].setUrl(buildURL(url, params));
frameB[frameNumber] = !frameB[frameNumber];
diff --git a/user/test/com/google/gwt/dom/client/ElementTest.java b/user/test/com/google/gwt/dom/client/ElementTest.java
index a1e6145..f1e1950 100644
--- a/user/test/com/google/gwt/dom/client/ElementTest.java
+++ b/user/test/com/google/gwt/dom/client/ElementTest.java
@@ -40,45 +40,15 @@
div.setClassName("foo");
assertEquals("foo", div.getClassName());
- assertTrue(div.addClassName("bar"));
+ div.addClassName("bar");
assertEquals("foo bar", div.getClassName());
- assertTrue(div.addClassName("baz"));
- assertEquals("foo bar baz", div.getClassName());
-
- assertFalse(div.addClassName("baz"));
+ div.addClassName("baz");
assertEquals("foo bar baz", div.getClassName());
div.replaceClassName("bar", "tintin");
assertTrue(div.getClassName().contains("tintin"));
assertFalse(div.getClassName().contains("bar"));
-
- assertTrue(div.removeClassName("tintin"));
- assertEquals("foo baz", div.getClassName());
-
- assertFalse(div.removeClassName("bar"));
- assertEquals("foo baz", div.getClassName());
-
- assertTrue(div.removeClassName("baz"));
- assertEquals("foo", div.getClassName());
-
- assertTrue(div.removeClassName("foo"));
- assertEquals("", div.getClassName());
- }
-
- public void testIndexOfName() {
- assertEquals(-1, Element.indexOfName("", "foo"));
-
- assertEquals(-1, Element.indexOfName("foo", "fo"));
- assertEquals(-1, Element.indexOfName("foo", "fool"));
-
- assertEquals(-1, Element.indexOfName("bar fool", "foo"));
- assertEquals(-1, Element.indexOfName("bar fool baz", "foo"));
-
- assertEquals(0, Element.indexOfName("foo", "foo"));
- assertEquals(0, Element.indexOfName("foo bar", "foo"));
- assertEquals(4, Element.indexOfName("bar foo", "foo"));
- assertEquals(4, Element.indexOfName("bar foo baz", "foo"));
}
/**
diff --git a/user/test/com/google/gwt/editor/client/EditorErrorTest.java b/user/test/com/google/gwt/editor/client/EditorErrorTest.java
index 0bd7a75..755ebef 100644
--- a/user/test/com/google/gwt/editor/client/EditorErrorTest.java
+++ b/user/test/com/google/gwt/editor/client/EditorErrorTest.java
@@ -1,12 +1,12 @@
/*
* Copyright 2010 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
@@ -39,43 +39,25 @@
private EditorDelegate<Address> delegate;
- @Override
public void flush() {
delegate.recordError("Hello Errors!", null, null);
}
- @Override
public void onPropertyChange(String... paths) {
}
- @Override
public void setDelegate(EditorDelegate<Address> delegate) {
this.delegate = delegate;
}
- @Override
public void setValue(Address value) {
}
}
- class AddressEditorReceivesErrors extends AddressEditor implements
- HasEditorErrors<Address> {
- List<EditorError> errors;
-
- @Override
- public void showErrors(List<EditorError> errors) {
- this.errors = errors;
- for (EditorError error : errors) {
- error.setConsumed(true);
- }
- }
- }
-
class PersonEditorReceivesErrors extends PersonEditor implements
HasEditorErrors<Person> {
List<EditorError> errors;
- @Override
public void showErrors(List<EditorError> errors) {
this.errors = errors;
for (EditorError error : errors) {
@@ -104,7 +86,6 @@
private List<EditorError> errors;
- @Override
public void showErrors(List<EditorError> errors) {
this.errors = errors;
}
@@ -126,7 +107,6 @@
List<EditorError> errors;
- @Override
public void showErrors(List<EditorError> errors) {
this.errors = errors;
}
@@ -287,7 +267,7 @@
assertEquals(driver.getErrors().toString(), 8, driver.getErrors().size());
List<EditorError> list = driver.getErrors();
-
+
// All the errors w/ addressEditor are collected first
EditorError error = list.get(0);
assertEquals("msg1", error.getMessage());
@@ -304,7 +284,7 @@
assertSame(e4, error.getUserData());
assertSame(null, error.getValue());
assertSame(editor.addressEditor, error.getEditor());
-
+
error = list.get(2);
assertEquals("msg6", error.getMessage());
assertEquals("address.bogusparent.boguschild", error.getAbsolutePath());
@@ -312,7 +292,7 @@
assertSame(e6, error.getUserData());
assertSame(null, error.getValue());
assertSame(editor.addressEditor, error.getEditor());
-
+
error = list.get(3);
assertEquals("msg8", error.getMessage());
assertEquals("address.", error.getAbsolutePath());
@@ -320,7 +300,7 @@
assertSame(e8, error.getUserData());
assertSame(null, error.getValue());
assertSame(editor.addressEditor, error.getEditor());
-
+
// Then the rest of the errors.
error = list.get(4);
assertEquals("msg2", error.getMessage());
@@ -329,7 +309,7 @@
assertSame(e2, error.getUserData());
assertSame(null, error.getValue());
assertSame(editor, error.getEditor());
-
+
error = list.get(5);
assertEquals("msg3", error.getMessage());
assertEquals("address.city", error.getAbsolutePath());
@@ -344,8 +324,8 @@
assertEquals("address.city.bogus3", error.getPath());
assertSame(e5, error.getUserData());
assertSame(null, error.getValue());
- assertSame(editor.addressEditor.city, error.getEditor());
-
+ assertSame(editor.addressEditor.city, error.getEditor());
+
error = list.get(7);
assertEquals("msg7", error.getMessage());
assertEquals(".", error.getAbsolutePath());
@@ -355,46 +335,6 @@
assertSame(editor, error.getEditor());
}
- /**
- * Test for IndexOutOfBoundsException in getPath() when called on a leaf editor error display.
- *
- * The external bug report: http://code.google.com/p/google-web-toolkit/issues/detail?id=5589
- */
- public void testSamePathHasError() {
- PersonEditorReceivesErrors editor = new PersonEditorReceivesErrors();
- AddressEditorReceivesErrors addressEditor = new AddressEditorReceivesErrors();
- editor.addressEditor = addressEditor;
-
- Address a = new Address();
- Person p = new Person();
- p.address = a;
-
- PersonEditorDriver driver = GWT.create(PersonEditorDriver.class);
- driver.initialize(editor);
- driver.edit(p);
- driver.flush();
-
- driver.setConstraintViolations(
- Arrays.<ConstraintViolation<?>>asList(createViolation("samePathError", p, "address")));
- assertEquals(0, driver.getErrors().size());
-
- assertEquals(0, editor.errors.size());
-
-
- List<EditorError> list = addressEditor.errors;
- assertNotNull(list);
- assertEquals(1, list.size());
-
- EditorError error = list.get(0);
- assertNotNull(error);
- assertEquals("address", error.getAbsolutePath());
- assertEquals("samePathError", error.getMessage());
- assertEquals("", error.getPath());
- assertNotNull(error.getUserData());
- assertSame(a, error.getValue());
- assertSame(addressEditor, error.getEditor());
- }
-
private <T> ConstraintViolation<T> createViolation(
String msg, T rootBean, final String path) {
return new ConstraintViolationImpl.Builder<T>()
diff --git a/user/test/com/google/gwt/editor/client/SimpleBeanEditorTest.java b/user/test/com/google/gwt/editor/client/SimpleBeanEditorTest.java
index 81be530..6a1c2d7 100644
--- a/user/test/com/google/gwt/editor/client/SimpleBeanEditorTest.java
+++ b/user/test/com/google/gwt/editor/client/SimpleBeanEditorTest.java
@@ -298,16 +298,6 @@
}
}
- class TaggedItemAddressEditor implements Editor<TaggedItem<Address>> {
- @Path("item.city") SimpleEditor<String> itemCityEditor = SimpleEditor.of(UNINITIALIZED);
- @Path("item.street") SimpleEditor<String> itemStreetEditor = SimpleEditor.of(UNINITIALIZED);
- @Path("tag") SimpleEditor<String> tagEditor = SimpleEditor.of(UNINITIALIZED);
- }
-
- interface TaggedItemAddressEditorDriver extends
- SimpleBeanEditorDriver<TaggedItem<Address>, TaggedItemAddressEditor> {
- }
-
Person person;
Address personAddress;
Person manager;
@@ -742,30 +732,6 @@
assertEquals(1, addressEditor.setDelegateCalled);
}
- public void testEditorWithParameterizedModel() {
- TaggedItemAddressEditorDriver driver = GWT.create(TaggedItemAddressEditorDriver.class);
- TaggedItemAddressEditor editor = new TaggedItemAddressEditor();
- driver.initialize(editor);
-
- TaggedItem<Address> taggedAddress = new TaggedItem<Address>();
- taggedAddress.setTag("tag1");
- taggedAddress.setItem(personAddress);
- driver.edit(taggedAddress);
-
- assertEquals("tag1", editor.tagEditor.getValue());
- assertEquals("City", editor.itemCityEditor.getValue());
- assertEquals("Street", editor.itemStreetEditor.getValue());
-
- editor.tagEditor.setValue("tag2");
- editor.itemCityEditor.setValue("Town");
- editor.itemStreetEditor.setValue("Road");
- driver.flush();
-
- assertEquals("tag2", taggedAddress.getTag());
- assertEquals("Town", taggedAddress.getItem().getCity());
- assertEquals("Road", taggedAddress.getItem().getStreet());
- }
-
@Override
protected void gwtSetUp() throws Exception {
personAddress = new Address();
diff --git a/user/test/com/google/gwt/editor/client/TaggedItem.java b/user/test/com/google/gwt/editor/client/TaggedItem.java
deleted file mode 100644
index a985393..0000000
--- a/user/test/com/google/gwt/editor/client/TaggedItem.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright 2012 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.editor.client;
-
-/**
- * Simple parameterized data object used in
- * {@link SimpleBeanEditorTest#testEditorWithParameterizedModels()}.
- *
- * @param <T> type of the item
- */
-public class TaggedItem<T> {
- private T item;
- private String tag;
-
- public T getItem() {
- return item;
- }
-
- public String getTag() {
- return tag;
- }
-
- public void setItem(T item) {
- this.item = item;
- }
-
- public void setTag(String tag) {
- this.tag = tag;
- }
-}
-
diff --git a/user/test/com/google/gwt/editor/client/adapters/HasDataEditorTest.java b/user/test/com/google/gwt/editor/client/adapters/HasDataEditorTest.java
index 8a5481e..9e400fa 100644
--- a/user/test/com/google/gwt/editor/client/adapters/HasDataEditorTest.java
+++ b/user/test/com/google/gwt/editor/client/adapters/HasDataEditorTest.java
@@ -16,8 +16,6 @@
package com.google.gwt.editor.client.adapters;
import com.google.gwt.core.client.GWT;
-import com.google.gwt.editor.client.EditorContext;
-import com.google.gwt.editor.client.EditorVisitor;
import com.google.gwt.editor.client.SimpleBeanEditorDriver;
import com.google.gwt.event.shared.GwtEvent;
import com.google.gwt.event.shared.HandlerRegistration;
@@ -207,26 +205,6 @@
assertEquals(expectedValue, editor.getList());
assertEquals(expectedValue, hasData.getRowData());
}
-
- /**
- * See <a href="http://code.google.com/p/google-web-toolkit/issues/detail?id=6959">issue 6959</a>
- */
- public void testTraverseSyntheticCompositeEditor() {
- List<Integer> expectedValue = Arrays.asList(1, 2, 3, 4, 5);
-
- EditorVisitor visitor = new SyntheticVisitor();
-
- // check that it won't throw
- driver.accept(visitor);
-
- driver.edit(expectedValue);
-
- // Shouldn't affect the editor and HasData
- driver.accept(visitor);
-
- assertEquals(expectedValue, editor.getList());
- assertEquals(expectedValue, hasData.getRowData());
- }
@Override
protected void gwtSetUp() throws Exception {
@@ -235,14 +213,4 @@
driver = GWT.create(HasDataEditorDriver.class);
driver.initialize(editor);
}
-
- /** A visitor that visits synthetic composite editors. */
- private static class SyntheticVisitor extends EditorVisitor {
- public <T> boolean visit(EditorContext<T> ctx) {
- if (ctx.asCompositeEditor() != null) {
- ctx.traverseSyntheticCompositeEditor(this);
- }
- return true;
- }
- }
}
diff --git a/user/test/com/google/gwt/emultest/java/lang/DoubleTest.java b/user/test/com/google/gwt/emultest/java/lang/DoubleTest.java
index c5a6cc7..ac9adb3 100644
--- a/user/test/com/google/gwt/emultest/java/lang/DoubleTest.java
+++ b/user/test/com/google/gwt/emultest/java/lang/DoubleTest.java
@@ -23,7 +23,6 @@
*/
public class DoubleTest extends GWTTestCase {
- @Override
public String getModuleName() {
return "com.google.gwt.emultest.EmulSuite";
}
@@ -78,7 +77,7 @@
// Expected behavior
}
}
-
+
public void testCompare() {
assertTrue(Double.compare(Double.NaN, Double.NaN) == 0);
assertTrue(Double.compare(0.0, Double.NaN) < 0);
@@ -89,14 +88,14 @@
assertTrue(Double.compare(500.0, 3.0) > 0);
assertTrue(Double.compare(500.0, 500.0) == 0);
}
-
+
public void testCompareTo() {
Double zero = new Double(0.0);
Double three = new Double(3.0);
Double fiveHundred = new Double(500.0);
Double infinity = new Double(Double.POSITIVE_INFINITY);
Double nan = new Double(Double.NaN);
-
+
assertTrue(nan.compareTo(nan) == 0);
assertTrue(zero.compareTo(nan) < 0);
assertTrue(nan.compareTo(infinity) > 0);
@@ -137,7 +136,7 @@
assertTrue(
"Can't parse MAX_VALUE",
Double.MAX_VALUE == Double.parseDouble(String.valueOf(Double.MAX_VALUE)));
-
+
// Test that leading and trailing whitespace is ignored
// Test that both 'e' and 'E' may be used as the exponent delimiter
assertTrue(2.56789e1 == Double.parseDouble("2.56789e1"));
@@ -152,47 +151,12 @@
assertTrue(-2.56789e1 == Double.parseDouble(" -2.56789E1"));
assertTrue(-2.56789e1 == Double.parseDouble("-2.56789e+01 "));
assertTrue(-2.56789e1 == Double.parseDouble(" -2.56789E1 "));
-
+
// Test that a float/double type suffix is allowed
assertEquals(1.0d, Double.parseDouble("1.0f"), 0.0);
assertEquals(1.0d, Double.parseDouble("1.0F"), 0.0);
assertEquals(1.0d, Double.parseDouble("1.0d"), 0.0);
assertEquals(1.0d, Double.parseDouble("1.0D"), 0.0);
-
- // Test NaN/Infinity - issue 7713
- assertTrue(Double.isNaN(Double.parseDouble("+NaN")));
- assertTrue(Double.isNaN(Double.parseDouble("NaN")));
- assertTrue(Double.isNaN(Double.parseDouble("-NaN")));
- assertEquals(Double.POSITIVE_INFINITY, Double.parseDouble("+Infinity"));
- assertEquals(Double.POSITIVE_INFINITY, Double.parseDouble("Infinity"));
- assertEquals(Double.NEGATIVE_INFINITY, Double.parseDouble("-Infinity"));
-
- // check for parsing some invalid values
- try {
- Double.parseDouble("nan");
- fail("Expected NumberFormatException");
- } catch (NumberFormatException expected) {
- }
- try {
- Double.parseDouble("infinity");
- fail("Expected NumberFormatException");
- } catch (NumberFormatException expected) {
- }
- try {
- Double.parseDouble("1.2.3");
- fail("Expected NumberFormatException");
- } catch (NumberFormatException expected) {
- }
- try {
- Double.parseDouble("+-1.2");
- fail("Expected NumberFormatException");
- } catch (NumberFormatException expected) {
- }
- try {
- Double.parseDouble("1e");
- fail("Expected NumberFormatException");
- } catch (NumberFormatException expected) {
- }
}
public void testDoubleBits() {
diff --git a/user/test/com/google/gwt/emultest/java/lang/FloatTest.java b/user/test/com/google/gwt/emultest/java/lang/FloatTest.java
index 15c6718..7c2b559 100644
--- a/user/test/com/google/gwt/emultest/java/lang/FloatTest.java
+++ b/user/test/com/google/gwt/emultest/java/lang/FloatTest.java
@@ -93,41 +93,6 @@
// Float.parseFloat(String.valueOf(Float.MAX_VALUE)), 1e31);
// assertEquals("Can't parse MIN_VALUE", Float.MIN_VALUE,
// Float.parseFloat(String.valueOf(Float.MIN_VALUE)), Float.MIN_VALUE);
-
- // Test NaN/Infinity - issue 7713
- assertTrue(Float.isNaN(Float.parseFloat("+NaN")));
- assertTrue(Float.isNaN(Float.parseFloat("NaN")));
- assertTrue(Float.isNaN(Float.parseFloat("-NaN")));
- assertEquals(Float.POSITIVE_INFINITY, Float.parseFloat("+Infinity"));
- assertEquals(Float.POSITIVE_INFINITY, Float.parseFloat("Infinity"));
- assertEquals(Float.NEGATIVE_INFINITY, Float.parseFloat("-Infinity"));
-
- // check for parsing some invalid values
- try {
- Float.parseFloat("nan");
- fail("Expected NumberFormatException");
- } catch (NumberFormatException expected) {
- }
- try {
- Float.parseFloat("infinity");
- fail("Expected NumberFormatException");
- } catch (NumberFormatException expected) {
- }
- try {
- Float.parseFloat("1.2.3");
- fail("Expected NumberFormatException");
- } catch (NumberFormatException expected) {
- }
- try {
- Float.parseFloat("+-1.2");
- fail("Expected NumberFormatException");
- } catch (NumberFormatException expected) {
- }
- try {
- Float.parseFloat("1e");
- fail("Expected NumberFormatException");
- } catch (NumberFormatException expected) {
- }
}
public void testFloatBits() {
diff --git a/user/test/com/google/gwt/emultest/java/lang/LongTest.java b/user/test/com/google/gwt/emultest/java/lang/LongTest.java
index f1124f6..c307636 100644
--- a/user/test/com/google/gwt/emultest/java/lang/LongTest.java
+++ b/user/test/com/google/gwt/emultest/java/lang/LongTest.java
@@ -93,9 +93,6 @@
assertEquals(100000000000L, Long.parseLong("100000000000"));
assertEquals(-100000000000L, Long.parseLong("-100000000000"));
assertEquals(10L, Long.parseLong("010"));
- assertEquals(Long.MAX_VALUE, Long.parseLong("" + Long.MAX_VALUE));
- // Issue 7308
- assertEquals(Long.MIN_VALUE, Long.parseLong("" + Long.MIN_VALUE));
try {
Long.parseLong("10L");
fail("expected NumberFormatException");
diff --git a/user/test/com/google/gwt/emultest/java/lang/StringTest.java b/user/test/com/google/gwt/emultest/java/lang/StringTest.java
index 07b4ebb..2266c08 100644
--- a/user/test/com/google/gwt/emultest/java/lang/StringTest.java
+++ b/user/test/com/google/gwt/emultest/java/lang/StringTest.java
@@ -424,27 +424,18 @@
assertEquals("", "".toLowerCase());
}
+ /*
+ * TODO: needs rewriting to avoid compiler optimizations.
+ */
public void testMatch() {
- assertFalse("1f", hideFromCompiler("abbbbcd").matches("b*"));
- assertFalse("2f", hideFromCompiler("abbbbcd").matches("b+"));
- assertTrue("3t", hideFromCompiler("abbbbcd").matches("ab*bcd"));
- assertTrue("4t", hideFromCompiler("abbbbcd").matches("ab+cd"));
- assertTrue("5t", hideFromCompiler("abbbbcd").matches("ab+bcd"));
- assertFalse("6f", hideFromCompiler("abbbbcd").matches(""));
- assertTrue("7t", hideFromCompiler("abbbbcd").matches("a.*d"));
- assertFalse("8f", hideFromCompiler("abbbbcd").matches("a.*e"));
- // issue #7736
- assertTrue("9t.1", hideFromCompiler("").matches("(|none)"));
- assertTrue("9t.2", hideFromCompiler("none").matches("(|none)"));
- assertFalse("9f.1", hideFromCompiler("ab").matches("(|none)"));
- assertFalse("9f.2", hideFromCompiler("anoneb").matches("(|none)"));
- assertTrue("10t", hideFromCompiler("none").matches("^(|none)$"));
- assertFalse("10f", hideFromCompiler("abbbbcd").matches("^b*$"));
- assertTrue("11t.1", hideFromCompiler("").matches("|none"));
- assertTrue("11t.2", hideFromCompiler("none").matches("|none"));
- assertFalse("11f.1", hideFromCompiler("ab").matches("|none"));
- assertFalse("11f.2", hideFromCompiler("anoneb").matches("|none"));
- assertTrue("12t", hideFromCompiler("none").matches("^|none$"));
+ assertFalse("1f", "abbbbcd".matches("b*"));
+ assertFalse("2f", "abbbbcd".matches("b+"));
+ assertTrue("3t", "abbbbcd".matches("ab*bcd"));
+ assertTrue("4t", "abbbbcd".matches("ab+cd"));
+ assertTrue("5t", "abbbbcd".matches("ab+bcd"));
+ assertFalse("6f", "abbbbcd".matches(""));
+ assertTrue("7t", "abbbbcd".matches("a.*d"));
+ assertFalse("8f", "abbbbcd".matches("a.*e"));
}
/*
diff --git a/user/test/com/google/gwt/emultest/java/math/BigDecimalArithmeticTest.java b/user/test/com/google/gwt/emultest/java/math/BigDecimalArithmeticTest.java
index f3b4a3d..981e59a 100644
--- a/user/test/com/google/gwt/emultest/java/math/BigDecimalArithmeticTest.java
+++ b/user/test/com/google/gwt/emultest/java/math/BigDecimalArithmeticTest.java
@@ -626,7 +626,7 @@
BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
BigDecimal bNumber = BigDecimal.valueOf(0L);
try {
- aNumber = aNumber.divide(bNumber);
+ aNumber.divide(bNumber);
fail("ArithmeticException has not been caught");
} catch (ArithmeticException e) {
assertEquals("Improper exception message", "Division by zero",
@@ -645,7 +645,7 @@
BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
try {
- aNumber = aNumber.divide(bNumber, 100);
+ aNumber.divide(bNumber, 100);
fail("IllegalArgumentException has not been caught");
} catch (IllegalArgumentException e) {
assertEquals("Improper exception message", "Invalid rounding mode",
@@ -664,7 +664,7 @@
BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
try {
- aNumber = aNumber.divide(bNumber, BigDecimal.ROUND_UNNECESSARY);
+ aNumber.divide(bNumber, BigDecimal.ROUND_UNNECESSARY);
fail("ArithmeticException has not been caught");
} catch (ArithmeticException e) {
assertEquals("Improper exception message", "Rounding necessary",
@@ -735,7 +735,7 @@
BigDecimal arg1 = new BigDecimal("320.0E+2147483647");
BigDecimal arg2 = new BigDecimal("6E-2147483647");
try {
- arg1 = arg1.divide(arg2, Integer.MAX_VALUE, RoundingMode.CEILING);
+ arg1.divide(arg2, Integer.MAX_VALUE, RoundingMode.CEILING);
fail("Expected ArithmeticException when dividing with a scale that's too large");
} catch (ArithmeticException e) {
// expected behaviour
@@ -1523,20 +1523,17 @@
// 1 digit left of dp, 14 scale + 1
val = BigDecimal.valueOf(5.43445663479765);
- val =
- val.setScale(val.scale() + 1, RoundingMode.CEILING).round(new
+ val.setScale(val.scale() + 1, RoundingMode.CEILING).round(new
MathContext(1, RoundingMode.CEILING));
// 1 digit left of dp, 13 scale + 2
val = BigDecimal.valueOf(5.4344566347976);
- val =
- val.setScale(val.scale() + 2, RoundingMode.CEILING).round(new
+ val.setScale(val.scale() + 2, RoundingMode.CEILING).round(new
MathContext(1, RoundingMode.CEILING));
// 2 digits left of dp, 13 scale + 2
BigDecimal test = BigDecimal.valueOf(12.4344566347976);
- test =
- test.setScale(test.scale() + 1, RoundingMode.CEILING).round(new
+ test.setScale(test.scale() + 1, RoundingMode.CEILING).round(new
MathContext(1, RoundingMode.CEILING));
}
diff --git a/user/test/com/google/gwt/emultest/java/math/BigDecimalCompareTest.java b/user/test/com/google/gwt/emultest/java/math/BigDecimalCompareTest.java
index 474ce3a..794309e 100644
--- a/user/test/com/google/gwt/emultest/java/math/BigDecimalCompareTest.java
+++ b/user/test/com/google/gwt/emultest/java/math/BigDecimalCompareTest.java
@@ -248,23 +248,6 @@
}
/**
- * Test identical fraction values with different scales.
- * http://code.google.com/p/google-web-toolkit/issues/detail?id=7834
- */
- public void testFractionScale() {
- BigDecimal a = new BigDecimal("0.02");
- BigDecimal b = new BigDecimal("0.02000");
- assertEquals(0, a.compareTo(b));
-
- BigDecimal a1 = new BigDecimal("0.029900000000000003");
- BigDecimal a2 = new BigDecimal("0.0001");
- a = a1.add(a2);
- // a is 0.030000000000000003 (0.029900000000000003 + 0.0001)
- b = new BigDecimal("0.03990");
- assertEquals(-1, a.compareTo(b));
- }
-
- /**
* hashCode() for equal BigDecimals.
*/
public void testHashCodeEqual() {
diff --git a/user/test/com/google/gwt/emultest/java/math/BigDecimalConstructorsTest.java b/user/test/com/google/gwt/emultest/java/math/BigDecimalConstructorsTest.java
index 15bdee8..aa5765c 100644
--- a/user/test/com/google/gwt/emultest/java/math/BigDecimalConstructorsTest.java
+++ b/user/test/com/google/gwt/emultest/java/math/BigDecimalConstructorsTest.java
@@ -687,19 +687,11 @@
}
/**
- * Test second failing example in gwt-java-math issue 4 and variations
- * to validate that precision is calculated correctly when leading zeros
- * and minus signs are present.
+ * Test second failing example in gwt-java-math issue 4.
*/
public void testConstrStringWithLeadingZeros() {
- assertEquals("bad precision", 1, new BigDecimal("-000.1").precision());
- assertEquals("bad precision", 4, new BigDecimal("001234").precision());
- assertEquals("bad precision", 4, new BigDecimal("-5555").precision());
- assertEquals("bad precision", 1, new BigDecimal("0").precision());
- assertEquals("bad precision", 1, new BigDecimal("-0").precision());
- assertEquals("bad precision", 4, new BigDecimal("001234e3").precision());
- assertEquals("bad precision", 5, new BigDecimal("00056789e+17").precision());
- assertEquals("bad precision", 6, new BigDecimal("0900000e-42").precision());
+ BigDecimal value = new BigDecimal("-000.1");
+ assertEquals("bad precision", 1, value.precision());
}
/**
diff --git a/user/test/com/google/gwt/emultest/java/math/BigDecimalConvertTest.java b/user/test/com/google/gwt/emultest/java/math/BigDecimalConvertTest.java
index 5f5dd96..0547078 100644
--- a/user/test/com/google/gwt/emultest/java/math/BigDecimalConvertTest.java
+++ b/user/test/com/google/gwt/emultest/java/math/BigDecimalConvertTest.java
@@ -512,7 +512,6 @@
/**
* valueOf(Double.NaN).
*/
- @SuppressWarnings("ReturnValueIgnored")
public void testValueOfDoubleNaN() {
double a = Double.NaN;
try {
diff --git a/user/test/com/google/gwt/emultest/java/math/BigDecimalScaleOperationsTest.java b/user/test/com/google/gwt/emultest/java/math/BigDecimalScaleOperationsTest.java
index e1b45fb..5323bc7 100644
--- a/user/test/com/google/gwt/emultest/java/math/BigDecimalScaleOperationsTest.java
+++ b/user/test/com/google/gwt/emultest/java/math/BigDecimalScaleOperationsTest.java
@@ -143,7 +143,7 @@
int newScale = 18;
BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
try {
- aNumber = aNumber.setScale(newScale);
+ aNumber.setScale(newScale);
fail("ArithmeticException has not been caught");
} catch (ArithmeticException e) {
assertEquals("Improper exception message", "Rounding necessary",
@@ -357,7 +357,7 @@
int shift = -18;
BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
try {
- aNumber = aNumber.movePointRight(shift);
+ aNumber.movePointRight(shift);
fail("ArithmeticException has not been caught");
} catch (ArithmeticException e) {
assertEquals("Improper exception message", "Underflow", e.getMessage());
diff --git a/user/test/com/google/gwt/emultest/java/math/BigIntegerDivideTest.java b/user/test/com/google/gwt/emultest/java/math/BigIntegerDivideTest.java
index 37f569f..1e119cb 100644
--- a/user/test/com/google/gwt/emultest/java/math/BigIntegerDivideTest.java
+++ b/user/test/com/google/gwt/emultest/java/math/BigIntegerDivideTest.java
@@ -57,7 +57,7 @@
BigInteger aNumber = new BigInteger(aSign, aBytes);
BigInteger bNumber = new BigInteger(bSign, bBytes);
try {
- aNumber = aNumber.divide(bNumber);
+ aNumber.divide(bNumber);
fail("ArithmeticException has not been caught");
} catch (ArithmeticException e) {
assertEquals("Improper exception message", "BigInteger divide by zero",
@@ -168,7 +168,7 @@
BigInteger aNumber = new BigInteger(aSign, aBytes);
BigInteger bNumber = new BigInteger(bSign, bBytes);
try {
- aNumber = aNumber.remainder(bNumber);
+ aNumber.remainder(bNumber);
fail("ArithmeticException has not been caught");
} catch (ArithmeticException e) {
assertEquals("Improper exception message", "BigInteger divide by zero",
@@ -266,7 +266,7 @@
BigInteger aNumber = new BigInteger(aSign, aBytes);
BigInteger bNumber = BigInteger.ZERO;
try {
- aNumber = aNumber.divide(bNumber);
+ aNumber.divide(bNumber);
fail("ArithmeticException has not been caught");
} catch (ArithmeticException e) {
assertEquals("Improper exception message", "BigInteger divide by zero",
@@ -336,7 +336,7 @@
BigInteger aNumber = new BigInteger(aSign, aBytes);
BigInteger bNumber = new BigInteger(bSign, bBytes);
try {
- aNumber = aNumber.mod(bNumber);
+ aNumber.mod(bNumber);
fail("ArithmeticException has not been caught");
} catch (ArithmeticException e) {
assertEquals("Improper exception message",
diff --git a/user/test/com/google/gwt/emultest/java/math/BigIntegerHashCodeTest.java b/user/test/com/google/gwt/emultest/java/math/BigIntegerHashCodeTest.java
index 33bda42..a107b6b 100644
--- a/user/test/com/google/gwt/emultest/java/math/BigIntegerHashCodeTest.java
+++ b/user/test/com/google/gwt/emultest/java/math/BigIntegerHashCodeTest.java
@@ -63,7 +63,6 @@
/**
* Test hash codes for the same object.
*/
- @SuppressWarnings("ReturnValueIgnored")
public void testSameObject() {
String value1 = "12378246728727834290276457386374882976782849";
String value2 = "-5634562095872038262928728727834290276457386374882976782849";
diff --git a/user/test/com/google/gwt/emultest/java/math/BigIntegerModPowTest.java b/user/test/com/google/gwt/emultest/java/math/BigIntegerModPowTest.java
index 96fb58f..ce676ff 100644
--- a/user/test/com/google/gwt/emultest/java/math/BigIntegerModPowTest.java
+++ b/user/test/com/google/gwt/emultest/java/math/BigIntegerModPowTest.java
@@ -173,7 +173,7 @@
BigInteger aNumber = new BigInteger(aSign, aBytes);
BigInteger modulus = new BigInteger(mSign, mBytes);
try {
- aNumber = aNumber.modInverse(modulus);
+ aNumber.modInverse(modulus);
fail("ArithmeticException has not been caught");
} catch (ArithmeticException e) {
assertEquals("Improper exception message",
@@ -234,7 +234,7 @@
BigInteger aNumber = new BigInteger(aSign, aBytes);
BigInteger modulus = new BigInteger(mSign, mBytes);
try {
- aNumber = aNumber.modInverse(modulus);
+ aNumber.modInverse(modulus);
fail("ArithmeticException has not been caught");
} catch (ArithmeticException e) {
assertEquals("Improper exception message", "BigInteger not invertible.",
@@ -299,7 +299,7 @@
BigInteger exp = new BigInteger(eSign, eBytes);
BigInteger modulus = new BigInteger(mSign, mBytes);
try {
- aNumber = aNumber.modPow(exp, modulus);
+ aNumber.modPow(exp, modulus);
fail("ArithmeticException has not been caught");
} catch (ArithmeticException e) {
assertEquals("Improper exception message",
diff --git a/user/test/com/google/gwt/emultest/java/math/BigIntegerMultiplyTest.java b/user/test/com/google/gwt/emultest/java/math/BigIntegerMultiplyTest.java
index c9d9eac..06157f4 100644
--- a/user/test/com/google/gwt/emultest/java/math/BigIntegerMultiplyTest.java
+++ b/user/test/com/google/gwt/emultest/java/math/BigIntegerMultiplyTest.java
@@ -303,7 +303,7 @@
int exp = -5;
BigInteger aNumber = new BigInteger(aSign, aBytes);
try {
- aNumber = aNumber.pow(exp);
+ aNumber.pow(exp);
fail("ArithmeticException has not been caught");
} catch (ArithmeticException e) {
assertEquals("Improper exception message", "Negative exponent",
diff --git a/user/test/com/google/gwt/emultest/java/math/BigIntegerOperateBitsTest.java b/user/test/com/google/gwt/emultest/java/math/BigIntegerOperateBitsTest.java
index 6e6d3a8..9ef9e27 100644
--- a/user/test/com/google/gwt/emultest/java/math/BigIntegerOperateBitsTest.java
+++ b/user/test/com/google/gwt/emultest/java/math/BigIntegerOperateBitsTest.java
@@ -149,7 +149,7 @@
int number = -7;
BigInteger aNumber = new BigInteger(aSign, aBytes);
try {
- aNumber = aNumber.clearBit(number);
+ aNumber.clearBit(number);
fail("ArithmeticException has not been caught");
} catch (ArithmeticException e) {
assertEquals("Improper exception message", "Negative bit address",
@@ -459,7 +459,7 @@
int number = -7;
BigInteger aNumber = new BigInteger(aSign, aBytes);
try {
- aNumber = aNumber.flipBit(number);
+ aNumber.flipBit(number);
fail("ArithmeticException has not been caught");
} catch (ArithmeticException e) {
assertEquals("Improper exception message", "Negative bit address",
@@ -768,7 +768,7 @@
int number = -7;
BigInteger aNumber = new BigInteger(aSign, aBytes);
try {
- aNumber = aNumber.setBit(number);
+ aNumber.setBit(number);
fail("ArithmeticException has not been caught");
} catch (ArithmeticException e) {
assertEquals("Improper exception message", "Negative bit address",
diff --git a/user/test/com/google/gwt/emultest/java/util/ComparatorTest.java b/user/test/com/google/gwt/emultest/java/util/ComparatorTest.java
index e46d534..939e75e 100644
--- a/user/test/com/google/gwt/emultest/java/util/ComparatorTest.java
+++ b/user/test/com/google/gwt/emultest/java/util/ComparatorTest.java
@@ -25,12 +25,12 @@
* TODO: document me.
*/
public class ComparatorTest extends TestComparator {
- public Comparator<Object> makeComparator() {
+ public Comparator makeComparator() {
return new DummyComparator();
}
- public List<Object> getComparableObjectsOrdered() {
- List<Object> l = new ArrayList<Object>();
+ public List getComparableObjectsOrdered() {
+ List l = new ArrayList();
l.add("x");
l.add("y");
l.add("z");
@@ -41,7 +41,7 @@
/**
* List comparator for testing.
*/
-class DummyComparator implements Comparator<Object> {
+class DummyComparator implements Comparator {
/**
* Compares returns reverse hash order.
*/
diff --git a/user/test/com/google/gwt/emultest/java/util/HashMapTest.java b/user/test/com/google/gwt/emultest/java/util/HashMapTest.java
index 2b78350..2f7be81 100644
--- a/user/test/com/google/gwt/emultest/java/util/HashMapTest.java
+++ b/user/test/com/google/gwt/emultest/java/util/HashMapTest.java
@@ -25,10 +25,12 @@
import java.util.Map;
import java.util.NoSuchElementException;
import java.util.Set;
+import java.util.Map.Entry;
/**
* Tests <code>HashMap</code>.
*/
+@SuppressWarnings("unchecked")
public class HashMapTest extends TestMap {
private static final int CAPACITY_16 = 16;
private static final int CAPACITY_NEG_ONE_HALF = -1;
@@ -88,7 +90,7 @@
private static final String VALUE_TEST_REMOVE = KEY_TEST_REMOVE + " - value";
private static final String VALUE_VAL = "value";
- private static void assertEmptyIterator(Iterator<?> it) {
+ private static void assertEmptyIterator(Iterator it) {
assertNotNull(it);
assertFalse(it.hasNext());
try {
@@ -103,7 +105,7 @@
*
* @param hashMap
*/
- private static void checkEmptyHashMapAssumptions(HashMap<?, ?> hashMap) {
+ private static void checkEmptyHashMapAssumptions(HashMap hashMap) {
assertNotNull(hashMap);
assertTrue(hashMap.isEmpty());
@@ -128,7 +130,7 @@
}
public void testAddEqualKeys() {
- final HashMap<Number, Object> expected = new HashMap<Number, Object>();
+ final HashMap expected = new HashMap();
assertEquals(expected.size(), 0);
iterateThrough(expected);
expected.put(new Long(45), new Object());
@@ -141,7 +143,7 @@
}
public void testAddWatch() {
- HashMap<String, String> m = new HashMap<String, String>();
+ HashMap m = new HashMap();
m.put("watch", "watch");
assertEquals(m.get("watch"), "watch");
}
@@ -150,7 +152,7 @@
* Test method for 'java.util.HashMap.clear()'
*/
public void testClear() {
- HashMap<String, String> hashMap = new HashMap<String, String>();
+ HashMap hashMap = new HashMap();
checkEmptyHashMapAssumptions(hashMap);
hashMap.put("Hello", "Bye");
@@ -166,10 +168,11 @@
* Test method for 'java.util.HashMap.clone()'
*/
public void testClone() {
- HashMap<String, String> srcMap = new HashMap<String, String>();
+ HashMap srcMap = new HashMap();
checkEmptyHashMapAssumptions(srcMap);
- HashMap<String, String> dstMap = cloneMap(srcMap);
+ // Check empty clone behavior
+ HashMap dstMap = (HashMap) srcMap.clone();
assertNotNull(dstMap);
assertEquals(dstMap.size(), srcMap.size());
// assertTrue(dstMap.values().toArray().equals(srcMap.values().toArray()));
@@ -180,7 +183,7 @@
srcMap.put(KEY_1, VALUE_1);
srcMap.put(KEY_2, VALUE_2);
srcMap.put(KEY_3, VALUE_3);
- dstMap = cloneMap(srcMap);
+ dstMap = (HashMap) srcMap.clone();
assertNotNull(dstMap);
assertEquals(dstMap.size(), srcMap.size());
@@ -193,7 +196,7 @@
* Test method for 'java.util.HashMap.containsKey(Object)'
*/
public void testContainsKey() {
- HashMap<String, Integer> hashMap = new HashMap<String, Integer>();
+ HashMap hashMap = new HashMap();
checkEmptyHashMapAssumptions(hashMap);
assertFalse(hashMap.containsKey(KEY_TEST_CONTAINS_KEY));
@@ -210,7 +213,7 @@
* Test method for 'java.util.HashMap.containsValue(Object)'
*/
public void testContainsValue() {
- HashMap<String, Integer> hashMap = new HashMap<String, Integer>();
+ HashMap hashMap = new HashMap();
checkEmptyHashMapAssumptions(hashMap);
assertFalse("check contains of empty map",
@@ -230,18 +233,18 @@
* Test method for 'java.util.HashMap.entrySet()'
*/
public void testEntrySet() {
- HashMap<String, String> hashMap = new HashMap<String, String>();
+ HashMap hashMap = new HashMap();
checkEmptyHashMapAssumptions(hashMap);
- Set<Map.Entry<String, String>> entrySet = hashMap.entrySet();
+ Set entrySet = hashMap.entrySet();
assertNotNull(entrySet);
// Check that the entry set looks right
hashMap.put(KEY_TEST_ENTRY_SET, VALUE_TEST_ENTRY_SET_1);
entrySet = hashMap.entrySet();
assertEquals(entrySet.size(), SIZE_ONE);
- Iterator<Map.Entry<String, String>> itSet = entrySet.iterator();
- Map.Entry<String, String> entry = itSet.next();
+ Iterator itSet = entrySet.iterator();
+ Map.Entry entry = (Map.Entry) itSet.next();
assertEquals(entry.getKey(), KEY_TEST_ENTRY_SET);
assertEquals(entry.getValue(), VALUE_TEST_ENTRY_SET_1);
assertEmptyIterator(itSet);
@@ -251,7 +254,7 @@
entrySet = hashMap.entrySet();
assertEquals(entrySet.size(), SIZE_ONE);
itSet = entrySet.iterator();
- entry = itSet.next();
+ entry = (Map.Entry) itSet.next();
assertEquals(entry.getKey(), KEY_TEST_ENTRY_SET);
assertEquals(entry.getValue(), VALUE_TEST_ENTRY_SET_2);
assertEmptyIterator(itSet);
@@ -265,16 +268,16 @@
* Used to test the entrySet entry's set method.
*/
public void testEntrySetEntrySetterNonString() {
- HashMap<Integer, Integer> hashMap = new HashMap<Integer, Integer>();
+ HashMap hashMap = new HashMap();
hashMap.put(1, 2);
- Set<Map.Entry<Integer, Integer>> entrySet = hashMap.entrySet();
- Map.Entry<Integer, Integer> entry = entrySet.iterator().next();
+ Set entrySet = hashMap.entrySet();
+ Entry entry = (Entry) entrySet.iterator().next();
entry.setValue(3);
- assertEquals(3, hashMap.get(1).intValue());
+ assertEquals(3, hashMap.get(1));
hashMap.put(1, 4);
- assertEquals(4, entry.getValue().intValue());
+ assertEquals(4, entry.getValue());
assertEquals(1, hashMap.size());
}
@@ -283,16 +286,16 @@
* Used to test the entrySet entry's set method.
*/
public void testEntrySetEntrySetterNull() {
- HashMap<String, Integer> hashMap = new HashMap<String, Integer>();
+ HashMap hashMap = new HashMap();
hashMap.put(null, 2);
- Set<Map.Entry<String, Integer>> entrySet = hashMap.entrySet();
- Map.Entry<String, Integer> entry = entrySet.iterator().next();
+ Set entrySet = hashMap.entrySet();
+ Entry entry = (Entry) entrySet.iterator().next();
entry.setValue(3);
- assertEquals(3, hashMap.get(null).intValue());
+ assertEquals(3, hashMap.get(null));
hashMap.put(null, 4);
- assertEquals(4, entry.getValue().intValue());
+ assertEquals(4, entry.getValue());
assertEquals(1, hashMap.size());
}
@@ -301,10 +304,10 @@
* Used to test the entrySet entry's set method.
*/
public void testEntrySetEntrySetterString() {
- HashMap<String, String> hashMap = new HashMap<String, String>();
+ HashMap hashMap = new HashMap();
hashMap.put("A", "B");
- Set<Map.Entry<String, String>> entrySet = hashMap.entrySet();
- Map.Entry<String, String> entry = entrySet.iterator().next();
+ Set entrySet = hashMap.entrySet();
+ Entry entry = (Entry) entrySet.iterator().next();
entry.setValue("C");
assertEquals("C", hashMap.get("A"));
@@ -319,12 +322,12 @@
* Used to test the entrySet remove method.
*/
public void testEntrySetRemove() {
- HashMap<String, String> hashMap = new HashMap<String, String>();
+ HashMap hashMap = new HashMap();
hashMap.put("A", "B");
- HashMap<String, String> dummy = new HashMap<String, String>();
+ HashMap dummy = new HashMap();
dummy.put("A", "b");
- Map.Entry<String, String> bogus = dummy.entrySet().iterator().next();
- Set<Map.Entry<String, String>> entrySet = hashMap.entrySet();
+ Entry bogus = (Entry) dummy.entrySet().iterator().next();
+ Set entrySet = hashMap.entrySet();
boolean removed = entrySet.remove(bogus);
assertEquals(removed, false);
assertEquals(hashMap.get("A"), "B");
@@ -334,23 +337,18 @@
* Test method for 'java.util.AbstractMap.equals(Object)'
*/
public void testEquals() {
- HashMap<String, String> hashMap = new HashMap<String, String>();
+ HashMap hashMap = new HashMap();
checkEmptyHashMapAssumptions(hashMap);
hashMap.put(KEY_KEY, VALUE_VAL);
- HashMap<String, String> copyMap = cloneMap(hashMap);
+ HashMap copyMap = (HashMap) hashMap.clone();
assertTrue(hashMap.equals(copyMap));
hashMap.put(VALUE_VAL, KEY_KEY);
assertFalse(hashMap.equals(copyMap));
}
- @SuppressWarnings("unchecked")
- private HashMap<String, String> cloneMap(HashMap<String, String> hashMap) {
- return (HashMap<String, String>) hashMap.clone();
- }
-
/*
* Test method for 'java.lang.Object.finalize()'.
*/
@@ -362,7 +360,7 @@
* Test method for 'java.util.HashMap.get(Object)'.
*/
public void testGet() {
- HashMap<String, String> hashMap = new HashMap<String, String>();
+ HashMap hashMap = new HashMap();
checkEmptyHashMapAssumptions(hashMap);
assertNull(hashMap.get(KEY_TEST_GET));
@@ -381,7 +379,7 @@
* Test method for 'java.util.AbstractMap.hashCode()'.
*/
public void testHashCode() {
- HashMap<String, String> hashMap = new HashMap<String, String>();
+ HashMap hashMap = new HashMap();
checkEmptyHashMapAssumptions(hashMap);
// Check that hashCode changes
@@ -396,7 +394,7 @@
* Test method for 'java.util.HashMap.HashMap()'.
*/
public void testHashMap() {
- HashMap<String, String> hashMap = new HashMap<String, String>();
+ HashMap hashMap = new HashMap();
checkEmptyHashMapAssumptions(hashMap);
}
@@ -404,13 +402,13 @@
* Test method for 'java.util.HashMap.HashMap(int)'
*/
public void testHashMapInt() {
- HashMap<String, String> hashMap = new HashMap<String, String>(CAPACITY_16);
+ HashMap hashMap = new HashMap(CAPACITY_16);
checkEmptyHashMapAssumptions(hashMap);
// TODO(mmendez): how do we verify capacity?
boolean failed = true;
try {
- new HashMap<String, String>(-SIZE_ONE);
+ new HashMap(-SIZE_ONE);
} catch (Throwable ex) {
if (ex instanceof IllegalArgumentException) {
failed = false;
@@ -421,7 +419,7 @@
fail("Failure testing new HashMap(-1)");
}
- HashMap<String, String> zeroSizedHashMap = new HashMap<String, String>(0);
+ HashMap zeroSizedHashMap = new HashMap(0);
assertNotNull(zeroSizedHashMap);
}
@@ -429,8 +427,8 @@
* Test method for 'java.util.HashMap.HashMap(int, float)'
*/
public void testHashMapIntFloat() {
- HashMap<String, String> hashMap =
- new HashMap<String, String>(CAPACITY_16, LOAD_FACTOR_ONE_HALF);
+
+ HashMap hashMap = new HashMap(CAPACITY_16, LOAD_FACTOR_ONE_HALF);
checkEmptyHashMapAssumptions(hashMap);
// TODO(mmendez): how do we verify capacity and load factor?
@@ -438,7 +436,7 @@
// Test new HashMap(-1, 0.0F)
boolean failed = true;
try {
- new HashMap<String, String>(CAPACITY_NEG_ONE_HALF, LOAD_FACTOR_ZERO);
+ new HashMap(CAPACITY_NEG_ONE_HALF, LOAD_FACTOR_ZERO);
} catch (Throwable ex) {
if (ex instanceof IllegalArgumentException) {
failed = false;
@@ -452,7 +450,7 @@
// Test new HashMap(0, -1.0F)
failed = true;
try {
- new HashMap<String, String>(CAPACITY_ZERO, LOAD_FACTOR_NEG_ONE);
+ new HashMap(CAPACITY_ZERO, LOAD_FACTOR_NEG_ONE);
} catch (Throwable ex) {
if (ex instanceof IllegalArgumentException) {
failed = false;
@@ -464,7 +462,7 @@
}
// Test new HashMap(0,0F);
- hashMap = new HashMap<String, String>(CAPACITY_ZERO, LOAD_FACTOR_ONE_TENTH);
+ hashMap = new HashMap(CAPACITY_ZERO, LOAD_FACTOR_ONE_TENTH);
assertNotNull(hashMap);
}
@@ -472,7 +470,7 @@
* Test method for 'java.util.HashMap.HashMap(Map)'
*/
public void testHashMapMap() {
- HashMap<Integer, Integer> srcMap = new HashMap<Integer, Integer>();
+ HashMap srcMap = new HashMap();
assertNotNull(srcMap);
checkEmptyHashMapAssumptions(srcMap);
@@ -480,16 +478,16 @@
srcMap.put(INTEGER_2, INTEGER_22);
srcMap.put(INTEGER_3, INTEGER_33);
- HashMap<Integer, Integer> hashMap = new HashMap<Integer, Integer>(srcMap);
+ HashMap hashMap = new HashMap(srcMap);
assertFalse(hashMap.isEmpty());
assertTrue(hashMap.size() == SIZE_THREE);
- Collection<Integer> valColl = hashMap.values();
+ Collection valColl = hashMap.values();
assertTrue(valColl.contains(INTEGER_11));
assertTrue(valColl.contains(INTEGER_22));
assertTrue(valColl.contains(INTEGER_33));
- Collection<Integer> keyColl = hashMap.keySet();
+ Collection keyColl = hashMap.keySet();
assertTrue(keyColl.contains(INTEGER_1));
assertTrue(keyColl.contains(INTEGER_2));
assertTrue(keyColl.contains(INTEGER_3));
@@ -499,10 +497,10 @@
* Test method for 'java.util.AbstractMap.isEmpty()'
*/
public void testIsEmpty() {
- HashMap<String, String> srcMap = new HashMap<String, String>();
+ HashMap srcMap = new HashMap();
checkEmptyHashMapAssumptions(srcMap);
- HashMap<String, String> dstMap = new HashMap<String, String>();
+ HashMap dstMap = new HashMap();
checkEmptyHashMapAssumptions(dstMap);
dstMap.putAll(srcMap);
@@ -517,7 +515,7 @@
}
public void testKeysConflict() {
- HashMap<Object, String> hashMap = new HashMap<Object, String>();
+ HashMap hashMap = new HashMap();
hashMap.put(STRING_ZERO_KEY, STRING_ZERO_VALUE);
hashMap.put(INTEGER_ZERO_KEY, INTEGER_ZERO_VALUE);
@@ -544,10 +542,10 @@
* Test method for 'java.util.HashMap.keySet()'
*/
public void testKeySet() {
- HashMap<String, String> hashMap = new HashMap<String, String>();
+ HashMap hashMap = new HashMap();
checkEmptyHashMapAssumptions(hashMap);
- Set<String> keySet = hashMap.keySet();
+ Set keySet = hashMap.keySet();
assertNotNull(keySet);
assertTrue(keySet.isEmpty());
assertTrue(keySet.size() == 0);
@@ -591,7 +589,7 @@
* Test method for 'java.util.HashMap.put(Object, Object)'
*/
public void testPut() {
- HashMap<String, String> hashMap = new HashMap<String, String>();
+ HashMap hashMap = new HashMap();
checkEmptyHashMapAssumptions(hashMap);
assertNull(hashMap.put(KEY_TEST_PUT, VALUE_TEST_PUT_1));
@@ -604,7 +602,7 @@
* Test method for 'java.util.HashMap.putAll(Map)'.
*/
public void testPutAll() {
- HashMap<String, String> srcMap = new HashMap<String, String>();
+ HashMap srcMap = new HashMap();
checkEmptyHashMapAssumptions(srcMap);
srcMap.put(KEY_1, VALUE_1);
@@ -612,7 +610,7 @@
srcMap.put(KEY_3, VALUE_3);
// Make sure that the data is copied correctly
- HashMap<String, String> dstMap = new HashMap<String, String>();
+ HashMap dstMap = new HashMap();
checkEmptyHashMapAssumptions(dstMap);
dstMap.putAll(srcMap);
@@ -634,7 +632,7 @@
// Check that an empty map does not blow away the contents of the
// destination map
- HashMap<String, String> emptyMap = new HashMap<String, String>();
+ HashMap emptyMap = new HashMap();
checkEmptyHashMapAssumptions(emptyMap);
dstMap.putAll(emptyMap);
assertTrue(dstMap.size() == srcMap.size());
@@ -669,7 +667,7 @@
* Test method for 'java.util.HashMap.remove(Object)'.
*/
public void testRemove() {
- HashMap<String, String> hashMap = new HashMap<String, String>();
+ HashMap hashMap = new HashMap();
checkEmptyHashMapAssumptions(hashMap);
assertNull(hashMap.remove(null));
@@ -685,7 +683,7 @@
* Test method for 'java.util.HashMap.size()'.
*/
public void testSize() {
- HashMap<String, String> hashMap = new HashMap<String, String>();
+ HashMap hashMap = new HashMap();
checkEmptyHashMapAssumptions(hashMap);
// Test size behavior on put
@@ -709,7 +707,7 @@
hashMap.put(KEY_1, VALUE_1);
hashMap.put(KEY_2, VALUE_2);
hashMap.put(KEY_3, VALUE_3);
- HashMap<String, String> srcMap = new HashMap<String, String>(hashMap);
+ HashMap srcMap = new HashMap(hashMap);
hashMap.putAll(srcMap);
assertEquals(hashMap.size(), SIZE_THREE);
@@ -722,7 +720,7 @@
* Test method for 'java.util.AbstractMap.toString()'.
*/
public void testToString() {
- HashMap<String, String> hashMap = new HashMap<String, String>();
+ HashMap hashMap = new HashMap();
checkEmptyHashMapAssumptions(hashMap);
hashMap.put(KEY_KEY, VALUE_VAL);
String entryString = makeEntryString(KEY_KEY, VALUE_VAL);
@@ -733,33 +731,33 @@
* Test method for 'java.util.AbstractMap.values()'.
*/
public void testValues() {
- HashMap<String, String> hashMap = new HashMap<String, String>();
+ HashMap hashMap = new HashMap();
checkEmptyHashMapAssumptions(hashMap);
assertNotNull(hashMap.values());
hashMap.put(KEY_KEY, VALUE_VAL);
- Collection<String> valColl = hashMap.values();
+ Collection valColl = hashMap.values();
assertNotNull(valColl);
assertEquals(valColl.size(), SIZE_ONE);
- Iterator<String> itVal = valColl.iterator();
- String val = itVal.next();
+ Iterator itVal = valColl.iterator();
+ String val = (String) itVal.next();
assertEquals(val, VALUE_VAL);
}
- @SuppressWarnings("rawtypes")
@Override
protected Map makeEmptyMap() {
return new HashMap();
}
- private void iterateThrough(final HashMap<?, ?> expected) {
- Iterator<?> iter = expected.entrySet().iterator();
+ private Iterator iterateThrough(final HashMap expected) {
+ Iterator iter = expected.entrySet().iterator();
for (int i = 0; i < expected.size(); i++) {
iter.next();
}
+ return iter;
}
private String makeEntryString(final String key, final String value) {
diff --git a/user/test/com/google/gwt/emultest/java/util/HashSetTest.java b/user/test/com/google/gwt/emultest/java/util/HashSetTest.java
index 0a0b793..65c7e5a 100644
--- a/user/test/com/google/gwt/emultest/java/util/HashSetTest.java
+++ b/user/test/com/google/gwt/emultest/java/util/HashSetTest.java
@@ -32,23 +32,21 @@
}
public void testAddingKeys() {
- Map<Object, Object> map = new HashMap<Object, Object>();
- Set<Object> keys = new HashSet<Object>(map.keySet());
+ Map map = new HashMap();
+ Set keys = new HashSet(map.keySet());
keys.add(new Object()); // Throws exception in IE6 (web-mode) but not GWT
}
public void testAddWatch() {
- HashSet<String> s = new HashSet<String>();
+ HashSet s = new HashSet();
s.add("watch");
assertTrue(s.contains("watch"));
}
- @SuppressWarnings("rawtypes")
protected Set makeEmptySet() {
return new HashSet();
}
- @SuppressWarnings("rawtypes")
public Object makeObject() {
return new HashSet();
}
diff --git a/user/test/com/google/gwt/emultest/java/util/IdentityHashMapTest.java b/user/test/com/google/gwt/emultest/java/util/IdentityHashMapTest.java
index 4ad811a..cea9f19 100644
--- a/user/test/com/google/gwt/emultest/java/util/IdentityHashMapTest.java
+++ b/user/test/com/google/gwt/emultest/java/util/IdentityHashMapTest.java
@@ -24,13 +24,12 @@
import java.util.IdentityHashMap;
import java.util.Iterator;
import java.util.Map;
-import java.util.Map.Entry;
import java.util.Set;
+import java.util.Map.Entry;
/**
* Tests <code>IdentityHashMap</code>.
*/
-@SuppressWarnings({"unchecked", "rawtypes"})
public class IdentityHashMapTest extends TestMap {
/**
@@ -50,6 +49,8 @@
}
private static final int CAPACITY_16 = 16;
+ private static final int CAPACITY_NEG_ONE_HALF = -1;
+ private static final int CAPACITY_ZERO = 0;
private static final Integer INTEGER_1 = new Integer(1);
private static final Integer INTEGER_11 = new Integer(11);
private static final Integer INTEGER_2 = new Integer(2);
@@ -70,6 +71,10 @@
private static final String KEY_TEST_KEY_SET = "testKeySet";
private static final String KEY_TEST_PUT = "testPut";
private static final String KEY_TEST_REMOVE = "testRemove";
+ private static final float LOAD_FACTOR_NEG_ONE = -1.0F;
+ private static final float LOAD_FACTOR_ONE_HALF = 0.5F;
+ private static final float LOAD_FACTOR_ONE_TENTH = 0.1F;
+ private static final float LOAD_FACTOR_ZERO = 0.0F;
private static final Object ODD_ZERO_KEY = new Object() {
public int hashCode() {
return 0;
diff --git a/user/test/com/google/gwt/emultest/java/util/LinkedHashMapTest.java b/user/test/com/google/gwt/emultest/java/util/LinkedHashMapTest.java
index 1d06fd5..ed8c804 100644
--- a/user/test/com/google/gwt/emultest/java/util/LinkedHashMapTest.java
+++ b/user/test/com/google/gwt/emultest/java/util/LinkedHashMapTest.java
@@ -21,10 +21,10 @@
import java.util.Collection;
import java.util.Iterator;
-import java.util.LinkedHashMap;
import java.util.Map;
-import java.util.Map.Entry;
import java.util.Set;
+import java.util.Map.Entry;
+import java.util.LinkedHashMap;
/**
* Tests <code>LinkedHashMap</code>.
@@ -119,7 +119,8 @@
*
* @param hashMap
*/
- private static void checkEmptyLinkedHashMapAssumptions(LinkedHashMap<?, ?> hashMap) {
+ @SuppressWarnings("unchecked") // raw LinkedHashMap
+ private static void checkEmptyLinkedHashMapAssumptions(LinkedHashMap hashMap) {
assertNotNull(hashMap);
assertTrue(hashMap.isEmpty());
@@ -753,11 +754,12 @@
* @param hashMap the LinkedHashMap to be copied
* @return the copy
*/
- private <K, V> LinkedHashMap<K, V> cloneLinkedHashMap(LinkedHashMap<K, V> hashMap) {
+ @SuppressWarnings("unchecked") // raw LinkedHashMap
+ private LinkedHashMap cloneLinkedHashMap(LinkedHashMap hashMap) {
if (GWT.isScript()) {
- return new LinkedHashMap<K, V>(hashMap);
+ return new LinkedHashMap(hashMap);
} else {
- LinkedHashMap<K, V> m = new LinkedHashMap<K, V>();
+ LinkedHashMap m = new LinkedHashMap();
m.putAll(hashMap);
return m;
}
diff --git a/user/test/com/google/gwt/emultest/java/util/StackProfile.java b/user/test/com/google/gwt/emultest/java/util/StackProfile.java
index e755168..fa941c9 100644
--- a/user/test/com/google/gwt/emultest/java/util/StackProfile.java
+++ b/user/test/com/google/gwt/emultest/java/util/StackProfile.java
@@ -45,7 +45,7 @@
}
public void addTiming(int num) {
- Stack<String> s = new Stack<String>();
+ Stack s = new Stack();
resetTimer();
for (int i = 0; i < num; i++) {
s.push("item" + i);
diff --git a/user/test/com/google/gwt/emultest/java/util/StackTest.java b/user/test/com/google/gwt/emultest/java/util/StackTest.java
index bcc1070..28e3930 100644
--- a/user/test/com/google/gwt/emultest/java/util/StackTest.java
+++ b/user/test/com/google/gwt/emultest/java/util/StackTest.java
@@ -25,129 +25,12 @@
*/
public class StackTest extends GWTTestCase {
- private static final int TEST_SEARCH_SIZE = 10;
- private static final int TEST_SIZE = 10;
-
- /** Sets module name so that javascript compiler can operate. */
- public String getModuleName() {
- return "com.google.gwt.emultest.EmulSuite";
- }
-
- /** Tests clone on Stacks. */
- public void testClone() {
- Stack<Integer> large = createLargeStack();
- @SuppressWarnings("unchecked")
- Stack<Integer> cloned = (Stack<Integer>) large.clone();
- checkLargeStack(cloned, 0);
- assertEquals(large.size(), TEST_SIZE);
- }
-
- /**
- * Tests pushing many elements into a stack, and seeing if they come out in
- * order. Also verifies that we get the correct exception when we run out of
- * elements, and tests peek
- */
- public void testCountAndOrderWithPeek() {
- Stack<Integer> large = new Stack<Integer>();
- for (int i = 0; i < TEST_SIZE; i++) {
- large.push(i);
- assertTrue(large.peek() == i);
- assertTrue(large.pop() == i);
- int theFinalInt = i + TEST_SIZE;
- large.push(theFinalInt);
- assertTrue(large.peek() == theFinalInt);
- }
- checkLargeStack(large, TEST_SIZE);
- }
-
- /** tests empty and tries to get emptyStackException as desired. */
- public void testEmptyAndEmptyStackException() {
- Stack<String> s = new Stack<String>();
- String item = "empty1";
- s.push(item);
- assertEquals(1, s.size());
- assertFalse(s.empty());
- assertEquals(s.pop(), item);
- checkEmptiness(s);
- }
-
- /** Tests pop and peek. */
- public void testPopAndPeek() {
- Stack<String> testStack = createStack();
- int x = testStack.size();
- Object item = testStack.peek();
- assertTrue(testStack.pop() == item);
- assertEquals(x - 1, testStack.size());
- }
-
- /** Tests push and peek. */
- public void testPushAndPeek() {
- Stack<String> testStack = createStack();
- int x = testStack.size();
- String item = "4";
- testStack.push(item);
- assertEquals(x + 1, testStack.size());
- assertTrue(testStack.peek() == item);
- }
-
- /**
- * Tests all combinations of search for a stack that attains a max size of
- * TEST_SEARCH_SIZE.
- */
- public void testSearch() {
- Stack<Integer> searchStack = new Stack<Integer>();
- checkEmptiness(searchStack);
- for (int stackSizeIncreasing = 0; stackSizeIncreasing < TEST_SEARCH_SIZE;
- stackSizeIncreasing++) {
- for (int theInt = 0; theInt < stackSizeIncreasing; theInt++) {
- assertEquals(
- "Increasing search found", searchStack.search(theInt), searchStack.size() - theInt);
- }
- for (int theInt = stackSizeIncreasing; theInt < TEST_SEARCH_SIZE; theInt++) {
- assertEquals("Increasing not found", searchStack.search(theInt), -1);
- }
- searchStack.push(stackSizeIncreasing);
- }
- for (int stackSizeDecreasing = TEST_SEARCH_SIZE - 1; stackSizeDecreasing >= 0;
- stackSizeDecreasing--) {
- for (int theInt = TEST_SEARCH_SIZE - 1; theInt > stackSizeDecreasing; theInt--) {
- assertEquals("Search decreasing not found", searchStack.search(theInt), -1);
- }
- for (int theInt = stackSizeDecreasing; theInt >= 0; theInt--) {
- assertEquals(
- "Search decreasing found", searchStack.search(theInt), searchStack.size() - theInt);
- }
- searchStack.pop();
- }
- checkEmptiness(searchStack);
- }
-
- private void checkLargeStack(Stack<Integer> stack, int offset) {
- for (int i = TEST_SIZE - 1; i >= 0; i--) {
- int theObtainedInt = stack.pop();
- assertEquals(i + offset, theObtainedInt);
- }
- checkEmptiness(stack);
- }
-
- private Stack<Integer> createLargeStack() {
- Stack<Integer> large = new Stack<Integer>();
- for (int i = 0; i < TEST_SIZE; i++) {
- large.push(i);
- }
- return large;
- }
-
- private Stack<String> createStack() {
- Stack<String> stack = new Stack<String>();
- stack.push("1");
- stack.push("2");
- stack.push("3");
- return stack;
- }
+ public static final int TEST_SEARCH_SIZE = 10;
+ public static final int TEST_SIZE = 10;
+ public static Stack testStack = new Stack();
/** Checks for emptiness of stack by peeking and popping. */
- private void checkEmptiness(Stack<?> s) {
+ public void checkEmptiness(Stack s) {
assertTrue(s.empty());
try {
s.pop();
@@ -161,4 +44,120 @@
}
}
}
+
+ /** Sets module name so that javascript compiler can operate. */
+ public String getModuleName() {
+ return "com.google.gwt.emultest.EmulSuite";
+ }
+
+ /** Tests clone on Stacks. */
+ public void testClone() {
+ Stack large = createLargeStack();
+ Stack cloned = (Stack) large.clone();
+ checkLargeStack(cloned, 0);
+ assertEquals(large.size(), TEST_SIZE);
+ }
+
+ /**
+ * Tests pushing many elements into a stack, and seeing if they come out in
+ * order. Also verifies that we get the correct exception when we run out of
+ * elements, and tests peek
+ */
+ public void testCountAndOrderWithPeek() {
+ Stack large = new Stack();
+ for (int i = 0; i < TEST_SIZE; i++) {
+ Integer theInt = new Integer(i);
+ large.push(theInt);
+ assertTrue(large.peek() == theInt);
+ assertTrue(large.pop() == theInt);
+ Integer theFinalInt = new Integer(theInt.intValue() + TEST_SIZE);
+ large.push(theFinalInt);
+ assertTrue(large.peek() == theFinalInt);
+ }
+ checkLargeStack(large, TEST_SIZE);
+ }
+
+ /** tests empty and tries to get emptyStackException as desired. */
+ public void testEmptyAndEmptyStackException() {
+ Stack s = new Stack();
+ String item = "empty1";
+ s.push(item);
+ assertEquals(1, s.size());
+ assertFalse(s.empty());
+ assertEquals(s.pop(), item);
+ checkEmptiness(s);
+ }
+
+ /** Tests pop and peek. */
+ public void testPopAndPeek() {
+ int x = testStack.size();
+ Object item = testStack.peek();
+ assertTrue(testStack.pop() == item);
+ assertEquals(x - 1, testStack.size());
+ }
+
+ /** Tests push and peek. */
+ public void testPushAndPeek() {
+ int x = testStack.size();
+ Object item = "4";
+ testStack.push(item);
+ assertEquals(x + 1, testStack.size());
+ assertTrue(testStack.peek() == item);
+ }
+
+ /**
+ * Tests all combinations of search for a stack that attains a max size of
+ * TEST_SEARCH_SIZE.
+ */
+ public void testSearch() {
+ Stack searchStack = new Stack();
+ checkEmptiness(searchStack);
+ for (int stackSizeIncreasing = 0; stackSizeIncreasing < TEST_SEARCH_SIZE; stackSizeIncreasing++) {
+ for (int theInt = 0; theInt < stackSizeIncreasing; theInt++) {
+ assertEquals("Increasing search found", searchStack.search(new Integer(
+ theInt)), searchStack.size() - theInt);
+ }
+ for (int theInt = stackSizeIncreasing; theInt < TEST_SEARCH_SIZE; theInt++) {
+ assertEquals("Increasing not found", searchStack.search(new Integer(
+ theInt)), -1);
+ }
+ searchStack.push(new Integer(stackSizeIncreasing));
+ }
+ for (int stackSizeDecreasing = TEST_SEARCH_SIZE - 1; stackSizeDecreasing >= 0; stackSizeDecreasing--) {
+ for (int theInt = TEST_SEARCH_SIZE - 1; theInt > stackSizeDecreasing; theInt--) {
+ assertEquals("Search decreasing not found",
+ searchStack.search(new Integer(theInt)), -1);
+ }
+ for (int theInt = stackSizeDecreasing; theInt >= 0; theInt--) {
+ assertEquals("Search decreasing found", searchStack.search(new Integer(
+ theInt)), searchStack.size() - theInt);
+ }
+ searchStack.pop();
+ }
+ checkEmptiness(searchStack);
+ }
+
+ private void checkLargeStack(Stack cloned, int offset) {
+ for (int i = TEST_SIZE - 1; i >= 0; i--) {
+ Integer theObtainedInt = (Integer) cloned.pop();
+ assertEquals(i + offset, theObtainedInt.intValue());
+ }
+ checkEmptiness(cloned);
+ }
+
+ private Stack createLargeStack() {
+ Stack large = new Stack();
+ for (int i = 0; i < TEST_SIZE; i++) {
+ Integer theFinalInt = new Integer(i);
+ large.push(theFinalInt);
+ }
+ return large;
+ }
+
+ static {
+ testStack.push("1");
+ testStack.push("2");
+ testStack.push("3");
+ }
+
}
diff --git a/user/test/com/google/gwt/emultest/java/util/TreeMapTest.java b/user/test/com/google/gwt/emultest/java/util/TreeMapTest.java
index 59a5f66..30ea28e 100644
--- a/user/test/com/google/gwt/emultest/java/util/TreeMapTest.java
+++ b/user/test/com/google/gwt/emultest/java/util/TreeMapTest.java
@@ -29,11 +29,11 @@
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
-import java.util.Map.Entry;
import java.util.NoSuchElementException;
import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;
+import java.util.Map.Entry;
/**
* Tests <code>TreeMap</code>.
@@ -943,7 +943,6 @@
assertEquals(1, keySet.size());
}
- @SuppressWarnings("unchecked")
public void testKeySetIteratorRemove() {
Map<K, V> map = makeFullMap();
resetFull();
@@ -1542,7 +1541,6 @@
*
* @see java.util.Map#remove(Object)
*/
- @SuppressWarnings("unchecked")
public void testRemove_throwsNullPointerException() {
// The _throwsUnsupportedOperationException version of this test will
// verify that the method is not supported.
diff --git a/user/test/com/google/gwt/http/RequestTest.gwt.xml b/user/test/com/google/gwt/http/RequestTest.gwt.xml
index 9926f14..38b75b2 100644
--- a/user/test/com/google/gwt/http/RequestTest.gwt.xml
+++ b/user/test/com/google/gwt/http/RequestTest.gwt.xml
@@ -15,6 +15,6 @@
<module>
<inherits name='com.google.gwt.user.User' />
- <servlet path='/testRequest/*'
+ <servlet path='/testRequest'
class='com.google.gwt.http.server.RequestTestServlet' />
</module>
diff --git a/user/test/com/google/gwt/http/client/RequestTest.java b/user/test/com/google/gwt/http/client/RequestTest.java
index 0f31fac..7046195 100644
--- a/user/test/com/google/gwt/http/client/RequestTest.java
+++ b/user/test/com/google/gwt/http/client/RequestTest.java
@@ -127,32 +127,4 @@
fail(e.getMessage());
}
}
-
- /*
- * Checks that the status code is correct when receiving a 204-No-Content. This needs special
- * handling in IE6-9. See http://code.google.com/p/google-web-toolkit/issues/detail?id=5031
- */
- public void test204NoContent() {
- delayTestFinishForRequest();
-
- RequestBuilder builder =
- new RequestBuilder(RequestBuilder.GET, getTestBaseURL() + "204NoContent");
- try {
- builder.sendRequest(null, new RequestCallback() {
-
- @Override
- public void onResponseReceived(Request request, Response response) {
- assertEquals(204, response.getStatusCode());
- finishTest();
- }
-
- @Override
- public void onError(Request request, Throwable exception) {
- fail(exception.getMessage());
- }
- });
- } catch (RequestException e) {
- fail(e.getMessage());
- }
- }
}
diff --git a/user/test/com/google/gwt/http/server/RequestTestServlet.java b/user/test/com/google/gwt/http/server/RequestTestServlet.java
index e267650..ec631b4 100644
--- a/user/test/com/google/gwt/http/server/RequestTestServlet.java
+++ b/user/test/com/google/gwt/http/server/RequestTestServlet.java
@@ -29,16 +29,12 @@
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
- if (request.getRequestURI().endsWith("/204NoContent")) {
- response.setStatus(HttpServletResponse.SC_NO_CONTENT);
- } else {
- try {
- Thread.sleep(5000);
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- response.setStatus(HttpServletResponse.SC_OK);
+ try {
+ Thread.sleep(5000);
+ } catch (InterruptedException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
}
+ response.setStatus(HttpServletResponse.SC_OK);
}
}
diff --git a/user/test/com/google/gwt/i18n/I18NSuite.java b/user/test/com/google/gwt/i18n/I18NSuite.java
index dc1864b..9906f51 100644
--- a/user/test/com/google/gwt/i18n/I18NSuite.java
+++ b/user/test/com/google/gwt/i18n/I18NSuite.java
@@ -43,7 +43,6 @@
import com.google.gwt.i18n.client.NumberFormat_fr_Test;
import com.google.gwt.i18n.client.NumberParse_en_Test;
import com.google.gwt.i18n.client.NumberParse_fr_Test;
-import com.google.gwt.i18n.client.PolishPluralsTest;
import com.google.gwt.i18n.client.RuntimeLocalesTest;
import com.google.gwt.i18n.client.TimeZoneInfoTest;
import com.google.gwt.i18n.client.TimeZoneTest;
@@ -111,7 +110,6 @@
suite.addTestSuite(NumberFormat_fr_Test.class);
suite.addTestSuite(NumberParse_en_Test.class);
suite.addTestSuite(NumberParse_fr_Test.class);
- suite.addTestSuite(PolishPluralsTest.class);
suite.addTestSuite(PropertyCatalogFactoryTest.class);
suite.addTestSuite(ReflectionMessageInterfaceTest.class);
suite.addTestSuite(RegionInheritanceTest.class);
diff --git a/user/test/com/google/gwt/i18n/MapTestBase.java b/user/test/com/google/gwt/i18n/MapTestBase.java
index 475a3e4..2901dd2 100644
--- a/user/test/com/google/gwt/i18n/MapTestBase.java
+++ b/user/test/com/google/gwt/i18n/MapTestBase.java
@@ -106,7 +106,6 @@
* @author Paul Jack
* @version $Id: TestMap.java,v 1.20.2.1 2004/05/22 12:14:05 scolebourne Exp $
*/
-@SuppressWarnings({"unchecked", "rawtypes"})
public abstract class MapTestBase extends TestCase {
// These instance variables are initialized with the reset method.
diff --git a/user/test/com/google/gwt/i18n/client/DateTimeParse_en_Test.java b/user/test/com/google/gwt/i18n/client/DateTimeParse_en_Test.java
index 7360286..54d4803 100644
--- a/user/test/com/google/gwt/i18n/client/DateTimeParse_en_Test.java
+++ b/user/test/com/google/gwt/i18n/client/DateTimeParse_en_Test.java
@@ -74,11 +74,6 @@
assertEquals(9 - 1900, date.getYear());
assertEquals(12 - 1, date.getMonth());
assertEquals(2, date.getDate());
-
- assertEquals(6, parse("dd HHmm", "11 213", 0, date));
- assertEquals(11, date.getDate());
- assertEquals(2, date.getHours());
- assertEquals(13, date.getMinutes());
}
public void testAmbiguousYear() {
diff --git a/user/test/com/google/gwt/i18n/client/I18N2Test.java b/user/test/com/google/gwt/i18n/client/I18N2Test.java
index 0d0c9be..c1578c0 100644
--- a/user/test/com/google/gwt/i18n/client/I18N2Test.java
+++ b/user/test/com/google/gwt/i18n/client/I18N2Test.java
@@ -156,9 +156,9 @@
String str = timeZoneData.americaLosAngeles();
TimeZoneInfo tzInfo = TimeZoneInfo.buildTimeZoneData(str);
TimeZone tz = TimeZone.createTimeZone(tzInfo);
- assertEquals("in timezone: 2/1/2010, 7:04:05 PM", m.inTimezone(date, tz));
+ assertEquals("in timezone: 2/1/2010 7:04:05 PM", m.inTimezone(date, tz));
- assertEquals("in timezone: 2/1/2010, 7:04:05 PM", m.inTimezoneAsSafeHtml(date, tz).asString());
+ assertEquals("in timezone: 2/1/2010 7:04:05 PM", m.inTimezoneAsSafeHtml(date, tz).asString());
}
public void testListWithArray() {
@@ -513,9 +513,9 @@
public void testStaticTimeZone() {
TestAnnotatedMessages m = GWT.create(TestAnnotatedMessages.class);
Date date = new Date(Date.UTC(2010 - 1900, 1, 2, 3, 4, 5));
- assertEquals("in GMT: 2/2/2010, 3:04:05 AM", m.gmt(date));
+ assertEquals("in GMT: 2/2/2010 3:04:05 AM", m.gmt(date));
- assertEquals("in GMT: 2/2/2010, 3:04:05 AM", m.gmtAsSafeHtml(date).asString(
+ assertEquals("in GMT: 2/2/2010 3:04:05 AM", m.gmtAsSafeHtml(date).asString(
));
}
diff --git a/user/test/com/google/gwt/i18n/client/I18N_nb_Test.java b/user/test/com/google/gwt/i18n/client/I18N_nb_Test.java
index 88da5d9..ede08e8 100644
--- a/user/test/com/google/gwt/i18n/client/I18N_nb_Test.java
+++ b/user/test/com/google/gwt/i18n/client/I18N_nb_Test.java
@@ -64,6 +64,6 @@
currencyData = currencyList.lookup("RUB");
assertNotNull(currencyData);
assertEquals("RUB", currencyData.getCurrencyCode());
- assertEquals("руб.", currencyData.getCurrencySymbol());
+ assertEquals("руб", currencyData.getCurrencySymbol());
}
}
diff --git a/user/test/com/google/gwt/i18n/client/PolishPluralsTest.java b/user/test/com/google/gwt/i18n/client/PolishPluralsTest.java
deleted file mode 100644
index df9e59b..0000000
--- a/user/test/com/google/gwt/i18n/client/PolishPluralsTest.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright 2012 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.i18n.client;
-
-import com.google.gwt.core.client.GWT;
-import com.google.gwt.junit.client.GWTTestCase;
-
-/**
- * Tests Polish plurals, which is one of the most complicated.
- */
-public class PolishPluralsTest extends GWTTestCase {
-
- /**
- * Shorter message for just testing that Polish plurals work properly.
- */
- public interface PluralMessage extends Messages {
- @DefaultMessage("{0} widgets-few")
- @AlternateMessage({"one", "A widget"})
- String pluralWidgetsOther(@PluralCount int count);
- }
-
- @Override
- public String getModuleName() {
- return "com.google.gwt.i18n.I18NTest_pl";
- }
-
- public void testPlurals() {
- // Note that all text is actually in English, but written according to
- // Polish plural rules.
- PluralMessage m = GWT.create(PluralMessage.class);
- assertEquals("(Polish many) 0 widgets", m.pluralWidgetsOther(0));
- assertEquals("(Polish one) A widget", m.pluralWidgetsOther(1));
- assertEquals("(Polish few) 2 widgets", m.pluralWidgetsOther(2));
- assertEquals("(Polish few) 3 widgets", m.pluralWidgetsOther(3));
- assertEquals("(Polish few) 4 widgets", m.pluralWidgetsOther(4));
- assertEquals("(Polish many) 5 widgets", m.pluralWidgetsOther(5));
- assertEquals("(Polish many) 10 widgets", m.pluralWidgetsOther(10));
- assertEquals("(Polish many) 11 widgets", m.pluralWidgetsOther(11));
- assertEquals("(Polish many) 12 widgets", m.pluralWidgetsOther(12));
- assertEquals("(Polish many) 13 widgets", m.pluralWidgetsOther(13));
- assertEquals("(Polish many) 14 widgets", m.pluralWidgetsOther(14));
- assertEquals("(Polish many) 15 widgets", m.pluralWidgetsOther(15));
- assertEquals("(Polish many) 20 widgets", m.pluralWidgetsOther(20));
- assertEquals("(Polish many) 21 widgets", m.pluralWidgetsOther(21));
- assertEquals("(Polish few) 22 widgets", m.pluralWidgetsOther(22));
- assertEquals("(Polish few) 23 widgets", m.pluralWidgetsOther(23));
- assertEquals("(Polish few) 24 widgets", m.pluralWidgetsOther(24));
- assertEquals("(Polish many) 25 widgets", m.pluralWidgetsOther(25));
- assertEquals("(Polish many) 99 widgets", m.pluralWidgetsOther(99));
- assertEquals("(Polish many) 100 widgets", m.pluralWidgetsOther(100));
- assertEquals("(Polish many) 101 widgets", m.pluralWidgetsOther(101));
- assertEquals("(Polish few) 102 widgets", m.pluralWidgetsOther(102));
- assertEquals("(Polish few) 103 widgets", m.pluralWidgetsOther(103));
- assertEquals("(Polish few) 104 widgets", m.pluralWidgetsOther(104));
- assertEquals("(Polish many) 105 widgets", m.pluralWidgetsOther(105));
- }
-}
diff --git a/user/test/com/google/gwt/i18n/client/PolishPluralsTest_PluralMessage_pl.properties b/user/test/com/google/gwt/i18n/client/PolishPluralsTest_PluralMessage_pl.properties
deleted file mode 100644
index ee22380..0000000
--- a/user/test/com/google/gwt/i18n/client/PolishPluralsTest_PluralMessage_pl.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-pluralWidgetsOther=(Polish other) {0} widgets
-pluralWidgetsOther[one]=(Polish one) A widget
-pluralWidgetsOther[few]=(Polish few) {0} widgets
-pluralWidgetsOther[many]=(Polish many) {0} widgets
diff --git a/user/test/com/google/gwt/i18n/public_es_AR/junit-standards.html b/user/test/com/google/gwt/i18n/public_es_AR/junit-standards.html
index a998bc9..1ae3c80 100644
--- a/user/test/com/google/gwt/i18n/public_es_AR/junit-standards.html
+++ b/user/test/com/google/gwt/i18n/public_es_AR/junit-standards.html
@@ -53,12 +53,12 @@
}
function loadSelectionScript() {
- var moduleName = location.pathname;
+ var moduleName = document.location.href;
var pos = moduleName.lastIndexOf('/');
moduleName = moduleName.substr(0, pos);
pos = moduleName.lastIndexOf('/');
moduleName = moduleName.substr(pos + 1);
- document.write('<script language="javascript" src="' + encodeURIComponent(moduleName) + '.nocache.js"><\/script>');
+ document.write("<script language='javascript' src='" + moduleName + ".nocache.js'><\/script>");
}
loadSelectionScript();
-->
diff --git a/user/test/com/google/gwt/i18n/public_es_AR/junit.html b/user/test/com/google/gwt/i18n/public_es_AR/junit.html
index 31c0114..e30fb7b 100644
--- a/user/test/com/google/gwt/i18n/public_es_AR/junit.html
+++ b/user/test/com/google/gwt/i18n/public_es_AR/junit.html
@@ -52,12 +52,12 @@
}
function loadSelectionScript() {
- var moduleName = location.pathname;
+ var moduleName = document.location.href;
var pos = moduleName.lastIndexOf('/');
moduleName = moduleName.substr(0, pos);
pos = moduleName.lastIndexOf('/');
moduleName = moduleName.substr(pos + 1);
- document.write('<script language="javascript" src="' + encodeURIComponent(moduleName) + '.nocache.js"><\/script>');
+ document.write("<script language='javascript' src='" + moduleName + ".nocache.js'></script>");
}
loadSelectionScript();
-->
diff --git a/user/test/com/google/gwt/i18n/public_es_MX/junit-standards.html b/user/test/com/google/gwt/i18n/public_es_MX/junit-standards.html
index db0b393..da44249 100644
--- a/user/test/com/google/gwt/i18n/public_es_MX/junit-standards.html
+++ b/user/test/com/google/gwt/i18n/public_es_MX/junit-standards.html
@@ -53,12 +53,12 @@
}
function loadSelectionScript() {
- var moduleName = location.pathname;
+ var moduleName = document.location.href;
var pos = moduleName.lastIndexOf('/');
moduleName = moduleName.substr(0, pos);
pos = moduleName.lastIndexOf('/');
moduleName = moduleName.substr(pos + 1);
- document.write('<script language="javascript" src="' + encodeURIComponent(moduleName) + '.nocache.js"><\/script>');
+ document.write("<script language='javascript' src='" + moduleName + ".nocache.js'><\/script>");
}
loadSelectionScript();
-->
diff --git a/user/test/com/google/gwt/i18n/public_es_MX/junit.html b/user/test/com/google/gwt/i18n/public_es_MX/junit.html
index 924012c..0de069d 100644
--- a/user/test/com/google/gwt/i18n/public_es_MX/junit.html
+++ b/user/test/com/google/gwt/i18n/public_es_MX/junit.html
@@ -52,12 +52,12 @@
}
function loadSelectionScript() {
- var moduleName = location.pathname;
+ var moduleName = document.location.href;
var pos = moduleName.lastIndexOf('/');
moduleName = moduleName.substr(0, pos);
pos = moduleName.lastIndexOf('/');
moduleName = moduleName.substr(pos + 1);
- document.write('<script language="javascript" src="' + encodeURIComponent(moduleName) + '.nocache.js"><\/script>');
+ document.write("<script language='javascript' src='" + moduleName + ".nocache.js'></script>");
}
loadSelectionScript();
-->
diff --git a/user/test/com/google/gwt/junit/ExpectedFailure.java b/user/test/com/google/gwt/junit/ExpectedFailure.java
deleted file mode 100644
index dc76900..0000000
--- a/user/test/com/google/gwt/junit/ExpectedFailure.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright 2012 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.junit;
-
-import junit.framework.AssertionFailedError;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * An annotation to mark test cases where the expected result is a failure.
- */
-@Target(ElementType.METHOD)
-@Retention(RetentionPolicy.RUNTIME)
-public @interface ExpectedFailure {
- String withMessage() default "";
-
- Class<? extends Throwable> withType() default AssertionFailedError.class;
-}
diff --git a/user/test/com/google/gwt/junit/ForwardingTestResult.java b/user/test/com/google/gwt/junit/ForwardingTestResult.java
deleted file mode 100644
index 22c3cb8..0000000
--- a/user/test/com/google/gwt/junit/ForwardingTestResult.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright 2012 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.junit;
-
-
-import junit.framework.AssertionFailedError;
-import junit.framework.Test;
-import junit.framework.TestFailure;
-import junit.framework.TestListener;
-import junit.framework.TestResult;
-
-import java.util.Enumeration;
-
-/**
- * A {@link TestResult} that forwards calls to the provided delegate with the exception of
- * {@link #run} and {@link #runProtected} as these two methods just call other methods that a
- * subclass of ForwardingTestResult might override.
- */
-abstract class ForwardingTestResult extends TestResult {
- private TestResult delegate;
-
- public ForwardingTestResult(TestResult result) {
- delegate = result;
- }
-
- public void addError(Test test, Throwable t) {
- delegate.addError(test, t);
- }
-
- public void addFailure(Test test, AssertionFailedError t) {
- delegate.addFailure(test, t);
- }
-
- public void addListener(TestListener listener) {
- delegate.addListener(listener);
- }
-
- public void removeListener(TestListener listener) {
- delegate.removeListener(listener);
- }
-
- public void endTest(Test test) {
- delegate.endTest(test);
- }
-
- public int errorCount() {
- return delegate.errorCount();
- }
-
- public Enumeration<TestFailure> errors() {
- return delegate.errors();
- }
-
- public int failureCount() {
- return delegate.failureCount();
- }
-
- public Enumeration<TestFailure> failures() {
- return delegate.failures();
- }
-
- public int runCount() {
- return delegate.runCount();
- }
-
- public boolean shouldStop() {
- return delegate.shouldStop();
- }
-
- public void startTest(Test test) {
- delegate.startTest(test);
- }
-
- public void stop() {
- delegate.stop();
- }
-
- public boolean wasSuccessful() {
- return delegate.wasSuccessful();
- }
-}
\ No newline at end of file
diff --git a/user/test/com/google/gwt/junit/GwtTestSuiteWithExpectedFailures.java b/user/test/com/google/gwt/junit/GwtTestSuiteWithExpectedFailures.java
deleted file mode 100644
index 2b3ebf4..0000000
--- a/user/test/com/google/gwt/junit/GwtTestSuiteWithExpectedFailures.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright 2012 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.junit;
-
-import com.google.gwt.junit.tools.GWTTestSuite;
-
-import junit.framework.TestResult;
-
-/**
- * A {@link GWTTestSuite} that can interpret {@link ExpectedFailure} on test methods.
- */
-class GwtTestSuiteWithExpectedFailures extends GWTTestSuite {
-
- public GwtTestSuiteWithExpectedFailures(String name) {
- super(name);
- }
-
- @Override
- public void run(TestResult result) {
- super.run(decorateResult(result));
- }
-
- private TestResult decorateResult(TestResult result) {
- return new TestResultWithExpectedFailures(result);
- }
-}
diff --git a/user/test/com/google/gwt/junit/JUnitSuite.java b/user/test/com/google/gwt/junit/JUnitSuite.java
index eba96f3..e225dff 100644
--- a/user/test/com/google/gwt/junit/JUnitSuite.java
+++ b/user/test/com/google/gwt/junit/JUnitSuite.java
@@ -16,29 +16,24 @@
package com.google.gwt.junit;
import com.google.gwt.junit.client.DevModeOnCompiledScriptTest;
-import com.google.gwt.junit.client.GWTTestCaseAsyncTest;
-import com.google.gwt.junit.client.GWTTestCaseSetupTearDownTest;
import com.google.gwt.junit.client.GWTTestCaseTest;
import com.google.gwt.junit.client.PropertyDefiningGWTTest;
+import com.google.gwt.junit.tools.GWTTestSuite;
import junit.framework.Test;
-import junit.framework.TestSuite;
/**
* Tests of the junit package.
*/
public class JUnitSuite {
public static Test suite() {
- TestSuite suite = new GwtTestSuiteWithExpectedFailures("Test suite for com.google.gwt.junit");
+ GWTTestSuite suite = new GWTTestSuite(
+ "Test for suite for com.google.gwt.junit");
// client
// Suppressed due to flakiness on Linux
// suite.addTestSuite(BenchmarkTest.class);
-
suite.addTestSuite(GWTTestCaseTest.class);
- suite.addTest(new TestSuiteWithOrder(GWTTestCaseAsyncTest.class));
- suite.addTest(new TestSuiteWithOrder(GWTTestCaseSetupTearDownTest.class));
-
suite.addTestSuite(DevModeOnCompiledScriptTest.class);
// Must run after a GWTTestCase so JUnitShell is initialized.
@@ -50,8 +45,9 @@
suite.addTestSuite(JUnitMessageQueueTest.class);
suite.addTestSuite(GWTTestCaseNoClientTest.class);
- // Intended only to be run manually. See class comments
+ // These two are intended only to be run manually. See class comments
// suite.addTestSuite(ParallelRemoteTest.class);
+ // suite.addTestSuite(TestManualAsync.class);
// remote
// Run manually only, launches servers that die on port contention
diff --git a/user/test/com/google/gwt/junit/TestResultWithExpectedFailures.java b/user/test/com/google/gwt/junit/TestResultWithExpectedFailures.java
deleted file mode 100644
index 555d8da..0000000
--- a/user/test/com/google/gwt/junit/TestResultWithExpectedFailures.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright 2012 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.junit;
-
-import junit.framework.AssertionFailedError;
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestResult;
-
-import java.lang.reflect.Method;
-
-/**
- * A {@link TestResult} that can interpret {@link ExpectedFailure} on test methods.
- */
-class TestResultWithExpectedFailures extends ForwardingTestResult {
-
- private boolean failed;
-
- public TestResultWithExpectedFailures(TestResult delegate) {
- super(delegate);
- }
-
- @Override
- public void startTest(Test test) {
- failed = false;
- super.startTest(test);
- }
-
- @Override
- public void addFailure(Test test, AssertionFailedError t) {
- failed = true;
- if (isAnExpectedException(test, t)) {
- return; // This is a good kind of failure, do not report it.
- }
- super.addFailure(test, t);
- }
-
- @Override
- public void addError(Test test, Throwable t) {
- failed = true;
- if (isAnExpectedException(test, t)) {
- return; // This is a good kind of failure, do not report it.
- }
- super.addError(test, t);
- }
-
- @Override
- public void endTest(Test test) {
- if (!failed && isTestExpectedToFail(test)) {
- // Test should have failed but didn't. Report the failure by calling the super directly to
- // prevent any interference from overridden #addFailure.
- super.addFailure(test, new AssertionFailedError("Expected failure but didn't fail"));
- }
- super.endTest(test);
- }
-
- private boolean isTestExpectedToFail(Test test) {
- return getExpectedFailureAnnotation(test) != null;
- }
-
- private boolean isAnExpectedException(Test test, Throwable t) {
- ExpectedFailure annotation = getExpectedFailureAnnotation(test);
- if (annotation != null) {
- t = normalizeGwtTestException(t);
- return t.getClass().isAssignableFrom(annotation.withType())
- && getExceptionMessage(t).contains(annotation.withMessage());
- }
- return false;
- }
-
- /**
- * Extracts the real exception from the {@code RuntimeException} thrown by GwtTestCase.
- */
- private Throwable normalizeGwtTestException(Throwable t) {
- // GWTTestCase replaces AssertionFailedError with RuntimeException and for all other exceptions
- // it puts them into 'cause' property.
- return t.getCause() == null ? new AssertionFailedError(t.getMessage()) : t.getCause();
- }
-
- private String getExceptionMessage(Throwable t) {
- return t.getMessage() == null ? "" : t.getMessage();
- }
-
- private ExpectedFailure getExpectedFailureAnnotation(Test test) {
- if (test instanceof TestCase) {
- TestCase testCase = (TestCase) test;
- try {
- Method testMethod = testCase.getClass().getMethod(testCase.getName());
- return testMethod.getAnnotation(ExpectedFailure.class);
- } catch (NoSuchMethodException e) {
- throw new RuntimeException(e);
- }
- }
- return null;
- }
-}
\ No newline at end of file
diff --git a/user/test/com/google/gwt/junit/TestSuiteWithOrder.java b/user/test/com/google/gwt/junit/TestSuiteWithOrder.java
deleted file mode 100644
index 459b477..0000000
--- a/user/test/com/google/gwt/junit/TestSuiteWithOrder.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright 2012 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.junit;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.util.Arrays;
-import java.util.Comparator;
-
-/**
- * Add {@link TestSuite} that runs test cases in alphabetical order.
- */
-class TestSuiteWithOrder extends TestSuite {
-
- /*
- * Implementation Note: When batching is active, TestModuleInfo in GWTTestCase#ALL_GWT_TESTS
- * accidentally forces the test execution order that is derived from first time the TestCase is
- * instantiated. The implementation of this class should guarantee the order not only by sorting
- * TestCases but also creating them in order.
- */
-
- public TestSuiteWithOrder(Class<? extends TestCase> clazz) {
- for (Class<?> c = clazz; Test.class.isAssignableFrom(c); c = c.getSuperclass()) {
- for (Method each : getDeclaredMethods(c)) {
- if (isTestMethod(each)) {
- addTestMethod(each, clazz);
- }
- }
- }
- if (countTestCases() == 0) {
- addTest(warning("No tests found in " + clazz.getName()));
- }
- }
-
- private void addTestMethod(Method m, Class<?> theClass) {
- if (!Modifier.isPublic(m.getModifiers())) {
- addTest(warning("Test method isn't public: " + m.getName() + "(" + theClass.getName() + ")"));
- return;
- }
- addTest(createTest(theClass, m.getName()));
- }
-
- private boolean isTestMethod(Method m) {
- return m.getParameterTypes().length == 0
- && m.getName().startsWith("test")
- && m.getReturnType().equals(Void.TYPE);
- }
-
- private Method[] getDeclaredMethods(Class<?> clazz) {
- Method[] methods = clazz.getDeclaredMethods();
- Arrays.sort(methods, new Comparator<Method>() {
- @Override
- public int compare(Method m1, Method m2) {
- return m1.toString().compareTo(m2.toString());
- }
- });
- return methods;
- }
-}
diff --git a/user/test/com/google/gwt/junit/client/GWTTestCaseAsyncTest.java b/user/test/com/google/gwt/junit/client/GWTTestCaseAsyncTest.java
deleted file mode 100644
index 5342fa0..0000000
--- a/user/test/com/google/gwt/junit/client/GWTTestCaseAsyncTest.java
+++ /dev/null
@@ -1,263 +0,0 @@
-/*
- * Copyright 2012 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.junit.client;
-
-import com.google.gwt.dom.client.ButtonElement;
-import com.google.gwt.dom.client.Document;
-import com.google.gwt.junit.ExpectedFailure;
-import com.google.gwt.user.client.DOM;
-import com.google.gwt.user.client.Event;
-import com.google.gwt.user.client.EventListener;
-import com.google.gwt.user.client.Timer;
-
-/**
- * This class tests GwtTestCase in async mode.
- *
- * Note: This test requires some test methods to be executed in a specific order.
- */
-public class GWTTestCaseAsyncTest extends GWTTestCase {
-
- public String getModuleName() {
- return "com.google.gwt.junit.JUnit";
- }
-
- // The following tests (all prefixed with test_) are intended to test the
- // interaction of synchronous failures (within event handlers) with various
- // other types of failures and successes. All of them are expected to fail
- // with the message "Expected failure".
- //
- // Nomenclature for these tests:
- // DTF => delayTestFinish()
- // SF => synchronous failure (from event handler)
- // FT => finishTest()
- // F => fail()
- // R => return;
-
- @ExpectedFailure(withMessage = "test_dtf_sf")
- public void test_dtf_sf() {
- delayTestFinish();
- synchronousFailure("test_dtf_sf");
- }
-
- @ExpectedFailure(withMessage = "test_dtf_sf_f")
- public void test_dtf_sf_f() {
- delayTestFinish();
- synchronousFailure("test_dtf_sf_f");
- failNow("test_dtf_sf_f");
- }
-
- @ExpectedFailure(withMessage = "test_dtf_sf_ft")
- public void test_dtf_sf_ft() {
- delayTestFinish();
- synchronousFailure("test_dtf_sf_ft");
- finishTest();
- }
-
- // Issue: http://code.google.com/p/google-web-toolkit/issues/detail?id=7846
- @ExpectedFailure(withMessage = "test_dtf_sf_r_f")
- public void _suppressed_test_dtf_sf_r_f() {
- delayTestFinish();
- synchronousFailure("test_dtf_sf_r_f");
- failLater("test_dtf_sf_r_f");
- }
-
- @ExpectedFailure(withMessage = "test_dtf_sf_r_ft")
- public void test_dtf_sf_r_ft() {
- delayTestFinish();
- synchronousFailure("test_dtf_sf_r_ft");
- finishTestLater();
- }
-
- @ExpectedFailure(withMessage = "test_sf")
- public void test_sf() {
- synchronousFailure("test_sf");
- }
-
- @ExpectedFailure(withMessage = "test_sf_dtf_f")
- public void test_sf_dtf_f() {
- synchronousFailure("test_sf_dtf_f");
- delayTestFinish();
- failNow("test_sf_dtf_f");
- }
-
- @ExpectedFailure(withMessage = "test_sf_dtf_ft")
- public void test_sf_dtf_ft() {
- synchronousFailure("test_sf_dtf_ft");
- delayTestFinish();
- finishTest();
- }
-
- // Issue: http://code.google.com/p/google-web-toolkit/issues/detail?id=7846
- @ExpectedFailure(withMessage = "test_sf_dtf_r_f")
- public void _suppressed_test_sf_dtf_r_f() {
- synchronousFailure("test_sf_dtf_r_f");
- delayTestFinish();
- failLater("test_sf_dtf_r_f");
- }
-
- @ExpectedFailure(withMessage = "test_sf_dtf_r_ft")
- public void test_sf_dtf_r_ft() {
- synchronousFailure("test_sf_dtf_r_ft");
- delayTestFinish();
- finishTestLater();
- }
-
- @ExpectedFailure(withMessage = "test_sf_f")
- public void test_sf_f() {
- synchronousFailure("test_sf_f");
- failNow("test_sf_f");
- }
-
- /**
- * Fails normally.
- */
- @ExpectedFailure(withMessage = "testDelayFail")
- public void testDelayFail() {
- delayTestFinish(100);
- fail("testDelayFail");
- finishTest();
- }
-
- /**
- * Completes normally.
- */
- public void testDelayNormal() {
- delayTestFinish(100);
- finishTest();
- }
-
- @ExpectedFailure(withMessage = "testFailAsync")
- public void testFailAsync() {
- delayTestFinish(1000);
- failLater("testFailAsync");
- }
-
- // Issue: http://code.google.com/p/google-web-toolkit/issues/detail?id=7846
- public void _suppressed_testLateFail() {
- // Kickoff timer to fail the test in the middle of next one.
- failLater("testLateFail", 2000);
- }
-
- /**
- * Second half of the previous test.
- */
- public void _suppressed_testLateFail_assert() {
- delayTestFinish(3000);
- finishTestLater(2500);
- // fail() call from previous test case should not cause a failure here.
- }
-
- public void testLateFinish() {
- // Kickoff timer to finish test in the middle of next one.
- finishTestLater(2000);
- }
-
- /**
- * Second half of the previous test.
- */
- @ExpectedFailure(withType = TimeoutException.class)
- public void testLateFinish_assert() {
- delayTestFinish(3000);
- // finishTest() call from previous test case should not prevent the timeout here.
- }
-
- public void testSpuriousFinishTest() {
- try {
- finishTest();
- fail("finishTest should have failed");
- } catch (IllegalStateException e) {
- }
- }
-
- @ExpectedFailure(withType = TimeoutException.class)
- public void testTimeoutAsync() {
- delayTestFinish(100);
- finishTestLater(200);
- }
-
- public void testNormalAsync() {
- delayTestFinish(200);
- finishTestLater(100);
- }
-
- public void testRepeatingNormalAsync() {
- delayTestFinish(200);
- new Timer() {
- private int i = 0;
-
- public void run() {
- if (++i < 4) {
- delayTestFinish(200);
- } else {
- cancel();
- finishTest();
- }
- }
- }.scheduleRepeating(100);
- }
-
- // Call delayTestFinish() with enough time so that failLater() will definitely fail.
- private void delayTestFinish() {
- delayTestFinish(2500);
- }
-
- private void failLater(String failMsg) {
- failLater(failMsg, 100);
- }
-
- private void failLater(final String failMsg, int delay) {
- new Timer() {
- @Override
- public void run() {
- failNow(failMsg);
- }
- }.schedule(delay);
- }
-
- private void failNow(String failMsg) {
- fail("Expected failure (" + failMsg + ")");
- }
-
- private void finishTestLater() {
- finishTestLater(1);
- }
-
- private void finishTestLater(int delay) {
- new Timer() {
- @Override
- public void run() {
- finishTest();
- }
- }.schedule(delay);
- }
-
- // Trigger a test failure synchronously, but from within an event handler.
- // (The exception thrown from fail() will get caught by the GWT UncaughtExceptionHandler).
- private void synchronousFailure(final String failMsg) {
- ButtonElement btn = Document.get().createPushButtonElement();
- Document.get().getBody().appendChild(btn);
- Event.sinkEvents(btn, Event.ONCLICK);
-
- EventListener listener = new EventListener() {
- public void onBrowserEvent(Event event) {
- failNow(failMsg);
- }
- };
-
- DOM.setEventListener(btn.<com.google.gwt.user.client.Element>cast(), listener);
- btn.click();
- }
-}
diff --git a/user/test/com/google/gwt/junit/client/GWTTestCaseSetupTearDownTest.java b/user/test/com/google/gwt/junit/client/GWTTestCaseSetupTearDownTest.java
deleted file mode 100644
index d93cef2..0000000
--- a/user/test/com/google/gwt/junit/client/GWTTestCaseSetupTearDownTest.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * Copyright 2012 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.junit.client;
-
-import static com.google.gwt.junit.client.GWTTestCaseSetupTearDownTest.SetUpTearDownState.SETUP;
-import static com.google.gwt.junit.client.GWTTestCaseSetupTearDownTest.SetUpTearDownState.TEARDOWN;
-import static com.google.gwt.junit.client.GWTTestCaseSetupTearDownTest.SetUpTearDownState.TESTCASE;
-
-import com.google.gwt.junit.ExpectedFailure;
-import com.google.gwt.user.client.Timer;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * This class tests {@link GWTTestCase#setUp()} and {@link GWTTestCase#tearDown()}.
- *
- * Note: This test requires some test methods to be executed in a specific order.
- */
-public class GWTTestCaseSetupTearDownTest extends GWTTestCase {
-
- public String getModuleName() {
- return "com.google.gwt.junit.JUnit";
- }
-
- /**
- * Tracks setup, teardown and testcase runs.
- */
- protected enum SetUpTearDownState {
- SETUP, TEARDOWN, TESTCASE
- }
-
- private static List<SetUpTearDownState> executions = new ArrayList<SetUpTearDownState>();
-
- @Override
- protected void gwtSetUp() {
- executions.add(SETUP);
- }
-
- @Override
- protected void gwtTearDown() {
- executions.add(TEARDOWN);
- }
-
- /**
- * This pseudo testcase for recording setup/testcase/teardown order.
- */
- public void testSetUpTearDown() {
- executions.add(TESTCASE);
- }
-
- /**
- * Delays test finish.
- */
- public void testSetUpTearDownAsync() {
- delayTestFinish(1000);
- new Timer() {
- @Override
- public void run() {
- executions.add(TESTCASE);
- finishTest();
- }
- }.schedule(1);
- }
-
- /**
- * Fails.
- */
- @ExpectedFailure
- public void testSetUpTearDownFail() {
- executions.add(TESTCASE);
- fail();
- }
-
- /**
- * Fails with delayed test finish.
- */
- @ExpectedFailure(withMessage = "testSetUpTearDownFailAsync")
- public void testSetUpTearDownFailSync() {
- executions.add(TESTCASE);
- delayTestFinish(1000);
- fail("testSetUpTearDownFailAsync");
- }
-
- /**
- * Fails async.
- */
- @ExpectedFailure(withMessage = "testSetUpTearDownFailAsync")
- public void testSetUpTearDownFailAsync() {
- delayTestFinish(1000);
- new Timer() {
- @Override
- public void run() {
- executions.add(TESTCASE);
- fail("testSetUpTearDownFailAsync");
- }
- }.schedule(1);
- }
-
- /**
- * Times out async.
- */
- @ExpectedFailure(withType = TimeoutException.class)
- public void testSetUpTearDownTimeout() {
- executions.add(TESTCASE);
- delayTestFinish(1);
- }
-
- /**
- * This is the last test to be is executed (under_score forces that). Will assert all setups &
- * teardowns.
- */
- public void test_assertAllSetUpTearDowns() {
- // These list needs to kept in alphabetical order for correct failure messaging.
- final String[] testCases = {
- "testSetUpTearDown",
- "testSetUpTearDownAsync",
- "testSetUpTearDownFail",
- "testSetUpTearDownFailAsync",
- "testSetUpTearDownFailSync",
- "testSetUpTearDownTimeout"};
-
- Iterator<SetUpTearDownState> iterator = executions.iterator();
- for (String testCase : testCases) {
- assertSame(testCase, SETUP, iterator.next());
- assertSame(testCase, TESTCASE, iterator.next());
- assertSame(testCase, TEARDOWN, iterator.next());
- }
- assertSame(SETUP, iterator.next()); // one last setup call for this test case
- assertFalse(iterator.hasNext());
- }
-}
diff --git a/user/test/com/google/gwt/junit/client/GWTTestCaseTest.java b/user/test/com/google/gwt/junit/client/GWTTestCaseTest.java
index 1146b89..2d151f4 100644
--- a/user/test/com/google/gwt/junit/client/GWTTestCaseTest.java
+++ b/user/test/com/google/gwt/junit/client/GWTTestCaseTest.java
@@ -1,12 +1,12 @@
/*
* Copyright 2007 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
@@ -20,22 +20,43 @@
*/
package com.google.gwt.junit.client;
+import static com.google.gwt.junit.client.GWTTestCaseTest.SetUpTearDownState.INITIAL;
+import static com.google.gwt.junit.client.GWTTestCaseTest.SetUpTearDownState.IS_SETUP;
+import static com.google.gwt.junit.client.GWTTestCaseTest.SetUpTearDownState.IS_TORNDOWN;
+
import com.google.gwt.core.client.GWT;
-import com.google.gwt.core.client.JavaScriptException;
import com.google.gwt.junit.DoNotRunWith;
-import com.google.gwt.junit.ExpectedFailure;
import com.google.gwt.junit.Platform;
+import com.google.gwt.user.client.Timer;
import junit.framework.AssertionFailedError;
-import java.util.Collections;
-
/**
- * This class tests our implementation of the GWTTestCase class which provides the behavior of
- * TestCase that is necessary in GWT.
+ * This class tests our implementation of the GWTTestCase class which provides
+ * the behavior of TestCase that is necessary in GWT.
*/
public class GWTTestCaseTest extends GWTTestCase {
+ /**
+ * Tracks whether or not setup and teardown have run.
+ */
+ protected enum SetUpTearDownState {
+ INITIAL, IS_SETUP, IS_TORNDOWN
+ }
+
+ /**
+ * If non-null, records an error related to setup/teardown that could not have
+ * been caught during normal test execution.
+ */
+ private static String outOfBandError = null;
+
+ /**
+ * These two variables test the retry functionality, currently used with
+ * HtmlUnit.
+ */
+ private static boolean attemptedOnce = false;
+ private static boolean htmlunitMode = true;
+
private static void assertNotEquals(double a, double b, double delta) {
boolean failed = false;
try {
@@ -46,7 +67,8 @@
}
if (!failed) {
- fail("Expected failure for assertEquals(" + a + ", " + b + ", " + delta + ")");
+ fail("Expected failure for assertEquals(" + a + ", " + b + ", " + delta
+ + ")");
}
}
@@ -60,35 +82,20 @@
}
if (!failed) {
- fail("Expected failure for assertEquals(" + a + ", " + b + ", " + delta + ")");
+ fail("Expected failure for assertEquals(" + a + ", " + b + ", " + delta
+ + ")");
}
}
-
- private Object obj1 = Collections.nCopies(1, "data");
- private Object obj2 = Collections.nCopies(2, "data");
- private Object obj1Equal = Collections.nCopies(1, "data");
+
+ /**
+ * Tracks whether this test has been setup and torn down.
+ */
+ protected SetUpTearDownState setupTeardownFlag = INITIAL;
public String getModuleName() {
return "com.google.gwt.junit.JUnit";
}
- @ExpectedFailure(withMessage = "testFail")
- public void testFail() {
- fail("testFail");
- }
-
- @ExpectedFailure(withType = Exception.class)
- public void testThrowsException() throws Exception {
- throw new Exception();
- }
-
- // Fails in 'web' mode.
- // Issue: http://code.google.com/p/google-web-toolkit/issues/detail?id=7847
- @ExpectedFailure(withType = JavaScriptException.class)
- public void _suppressed_testThrowsNonSerializableException() {
- throw new JavaScriptException("name", "desc");
- }
-
public void testAssertEqualsDouble() {
assertEquals(0.0, 0.0, 0.0);
assertEquals(1.1, 1.1, 0.0);
@@ -123,126 +130,241 @@
assertNotEquals(-2.0f, -1.0f, 0.1f);
}
+ /**
+ *
+ */
public void testAssertEqualsIntInt() {
assertEquals(5, 5);
- assertEquals("msg", 5, 5);
+
+ boolean exWasThrown = false;
+ try {
+ assertEquals(5, 4);
+ } catch (Throwable ex) {
+ exWasThrown = true;
+ if (!(ex instanceof AssertionFailedError)) {
+ fail("Unexpected type of exception during assertEquals(int,int) testing");
+ }
+ }
+
+ if (!exWasThrown) {
+ fail("No exception was thrown during assertEquals(int,int) testing");
+ }
}
- @ExpectedFailure
- public void testAssertEqualsIntIntFail() {
- assertEquals(5, 4);
- }
-
- @ExpectedFailure(withMessage = "msg")
- public void testAssertEqualsIntIntFailWithMessage() {
- assertEquals("msg", 5, 4);
- }
-
+ /**
+ *
+ */
public void testAssertEqualsObjectObject() {
- assertEquals(obj1, obj1Equal);
+ Object obj1 = "String";
+
+ assertEquals(obj1, obj1);
+
+ boolean exWasThrown = false;
+ try {
+ Object obj2 = "not String";
+ assertEquals(obj1, obj2);
+ } catch (Throwable ex) {
+ exWasThrown = true;
+ if (!(ex instanceof AssertionFailedError)) {
+ fail("Unexpected type of exception during assertEquals(String,String) testing");
+ }
+ }
+
+ if (!exWasThrown) {
+ fail("No exception was thrown during assertEquals(String,String) testing");
+ }
+ }
+
+ /**
+ *
+ */
+ public void testAssertEqualsStringIntInt() {
+ assertEquals("", 5, 5);
+
+ boolean exWasThrown = false;
+ try {
+ assertEquals("hello", 5, 4);
+ } catch (Throwable ex) {
+ exWasThrown = true;
+ if (!(ex instanceof AssertionFailedError)) {
+ fail("Unexpected type of exception during assertEquals(String,int,int) testing");
+ }
+ }
+
+ if (!exWasThrown) {
+ fail("No exception was thrown during assertEquals(String,int,int) testing");
+ }
+ }
+
+ /**
+ *
+ */
+ public void testAssertEqualsStringObjectObject() {
+ Object obj1 = "String";
+
assertEquals("msg", obj1, obj1);
+
+ boolean exWasThrown = false;
+ try {
+ Object obj2 = "not String";
+ assertEquals("msg", obj1, obj2);
+ } catch (Throwable ex) {
+ exWasThrown = true;
+ if (!(ex instanceof AssertionFailedError)) {
+ fail("Unexpected type of exception during assertEquals(String,Object,Object) testing");
+ }
+ }
+
+ if (!exWasThrown) {
+ fail("No exception was thrown during assertEquals(String,Object,Object) testing");
+ }
}
- @ExpectedFailure
- public void testAssertEqualsObjectObjectFail() {
- assertEquals(obj1, obj2);
- }
-
- @ExpectedFailure(withMessage = "msg")
- public void testAssertEqualsObjectObjectFailWithMessage() {
- assertEquals("msg", obj1, obj2);
- }
-
+ /**
+ *
+ */
public void testAssertFalse() {
+ // Should not fail
assertFalse(false);
- assertFalse("msg", false);
+
+ // Should not fail
+ assertFalse("We should be okay", false);
+
+ boolean exWasThrown = false;
+ try {
+ // Should fail
+ assertFalse(true);
+ } catch (Throwable ex) {
+ exWasThrown = true;
+ if (!(ex instanceof AssertionFailedError)) {
+ fail("Unexpected type of exception during assertFalse(boolean) testing");
+ }
+ }
+
+ if (!exWasThrown) {
+ fail("No exception was thrown");
+ }
+ exWasThrown = false;
+
+ try {
+ // Should fail
+ assertFalse("This should be okay", true);
+ } catch (Throwable ex) {
+ exWasThrown = true;
+ if (ex instanceof AssertionFailedError) {
+ return;
+ }
+ }
+
+ if (!exWasThrown) {
+ fail("No exception was thrown");
+ } else {
+ fail("Unexpected exception during assertFalse(String, boolean) testing");
+ }
}
- @ExpectedFailure
- public void testAssertFalseFail() {
- assertFalse(true);
- }
-
- @ExpectedFailure(withMessage = "msg")
- public void testAssertFalseFailWithMessage() {
- assertFalse("msg", true);
- }
-
+ /**
+ *
+ */
public void testAssertNotNull() {
assertNotNull("Hello");
- assertNotNull("msg", "Hello");
+ assertNotNull("We should be okay", "Hello");
+
+ try {
+ assertNotNull("Hello");
+ } catch (Throwable ex) {
+ if (!(ex instanceof AssertionFailedError)) {
+ fail("Unexpected type of exception during assertNotNull(Object) testing");
+ }
+ }
+
+ try {
+ assertNotNull("This should be okay", null);
+ } catch (Throwable ex) {
+ if (ex instanceof AssertionFailedError) {
+ return;
+ }
+ }
+
+ fail("Unexpected exception during assertNotNull(String, Object) testing");
}
- @ExpectedFailure
- public void testAssertNotNullFail() {
- assertNotNull(null);
- }
-
- @ExpectedFailure(withMessage = "msg")
- public void testAssertNotNullStringFailWithMessage() {
- assertNotNull("msg", null);
- }
-
+ /**
+ *
+ */
public void testAssertNotSame() {
+ Object obj1 = "Foo";
+ Object obj2 = "Bar";
+
assertNotSame(obj1, obj2);
- assertNotSame("msg", obj1, obj2);
- assertNotSame(obj1, obj1Equal);
- assertNotSame("msg", obj1, obj1Equal);
+ assertNotSame("Hello", obj1, obj2);
+
+ try {
+ assertNotSame(obj1, "Baz");
+ } catch (Throwable ex) {
+ if (!(ex instanceof AssertionFailedError)) {
+ fail("Unexpected type of exception");
+ }
+ }
}
- @ExpectedFailure
- public void testAssertNotSameFail() {
- assertNotSame(obj1, obj1);
- }
-
- @ExpectedFailure(withMessage = "msg")
- public void testAssertNotSameFailWithMessage() {
- assertNotSame("msg", obj1, obj1);
- }
-
+ /**
+ *
+ */
public void testAssertNull() {
assertNull(null);
- assertNull("msg", null);
+ assertNull("We should be okay", null);
+
+ try {
+ assertNull("Hello");
+ } catch (Throwable ex) {
+ if (!(ex instanceof AssertionFailedError)) {
+ fail("Unexpected type of exception during assertNull(Object) testing");
+ }
+ }
+
+ try {
+ assertNull("This should be okay", "Hello");
+ } catch (Throwable ex) {
+ if (ex instanceof AssertionFailedError) {
+ return;
+ }
+ }
+
+ fail("Unexpected exception during assertNull(String, Object) testing");
}
- @ExpectedFailure
- public void testAssertNullFail() {
- assertNull("Hello");
- }
-
- @ExpectedFailure(withMessage = "msg")
- public void testAssertNullFailWithMessage() {
- assertNull("msg", "Hello");
- }
-
+ /**
+ *
+ */
public void testAssertSame() {
- assertSame(obj1, obj1);
- assertSame("msg", obj1, obj1);
+ // TODO(mmendez): finish this test
}
- @ExpectedFailure
- public void testAssertSameFail() {
- assertSame(obj1, obj1Equal);
- }
-
- @ExpectedFailure(withMessage = "msg")
- public void testAssertSameFailWithMessage() {
- assertSame("msg", obj1, obj1Equal);
- }
-
+ /**
+ *
+ */
public void testAssertTrue() {
assertTrue(true);
- assertTrue("msg", true);
- }
+ assertTrue("We should be okay", true);
- @ExpectedFailure
- public void testAssertTrueFail() {
- assertTrue(false);
- }
+ try {
+ assertTrue(false);
+ } catch (Throwable ex) {
+ if (!(ex instanceof AssertionFailedError)) {
+ fail("Unexpected type of exception during assertFalse(boolean) testing");
+ }
+ }
- @ExpectedFailure(withMessage = "msg")
- public void testAssertTrueFailWithMessage() {
- assertTrue("msg", false);
+ try {
+ assertTrue("This should be okay", false);
+ } catch (Throwable ex) {
+ if (ex instanceof AssertionFailedError) {
+ return;
+ }
+ }
+
+ fail("Unexpected exception during assertTrue(String, boolean) testing");
}
/**
@@ -260,4 +382,74 @@
public void testPlatformProd() {
assertTrue("Should not run in prod mode", !GWT.isScript());
}
+
+ public void testSetUpTearDown() throws Exception {
+ assertSame(IS_SETUP, setupTeardownFlag);
+ tearDown();
+ assertSame(IS_TORNDOWN, setupTeardownFlag);
+ setUp();
+ assertSame(IS_SETUP, setupTeardownFlag);
+ gwtTearDown();
+ assertSame(IS_TORNDOWN, setupTeardownFlag);
+ gwtSetUp();
+ assertSame(IS_SETUP, setupTeardownFlag);
+ }
+
+ public void testSetUpTearDownAsync() {
+ assertSame(IS_SETUP, setupTeardownFlag);
+ delayTestFinish(1000);
+ new Timer() {
+ @Override
+ public void run() {
+ assertSame(IS_SETUP, setupTeardownFlag);
+ finishTest();
+ if (setupTeardownFlag != IS_TORNDOWN) {
+ recordOutofBandError("Bad async success tearDown behavior not catchable by JUnit");
+ }
+ }
+ }.schedule(1);
+ }
+
+ public void testSetUpTearDownAsyncHadNoOutOfBandErrors() {
+ assertNoOutOfBandErrorsAsync();
+ }
+
+ @Override
+ protected void gwtSetUp() throws Exception {
+ setupTeardownFlag = IS_SETUP;
+ }
+
+ @Override
+ protected void gwtTearDown() throws Exception {
+ if (setupTeardownFlag != IS_SETUP) {
+ // Must use window alert to grind the test to a halt in this failure.
+ recordOutofBandError("Bad tearDown behavior not catchable by JUnit");
+ }
+ setupTeardownFlag = IS_TORNDOWN;
+ }
+
+ protected static void recordOutofBandError(String outOfBandError) {
+ GWTTestCaseTest.outOfBandError = outOfBandError;
+ }
+
+ /**
+ * Call this method to asynchronously check for out of band errors in the
+ * previous test.
+ */
+ protected void assertNoOutOfBandErrorsAsync() {
+ // Give things a chance to settle down.
+ delayTestFinish(10000);
+ new Timer() {
+ @Override
+ public void run() {
+ if (outOfBandError != null) {
+ String msg = outOfBandError;
+ outOfBandError = null;
+ fail(msg);
+ }
+ finishTest();
+ }
+
+ }.schedule(1000);
+ }
}
diff --git a/user/test/com/google/gwt/junit/client/TestManualAsync.java b/user/test/com/google/gwt/junit/client/TestManualAsync.java
new file mode 100644
index 0000000..907d252
--- /dev/null
+++ b/user/test/com/google/gwt/junit/client/TestManualAsync.java
@@ -0,0 +1,347 @@
+/*
+ * Copyright 2007 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.junit.client;
+
+import static com.google.gwt.junit.client.GWTTestCaseTest.SetUpTearDownState.IS_SETUP;
+import static com.google.gwt.junit.client.GWTTestCaseTest.SetUpTearDownState.IS_TORNDOWN;
+
+import com.google.gwt.dom.client.ButtonElement;
+import com.google.gwt.dom.client.Document;
+import com.google.gwt.user.client.DOM;
+import com.google.gwt.user.client.Event;
+import com.google.gwt.user.client.EventListener;
+import com.google.gwt.user.client.Timer;
+
+/**
+ * This test must be run manually to inspect for correct results. Many of these
+ * tests are designed to fail in specific ways, the rest should succeed. The
+ * name of each test method indicates how it should behave.
+ */
+public class TestManualAsync extends GWTTestCaseTest {
+
+ // The following tests (all prefixed with test_) are intended to test the
+ // interaction of synchronous failures (within event handlers) with various
+ // other types of failures and successes. All of them are expected to fail
+ // with the message "Expected failure".
+ //
+ // Nomenclature for these tests:
+ // DTF => delayTestFinish()
+ // SF => synchronous failure (from event handler)
+ // FT => finishTest()
+ // F => fail()
+ // R => return;
+
+ public void test_dtf_sf() {
+ delayTestFinish();
+ synchronousFailure("test_dtf_sf");
+ }
+
+ public void test_dtf_sf_f() {
+ delayTestFinish();
+ synchronousFailure("test_dtf_sf_f");
+ failNow("test_dtf_sf_f");
+ }
+
+ public void test_dtf_sf_ft() {
+ delayTestFinish();
+ synchronousFailure("test_dtf_sf_ft");
+ finishTest();
+ }
+
+ public void test_dtf_sf_r_f() {
+ delayTestFinish();
+ synchronousFailure("test_dtf_sf_r_f");
+ failLater("test_dtf_sf_r_f");
+ }
+
+ public void test_dtf_sf_r_ft() {
+ delayTestFinish();
+ synchronousFailure("test_dtf_sf_r_ft");
+ finishTestLater();
+ }
+
+ public void test_sf() {
+ synchronousFailure("test_sf");
+ }
+
+ public void test_sf_dtf_f() {
+ synchronousFailure("test_sf_dtf_f");
+ delayTestFinish();
+ failNow("test_sf_dtf_f");
+ }
+
+ public void test_sf_dtf_ft() {
+ synchronousFailure("test_sf_dtf_ft");
+ delayTestFinish();
+ finishTest();
+ }
+
+ public void test_sf_dtf_r_f() {
+ synchronousFailure("test_sf_dtf_r_f");
+ delayTestFinish();
+ failLater("test_sf_dtf_r_f");
+ }
+
+ public void test_sf_dtf_r_ft() {
+ synchronousFailure("test_sf_dtf_r_ft");
+ delayTestFinish(5 * 60 * 1000);
+ finishTestLater();
+ }
+
+ public void test_sf_f() {
+ synchronousFailure("test_sf_f");
+ failNow("test_sf_f");
+ }
+
+ /**
+ * Fails normally.
+ */
+ public void testDelayFail() {
+ delayTestFinish(100);
+ fail("Expected failure");
+ finishTest();
+ }
+
+ /**
+ * Completes normally.
+ */
+ public void testDelayNormal() {
+ delayTestFinish(100);
+ finishTest();
+ }
+
+ /**
+ * Fails normally.
+ */
+ public void testFail() {
+ fail("Expected failure");
+ }
+
+ /**
+ * Async fails.
+ */
+ public void testFailAsync() {
+ delayTestFinish(1000);
+ new Timer() {
+ public void run() {
+ fail("Expected failure");
+ }
+ }.schedule(100);
+ }
+
+ /**
+ * Tests the case where a JUnit exception is thrown from an event handler, but
+ * after this test method has completed successfully.
+ *
+ * This test should *not* fail, but the next one should.
+ */
+ public void testLateFailPart1() {
+ // Leave the test in synchronous mode, but crank up a timer to fail in 2.5s.
+ new Timer() {
+ @Override
+ public void run() {
+ // This fail should be called during the next test.
+ fail();
+ }
+ }.schedule(2500);
+
+ // We don't actually assert anything here. This test exists solely to make
+ // the next one fail.
+ }
+
+ /**
+ * Second half of the previous test.
+ */
+ public void testLateFailPart2() {
+ // Go into async mode from 5s, finishing in 4. The timer from the previous
+ // test will go off and call fail() before finishTest() is called.
+ delayTestFinish(5000);
+ new Timer() {
+ @Override
+ public void run() {
+ finishTest();
+ }
+ }.schedule(4000);
+ }
+
+ /**
+ * Completes normally.
+ */
+ public void testNormal() {
+ }
+
+ /**
+ * Completes async.
+ */
+ public void testNormalAsync() {
+ delayTestFinish(200);
+ new Timer() {
+ public void run() {
+ finishTest();
+ }
+ }.schedule(100);
+ }
+
+ /**
+ * Completes async.
+ */
+ public void testRepeatingNormal() {
+ delayTestFinish(200);
+ new Timer() {
+ private int i = 0;
+
+ public void run() {
+ if (++i < 4) {
+ delayTestFinish(200);
+ } else {
+ cancel();
+ finishTest();
+ }
+ }
+ }.scheduleRepeating(100);
+ }
+
+ /**
+ * Fails async.
+ */
+ public void testSetUpTearDownFailAsync() {
+ assertEquals(IS_SETUP, setupTeardownFlag);
+ delayTestFinish(1000);
+ new Timer() {
+ @Override
+ public void run() {
+ fail("Expected failure");
+ }
+ }.schedule(1);
+
+ new Timer() {
+ @Override
+ public void run() {
+ /*
+ * The failing test should have triggered tearDown.
+ */
+ if (setupTeardownFlag != IS_TORNDOWN) {
+ recordOutofBandError("Bad async failure tearDown behavior not catchable by JUnit");
+ }
+ }
+ }.schedule(100);
+ }
+
+ /**
+ * Completes async.
+ */
+ public void testSetUpTearDownFailAsyncHadNoOutOfBandErrors() {
+ assertNoOutOfBandErrorsAsync();
+ }
+
+ /**
+ * Times out async.
+ */
+ public void testSetUpTearDownTimeoutAsync() {
+ assertSame(IS_SETUP, setupTeardownFlag);
+ delayTestFinish(1);
+ new Timer() {
+ @Override
+ public void run() {
+ /*
+ * The failing test should have triggered tearDown.
+ */
+ if (setupTeardownFlag != IS_TORNDOWN) {
+ recordOutofBandError("Bad async timeout tearDown behavior not catchable by JUnit");
+ }
+ }
+ }.schedule(100);
+ }
+
+ /**
+ * Completes async.
+ */
+ public void testSetUpTearDownTimeoutAsyncHadNoOutOfBandErrors() {
+ assertNoOutOfBandErrorsAsync();
+ }
+
+ /**
+ * Completes normally.
+ */
+ public void testSpuriousFinishTest() {
+ try {
+ finishTest();
+ fail("Unexpected failure");
+ } catch (IllegalStateException e) {
+ }
+ }
+
+ /**
+ * Times out.
+ */
+ public void testTimeoutAsync() {
+ delayTestFinish(100);
+ new Timer() {
+ public void run() {
+ finishTest();
+ }
+ }.schedule(200);
+ }
+
+ // Call delayTestFinish() with enough time so that failLater() will
+ // definitely fail.
+ private void delayTestFinish() {
+ delayTestFinish(2500);
+ }
+
+ // Fail asynchronously after a small amount of time.
+ private void failLater(final String failMsg) {
+ new Timer() {
+ @Override
+ public void run() {
+ failNow(failMsg);
+ }
+ }.schedule(100);
+ }
+
+ // Fail synchronously with an "expected failure" message.
+ private void failNow(String failMsg) {
+ fail("Expected failure (" + failMsg + ")");
+ }
+
+ // Finish the test asynchronously after a small amount of time.
+ private void finishTestLater() {
+ new Timer() {
+ @Override
+ public void run() {
+ finishTest();
+ }
+ }.schedule(1);
+ }
+
+ // Trigger a test failure synchronously, but from within an event handler.
+ // (The exception thrown from fail() will get caught by the GWT
+ // UncaughtExceptionHandler).
+ private void synchronousFailure(final String failMsg) {
+ ButtonElement btn = Document.get().createButtonElement();
+ Document.get().getBody().appendChild(btn);
+ Event.sinkEvents(btn, Event.ONCLICK);
+
+ EventListener listener = new EventListener() {
+ public void onBrowserEvent(Event event) {
+ failNow(failMsg);
+ }
+ };
+
+ DOM.setEventListener(btn.<com.google.gwt.user.client.Element>cast(), listener);
+ btn.click();
+ }
+}
diff --git a/user/test/com/google/gwt/layout/client/LayoutTest.java b/user/test/com/google/gwt/layout/client/LayoutTest.java
index 129ddcc..eac839f 100644
--- a/user/test/com/google/gwt/layout/client/LayoutTest.java
+++ b/user/test/com/google/gwt/layout/client/LayoutTest.java
@@ -35,8 +35,8 @@
import com.google.gwt.junit.client.GWTTestCase;
import com.google.gwt.layout.client.Layout.Alignment;
import com.google.gwt.layout.client.Layout.Layer;
-import com.google.gwt.user.client.ResizeHelper;
import com.google.gwt.user.client.Window;
+import com.google.gwt.user.client.WindowTest;
/**
* Tests for the {@link Layout} class.
@@ -56,6 +56,7 @@
private Element wrapper0, wrapper1;
private Layout layout;
private Layer layer0, layer1;
+ private boolean resized;
@Override
public String getModuleName() {
@@ -306,7 +307,7 @@
@DoNotRunWith(Platform.HtmlUnitLayout)
public void testStaticConstraints() {
// This test assumes enough size. Ignore it if size cannot be guaranteed.
- if (!ResizeHelper.isResizeSupported()) {
+ if (!resized) {
return;
}
@@ -349,7 +350,7 @@
@DoNotRunWith(Platform.HtmlUnitLayout)
public void testUnits() {
// This test assumes enough size. Ignore it if size cannot be guaranteed.
- if (!ResizeHelper.isResizeSupported()) {
+ if (!resized) {
return;
}
@@ -439,7 +440,7 @@
@Override
protected void gwtSetUp() throws Exception {
// ensure enough sizes for this test
- ResizeHelper.resizeTo(800, 600);
+ resized = WindowTest.ResizeHelper.resizeTo(800, 600);
Window.enableScrolling(false);
@@ -465,6 +466,7 @@
Window.enableScrolling(true);
Document.get().getBody().removeChild(parent);
layout.onDetach();
+ WindowTest.ResizeHelper.restoreSize();
}
private void assertLeftRightTopBottomUnitsMakeSense(Element elem) {
diff --git a/user/test/com/google/gwt/resources/css/CssNodeClonerTest.java b/user/test/com/google/gwt/resources/css/CssNodeClonerTest.java
index b2e8f8e..7467a60 100644
--- a/user/test/com/google/gwt/resources/css/CssNodeClonerTest.java
+++ b/user/test/com/google/gwt/resources/css/CssNodeClonerTest.java
@@ -56,16 +56,6 @@
}
}
- public void testCloneMedia() throws UnableToCompleteException {
- CssStylesheet sheet = GenerateCssAst.exec(TreeLogger.NULL,
- getClass().getClassLoader().getResource(
- "com/google/gwt/resources/css/media.css"));
-
- CssStylesheet cloned = CssNodeCloner.clone(CssStylesheet.class, sheet);
-
- assertEquals("@media print, standard {\n}\n", cloned.toString());
- }
-
public void testCloneProperty() {
CssProperty.IdentValue value = new CssProperty.IdentValue("value");
CssProperty p = new CssProperty("name", value, true);
diff --git a/user/test/com/google/gwt/resources/css/media.css b/user/test/com/google/gwt/resources/css/media.css
deleted file mode 100644
index fef5ea5..0000000
--- a/user/test/com/google/gwt/resources/css/media.css
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- * Copyright 2010 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.
- */
-
-@media print, standard {}
diff --git a/user/test/com/google/gwt/uibinder/attributeparsers/StrictAttributeParserTest.java b/user/test/com/google/gwt/uibinder/attributeparsers/StrictAttributeParserTest.java
index 81af5a1..f8ec5e2 100644
--- a/user/test/com/google/gwt/uibinder/attributeparsers/StrictAttributeParserTest.java
+++ b/user/test/com/google/gwt/uibinder/attributeparsers/StrictAttributeParserTest.java
@@ -31,13 +31,13 @@
public void testSimple() {
String before = "{able.baker.charlie.prawns}";
String expected = "able.baker().charlie().prawns()";
- assertEquals(expected, converter.convert(before, new FieldReferenceDelegate()));
+ assertEquals(expected, converter.convert(before, new FieldReferenceDelegate(null)));
}
public void testNoneShouldFail() {
String before = "able.baker.charlie.prawns";
try {
- converter.convert(before, new FieldReferenceDelegate());
+ converter.convert(before, new FieldReferenceDelegate(null));
fail();
} catch (IllegalFieldReferenceException e) {
/* pass */
@@ -47,7 +47,7 @@
public void testTooManyShouldFail() {
String before = "{able.baker.charlie} {prawns.are.yummy}";
try {
- converter.convert(before, new FieldReferenceDelegate());
+ converter.convert(before, new FieldReferenceDelegate(null));
fail();
} catch (IllegalFieldReferenceException e) {
/* pass */
@@ -57,7 +57,7 @@
public void testMixedShouldFail() {
String before = "{able.baker.charlie} prawns are still yummy}";
try {
- converter.convert(before, new FieldReferenceDelegate());
+ converter.convert(before, new FieldReferenceDelegate(null));
fail();
} catch (IllegalFieldReferenceException e) {
/* pass */
diff --git a/user/test/com/google/gwt/uibinder/test/client/UiRendererEventsTest.java b/user/test/com/google/gwt/uibinder/test/client/UiRendererEventsTest.java
index 934becf..8f6c53e 100644
--- a/user/test/com/google/gwt/uibinder/test/client/UiRendererEventsTest.java
+++ b/user/test/com/google/gwt/uibinder/test/client/UiRendererEventsTest.java
@@ -170,7 +170,7 @@
bazReceiver = new MockBazReceiver();
uiParent = Document.get().createDivElement();
- uiParent.setInnerSafeHtml(renderedUi);
+ uiParent.setInnerHTML(renderedUi.asString());
Document.get().getBody().appendChild(uiParent);
uiRoot = Element.as(uiParent.getChild(0));
diff --git a/user/test/com/google/gwt/uibinder/test/client/UiRendererTest.java b/user/test/com/google/gwt/uibinder/test/client/UiRendererTest.java
index b97a9e4..b5a5ef5 100644
--- a/user/test/com/google/gwt/uibinder/test/client/UiRendererTest.java
+++ b/user/test/com/google/gwt/uibinder/test/client/UiRendererTest.java
@@ -51,7 +51,7 @@
renderer = UiRendererUi.getRenderer();
docDiv = Document.get().createDivElement();
- docDiv.setInnerSafeHtml(renderedHtml);
+ docDiv.setInnerHTML(renderedHtml.asString());
Document.get().getBody().appendChild(docDiv);
}
diff --git a/user/test/com/google/gwt/user/MiscSuite.java b/user/test/com/google/gwt/user/MiscSuite.java
deleted file mode 100644
index 888f903..0000000
--- a/user/test/com/google/gwt/user/MiscSuite.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright 2013 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.user;
-
-import com.google.gwt.junit.tools.GWTTestSuite;
-import com.google.gwt.layout.client.LayoutTest;
-import com.google.gwt.user.client.AsyncProxyTest;
-import com.google.gwt.user.client.CommandExecutorTest;
-import com.google.gwt.user.client.CookieTest;
-import com.google.gwt.user.client.DoubleClickEventSinkTest;
-import com.google.gwt.user.client.DragAndDropEventsSinkTest;
-import com.google.gwt.user.client.EventTest;
-import com.google.gwt.user.client.GestureEventSinkTest;
-import com.google.gwt.user.client.HistoryDisabledTest;
-import com.google.gwt.user.client.TouchEventSinkTest;
-import com.google.gwt.user.client.WindowTest;
-import com.google.gwt.user.datepicker.client.CalendarUtilTest;
-import com.google.gwt.user.datepicker.client.DateChangeEventTest;
-import com.google.gwt.user.rebind.ui.ImageBundleGeneratorTest;
-import com.google.gwt.xml.client.XMLTest;
-
-import junit.framework.Test;
-
-/**
- * Various tests split out from UISuite because they're not in gwt.client.ui.
- */
-public class MiscSuite {
-
- public static Test suite() {
- GWTTestSuite suite = new GWTTestSuite("Miscellaneous GWT tests");
- suite.addTestSuite(AsyncProxyTest.class);
- suite.addTestSuite(CalendarUtilTest.class);
- suite.addTestSuite(CommandExecutorTest.class);
- suite.addTestSuite(CookieTest.class);
- suite.addTestSuite(DateChangeEventTest.class);
- suite.addTestSuite(DoubleClickEventSinkTest.class);
- suite.addTestSuite(DragAndDropEventsSinkTest.class);
- suite.addTestSuite(EventTest.class);
- suite.addTestSuite(GestureEventSinkTest.class);
- suite.addTestSuite(HistoryDisabledTest.class);
- suite.addTestSuite(ImageBundleGeneratorTest.class);
- suite.addTestSuite(LayoutTest.class);
- suite.addTestSuite(TouchEventSinkTest.class);
- suite.addTestSuite(WindowTest.class);
- suite.addTestSuite(XMLTest.class);
- return suite;
- }
-}
diff --git a/user/test/com/google/gwt/user/RPCSuite.java b/user/test/com/google/gwt/user/RPCSuite.java
index 96b74fc..c2459a2 100644
--- a/user/test/com/google/gwt/user/RPCSuite.java
+++ b/user/test/com/google/gwt/user/RPCSuite.java
@@ -49,6 +49,20 @@
import com.google.gwt.user.client.rpc.ValueTypesTest;
import com.google.gwt.user.client.rpc.ValueTypesTestWithTypeObfuscation;
import com.google.gwt.user.client.rpc.XsrfProtectionTest;
+import com.google.gwt.user.client.rpc.impl.ClientSerializationStreamReaderTest;
+import com.google.gwt.user.rebind.rpc.BlacklistTypeFilterTest;
+import com.google.gwt.user.rebind.rpc.SerializableTypeOracleBuilderTest;
+import com.google.gwt.user.rebind.rpc.TypeHierarchyUtilsTest;
+import com.google.gwt.user.server.Base64Test;
+import com.google.gwt.user.server.UtilTest;
+import com.google.gwt.user.server.rpc.AbstractXsrfProtectedServiceServletTest;
+import com.google.gwt.user.server.rpc.RPCRequestTest;
+import com.google.gwt.user.server.rpc.RPCServletUtilsTest;
+import com.google.gwt.user.server.rpc.RPCTest;
+import com.google.gwt.user.server.rpc.SerializationPolicyLoaderTest;
+import com.google.gwt.user.server.rpc.impl.LegacySerializationPolicyTest;
+import com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriterTest;
+import com.google.gwt.user.server.rpc.impl.StandardSerializationPolicyTest;
import junit.framework.Test;
@@ -70,7 +84,24 @@
GWTTestSuite suite = new GWTTestSuite(
"Test for com.google.gwt.user.client.rpc");
- // Non GWTTestCases: see RpcSuiteNoBrowser
+ // Non GWTTestCases
+ suite.addTestSuite(BlacklistTypeFilterTest.class);
+ suite.addTestSuite(SerializableTypeOracleBuilderTest.class);
+ suite.addTestSuite(TypeHierarchyUtilsTest.class);
+ suite.addTestSuite(RPCTest.class);
+ suite.addTestSuite(com.google.gwt.user.server.rpc.RemoteServiceServletTest.class);
+ suite.addTestSuite(LegacySerializationPolicyTest.class);
+ suite.addTestSuite(StandardSerializationPolicyTest.class);
+ suite.addTestSuite(SerializationPolicyLoaderTest.class);
+ suite.addTestSuite(RPCServletUtilsTest.class);
+ suite.addTestSuite(RPCRequestTest.class);
+ suite.addTestSuite(FailedRequestTest.class);
+ suite.addTestSuite(FailingRequestBuilderTest.class);
+ suite.addTestSuite(Base64Test.class);
+ suite.addTestSuite(UtilTest.class);
+ suite.addTestSuite(AbstractXsrfProtectedServiceServletTest.class);
+ suite.addTestSuite(ClientSerializationStreamReaderTest.class);
+ suite.addTestSuite(ServerSerializationStreamWriterTest.class);
// GWTTestCases
suite.addTestSuite(ValueTypesTest.class);
@@ -88,8 +119,6 @@
suite.addTestSuite(RecursiveClassTest.class);
suite.addTestSuite(TypeCheckedObjectsTest.class);
suite.addTestSuite(XsrfProtectionTest.class);
- suite.addTestSuite(FailedRequestTest.class);
- suite.addTestSuite(FailingRequestBuilderTest.class);
// This test turns on the type-elision feature of RPC
suite.addTestSuite(ValueTypesTestWithTypeObfuscation.class);
diff --git a/user/test/com/google/gwt/user/RpcSuiteNoBrowser.java b/user/test/com/google/gwt/user/RpcSuiteNoBrowser.java
deleted file mode 100644
index 5756bcc..0000000
--- a/user/test/com/google/gwt/user/RpcSuiteNoBrowser.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright 2012 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.user;
-
-import com.google.gwt.dev.BootStrapPlatform;
-import com.google.gwt.user.client.rpc.impl.ClientSerializationStreamReaderTest;
-import com.google.gwt.user.rebind.rpc.BlacklistTypeFilterTest;
-import com.google.gwt.user.rebind.rpc.SerializationUtilsTest;
-import com.google.gwt.user.rebind.rpc.SerializableTypeOracleBuilderTest;
-import com.google.gwt.user.rebind.rpc.TypeHierarchyUtilsTest;
-import com.google.gwt.user.server.Base64Test;
-import com.google.gwt.user.server.UtilTest;
-import com.google.gwt.user.server.rpc.AbstractXsrfProtectedServiceServletTest;
-import com.google.gwt.user.server.rpc.RPCRequestTest;
-import com.google.gwt.user.server.rpc.RPCServletUtilsTest;
-import com.google.gwt.user.server.rpc.RPCTest;
-import com.google.gwt.user.server.rpc.RPCTypeCheckTest;
-import com.google.gwt.user.server.rpc.RemoteServiceServletTest;
-import com.google.gwt.user.server.rpc.SerializationPolicyLoaderTest;
-import com.google.gwt.user.server.rpc.impl.LegacySerializationPolicyTest;
-import com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriterTest;
-import com.google.gwt.user.server.rpc.impl.StandardSerializationPolicyTest;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-/**
- * RPC tests that don't extend GWTTestCase.
- */
-public class RpcSuiteNoBrowser {
-
- static {
- /*
- * Required for OS X Leopard. This call ensures we have a valid context
- * ClassLoader. Many of the tests test low-level RPC mechanisms and rely on
- * a ClassLoader to resolve classes and resources.
- */
- BootStrapPlatform.applyPlatformHacks();
- }
-
- public static Test suite() {
- TestSuite suite = new TestSuite("Non-browser tests for com.google.gwt.user.client.rpc");
- suite.addTestSuite(BlacklistTypeFilterTest.class);
- suite.addTestSuite(SerializationUtilsTest.class);
- suite.addTestSuite(SerializableTypeOracleBuilderTest.class);
- suite.addTestSuite(TypeHierarchyUtilsTest.class);
- suite.addTestSuite(RPCTest.class);
- suite.addTestSuite(RPCTypeCheckTest.class);
- suite.addTestSuite(RemoteServiceServletTest.class);
- suite.addTestSuite(LegacySerializationPolicyTest.class);
- suite.addTestSuite(StandardSerializationPolicyTest.class);
- suite.addTestSuite(SerializationPolicyLoaderTest.class);
- suite.addTestSuite(RPCServletUtilsTest.class);
- suite.addTestSuite(RPCRequestTest.class);
- suite.addTestSuite(Base64Test.class);
- suite.addTestSuite(UtilTest.class);
- suite.addTestSuite(AbstractXsrfProtectedServiceServletTest.class);
- suite.addTestSuite(ClientSerializationStreamReaderTest.class);
- suite.addTestSuite(ServerSerializationStreamWriterTest.class);
- return suite;
- }
-}
diff --git a/user/test/com/google/gwt/user/UISuite.java b/user/test/com/google/gwt/user/UISuite.java
new file mode 100644
index 0000000..9de41d8
--- /dev/null
+++ b/user/test/com/google/gwt/user/UISuite.java
@@ -0,0 +1,246 @@
+/*
+ * Copyright 2009 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.user;
+
+import com.google.gwt.junit.tools.GWTTestSuite;
+import com.google.gwt.layout.client.LayoutTest;
+import com.google.gwt.user.client.AsyncProxyTest;
+import com.google.gwt.user.client.CommandExecutorTest;
+import com.google.gwt.user.client.CookieTest;
+import com.google.gwt.user.client.DoubleClickEventSinkTest;
+import com.google.gwt.user.client.DragAndDropEventsSinkTest;
+import com.google.gwt.user.client.EventTest;
+import com.google.gwt.user.client.GestureEventSinkTest;
+import com.google.gwt.user.client.HistoryDisabledTest;
+import com.google.gwt.user.client.TouchEventSinkTest;
+import com.google.gwt.user.client.WindowTest;
+import com.google.gwt.user.client.ui.AbsolutePanelTest;
+import com.google.gwt.user.client.ui.AnchorTest;
+import com.google.gwt.user.client.ui.ButtonTest;
+import com.google.gwt.user.client.ui.CaptionPanelTest;
+import com.google.gwt.user.client.ui.CheckBoxTest;
+import com.google.gwt.user.client.ui.CompositeTest;
+import com.google.gwt.user.client.ui.CreateEventTest;
+import com.google.gwt.user.client.ui.CustomButtonTest;
+import com.google.gwt.user.client.ui.CustomScrollPanelTest;
+import com.google.gwt.user.client.ui.DOMRtlTest;
+import com.google.gwt.user.client.ui.DOMTest;
+import com.google.gwt.user.client.ui.DateBoxTest;
+import com.google.gwt.user.client.ui.DatePickerTest;
+import com.google.gwt.user.client.ui.DeckLayoutPanelTest;
+import com.google.gwt.user.client.ui.DeckPanelTest;
+import com.google.gwt.user.client.ui.DecoratedPopupTest;
+import com.google.gwt.user.client.ui.DecoratedStackPanelTest;
+import com.google.gwt.user.client.ui.DecoratedTabBarTest;
+import com.google.gwt.user.client.ui.DecoratedTabPanelTest;
+import com.google.gwt.user.client.ui.DecoratorPanelTest;
+import com.google.gwt.user.client.ui.DefaultSuggestionDisplayTest;
+import com.google.gwt.user.client.ui.DelegatingKeyboardListenerCollectionTest;
+import com.google.gwt.user.client.ui.DialogBoxTest;
+import com.google.gwt.user.client.ui.DirectionalTextHelperTest;
+import com.google.gwt.user.client.ui.DisclosurePanelTest;
+import com.google.gwt.user.client.ui.DockLayoutPanelRtlTest;
+import com.google.gwt.user.client.ui.DockLayoutPanelTest;
+import com.google.gwt.user.client.ui.DockPanelTest;
+import com.google.gwt.user.client.ui.ElementWrappingTest;
+import com.google.gwt.user.client.ui.FastStringMapTest;
+import com.google.gwt.user.client.ui.FileUploadTest;
+import com.google.gwt.user.client.ui.FiniteWidgetIteratorTest;
+import com.google.gwt.user.client.ui.FlexTableTest;
+import com.google.gwt.user.client.ui.FlowPanelTest;
+import com.google.gwt.user.client.ui.FocusPanelTest;
+import com.google.gwt.user.client.ui.FormPanelTest;
+import com.google.gwt.user.client.ui.GridTest;
+import com.google.gwt.user.client.ui.HTMLPanelTest;
+import com.google.gwt.user.client.ui.HTMLTest;
+import com.google.gwt.user.client.ui.HeaderPanelTest;
+import com.google.gwt.user.client.ui.HiddenTest;
+import com.google.gwt.user.client.ui.HistoryTest;
+import com.google.gwt.user.client.ui.HorizontalPanelTest;
+import com.google.gwt.user.client.ui.HorizontalSplitPanelTest;
+import com.google.gwt.user.client.ui.HyperlinkTest;
+import com.google.gwt.user.client.ui.ImageTest;
+import com.google.gwt.user.client.ui.InlineHTMLTest;
+import com.google.gwt.user.client.ui.InlineHyperlinkTest;
+import com.google.gwt.user.client.ui.IsWidgetTest;
+import com.google.gwt.user.client.ui.LabelTest;
+import com.google.gwt.user.client.ui.LazyPanelTest;
+import com.google.gwt.user.client.ui.LinearPanelTest;
+import com.google.gwt.user.client.ui.ListBoxTest;
+import com.google.gwt.user.client.ui.MenuBarTest;
+import com.google.gwt.user.client.ui.MenuItemTest;
+import com.google.gwt.user.client.ui.NamedFrameTest;
+import com.google.gwt.user.client.ui.NativeHorizontalScrollbarTest;
+import com.google.gwt.user.client.ui.NativeVerticalScrollbarTest;
+import com.google.gwt.user.client.ui.PopupTest;
+import com.google.gwt.user.client.ui.PrefixTreeTest;
+import com.google.gwt.user.client.ui.RadioButtonTest;
+import com.google.gwt.user.client.ui.ResetButtonTest;
+import com.google.gwt.user.client.ui.ResizeLayoutPanelTest;
+import com.google.gwt.user.client.ui.RichTextAreaTest;
+import com.google.gwt.user.client.ui.RootPanelTest;
+import com.google.gwt.user.client.ui.ScrollPanelTest;
+import com.google.gwt.user.client.ui.SimpleCheckBoxTest;
+import com.google.gwt.user.client.ui.SimpleLayoutPanelTest;
+import com.google.gwt.user.client.ui.SimplePanelTest;
+import com.google.gwt.user.client.ui.SimpleRadioButtonTest;
+import com.google.gwt.user.client.ui.SplitLayoutPanelTest;
+import com.google.gwt.user.client.ui.StackLayoutPanelTest;
+import com.google.gwt.user.client.ui.StackPanelTest;
+import com.google.gwt.user.client.ui.SubmitButtonTest;
+import com.google.gwt.user.client.ui.SuggestBoxTest;
+import com.google.gwt.user.client.ui.TabBarTest;
+import com.google.gwt.user.client.ui.TabLayoutPanelTest;
+import com.google.gwt.user.client.ui.TabPanelTest;
+import com.google.gwt.user.client.ui.TextAreaTest;
+import com.google.gwt.user.client.ui.TreeItemTest;
+import com.google.gwt.user.client.ui.TreeTest;
+import com.google.gwt.user.client.ui.UIObjectTest;
+import com.google.gwt.user.client.ui.ValueBoxBaseTest;
+import com.google.gwt.user.client.ui.ValueListBoxTest;
+import com.google.gwt.user.client.ui.VerticalPanelTest;
+import com.google.gwt.user.client.ui.VerticalSplitPanelTest;
+import com.google.gwt.user.client.ui.WidgetCollectionTest;
+import com.google.gwt.user.client.ui.WidgetIteratorsTest;
+import com.google.gwt.user.client.ui.WidgetOnLoadTest;
+import com.google.gwt.user.client.ui.WidgetSubclassingTest;
+import com.google.gwt.user.client.ui.WidgetTest;
+import com.google.gwt.user.client.ui.impl.ClippedImagePrototypeTest;
+import com.google.gwt.user.datepicker.client.CalendarUtilTest;
+import com.google.gwt.user.datepicker.client.DateChangeEventTest;
+import com.google.gwt.user.rebind.ui.ImageBundleGeneratorTest;
+import com.google.gwt.xml.client.XMLTest;
+
+import junit.framework.Test;
+
+/**
+ * Tests of the ui package.
+ */
+public class UISuite {
+ public static Test suite() {
+ GWTTestSuite suite = new GWTTestSuite("Test for suite for all user widgets");
+
+ suite.addTestSuite(AbsolutePanelTest.class);
+ suite.addTestSuite(AnchorTest.class);
+ suite.addTestSuite(AsyncProxyTest.class);
+ suite.addTestSuite(ButtonTest.class);
+ suite.addTestSuite(CalendarUtilTest.class);
+ suite.addTestSuite(CaptionPanelTest.class);
+ suite.addTestSuite(CheckBoxTest.class);
+ suite.addTestSuite(ClassInitTest.class);
+ suite.addTestSuite(ClippedImagePrototypeTest.class);
+ suite.addTestSuite(CommandExecutorTest.class);
+ suite.addTestSuite(CompositeTest.class);
+ suite.addTestSuite(CookieTest.class);
+ suite.addTestSuite(CreateEventTest.class);
+ suite.addTestSuite(CustomButtonTest.class);
+ suite.addTestSuite(CustomScrollPanelTest.class);
+ suite.addTestSuite(DateBoxTest.class);
+ suite.addTestSuite(DateChangeEventTest.class);
+ suite.addTestSuite(DatePickerTest.class);
+ suite.addTestSuite(DeckLayoutPanelTest.class);
+ suite.addTestSuite(DeckPanelTest.class);
+ suite.addTestSuite(DecoratedPopupTest.class);
+ suite.addTestSuite(DecoratedStackPanelTest.class);
+ suite.addTestSuite(DecoratedTabBarTest.class);
+ suite.addTestSuite(DecoratedTabPanelTest.class);
+ suite.addTestSuite(DecoratorPanelTest.class);
+ suite.addTestSuite(DefaultSuggestionDisplayTest.class);
+ suite.addTestSuite(DelegatingKeyboardListenerCollectionTest.class);
+ suite.addTestSuite(DialogBoxTest.class);
+ suite.addTestSuite(DirectionalTextHelperTest.class);
+ suite.addTestSuite(DisclosurePanelTest.class);
+ suite.addTestSuite(DockLayoutPanelRtlTest.class);
+ suite.addTestSuite(DockLayoutPanelTest.class);
+ suite.addTestSuite(DockPanelTest.class);
+ suite.addTestSuite(DoubleClickEventSinkTest.class);
+ suite.addTestSuite(DOMTest.class);
+ suite.addTestSuite(DOMRtlTest.class);
+ suite.addTestSuite(DragAndDropEventsSinkTest.class);
+ suite.addTestSuite(ElementWrappingTest.class);
+ suite.addTestSuite(EventTest.class);
+ suite.addTestSuite(FastStringMapTest.class);
+ suite.addTestSuite(FileUploadTest.class);
+ suite.addTestSuite(FiniteWidgetIteratorTest.class);
+ suite.addTestSuite(FlexTableTest.class);
+ suite.addTestSuite(FlowPanelTest.class);
+ suite.addTestSuite(FocusPanelTest.class);
+ suite.addTestSuite(FormPanelTest.class);
+ suite.addTestSuite(GestureEventSinkTest.class);
+ suite.addTestSuite(GridTest.class);
+ suite.addTestSuite(HeaderPanelTest.class);
+ suite.addTestSuite(HiddenTest.class);
+ suite.addTestSuite(HistoryTest.class);
+ suite.addTestSuite(HistoryDisabledTest.class);
+ suite.addTestSuite(HorizontalPanelTest.class);
+ suite.addTestSuite(HorizontalSplitPanelTest.class);
+ suite.addTestSuite(HTMLPanelTest.class);
+ suite.addTestSuite(HTMLTest.class);
+ suite.addTestSuite(HyperlinkTest.class);
+ suite.addTestSuite(ImageBundleGeneratorTest.class);
+ suite.addTestSuite(ImageTest.class);
+ suite.addTestSuite(InlineHTMLTest.class);
+ suite.addTestSuite(InlineHyperlinkTest.class);
+ suite.addTestSuite(IsWidgetTest.class);
+ suite.addTestSuite(LabelTest.class);
+ suite.addTestSuite(LayoutTest.class);
+ suite.addTestSuite(LazyPanelTest.class);
+ suite.addTestSuite(LinearPanelTest.class);
+ suite.addTestSuite(ListBoxTest.class);
+ suite.addTestSuite(MenuBarTest.class);
+ suite.addTestSuite(MenuItemTest.class);
+ suite.addTestSuite(NamedFrameTest.class);
+ suite.addTestSuite(NativeHorizontalScrollbarTest.class);
+ suite.addTestSuite(NativeVerticalScrollbarTest.class);
+ suite.addTestSuite(PopupTest.class);
+ suite.addTestSuite(PrefixTreeTest.class);
+ suite.addTestSuite(RadioButtonTest.class);
+ suite.addTestSuite(ResetButtonTest.class);
+ suite.addTestSuite(ResizeLayoutPanelTest.class);
+ suite.addTestSuite(RichTextAreaTest.class);
+ suite.addTestSuite(RootPanelTest.class);
+ suite.addTestSuite(ScrollPanelTest.class);
+ suite.addTestSuite(SimpleCheckBoxTest.class);
+ suite.addTestSuite(SimpleRadioButtonTest.class);
+ suite.addTestSuite(SimplePanelTest.class);
+ suite.addTestSuite(SimpleLayoutPanelTest.class);
+ suite.addTestSuite(SplitLayoutPanelTest.class);
+ suite.addTestSuite(StackLayoutPanelTest.class);
+ suite.addTestSuite(StackPanelTest.class);
+ suite.addTestSuite(SubmitButtonTest.class);
+ suite.addTestSuite(SuggestBoxTest.class);
+ suite.addTestSuite(TabBarTest.class);
+ suite.addTestSuite(TabLayoutPanelTest.class);
+ suite.addTestSuite(TabPanelTest.class);
+ suite.addTestSuite(TextAreaTest.class);
+ suite.addTestSuite(TreeTest.class);
+ suite.addTestSuite(TreeItemTest.class);
+ suite.addTestSuite(TouchEventSinkTest.class);
+ suite.addTestSuite(UIObjectTest.class);
+ suite.addTestSuite(ValueBoxBaseTest.class);
+ suite.addTestSuite(ValueListBoxTest.class);
+ suite.addTestSuite(VerticalPanelTest.class);
+ suite.addTestSuite(VerticalSplitPanelTest.class);
+ suite.addTestSuite(WidgetCollectionTest.class);
+ suite.addTestSuite(WidgetIteratorsTest.class);
+ suite.addTestSuite(WidgetOnLoadTest.class);
+ suite.addTestSuite(WidgetSubclassingTest.class);
+ suite.addTestSuite(WidgetTest.class);
+ suite.addTestSuite(WindowTest.class);
+ suite.addTestSuite(XMLTest.class);
+ return suite;
+ }
+}
diff --git a/user/test/com/google/gwt/user/UiPart1Suite.java b/user/test/com/google/gwt/user/UiPart1Suite.java
deleted file mode 100644
index 74e7d67..0000000
--- a/user/test/com/google/gwt/user/UiPart1Suite.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Copyright 2013 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.user;
-
-import com.google.gwt.junit.tools.GWTTestSuite;
-import com.google.gwt.user.client.ui.AbsolutePanelTest;
-import com.google.gwt.user.client.ui.AnchorTest;
-import com.google.gwt.user.client.ui.ButtonTest;
-import com.google.gwt.user.client.ui.CaptionPanelTest;
-import com.google.gwt.user.client.ui.CheckBoxTest;
-import com.google.gwt.user.client.ui.CompositeTest;
-import com.google.gwt.user.client.ui.CreateEventTest;
-import com.google.gwt.user.client.ui.CustomButtonTest;
-import com.google.gwt.user.client.ui.CustomScrollPanelTest;
-import com.google.gwt.user.client.ui.DOMRtlTest;
-import com.google.gwt.user.client.ui.DOMTest;
-import com.google.gwt.user.client.ui.DateBoxTest;
-import com.google.gwt.user.client.ui.DatePickerTest;
-import com.google.gwt.user.client.ui.DeckLayoutPanelTest;
-import com.google.gwt.user.client.ui.DeckPanelTest;
-import com.google.gwt.user.client.ui.DecoratedPopupTest;
-import com.google.gwt.user.client.ui.DecoratedStackPanelTest;
-import com.google.gwt.user.client.ui.DecoratedTabBarTest;
-import com.google.gwt.user.client.ui.DecoratedTabPanelTest;
-import com.google.gwt.user.client.ui.DecoratorPanelTest;
-import com.google.gwt.user.client.ui.DefaultSuggestionDisplayTest;
-import com.google.gwt.user.client.ui.DelegatingKeyboardListenerCollectionTest;
-import com.google.gwt.user.client.ui.DialogBoxTest;
-import com.google.gwt.user.client.ui.DirectionalTextHelperTest;
-import com.google.gwt.user.client.ui.DisclosurePanelTest;
-import com.google.gwt.user.client.ui.DockLayoutPanelRtlTest;
-import com.google.gwt.user.client.ui.DockLayoutPanelTest;
-import com.google.gwt.user.client.ui.DockPanelTest;
-import com.google.gwt.user.client.ui.ElementWrappingTest;
-import com.google.gwt.user.client.ui.FastStringMapTest;
-import com.google.gwt.user.client.ui.FileUploadTest;
-import com.google.gwt.user.client.ui.FiniteWidgetIteratorTest;
-import com.google.gwt.user.client.ui.FlexTableTest;
-import com.google.gwt.user.client.ui.FlowPanelTest;
-import com.google.gwt.user.client.ui.FocusPanelTest;
-import com.google.gwt.user.client.ui.FormPanelTest;
-import com.google.gwt.user.client.ui.GridTest;
-import com.google.gwt.user.client.ui.impl.ClippedImagePrototypeTest;
-
-import junit.framework.Test;
-
-/**
- * Tests in the user.client.ui package that start with A-G.
- * @see UiPart2Suite
- */
-public class UiPart1Suite {
- public static Test suite() {
- GWTTestSuite suite = new GWTTestSuite("Test for suite for all user widgets");
-
- suite.addTestSuite(AbsolutePanelTest.class);
- suite.addTestSuite(AnchorTest.class);
- suite.addTestSuite(ButtonTest.class);
- suite.addTestSuite(CaptionPanelTest.class);
- suite.addTestSuite(CheckBoxTest.class);
- suite.addTestSuite(ClassInitTest.class);
- suite.addTestSuite(ClippedImagePrototypeTest.class);
- suite.addTestSuite(CompositeTest.class);
- suite.addTestSuite(CreateEventTest.class);
- suite.addTestSuite(CustomButtonTest.class);
- suite.addTestSuite(CustomScrollPanelTest.class);
- suite.addTestSuite(DateBoxTest.class);
- suite.addTestSuite(DatePickerTest.class);
- suite.addTestSuite(DeckLayoutPanelTest.class);
- suite.addTestSuite(DeckPanelTest.class);
- suite.addTestSuite(DecoratedPopupTest.class);
- suite.addTestSuite(DecoratedStackPanelTest.class);
- suite.addTestSuite(DecoratedTabBarTest.class);
- suite.addTestSuite(DecoratedTabPanelTest.class);
- suite.addTestSuite(DecoratorPanelTest.class);
- suite.addTestSuite(DefaultSuggestionDisplayTest.class);
- suite.addTestSuite(DelegatingKeyboardListenerCollectionTest.class);
- suite.addTestSuite(DialogBoxTest.class);
- suite.addTestSuite(DirectionalTextHelperTest.class);
- suite.addTestSuite(DisclosurePanelTest.class);
- suite.addTestSuite(DockLayoutPanelRtlTest.class);
- suite.addTestSuite(DockLayoutPanelTest.class);
- suite.addTestSuite(DockPanelTest.class);
- suite.addTestSuite(DOMTest.class);
- suite.addTestSuite(DOMRtlTest.class);
- suite.addTestSuite(ElementWrappingTest.class);
- suite.addTestSuite(FastStringMapTest.class);
- suite.addTestSuite(FileUploadTest.class);
- suite.addTestSuite(FiniteWidgetIteratorTest.class);
- suite.addTestSuite(FlexTableTest.class);
- suite.addTestSuite(FlowPanelTest.class);
- suite.addTestSuite(FocusPanelTest.class);
- suite.addTestSuite(FormPanelTest.class);
- suite.addTestSuite(GridTest.class);
-
- return suite;
- }
-}
diff --git a/user/test/com/google/gwt/user/UiPart2Suite.java b/user/test/com/google/gwt/user/UiPart2Suite.java
deleted file mode 100644
index cde0c66..0000000
--- a/user/test/com/google/gwt/user/UiPart2Suite.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * Copyright 2013 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.user;
-
-import com.google.gwt.junit.tools.GWTTestSuite;
-import com.google.gwt.user.client.ui.HTMLPanelTest;
-import com.google.gwt.user.client.ui.HTMLTest;
-import com.google.gwt.user.client.ui.HeaderPanelTest;
-import com.google.gwt.user.client.ui.HiddenTest;
-import com.google.gwt.user.client.ui.HistoryTest;
-import com.google.gwt.user.client.ui.HorizontalPanelTest;
-import com.google.gwt.user.client.ui.HorizontalSplitPanelTest;
-import com.google.gwt.user.client.ui.HyperlinkTest;
-import com.google.gwt.user.client.ui.ImageTest;
-import com.google.gwt.user.client.ui.InlineHTMLTest;
-import com.google.gwt.user.client.ui.InlineHyperlinkTest;
-import com.google.gwt.user.client.ui.IsWidgetTest;
-import com.google.gwt.user.client.ui.LabelTest;
-import com.google.gwt.user.client.ui.LazyPanelTest;
-import com.google.gwt.user.client.ui.LinearPanelTest;
-import com.google.gwt.user.client.ui.ListBoxTest;
-import com.google.gwt.user.client.ui.MenuBarTest;
-import com.google.gwt.user.client.ui.MenuItemTest;
-import com.google.gwt.user.client.ui.NamedFrameTest;
-import com.google.gwt.user.client.ui.NativeHorizontalScrollbarTest;
-import com.google.gwt.user.client.ui.NativeVerticalScrollbarTest;
-import com.google.gwt.user.client.ui.PopupTest;
-import com.google.gwt.user.client.ui.PrefixTreeTest;
-import com.google.gwt.user.client.ui.RadioButtonTest;
-import com.google.gwt.user.client.ui.ResetButtonTest;
-import com.google.gwt.user.client.ui.ResizeLayoutPanelTest;
-import com.google.gwt.user.client.ui.RichTextAreaTest;
-import com.google.gwt.user.client.ui.RootPanelTest;
-import com.google.gwt.user.client.ui.ScrollPanelTest;
-import com.google.gwt.user.client.ui.SimpleCheckBoxTest;
-import com.google.gwt.user.client.ui.SimpleLayoutPanelTest;
-import com.google.gwt.user.client.ui.SimplePanelTest;
-import com.google.gwt.user.client.ui.SimpleRadioButtonTest;
-import com.google.gwt.user.client.ui.SplitLayoutPanelTest;
-import com.google.gwt.user.client.ui.StackLayoutPanelTest;
-import com.google.gwt.user.client.ui.StackPanelTest;
-import com.google.gwt.user.client.ui.SubmitButtonTest;
-import com.google.gwt.user.client.ui.SuggestBoxTest;
-import com.google.gwt.user.client.ui.TabBarTest;
-import com.google.gwt.user.client.ui.TabLayoutPanelTest;
-import com.google.gwt.user.client.ui.TabPanelTest;
-import com.google.gwt.user.client.ui.TextAreaTest;
-import com.google.gwt.user.client.ui.TreeItemTest;
-import com.google.gwt.user.client.ui.TreeTest;
-import com.google.gwt.user.client.ui.UIObjectTest;
-import com.google.gwt.user.client.ui.ValueBoxBaseTest;
-import com.google.gwt.user.client.ui.ValueListBoxTest;
-import com.google.gwt.user.client.ui.VerticalPanelTest;
-import com.google.gwt.user.client.ui.VerticalSplitPanelTest;
-import com.google.gwt.user.client.ui.WidgetCollectionTest;
-import com.google.gwt.user.client.ui.WidgetIteratorsTest;
-import com.google.gwt.user.client.ui.WidgetOnLoadTest;
-import com.google.gwt.user.client.ui.WidgetSubclassingTest;
-import com.google.gwt.user.client.ui.WidgetTest;
-
-import junit.framework.Test;
-
-/**
- * Tests in the user.client.ui package that start with H-Z.
- * @see UiPart1Suite
- */
-public class UiPart2Suite {
- public static Test suite() {
- GWTTestSuite suite = new GWTTestSuite("Test for suite for all user widgets");
-
- suite.addTestSuite(HeaderPanelTest.class);
- suite.addTestSuite(HiddenTest.class);
- suite.addTestSuite(HistoryTest.class);
- suite.addTestSuite(HorizontalPanelTest.class);
- suite.addTestSuite(HorizontalSplitPanelTest.class);
- suite.addTestSuite(HTMLPanelTest.class);
- suite.addTestSuite(HTMLTest.class);
- suite.addTestSuite(HyperlinkTest.class);
- suite.addTestSuite(ImageTest.class);
- suite.addTestSuite(InlineHTMLTest.class);
- suite.addTestSuite(InlineHyperlinkTest.class);
- suite.addTestSuite(IsWidgetTest.class);
- suite.addTestSuite(LabelTest.class);
- suite.addTestSuite(LazyPanelTest.class);
- suite.addTestSuite(LinearPanelTest.class);
- suite.addTestSuite(ListBoxTest.class);
- suite.addTestSuite(MenuBarTest.class);
- suite.addTestSuite(MenuItemTest.class);
- suite.addTestSuite(NamedFrameTest.class);
- suite.addTestSuite(NativeHorizontalScrollbarTest.class);
- suite.addTestSuite(NativeVerticalScrollbarTest.class);
- suite.addTestSuite(PopupTest.class);
- suite.addTestSuite(PrefixTreeTest.class);
- suite.addTestSuite(RadioButtonTest.class);
- suite.addTestSuite(ResetButtonTest.class);
- suite.addTestSuite(ResizeLayoutPanelTest.class);
- suite.addTestSuite(RichTextAreaTest.class);
- suite.addTestSuite(RootPanelTest.class);
- suite.addTestSuite(ScrollPanelTest.class);
- suite.addTestSuite(SimpleCheckBoxTest.class);
- suite.addTestSuite(SimpleRadioButtonTest.class);
- suite.addTestSuite(SimplePanelTest.class);
- suite.addTestSuite(SimpleLayoutPanelTest.class);
- suite.addTestSuite(SplitLayoutPanelTest.class);
- suite.addTestSuite(StackLayoutPanelTest.class);
- suite.addTestSuite(StackPanelTest.class);
- suite.addTestSuite(SubmitButtonTest.class);
- suite.addTestSuite(SuggestBoxTest.class);
- suite.addTestSuite(TabBarTest.class);
- suite.addTestSuite(TabLayoutPanelTest.class);
- suite.addTestSuite(TabPanelTest.class);
- suite.addTestSuite(TextAreaTest.class);
- suite.addTestSuite(TreeTest.class);
- suite.addTestSuite(TreeItemTest.class);
- suite.addTestSuite(UIObjectTest.class);
- suite.addTestSuite(ValueBoxBaseTest.class);
- suite.addTestSuite(ValueListBoxTest.class);
- suite.addTestSuite(VerticalPanelTest.class);
- suite.addTestSuite(VerticalSplitPanelTest.class);
- suite.addTestSuite(WidgetCollectionTest.class);
- suite.addTestSuite(WidgetIteratorsTest.class);
- suite.addTestSuite(WidgetOnLoadTest.class);
- suite.addTestSuite(WidgetSubclassingTest.class);
- suite.addTestSuite(WidgetTest.class);
- return suite;
- }
-}
diff --git a/user/test/com/google/gwt/user/cellview/client/AbstractCellTableTestBase.java b/user/test/com/google/gwt/user/cellview/client/AbstractCellTableTestBase.java
index 1b74f13..3e1177e 100644
--- a/user/test/com/google/gwt/user/cellview/client/AbstractCellTableTestBase.java
+++ b/user/test/com/google/gwt/user/cellview/client/AbstractCellTableTestBase.java
@@ -269,23 +269,16 @@
public void testCellEvent() {
IndexCell<String> cell = new IndexCell<String>("click");
T table = createAbstractHasData(cell);
-
RootPanel.get().add(table);
table.setRowData(createData(0, 10));
table.getPresenter().flush();
- // Trigger an event at index 5 inside the child div.
+ // Trigger an event at index 5.
NativeEvent event = Document.get().createClickEvent(0, 0, 0, 0, 0, false, false, false, false);
getBodyElement(table, 5, 0).getFirstChildElement().dispatchEvent(event);
cell.assertLastBrowserEventIndex(5);
cell.assertLastEditingIndex(5);
- // Trigger an event at index 3 outside the child div.
- event = Document.get().createClickEvent(0, 0, 0, 0, 0, false, false, false, false);
- getBodyElement(table, 3, 0).dispatchEvent(event);
- cell.assertLastBrowserEventIndex(3);
- cell.assertLastEditingIndex(3);
-
RootPanel.get().remove(table);
}
diff --git a/user/test/com/google/gwt/user/client/ResizeHelper.java b/user/test/com/google/gwt/user/client/ResizeHelper.java
deleted file mode 100644
index 1a267eb..0000000
--- a/user/test/com/google/gwt/user/client/ResizeHelper.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright 2012 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.user.client;
-
-
-import com.google.gwt.regexp.shared.MatchResult;
-import com.google.gwt.regexp.shared.RegExp;
-import com.google.gwt.user.client.Window.Navigator;
-
-import junit.framework.Assert;
-
-/**
- * Calculates the sizes for Window extras such as border, menu, tool bar, and stores the original
- * sizes to restore at the end of test.
- */
-public final class ResizeHelper {
-
- private static int extraWidth;
- private static int extraHeight;
-
- static {
- // FF4 on win can start in 'almost' fullscreen when the window title bar
- // is hidden but accounted incorrectly, so, move the window and resize to
- // smaller size first, to take it out of 'full screen mode'.
- Window.moveTo(10, 10);
- Window.resizeTo(700, 500);
-
- extraWidth = 700 - Window.getClientWidth();
- extraHeight = 500 - Window.getClientHeight();
- }
-
- public static void resizeBy(int width, int height) {
- Window.resizeBy(width, height);
- }
-
- public static void resizeTo(int width, int height) {
- Window.resizeTo(width, height);
- }
-
- public static void assertSize(int width, int height) {
- Assert.assertEquals(width, Window.getClientWidth() + extraWidth);
- Assert.assertEquals(height, Window.getClientHeight() + extraHeight);
- }
-
- public static boolean isResizeSupported() {
- String userAgent = Navigator.getUserAgent();
- if (userAgent.contains("Chrome")) {
- return false; // All versions of Chrome are upsupported
- }
-
- if (userAgent.contains("Firefox")) {
- RegExp versionRegExp = RegExp.compile("Firefox[\\/\\s](\\d+)\\.\\d+", "ig");
- MatchResult result = versionRegExp.exec(userAgent);
- if (result != null) {
- int version = Integer.parseInt(result.getGroup(1));
- return version < 7; // Resize is unsupported for Firefox 7 and newer.
- }
- }
- return true;
- }
-}
diff --git a/user/test/com/google/gwt/user/client/WindowTest.java b/user/test/com/google/gwt/user/client/WindowTest.java
index 10d1e8a..085a91d 100644
--- a/user/test/com/google/gwt/user/client/WindowTest.java
+++ b/user/test/com/google/gwt/user/client/WindowTest.java
@@ -16,14 +16,11 @@
package com.google.gwt.user.client;
import com.google.gwt.core.client.JavaScriptException;
-import com.google.gwt.core.client.Scheduler;
-import com.google.gwt.core.client.Scheduler.RepeatingCommand;
-import com.google.gwt.core.client.Scheduler.ScheduledCommand;
import com.google.gwt.event.logical.shared.ResizeEvent;
import com.google.gwt.event.logical.shared.ResizeHandler;
import com.google.gwt.event.shared.HandlerRegistration;
-import com.google.gwt.http.client.URL;
import com.google.gwt.http.client.UrlBuilder;
+import com.google.gwt.http.client.URL;
import com.google.gwt.junit.DoNotRunWith;
import com.google.gwt.junit.Platform;
import com.google.gwt.junit.client.GWTTestCase;
@@ -225,7 +222,7 @@
largeDOM.setPixelSize(oldClientWidth + 100, oldClientHeight + 100);
RootPanel.get().add(largeDOM);
delayTestFinish(1000);
- Scheduler.get().scheduleDeferred(new ScheduledCommand() {
+ DeferredCommand.addCommand(new Command() {
public void execute() {
int newClientHeight = Window.getClientHeight();
int newClientWidth = Window.getClientWidth();
@@ -237,15 +234,118 @@
});
}
+ /**
+ * Calculates the sizes for Window extras such as border, menu, tool bar, and
+ * stores the original sizes to restore at the end of test.
+ */
+ public static final class ResizeHelper {
+ private static int clientHeight;
+ private static int clientWidth;
+ private static int extraWidth;
+ private static int extraHeight;
+ private static boolean initialized;
+
+ public static int getExtraHeight() {
+ ensureInitialized();
+ return extraHeight;
+ }
+
+ public static int getExtraWidth() {
+ ensureInitialized();
+ return extraWidth;
+ }
+
+ /**
+ * Wraps {@code Window#resizeBy(int, int)} to ensure initialized. This may
+ * be a no-op in Chrome.
+ *
+ * @param width
+ * @param height
+ * @return Whether this operation is done
+ */
+ public static boolean resizeBy(int width, int height) {
+ if (ensureInitialized()) {
+ Window.resizeBy(width, height);
+ }
+ return initialized;
+ }
+
+ /**
+ * Wraps {@code Window#resizeTo(int, int)} to ensure initialized. This may
+ * be a no-op in Chrome.
+ *
+ * @param width
+ * @param height
+ * @return Whether this operation is done
+ */
+ public static boolean resizeTo(int width, int height) {
+ if (ensureInitialized()) {
+ Window.resizeTo(width, height);
+ }
+ return initialized;
+ }
+
+ public static void restoreSize() {
+ // Ignore if not initialized
+ if (initialized) {
+ Window.resizeTo(clientWidth + extraWidth, clientHeight + extraHeight);
+ }
+ }
+
+ private static synchronized boolean ensureInitialized() {
+ if (!initialized) {
+ init();
+ }
+ return initialized;
+ }
+
+ private static void init() {
+ // resizeTo works in Chrome if the window is opened by Window.open(),
+ // which is the case when testing with Selenium and the server is started
+ // with -multiWin. However, the size change is deferred. The test would
+ // involve many nested DeferredCommand.
+ if (Navigator.getUserAgent().toLowerCase().contains("chrome")) {
+ return;
+ }
+
+ // FF4 on win can start in 'almost' fullscreen when the window title bar
+ // is hidden but accounted incorrectly, so, move the window and resize to
+ // smaller size first, to take it out of 'full screen mode'.
+ Window.moveTo(10,10);
+ Window.resizeTo(700, 500);
+
+ // store the original size (to be used in restoreSize)
+ clientHeight = Window.getClientHeight();
+ clientWidth = Window.getClientWidth();
+ // IE cannot resize window out of the screen, so we need to move the
+ // window such that it can be resized to below size.
+ // We do not have method to return the window coordinates (screenLeft,
+ // screenTop), so this move is not undone.
+ Window.moveTo(0,0);
+
+ // clientWidth is innerWidth, resizeTo specifies outerWidth
+ // Let's find out the delta for extras such as border, menu, tool bar.
+ // If the sizes are too small to show the extras, resizeTo may not set the
+ // sizes as requested.
+ // If the sizes are too big, for example, height > screen.availHeight + 40
+ // on FF, resizeTo silently sets the height to screen.availHeight + 40.
+ // Some test machines are configured at this time as 800x600, reduce the size
+ // to give some 'buffer'
+ Window.resizeTo(750, 550);
+ extraWidth = 750 - Window.getClientWidth();
+ extraHeight = 550 - Window.getClientHeight();
+ initialized = true;
+ restoreSize();
+ }
+ }
+
private static final class TestResizeHandler implements ResizeHandler {
private int height;
private int width;
- private boolean called;
public void onResize(ResizeEvent event) {
width = event.getWidth();
height = event.getHeight();
- called = true;
}
public int getHeight() {
@@ -255,10 +355,6 @@
public int getWidth() {
return width;
}
-
- public boolean isCalled() {
- return called;
- }
}
/**
@@ -266,37 +362,42 @@
*/
@DoNotRunWith({Platform.HtmlUnitLayout})
public void testResizing() {
- // There is nothing to test if the browser doesn't support resize
- if (!ResizeHelper.isResizeSupported()) {
- return;
- }
-
clearBodyContent();
- final int width = 600;
- final int height = 500;
+ // Handler for resize events
+ final TestResizeHandler resizeHandler = new TestResizeHandler();
+ final HandlerRegistration handlerRegistration = Window.addResizeHandler(resizeHandler);
- final TestResizeHandler handler = new TestResizeHandler();
- final HandlerRegistration handlerRegistration = Window.addResizeHandler(handler);
-
- ResizeHelper.resizeTo(width, height);
- ResizeHelper.assertSize(width, height);
- ResizeHelper.resizeBy(10, 20);
- ResizeHelper.assertSize(width + 10, height + 20);
-
- delayTestFinish(1000);
- Scheduler.get().scheduleFixedDelay(new RepeatingCommand() {
- public boolean execute() {
- if (!handler.isCalled()) {
- return true; // we still didn't receive the callback, let's wait more
+ delayTestFinish(2000);
+ DeferredCommand.addCommand(new Command() {
+ public void execute() {
+ // Sizes must be appropriate, otherwise browsers may not resize as
+ // requested. See comments in ResizeHelper.
+ int width = 600;
+ int height = 500;
+ // ensureInitialized could fail on Chrome
+ if (!ResizeHelper.resizeTo(width, height)) {
+ handlerRegistration.removeHandler();
+ finishTest(); // nothing we can test
}
- assertEquals(Window.getClientWidth(), handler.getWidth());
- assertEquals(Window.getClientHeight(), handler.getHeight());
+
+ assertEquals(width, Window.getClientWidth() + ResizeHelper.getExtraWidth());
+ assertEquals(height, Window.getClientHeight() + ResizeHelper.getExtraHeight());
+ // TODO: TestResizeHandler.getWidth() returns 0 -- need to investigate
+ // assertEquals(resizeHandler.getWidth(), Window.getClientWidth());
+ // assertEquals(resizeHandler.getHeight(), Window.getClientHeight());
+ ResizeHelper.resizeBy(10, 20);
+ assertEquals(width + 10, Window.getClientWidth() + ResizeHelper.getExtraWidth());
+ assertEquals(height + 20, Window.getClientHeight() + ResizeHelper.getExtraHeight());
+ // assertEquals(resizeHandler.getWidth(), Window.getClientWidth());
+ // assertEquals(resizeHandler.getHeight(), Window.getClientHeight());
+
+ // Cleanup the window
handlerRegistration.removeHandler();
+ ResizeHelper.restoreSize();
finishTest();
- return false;
}
- }, 10);
+ });
}
/**
diff --git a/user/test/com/google/gwt/user/client/rpc/FailedRequestTest.java b/user/test/com/google/gwt/user/client/rpc/FailedRequestTest.java
index b694fae..2691c34 100644
--- a/user/test/com/google/gwt/user/client/rpc/FailedRequestTest.java
+++ b/user/test/com/google/gwt/user/client/rpc/FailedRequestTest.java
@@ -18,10 +18,12 @@
import com.google.gwt.http.client.Request;
import com.google.gwt.user.client.rpc.impl.FailedRequest;
+import junit.framework.TestCase;
+
/**
* Tests the {@link com.google.gwt.user.client.rpc.impl.FailedRequest} class.
*/
-public class FailedRequestTest extends RpcTestBase {
+public class FailedRequestTest extends TestCase {
public void testBasics() {
Request failedRequest = new FailedRequest();
assertFalse(failedRequest.isPending());
diff --git a/user/test/com/google/gwt/user/client/rpc/FailingRequestBuilderTest.java b/user/test/com/google/gwt/user/client/rpc/FailingRequestBuilderTest.java
index 4dcb045..effa813 100644
--- a/user/test/com/google/gwt/user/client/rpc/FailingRequestBuilderTest.java
+++ b/user/test/com/google/gwt/user/client/rpc/FailingRequestBuilderTest.java
@@ -19,10 +19,12 @@
import com.google.gwt.http.client.RequestException;
import com.google.gwt.user.client.rpc.impl.FailingRequestBuilder;
+import junit.framework.TestCase;
+
/**
* Tests the {@link FailingRequestBuilder} class.
*/
-public class FailingRequestBuilderTest extends RpcTestBase {
+public class FailingRequestBuilderTest extends TestCase {
public void testBasics() throws RequestException {
final boolean[] callbackCalled = new boolean[] {false};
diff --git a/user/test/com/google/gwt/user/client/rpc/RecursiveClassTest.java b/user/test/com/google/gwt/user/client/rpc/RecursiveClassTest.java
index f241687..e3b84df 100644
--- a/user/test/com/google/gwt/user/client/rpc/RecursiveClassTest.java
+++ b/user/test/com/google/gwt/user/client/rpc/RecursiveClassTest.java
@@ -15,8 +15,8 @@
*/
package com.google.gwt.user.client.rpc;
-import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.rpc.RecursiveClassTestService.ResultNode;
+import com.google.gwt.core.client.GWT;
/**
* Class used to test generics with wild cards and recursive references.
@@ -26,19 +26,18 @@
/**
* This method is used to test generics with wild cards and recursive references.
*/
- @SuppressWarnings({"unchecked", "rawtypes"})
public void testRecursiveClass() {
RecursiveClassTestServiceAsync service = getServiceAsync();
delayTestFinishForRpc();
- service.greetServer("Hello", new AsyncCallback() {
+ service.greetServer("Hello", new AsyncCallback<ResultNode>() {
public void onFailure(Throwable caught) {
TestSetValidator.rethrowException(caught);
}
- public void onSuccess(Object result) {
+ public void onSuccess(ResultNode result) {
assertNotNull(result);
- assertTrue(result instanceof ResultNode);
+ assertTrue(TestSetValidator.isValidRecurisveClassObject(result));
finishTest();
}
});
diff --git a/user/test/com/google/gwt/user/client/rpc/RecursiveClassTestServiceAsync.java b/user/test/com/google/gwt/user/client/rpc/RecursiveClassTestServiceAsync.java
index 6436f45..61fd819 100644
--- a/user/test/com/google/gwt/user/client/rpc/RecursiveClassTestServiceAsync.java
+++ b/user/test/com/google/gwt/user/client/rpc/RecursiveClassTestServiceAsync.java
@@ -21,6 +21,6 @@
* Service used to test generics with wild cards and recursive references.
*/
public interface RecursiveClassTestServiceAsync {
- <U extends ResultNode<U>> void greetServer(String input, AsyncCallback<ResultNode<U>> callback)
- throws IllegalArgumentException;
+ <U extends ResultNode<?>> void greetServer(String input, AsyncCallback<ResultNode> callback)
+ throws IllegalArgumentException;
}
diff --git a/user/test/com/google/gwt/user/client/rpc/TestSetValidator.java b/user/test/com/google/gwt/user/client/rpc/TestSetValidator.java
index 76fb619..f5601b0 100644
--- a/user/test/com/google/gwt/user/client/rpc/TestSetValidator.java
+++ b/user/test/com/google/gwt/user/client/rpc/TestSetValidator.java
@@ -31,6 +31,7 @@
import com.google.gwt.user.client.rpc.TestSetFactory.SerializableGraphWithCFS;
import com.google.gwt.user.client.rpc.TestSetFactory.SerializablePrivateNoArg;
import com.google.gwt.user.client.rpc.TestSetFactory.SerializableWithTwoArrays;
+import com.google.gwt.user.client.rpc.RecursiveClassTestService.ResultNode;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse;
@@ -38,9 +39,9 @@
import static junit.framework.Assert.assertSame;
import java.util.ArrayList;
-import java.util.EnumMap;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.EnumMap;
import java.util.IdentityHashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
@@ -48,11 +49,11 @@
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
-import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet;
import java.util.Vector;
+import java.util.Map.Entry;
/**
* Misnamed set of static validation methods used by various collection class
@@ -805,6 +806,10 @@
return true;
}
+ public static boolean isValidRecurisveClassObject(ResultNode<? extends ResultNode<?>> result) {
+ return (result != null);
+ }
+
public static boolean isValidSingletonList(List<MarkerTypeSingleton> list) {
if (list == null || list.size() != 1) {
return false;
diff --git a/user/test/com/google/gwt/user/client/rpc/UnicodeEscapingService.java b/user/test/com/google/gwt/user/client/rpc/UnicodeEscapingService.java
index 5aee0b3..f1fe049 100644
--- a/user/test/com/google/gwt/user/client/rpc/UnicodeEscapingService.java
+++ b/user/test/com/google/gwt/user/client/rpc/UnicodeEscapingService.java
@@ -59,11 +59,6 @@
}
/**
- * Returns the input string unmodified.
- */
- String echo(String str);
-
- /**
* Returns a string containing the characters from start to end.
*
* Used to verify server->client escaping.
diff --git a/user/test/com/google/gwt/user/client/rpc/UnicodeEscapingServiceAsync.java b/user/test/com/google/gwt/user/client/rpc/UnicodeEscapingServiceAsync.java
index f998680..6ae9fd4 100644
--- a/user/test/com/google/gwt/user/client/rpc/UnicodeEscapingServiceAsync.java
+++ b/user/test/com/google/gwt/user/client/rpc/UnicodeEscapingServiceAsync.java
@@ -21,7 +21,6 @@
* Async version of the {@link UnicodeEscapingService} interface.
*/
public interface UnicodeEscapingServiceAsync {
- void echo(String str, AsyncCallback<String> callback);
void getStringContainingCharacterRange(int start, int end,
AsyncCallback<String> callback);
void verifyStringContainingCharacterRange(int start, int end, String str,
diff --git a/user/test/com/google/gwt/user/client/rpc/UnicodeEscapingTest.java b/user/test/com/google/gwt/user/client/rpc/UnicodeEscapingTest.java
index defb3c1..0a8c7fa 100644
--- a/user/test/com/google/gwt/user/client/rpc/UnicodeEscapingTest.java
+++ b/user/test/com/google/gwt/user/client/rpc/UnicodeEscapingTest.java
@@ -315,40 +315,4 @@
}
});
}
-
- /**
- * Verify that string encoding/decoding is lossless.
- */
- private void echoVerify(final String str) {
- delayTestFinish(TEST_FINISH_DELAY_MS);
- getService().echo(str, new AsyncCallback<String>() {
- @Override
- public void onFailure(Throwable caught) {
- TestSetValidator.rethrowException(caught);
- }
-
- @Override
- public void onSuccess(String result) {
- assertEquals(str, result);
- finishTest();
- }
- });
- }
-
- /**
- * Test that a NUL character followed by an octal character is encoded
- * correctly. Encoding the NUL character simply as "\0" in this case
- * would cause the recipient to see "\07" as a single octal escape sequence,
- * rather than two separate characters.
- */
- public void testEscapeNull() {
- echoVerify("\u0000" + "7"); // split to emphasize two characters
- }
-
- /**
- * Test that HTML special characters are encoded correctly.
- */
- public void testEscapeHtml() {
- echoVerify("<img src=x onerror=alert(1)>");
- }
}
diff --git a/user/test/com/google/gwt/user/client/ui/CustomButtonTest.java b/user/test/com/google/gwt/user/client/ui/CustomButtonTest.java
index 9f0b8e2..6f38b6e 100644
--- a/user/test/com/google/gwt/user/client/ui/CustomButtonTest.java
+++ b/user/test/com/google/gwt/user/client/ui/CustomButtonTest.java
@@ -29,7 +29,9 @@
import java.util.ArrayList;
import java.util.HashMap;
+import java.util.Iterator;
import java.util.Map;
+import java.util.Map.Entry;
/**
* Test for <code>PushButton</code> as most of this widget's functionality is UI
@@ -82,25 +84,29 @@
b.setDown(true);
assertEquals(b.getStylePrimaryName(), "random");
- Map<String, Face> faces = new HashMap<String, Face>();
+ Map faces = new HashMap();
faces.put("downDisabled", b.getDownDisabledFace());
faces.put("upDisabled", b.getUpDisabledFace());
faces.put("down", b.getDownFace());
faces.put("up", b.getUpFace());
faces.put("upHovering", b.getUpHoveringFace());
faces.put("downHovering", b.getDownHoveringFace());
+ Iterator entries = faces.entrySet().iterator();
// Set all faces as text.
- for (Map.Entry<String, Face> entry : faces.entrySet()) {
- Face f = entry.getValue();
+ while (entries.hasNext()) {
+ Map.Entry entry = (Entry) entries.next();
+ Face f = (Face) entry.getValue();
b.setCurrentFace(f);
assertEquals("random", b.getStylePrimaryName());
assertTrue(b.getStyleName().indexOf("random-" + f.getName()) != -1);
}
+ entries = faces.entrySet().iterator();
b.addStyleName("fobar");
// Set all faces as text.
- for (Map.Entry<String, Face> entry : faces.entrySet()) {
- Face f = entry.getValue();
+ while (entries.hasNext()) {
+ Map.Entry entry = (Entry) entries.next();
+ Face f = (Face) entry.getValue();
b.setCurrentFace(f);
String computedStyleName = DOM.getElementProperty(b.getElement(),
"className");
@@ -112,37 +118,43 @@
public void testSettingFaces() {
PushButton b = new PushButton();
- Map<String, Face> faces = new HashMap<String, Face>();
+ Map faces = new HashMap();
faces.put("downDisabled", b.getDownDisabledFace());
faces.put("upDisabled", b.getUpDisabledFace());
faces.put("down", b.getDownFace());
faces.put("up", b.getUpFace());
faces.put("upHovering", b.getUpHoveringFace());
faces.put("downHovering", b.getDownHoveringFace());
+ Iterator entries = faces.entrySet().iterator();
// Set all faces as text.
- for (Map.Entry<String, Face> entry : faces.entrySet()) {
- Face f = entry.getValue();
- String faceName = entry.getKey();
+ while (entries.hasNext()) {
+ Map.Entry entry = (Entry) entries.next();
+ Face f = (Face) entry.getValue();
+ String faceName = (String) entry.getKey();
f.setText(faceName);
}
-
- for (Map.Entry<String, Face> entry : faces.entrySet()) {
- Face f = entry.getValue();
- String faceName = entry.getKey();
+ entries = faces.entrySet().iterator();
+ while (entries.hasNext()) {
+ Map.Entry entry = (Entry) entries.next();
+ Face f = (Face) entry.getValue();
+ String faceName = (String) entry.getKey();
assertEquals(f.getText(), faceName);
}
-
// Set all faces as HTML
- for (Map.Entry<String, Face> entry : faces.entrySet()) {
- Face f = entry.getValue();
- String faceName = entry.getKey();
+ entries = faces.entrySet().iterator();
+ while (entries.hasNext()) {
+ Map.Entry entry = (Entry) entries.next();
+ Face f = (Face) entry.getValue();
+ String faceName = (String) entry.getKey();
f.setHTML("<b>" + faceName + "</b>");
}
- for (Map.Entry<String, Face> entry : faces.entrySet()) {
- Face f = entry.getValue();
- String faceName = entry.getKey();
+ entries = faces.entrySet().iterator();
+ while (entries.hasNext()) {
+ Map.Entry entry = (Entry) entries.next();
+ Face f = (Face) entry.getValue();
+ String faceName = (String) entry.getKey();
assertEquals(f.getText(), faceName);
assertEquals(f.getHTML().toLowerCase(), "<b>" + faceName.toLowerCase()
+ "</b>");
diff --git a/user/test/com/google/gwt/user/client/ui/FastStringMapProfile.java b/user/test/com/google/gwt/user/client/ui/FastStringMapProfile.java
index 71f50b1..b6057b4 100644
--- a/user/test/com/google/gwt/user/client/ui/FastStringMapProfile.java
+++ b/user/test/com/google/gwt/user/client/ui/FastStringMapProfile.java
@@ -22,7 +22,7 @@
*/
public class FastStringMapProfile extends WidgetProfile {
- Map<String, Integer> m;
+ Map m;
public void testTiming() throws Exception {
m = putTiming(32000);
@@ -46,8 +46,8 @@
this.timing("get(" + size + ")");
}
- public FastStringMap<Integer> putTiming(int size) {
- FastStringMap<Integer> m1 = new FastStringMap<Integer>();
+ public FastStringMap putTiming(int size) {
+ FastStringMap m1 = new FastStringMap();
this.resetTimer();
for (int i = 0; i < size; i++) {
Integer iVal = new Integer(size);
diff --git a/user/test/com/google/gwt/user/client/ui/HTMLTableProfile.java b/user/test/com/google/gwt/user/client/ui/HTMLTableProfile.java
index cc86737..a033ba7 100644
--- a/user/test/com/google/gwt/user/client/ui/HTMLTableProfile.java
+++ b/user/test/com/google/gwt/user/client/ui/HTMLTableProfile.java
@@ -70,7 +70,7 @@
public void hashMapShare(int rows, int columns) {
resetTimer();
- HashMap<String, Label> m = new HashMap<String, Label>();
+ HashMap m = new HashMap();
for (int row = 0; row < rows; row++) {
for (int column = 0; column < columns; column++) {
Label label = new Label(column + "i");
diff --git a/user/test/com/google/gwt/user/client/ui/NamedFrameTest.java b/user/test/com/google/gwt/user/client/ui/NamedFrameTest.java
index ff54a362..d25665c 100644
--- a/user/test/com/google/gwt/user/client/ui/NamedFrameTest.java
+++ b/user/test/com/google/gwt/user/client/ui/NamedFrameTest.java
@@ -76,8 +76,4 @@
// Success
}
}
-
- public void testDefaultSrc() {
- assertEquals("javascript:''", new NamedFrame("defaultSrc").getUrl());
- }
}
diff --git a/user/test/com/google/gwt/user/client/ui/PrefixTreeTest.java b/user/test/com/google/gwt/user/client/ui/PrefixTreeTest.java
index 38e8d5e..7cabdd7 100644
--- a/user/test/com/google/gwt/user/client/ui/PrefixTreeTest.java
+++ b/user/test/com/google/gwt/user/client/ui/PrefixTreeTest.java
@@ -18,6 +18,7 @@
import com.google.gwt.junit.client.GWTTestCase;
import java.util.ArrayList;
+import java.util.Iterator;
import java.util.List;
/**
@@ -125,7 +126,7 @@
* Tests newly constructed prefix tree assumptions.
*/
public void testPlaysWellWithOthers() {
- final List<String> l = new ArrayList<String>();
+ final List l = new ArrayList();
for (int i = 0; i < 100; i++) {
l.add(String.valueOf(i));
}
@@ -167,7 +168,7 @@
testSizeByIterator(tree);
assertTrue(tree.iterator().hasNext());
- List<String> l;
+ List l;
l = tree.getSuggestions("", 13);
assertTrue("Expected size of 13, got " + l.size(), l.size() == 13);
@@ -187,7 +188,7 @@
l = tree.getSuggestions("o", 1);
assertTrue("Expected size of 1, got " + l.size(), l.size() == 1);
- assertTrue(l.get(0).endsWith("..."));
+ assertTrue(((String) l.get(0)).endsWith("..."));
assertAllStartWith(l, "o");
l = tree.getSuggestions("something", 1);
@@ -196,8 +197,9 @@
assertAllStartWith(l, "somethingdifferent");
}
- protected void assertAllStartWith(List<String> l, String prefix) {
- for (String test : l) {
+ protected void assertAllStartWith(List l, String prefix) {
+ for (final Iterator i = l.iterator(); i.hasNext();) {
+ final String test = (String) i.next();
assertTrue(test + " does not start with " + prefix,
test.startsWith(prefix));
}
@@ -211,7 +213,8 @@
*/
protected void testSizeByIterator(PrefixTree tree) {
int count = 0;
- for (@SuppressWarnings("unused") String s : tree) {
+ for (final Iterator i = tree.iterator(); i.hasNext();) {
+ i.next();
count++;
}
diff --git a/user/test/com/google/gwt/user/client/ui/TreeTest.java b/user/test/com/google/gwt/user/client/ui/TreeTest.java
index dfcda3a..212b901 100644
--- a/user/test/com/google/gwt/user/client/ui/TreeTest.java
+++ b/user/test/com/google/gwt/user/client/ui/TreeTest.java
@@ -15,8 +15,6 @@
*/
package com.google.gwt.user.client.ui;
-import com.google.gwt.junit.DoNotRunWith;
-import com.google.gwt.junit.Platform;
import com.google.gwt.junit.client.GWTTestCase;
import com.google.gwt.safehtml.shared.SafeHtmlUtils;
import com.google.gwt.user.client.DOM;
@@ -346,55 +344,6 @@
// Expected.
}
}
-
- @DoNotRunWith(Platform.HtmlUnitLayout)
- public void testScrollOnSelectEnabledFalse() {
- // With scrolling disabled.
- Tree tree = createTree();
- tree.setScrollOnSelectEnabled(false);
- assertScrollingOnSelection(tree, false);
- }
-
- @DoNotRunWith(Platform.HtmlUnitLayout)
- public void testScrollOnSelectEnabledTrue() {
- // With scrolling enabled (default)
- Tree tree = createTree();
- assertTrue(tree.isScrollOnSelectEnabled());
- assertScrollingOnSelection(tree, true);
- }
-
- private void assertScrollingOnSelection(Tree tree, boolean shouldScroll) {
- tree.addItem(new Label("hello1"));
- tree.addItem(new Label("hello2"));
- TreeItem levelZeroTreeItem = tree.addItem(new Label("level0"));
- TreeItem selectedItem = levelZeroTreeItem.addItem(new Label("level1"));
- selectedItem.addItem(SafeHtmlUtils.fromString("level2"));
-
- // For the tree to be opened. Otherwise, all sizes will be zero and no scrolling would occur,
- // regardless of the mode.
- levelZeroTreeItem.setState(true);
- selectedItem.setState(true);
-
- ScrollPanel panel = new ScrollPanel();
- RootPanel.get().add(panel);
- panel.setWidget(tree);
-
- // Set a size that is smaller than the content to allow scrolling
- panel.setPixelSize(40, 90);
-
- assertEquals(0, panel.getVerticalScrollPosition());
- assertEquals(0, panel.getHorizontalScrollPosition());
-
- tree.setSelectedItem(selectedItem);
-
- if (shouldScroll) {
- assertTrue("Expected vertical scroll", panel.getVerticalScrollPosition() != 0);
- assertTrue("Expected horizontal scroll", panel.getHorizontalScrollPosition() != 0);
- } else {
- assertEquals("Expected no vertical scroll", 0, panel.getVerticalScrollPosition());
- assertEquals("Expected no horizontal scroll", 0, panel.getHorizontalScrollPosition());
- }
- }
public void testSwap() {
Tree t = createTree();
diff --git a/user/test/com/google/gwt/user/client/ui/WidgetCollectionTest.java b/user/test/com/google/gwt/user/client/ui/WidgetCollectionTest.java
index 121b54c..33d01ad 100644
--- a/user/test/com/google/gwt/user/client/ui/WidgetCollectionTest.java
+++ b/user/test/com/google/gwt/user/client/ui/WidgetCollectionTest.java
@@ -38,7 +38,7 @@
public void clear() {
}
- public Iterator<Widget> iterator() {
+ public Iterator iterator() {
return null;
}
@@ -88,7 +88,7 @@
wc.add(l1);
wc.add(l2);
- Iterator<Widget> it = wc.iterator();
+ Iterator it = wc.iterator();
assertTrue(it.hasNext());
assertEquals(it.next(), l0);
it.remove();
diff --git a/user/test/com/google/gwt/user/client/ui/WidgetIteratorsTest.java b/user/test/com/google/gwt/user/client/ui/WidgetIteratorsTest.java
index fe7ffc7..21821cf 100644
--- a/user/test/com/google/gwt/user/client/ui/WidgetIteratorsTest.java
+++ b/user/test/com/google/gwt/user/client/ui/WidgetIteratorsTest.java
@@ -37,7 +37,7 @@
fail("Unexpected call to clear()");
}
- public Iterator<Widget> iterator() {
+ public Iterator iterator() {
fail("Unexpected call to iterator()");
return null;
}
@@ -56,7 +56,7 @@
* Tests that empty arrays operate properly.
*/
public void testEmptyArray() {
- final Iterator<Widget> subject = WidgetIterators.createWidgetIterator(
+ final Iterator subject = WidgetIterators.createWidgetIterator(
new MockWidget(), new Widget[] {null, null});
assertFalse(subject.hasNext());
assertNextFails(subject);
@@ -80,7 +80,7 @@
}
};
- final Iterator<Widget> subject = WidgetIterators.createWidgetIterator(mock, widgets);
+ final Iterator subject = WidgetIterators.createWidgetIterator(mock, widgets);
expectedRemoveIndex[0] = 1;
assertTrue(subject.hasNext());
@@ -106,7 +106,7 @@
final MockWidget mock = new MockWidget();
final Widget[] widgets = new Widget[] {
null, createTestWidget(), null, createTestWidget(), null, null};
- final Iterator<Widget> subject = WidgetIterators.createWidgetIterator(mock, widgets);
+ final Iterator subject = WidgetIterators.createWidgetIterator(mock, widgets);
assertTrue(subject.hasNext());
assertEquals(widgets[1], subject.next());
@@ -118,7 +118,7 @@
assertNextFails(subject);
}
- private void assertNextFails(Iterator<Widget> iterator) {
+ private void assertNextFails(Iterator iterator) {
try {
iterator.next();
fail("Expected NoSuchElementException.");
@@ -127,7 +127,7 @@
}
}
- private void assertRemoveFails(Iterator<Widget> iterator) {
+ private void assertRemoveFails(Iterator iterator) {
try {
iterator.remove();
fail("Expected IllegalStateException.");
diff --git a/user/test/com/google/gwt/user/rebind/rpc/SerializableTypeOracleBuilderTest.java b/user/test/com/google/gwt/user/rebind/rpc/SerializableTypeOracleBuilderTest.java
index 88251fa..d5f01a0 100644
--- a/user/test/com/google/gwt/user/rebind/rpc/SerializableTypeOracleBuilderTest.java
+++ b/user/test/com/google/gwt/user/rebind/rpc/SerializableTypeOracleBuilderTest.java
@@ -45,16 +45,11 @@
import com.google.gwt.user.rebind.rpc.testcases.client.ManualSerialization;
import com.google.gwt.user.rebind.rpc.testcases.client.NoSerializableTypes;
import com.google.gwt.user.rebind.rpc.testcases.client.NotAllSubtypesAreSerializable;
-import com.google.gwt.user.rebind.rpc.testcases.client.ParameterizedTypeInList;
-import com.google.gwt.user.rebind.rpc.testcases.client.RawTypeInList;
-import com.google.gwt.user.rebind.rpc.testcases.client.SubclassUsedInArray;
import junit.framework.TestCase;
import java.io.PrintWriter;
-import java.util.ArrayList;
import java.util.Arrays;
-import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
@@ -1930,44 +1925,6 @@
}
/**
- * Tests a case where a subtype is visited and then later used to find covariant array types.
- * (Reproduces a caching issue that depends on the order in which types are visited.)
- */
- public void testSubclassUsedInArray() throws NotFoundException, UnableToCompleteException {
- JClassType expected = arrayType(SubclassUsedInArray.LeafType.class);
- checkSerializable(expected,
- eachJType(SubclassUsedInArray.Base.class, SubclassUsedInArray.HasArray.class));
- }
-
- /**
- * Test the case where a root array type has a type parameter as its leaf.
- */
- public void testArrayOfTypeParameterExtendsSubclass() throws Exception {
- JClassType expected = arrayType(SubclassUsedInArray.LeafType.class);
-
- TypeOracle oracle = getTestTypeOracle();
- JGenericType genericHasArray = oracle
- .getType(SubclassUsedInArray.GenericHasArray.class.getCanonicalName()).isGenericType();
- JTypeParameter typeParameter = genericHasArray.getTypeParameters()[0];
-
- checkSerializable(expected,
- oracle.getType(SubclassUsedInArray.Base.class.getCanonicalName()),
- oracle.getArrayType(typeParameter));
- }
-
- public void testRawTypeInList() throws Exception {
- JClassType expected = arrayType(RawTypeInList.Covariant.class);
- checkSerializable(expected,
- eachJType(RawTypeInList.Marker.class, RawTypeInList.HasList.class));
- }
-
- public void testParameterizedTypeInList() throws Exception {
- JClassType expected = arrayType(ParameterizedTypeInList.Covariant.class);
- checkSerializable(expected,
- eachJType(ParameterizedTypeInList.Marker.class, ParameterizedTypeInList.HasList.class));
- }
-
- /**
* Tests subtypes that introduce new instantiable type parameters.
*
* @throws UnableToCompleteException
@@ -2070,7 +2027,7 @@
JClassType foo = to.getType("Foo");
JClassType bar = to.getType("Bar");
JClassType intfOfString =
- to.getParameterizedType(intf, new JClassType[]{to.getType(String.class.getName())});
+ to.getParameterizedType(intf, new JClassType[] {to.getType(String.class.getName())});
JClassType ser = to.getType("Ser");
SerializableTypeOracleBuilder sob = createSerializableTypeOracleBuilder(logger, to);
@@ -2344,7 +2301,7 @@
JTypeParameter typeParam = c.getTypeParameters()[0];
- JParameterizedType parameterizedType = to.getParameterizedType(a, new JClassType[]{typeParam});
+ JParameterizedType parameterizedType = to.getParameterizedType(a, new JClassType[] {typeParam});
SerializableTypeOracleBuilder sob = createSerializableTypeOracleBuilder(logger, to);
sob.addRootType(logger, parameterizedType);
SerializableTypeOracle so = sob.build(logger);
@@ -2409,78 +2366,6 @@
assertNotInstantiableOrFieldSerializable(so, a.getRawType());
}
- /**
- * Checks that a type is serializable when searching from the given roots.
- * Also, check that the root order doesn't matter.
- */
- private void checkSerializable(JClassType expected, JType... roots)
- throws UnableToCompleteException {
- roots = Arrays.copyOf(roots, roots.length);
-
- // find serializable types in forward and reverse order
- SerializableTypeOracle forwardResult = findSerializable(roots);
- Collections.reverse(Arrays.asList(roots));
- SerializableTypeOracle reverseResult = findSerializable(roots);
-
- // check that the expected type is serializable
- boolean forwardOk = forwardResult.isSerializable(expected);
- boolean reverseOk = reverseResult.isSerializable(expected);
- if (!forwardOk && !reverseOk) {
- fail(expected + " is not serializable from " + join(", ", roots) + " in either order");
- }
- if (!forwardOk || !reverseOk) {
- fail(expected + " is not serializable from " + join(", ", roots) + " in both orders");
- }
-
- // also check that other serializable types are stable
- checkSameSerializables(forwardResult, reverseResult);
- }
-
- private SerializableTypeOracle findSerializable(JType... rootTypes)
- throws UnableToCompleteException {
- TreeLogger logger = createLogger();
- TypeOracle oracle = getTestTypeOracle();
- SerializableTypeOracleBuilder builder =
- createSerializableTypeOracleBuilder(logger, oracle);
- for (JType root : rootTypes) {
- builder.addRootType(logger, root);
- }
- return builder.build(logger);
- }
-
- private JType[] eachJType(Class... classes) throws UnableToCompleteException {
- TypeOracle oracle = getTestTypeOracle();
- List<JType> result = new ArrayList<JType>();
- for (Class aClass : classes) {
- result.add(oracle.findType(aClass.getCanonicalName()));
- }
- return result.toArray(new JType[result.size()]);
- }
-
- private void checkSameSerializables(SerializableTypeOracle first, SerializableTypeOracle second) {
- String firstTypes = join("\n", first.getSerializableTypes());
- String secondTypes = join("\n", second.getSerializableTypes());
- assertEquals("type oracles differ", firstTypes, secondTypes);
- }
-
- private JClassType arrayType(Class<?> itemType)
- throws UnableToCompleteException, NotFoundException {
- TypeOracle typeOracle = getTestTypeOracle();
- JClassType leaf = typeOracle.getType(itemType.getCanonicalName());
- return typeOracle.getArrayType(leaf);
- }
-
- private <T> String join(String delimiter, T... items) {
- StringBuilder result = new StringBuilder();
- for (int i = 0; i < items.length; i++) {
- if (i > 0) {
- result.append(delimiter);
- }
- result.append(items[i]);
- }
- return result.toString();
- }
-
private JClassType[] makeArray(JClassType... elements) {
return elements;
}
diff --git a/user/test/com/google/gwt/user/rebind/rpc/SerializationUtilsTest.java b/user/test/com/google/gwt/user/rebind/rpc/SerializationUtilsTest.java
deleted file mode 100644
index 3c8a5cc..0000000
--- a/user/test/com/google/gwt/user/rebind/rpc/SerializationUtilsTest.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright 2013 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.user.rebind.rpc;
-
-import com.google.gwt.core.ext.TreeLogger;
-import com.google.gwt.core.ext.typeinfo.JClassType;
-import com.google.gwt.core.ext.typeinfo.NotFoundException;
-import com.google.gwt.core.ext.typeinfo.TypeOracle;
-import com.google.gwt.dev.javac.TypeOracleTestingUtils;
-import com.google.gwt.dev.javac.testing.impl.StaticJavaResource;
-
-import junit.framework.TestCase;
-
-/**
- * Tests for {@link SerializationUtils}.
- */
-public class SerializationUtilsTest extends TestCase {
-
- public void testGetSerializationSignatureUseEnumConstants() throws Throwable {
- assertEquals("Identical enums have different signature",
- getEnumSerializationSignature("FOO, BAR, BAZ"),
- getEnumSerializationSignature("FOO, BAR, BAZ"));
-
- assertFalse("Enums w/ renamed constant have same signature",
- getEnumSerializationSignature("FOO, BAR, BAZ").equals(
- getEnumSerializationSignature("FOO, BAZ, BAR")));
- // reordering is equivalent to renaming, but let's test it anyway
- assertFalse("Enums w/ reordered constants have same signature",
- getEnumSerializationSignature("FOO, BAR, BAZ").equals(
- getEnumSerializationSignature("FOO, BAZ, BAR")));
-
- assertFalse("Enums w/ added constant have same signature",
- getEnumSerializationSignature("FOO, BAR, BAZ").equals(
- getEnumSerializationSignature("FOO, BAR, BAZ, QUUX")));
- assertFalse("Enums w/ removed constant have same signature",
- getEnumSerializationSignature("FOO, BAR, BAZ").equals(
- getEnumSerializationSignature("FOO, BAR")));
-
- assertEquals("Enums w/ changed implementation have different signature",
- getEnumSerializationSignature("FOO, BAR, BAZ"),
- getEnumSerializationSignature("FOO, BAR { @Override public String toString() { return \"QUUX\"; } }, BAZ"));
- }
-
- protected String getEnumSerializationSignature(String constants) throws NotFoundException {
- TypeOracle to = TypeOracleTestingUtils.buildStandardTypeOracleWith(TreeLogger.NULL,
- new StaticJavaResource("TestEnum", "public enum TestEnum { " + constants + " }"));
- JClassType enumType = to.getType("TestEnum");
- return SerializationUtils.getSerializationSignature(to, enumType);
- }
-}
diff --git a/user/test/com/google/gwt/user/rebind/rpc/testcases/client/ParameterizedTypeInList.java b/user/test/com/google/gwt/user/rebind/rpc/testcases/client/ParameterizedTypeInList.java
deleted file mode 100644
index 061a6a6..0000000
--- a/user/test/com/google/gwt/user/rebind/rpc/testcases/client/ParameterizedTypeInList.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright 2012 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.user.rebind.rpc.testcases.client;
-
-import java.io.Serializable;
-import java.util.List;
-
-/**
- * Sets up the situation where we need to find the covariant arrays of a List that
- * contains a parameterized type.
- */
-public class ParameterizedTypeInList {
-
- /**
- * A root type to make sure we visit Item as a subtype first
- * (so that its subtypes aren't cached).
- */
- public interface Marker extends Serializable {
- }
-
- /**
- * A root type that uses Item as a parameterized type in a List.
- * (GWT-RPC automatically adds the corresponding array types for lists.)
- */
- public static class HasList implements Serializable {
- List<Item<String>> field;
- }
-
- /**
- * A parameterized type.
- */
- public static class Item<T extends Comparable> implements Marker {
- T field;
- }
-
- /**
- * Arrays of this type should be added as well.
- */
- public static class Covariant extends Item<String> {
- }
-}
diff --git a/user/test/com/google/gwt/user/rebind/rpc/testcases/client/RawTypeInList.java b/user/test/com/google/gwt/user/rebind/rpc/testcases/client/RawTypeInList.java
deleted file mode 100644
index c5d37bf..0000000
--- a/user/test/com/google/gwt/user/rebind/rpc/testcases/client/RawTypeInList.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright 2012 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.user.rebind.rpc.testcases.client;
-
-import java.io.Serializable;
-import java.util.List;
-
-/**
- * Sets up the situation where we need to find the covariant arrays of a List that
- * contains a raw type.
- */
-public class RawTypeInList {
-
- /**
- * A root type to make sure we visit Item as a subtype first
- * (so that its subtypes aren't cached).
- */
- public interface Marker extends Serializable {
- }
-
- /**
- * A root type that uses Item as a raw type in a List.
- * (GWT-RPC automatically adds the corresponding array types for lists.)
- */
- public static class HasList implements Serializable {
- List<Item> field;
- }
-
- /**
- * A parameterized type.
- */
- public static class Item<T extends Comparable> implements Marker {
- T field;
- }
-
- /**
- * Arrays of this type should be added as well.
- */
- public static class Covariant extends Item<String> {
- }
-}
diff --git a/user/test/com/google/gwt/user/rebind/rpc/testcases/client/SubclassUsedInArray.java b/user/test/com/google/gwt/user/rebind/rpc/testcases/client/SubclassUsedInArray.java
deleted file mode 100644
index 247875f..0000000
--- a/user/test/com/google/gwt/user/rebind/rpc/testcases/client/SubclassUsedInArray.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright 2012 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.user.rebind.rpc.testcases.client;
-
-import java.io.Serializable;
-
-/**
- * Sets up a situation where an array type has a covariant type but its leaf's subtypes aren't
- * cached.
- */
-public class SubclassUsedInArray {
-
- /** Root type. */
- public interface Base extends Serializable {
- }
-
- /** Array's leaf type. Not a root so its subtypes aren't cached. */
- public static class Subtype implements Base {
- // Has a field so it's not trivially serializable and full analysis will be done.
- private FieldType fieldType;
- }
-
- /** A subtype to trigger a covariant array type. */
- public static class LeafType extends Subtype {
- }
-
- /** Root type to trigger the array. */
- public static class HasArray implements Serializable {
- private Subtype[] array;
- }
-
- /** Used to create a type parameter with Subtype as its upper bound */
- public static class GenericHasArray<T extends Subtype> implements Serializable {
- private T[] array;
- }
-
- /** Just a field. */
- public static class FieldType implements Serializable {
- }
-}
diff --git a/user/test/com/google/gwt/user/server/rpc/RPCTypeCheckTest.java b/user/test/com/google/gwt/user/server/rpc/RPCTypeCheckTest.java
index d6fc11d..76f155b 100644
--- a/user/test/com/google/gwt/user/server/rpc/RPCTypeCheckTest.java
+++ b/user/test/com/google/gwt/user/server/rpc/RPCTypeCheckTest.java
@@ -23,7 +23,6 @@
import com.google.gwt.user.client.rpc.SerializedTypeViolationException;
import com.google.gwt.user.client.rpc.TestSetFactory.ReverseSorter;
import com.google.gwt.user.server.rpc.RPCTypeCheckCollectionsTest.TestHashSet;
-import com.google.gwt.user.server.rpc.testcases.TypeVariableCycle;
import junit.framework.TestCase;
@@ -2459,23 +2458,6 @@
}
/**
- * Test for <a href="https://code.google.com/p/google-web-toolkit/issues/detail?id=7779">7779</a>.
- */
- public void testTypeVariableCycle() throws Exception {
-
- // Build an RPC request that calls dereference(hello)
- RPCTypeCheckFactory builder = new RPCTypeCheckFactory(TypeVariableCycle.class, "dereference");
- builder.write(TypeVariableCycle.HELLO);
- String request = builder.toString();
-
- // Make sure we can decode it.
- RPCRequest decoded = RPC.decodeRequest(request);
- Object deserializedArg = decoded.getParameters()[0];
- assertEquals(TypeVariableCycle.PtrPtr.class, deserializedArg.getClass());
- assertEquals("hello", ((TypeVariableCycle.PtrPtr) deserializedArg).get());
- }
-
- /**
* This checks that HashMap correctly reports that it is an incorrect type.
*/
public void testHashMapSpoofingClass() {
@@ -2778,7 +2760,6 @@
* arguments of a primitive value type with another primitive type.
*/
public void testValueSpoofing() {
- boolean returned = false;
try {
// When an int appears in place of a string, the result will be the
// int value indexing the string table, which will result in
@@ -2786,14 +2767,10 @@
// an incorrect string if the integer value is within range of the string
// table.
RPC.decodeRequest(generateIntSpoofingString());
- returned = true;
- } catch (AssertionError e) {
+ fail("Expected ArrayIndexOutOfBoundsException from testValueSpoofing (1)");
+ } catch (ArrayIndexOutOfBoundsException e) {
// Expected
}
- if (returned) {
- fail("RPC.decodeRequest should have thrown.");
- }
-
try {
// When a string pretends to be an int, it simply results in an incorrect
// integer value.
diff --git a/user/test/com/google/gwt/user/server/rpc/UnicodeEscapingServiceImpl.java b/user/test/com/google/gwt/user/server/rpc/UnicodeEscapingServiceImpl.java
index 30ffbe1..c96276a 100644
--- a/user/test/com/google/gwt/user/server/rpc/UnicodeEscapingServiceImpl.java
+++ b/user/test/com/google/gwt/user/server/rpc/UnicodeEscapingServiceImpl.java
@@ -25,13 +25,6 @@
UnicodeEscapingService {
/**
- * @see UnicodeEscapingService#echo(String)
- */
- public String echo(String str) {
- return str;
- }
-
- /**
* @see UnicodeEscapingService#getStringContainingCharacterRange(int, int)
*/
public String getStringContainingCharacterRange(int start, int end) {
diff --git a/user/test/com/google/gwt/user/server/rpc/impl/StandardSerializationPolicyTest.java b/user/test/com/google/gwt/user/server/rpc/impl/StandardSerializationPolicyTest.java
index f75f54d..90bb1be 100644
--- a/user/test/com/google/gwt/user/server/rpc/impl/StandardSerializationPolicyTest.java
+++ b/user/test/com/google/gwt/user/server/rpc/impl/StandardSerializationPolicyTest.java
@@ -21,7 +21,6 @@
import java.util.HashMap;
import java.util.Map;
-import java.util.Set;
/**
* Tests for the {@link StandardSerializationPolicy} class.
@@ -118,14 +117,14 @@
}
StandardSerializationPolicy getStandardSerializationPolicy() {
- Map<Class<?>, Boolean> map = new HashMap<Class<?>, Boolean>();
+ Map map = new HashMap();
map.put(A.class, Boolean.TRUE);
map.put(C.class, Boolean.FALSE);
- Map<Class<?>, String> typeIds = new HashMap<Class<?>, String>();
+ Map typeIds = new HashMap();
typeIds.put(A.class, "A");
typeIds.put(B.class, "B");
- return new StandardSerializationPolicy(map, map, typeIds, new HashMap<Class<?>, Set<String>>());
+ return new StandardSerializationPolicy(map, map, typeIds, new HashMap());
}
}
diff --git a/user/test/com/google/gwt/user/server/rpc/testcases/TypeVariableCycle.java b/user/test/com/google/gwt/user/server/rpc/testcases/TypeVariableCycle.java
deleted file mode 100644
index 190f129..0000000
--- a/user/test/com/google/gwt/user/server/rpc/testcases/TypeVariableCycle.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Copyright 2013 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.user.server.rpc.testcases;
-
-import com.google.gwt.user.client.rpc.IsSerializable;
-import com.google.gwt.user.client.rpc.RemoteService;
-
-/**
- * An example of how to create a cycle using type variable inference. To determine
- * the expected type of the HELLO.ptr field, the type inference in
- * {@link com.google.gwt.user.server.rpc.impl.SerializabilityUtil}
- * starts with PtrPtr.ptr and deduces the following:
- *
- * <ul>
- * <li>C = B (by inheritance)
- * <li>B = A (by inheritance)
- * <li>A = C (because the raw type of ptr is BasePtr<A> and we are substituting C into it)
- * </pre>
- *
- * <p>If we put these deductions into a map then there will be a cycle in the map.
- * The type inferencer needs to detect the cycle and conclude that there is no constraint
- * on any of these type variables, so HELLO.ptr.target could be any serializable
- * type.</p>
- *
- * <p>TODO(skybrian): it's unclear whether this should really be a cycle. The 'A' in the second
- * deduction annotates the the PtrPtr object (HELLO) and the 'A' in the last deduction is for the
- * SimplePtr object (HELLO.ptr) so perhaps they are two type variables of the same name in different
- * scopes? Currently the algorithm in SerializabilityUtil doesn't have scopes so this might
- * just be a false alias. It doesn't affect the conclusion for this example, though.</p>
- */
-public class TypeVariableCycle implements RemoteService {
-
- /**
- * A value we that we want to send via GWT-RPC.
- */
- public static final PtrPtr<String> HELLO =
- new PtrPtr<String>(new SimplePtr<String>("hello"));
-
- /**
- * The RPC method that we will call.
- */
- @SuppressWarnings("unused")
- public static <X> X dereference(BasePtr<X> any) {
- return any.get();
- }
-
- /**
- * The base of a convoluted class hierarchy of pointer types.
- */
- public static abstract class BasePtr<A> implements IsSerializable {
- abstract A get();
- }
-
- /**
- * An unneeded intermediate class to make a size-3 cycle. (Intermediate
- * classes could be added to make a cycle of any size.)
- */
- public abstract static class NonSimplePtr<B> extends BasePtr<B> {
- }
-
- /**
- * A pointer to a pointer.
- */
- public static class PtrPtr<C> extends NonSimplePtr<C> {
- public BasePtr<C> ptr;
-
- @SuppressWarnings("unused")
- PtrPtr() {
- }
-
- PtrPtr(BasePtr<C> ptr) {
- this.ptr = ptr;
- }
-
- @Override
- public C get() {
- return ptr.get();
- }
- }
-
- /**
- * A trivial implementation of BasePtr.
- */
- public static class SimplePtr<D> extends BasePtr<D> {
- public D target;
-
- @SuppressWarnings("unused")
- SimplePtr() {
- }
-
- SimplePtr(D target) {
- this.target = target;
- }
-
- @Override
- D get() {
- return target;
- }
- }
-}
diff --git a/user/test/com/google/gwt/validation/example/client/AuthorTest.java b/user/test/com/google/gwt/validation/example/client/AuthorTest.java
index 38d4d1b..374399d 100644
--- a/user/test/com/google/gwt/validation/example/client/AuthorTest.java
+++ b/user/test/com/google/gwt/validation/example/client/AuthorTest.java
@@ -47,20 +47,20 @@
initValidAuthor();
Set<ConstraintViolation<Author>> violations = validator.validate(author,
ClientGroup.class);
- assertContentsEmpty("valid author", violations);
+ assertContentsAnyOrder("valid author", violations);
}
public void testGroup_default() throws Exception {
initValidAuthor();
Set<ConstraintViolation<Author>> violations = validator.validate(author,
Default.class);
- assertContentsEmpty("valid author", violations);
+ assertContentsAnyOrder("valid author", violations);
}
public void testGroup_empty() throws Exception {
initValidAuthor();
Set<ConstraintViolation<Author>> violations = validator.validate(author);
- assertContentsEmpty("valid author", violations);
+ assertContentsAnyOrder("valid author", violations);
}
public void testGroup_serverGroup() throws Exception {
@@ -93,7 +93,7 @@
public void testValidate_valid() {
initValidAuthor();
Set<ConstraintViolation<Author>> violations = validator.validate(author);
- assertContentsEmpty("valid author", violations);
+ assertContentsAnyOrder("valid author", violations);
}
public void testValidateProperty_object() {
@@ -125,11 +125,6 @@
author.setCompany("Google");
}
- private <T> void assertContentsEmpty(String message,
- Iterable<T> actual) {
- assertFalse(message + "Expected empty but found " + actual, actual.iterator().hasNext());
- }
-
private <T> void assertContentsAnyOrder(String message,
Iterable<T> actual, T... expected) {
diff --git a/user/test/com/google/web/bindery/event/shared/SimpleEventBusTest.java b/user/test/com/google/web/bindery/event/shared/SimpleEventBusTest.java
index cbe7b58..29e6541 100644
--- a/user/test/com/google/web/bindery/event/shared/SimpleEventBusTest.java
+++ b/user/test/com/google/web/bindery/event/shared/SimpleEventBusTest.java
@@ -294,7 +294,19 @@
final SimpleEventBus eventBus = new SimpleEventBus();
HandlerRegistration reg = FooEvent.register(eventBus, fooHandler1);
reg.removeHandler();
- reg.removeHandler(); // should not throw
+
+ boolean assertsOn = getClass().desiredAssertionStatus();
+
+ if (assertsOn) {
+ try {
+ reg.removeHandler();
+ fail("Should have thrown on remove");
+ } catch (AssertionError e) { /* pass */
+ }
+ } else {
+ reg.removeHandler();
+ // Succeed on no assert failure
+ }
}
public void testNoSource() {
diff --git a/user/test/com/google/web/bindery/requestfactory/gwt/client/RequestFactoryTest.java b/user/test/com/google/web/bindery/requestfactory/gwt/client/RequestFactoryTest.java
index caf6670..90dcd71 100644
--- a/user/test/com/google/web/bindery/requestfactory/gwt/client/RequestFactoryTest.java
+++ b/user/test/com/google/web/bindery/requestfactory/gwt/client/RequestFactoryTest.java
@@ -16,7 +16,6 @@
package com.google.web.bindery.requestfactory.gwt.client;
import com.google.web.bindery.autobean.shared.AutoBeanCodex;
-import com.google.web.bindery.autobean.shared.AutoBeanUtils;
import com.google.web.bindery.requestfactory.shared.EntityProxy;
import com.google.web.bindery.requestfactory.shared.EntityProxyChange;
import com.google.web.bindery.requestfactory.shared.EntityProxyId;
@@ -276,63 +275,6 @@
});
}
- /**
- * See https://code.google.com/p/google-web-toolkit/issues/detail?id=7900
- */
- public void testCreatePersistCascadingAndReturnSelfEditWithReferences() {
- delayTestFinish(DELAY_TEST_FINISH);
-
- SimpleFooRequest context = simpleFooRequest();
- SimpleFooProxy foo = context.create(SimpleFooProxy.class);
- SimpleBarProxy bar = context.create(SimpleBarProxy.class);
- foo.setBarField(bar);
- Request<SimpleFooProxy> fooReq = context.persistCascadingAndReturnSelf()
- .using(foo).with("barField");
- fooReq.fire(new Receiver<SimpleFooProxy>() {
-
- @Override
- public void onSuccess(SimpleFooProxy returned) {
- assertTrue(AutoBeanUtils.getAutoBean(returned).isFrozen());
- assertTrue(AutoBeanUtils.getAutoBean(returned.getBarField()).isFrozen());
-
- simpleFooRequest().edit(returned);
-
- finishTestAndReset();
- }
- });
- }
-
- /**
- * See https://code.google.com/p/google-web-toolkit/issues/detail?id=7900
- */
- public void testCreateReferencePersistCascadingAndReturnSelfEdit() {
- delayTestFinish(DELAY_TEST_FINISH);
-
- simpleFooRequest().findSimpleFooById(1L).fire(new Receiver<SimpleFooProxy>() {
- @Override
- public void onSuccess(SimpleFooProxy response) {
- SimpleFooRequest context = simpleFooRequest();
- SimpleFooProxy foo = context.edit(response);
- SimpleBarProxy bar = context.create(SimpleBarProxy.class);
- foo.setBarField(bar);
- Request<SimpleFooProxy> fooReq = context.persistCascadingAndReturnSelf()
- .using(foo).with("barField");
- fooReq.fire(new Receiver<SimpleFooProxy>() {
-
- @Override
- public void onSuccess(SimpleFooProxy returned) {
- assertTrue(AutoBeanUtils.getAutoBean(returned).isFrozen());
- assertTrue(AutoBeanUtils.getAutoBean(returned.getBarField()).isFrozen());
-
- simpleFooRequest().edit(returned);
-
- finishTestAndReset();
- }
- });
- }
- });
- }
-
public void testChangedCreate() {
SimpleFooRequest context = simpleFooRequest();
@@ -664,9 +606,6 @@
assertEquals(2, handler.totalEventCount);
checkStableIdEquals(foo, returned);
-
- simpleFooRequest().edit(returned);
-
finishTestAndReset();
}
});
diff --git a/user/test/com/google/web/bindery/requestfactory/shared/impl/RequestPayloadTest.java b/user/test/com/google/web/bindery/requestfactory/shared/impl/RequestPayloadTest.java
index e2c33cf..d40d9a0 100644
--- a/user/test/com/google/web/bindery/requestfactory/shared/impl/RequestPayloadTest.java
+++ b/user/test/com/google/web/bindery/requestfactory/shared/impl/RequestPayloadTest.java
@@ -119,7 +119,6 @@
for (OperationMessage operationMessage : requestMessage.getOperations()) {
if (fooTypeToken.equals(operationMessage.getTypeToken())) {
seenFoos++;
- @SuppressWarnings("unchecked")
SimpleProxyId<?> id = (SimpleProxyId<?>) foo.stableId();
assertEquals(id.getServerId(), operationMessage.getServerId());
assertEquals(2, operationMessage.getPropertyMap().size());
diff --git a/user/test/org/apache/commons/collections/AbstractTestListIterator.java b/user/test/org/apache/commons/collections/AbstractTestListIterator.java
index e97f743..24701f5 100755
--- a/user/test/org/apache/commons/collections/AbstractTestListIterator.java
+++ b/user/test/org/apache/commons/collections/AbstractTestListIterator.java
@@ -37,7 +37,6 @@
* @author Rodney Waldhoff
* @author Stephen Colebourne
*/
-@SuppressWarnings({"unchecked", "rawtypes"})
public abstract class AbstractTestListIterator extends TestIterator {
// -----------------------------------------------------------------------
diff --git a/user/test/org/apache/commons/collections/DefaultMapEntry.java b/user/test/org/apache/commons/collections/DefaultMapEntry.java
index 2f8ee5a..1b15f06 100644
--- a/user/test/org/apache/commons/collections/DefaultMapEntry.java
+++ b/user/test/org/apache/commons/collections/DefaultMapEntry.java
@@ -23,7 +23,7 @@
* @author <a href="mailto:jstrachan@apache.org">James Strachan</a>
* @author <a href="mailto:mas@apache.org">Michael A. Smith</a>
*/
-@SuppressWarnings({"unchecked", "rawtypes"})
+
public class DefaultMapEntry implements Map.Entry {
private Object key;
diff --git a/user/test/org/apache/commons/collections/LocalTestNode.java b/user/test/org/apache/commons/collections/LocalTestNode.java
index ba282ad..5608b62 100644
--- a/user/test/org/apache/commons/collections/LocalTestNode.java
+++ b/user/test/org/apache/commons/collections/LocalTestNode.java
@@ -22,7 +22,6 @@
*
* @author Marc Johnson (marcj at users dot sourceforge dot net)
*/
-@SuppressWarnings({"unchecked", "rawtypes"})
class LocalTestNode implements Comparable {
private Comparable key;
diff --git a/user/test/org/apache/commons/collections/TestArrayList.java b/user/test/org/apache/commons/collections/TestArrayList.java
index 63ef8b3..07ff0ab 100644
--- a/user/test/org/apache/commons/collections/TestArrayList.java
+++ b/user/test/org/apache/commons/collections/TestArrayList.java
@@ -21,7 +21,6 @@
* @author <a href="mailto:jvanzyl@apache.org">Jason van Zyl</a>
* @version $Id: TestArrayList.java,v 1.5.2.1 2004/05/22 12:14:05 scolebourne Exp $
*/
-@SuppressWarnings({"unchecked", "rawtypes"})
public abstract class TestArrayList extends TestList
{
diff --git a/user/test/org/apache/commons/collections/TestCollection.java b/user/test/org/apache/commons/collections/TestCollection.java
index 66d187f..e3aac53 100644
--- a/user/test/org/apache/commons/collections/TestCollection.java
+++ b/user/test/org/apache/commons/collections/TestCollection.java
@@ -110,7 +110,6 @@
* @author <a href="mailto:mas@apache.org">Michael A. Smith</a>
* @version $Id: TestCollection.java,v 1.9.2.1 2004/05/22 12:14:05 scolebourne Exp $
*/
-@SuppressWarnings({"unchecked", "rawtypes"})
public abstract class TestCollection extends TestObject {
//
diff --git a/user/test/org/apache/commons/collections/TestComparator.java b/user/test/org/apache/commons/collections/TestComparator.java
index 331644d..488dd6a 100644
--- a/user/test/org/apache/commons/collections/TestComparator.java
+++ b/user/test/org/apache/commons/collections/TestComparator.java
@@ -20,7 +20,7 @@
import java.util.Comparator;
import java.util.List;
-@SuppressWarnings({"unchecked", "rawtypes"})
+
public abstract class TestComparator extends TestObject {
diff --git a/user/test/org/apache/commons/collections/TestIterator.java b/user/test/org/apache/commons/collections/TestIterator.java
index 4714bc1..9b779da 100644
--- a/user/test/org/apache/commons/collections/TestIterator.java
+++ b/user/test/org/apache/commons/collections/TestIterator.java
@@ -23,7 +23,6 @@
*
* @author Morgan Delagrange
*/
-@SuppressWarnings({"unchecked", "rawtypes"})
public abstract class TestIterator extends TestObject {
diff --git a/user/test/org/apache/commons/collections/TestList.java b/user/test/org/apache/commons/collections/TestList.java
index 88dd29c..9a0135b 100644
--- a/user/test/org/apache/commons/collections/TestList.java
+++ b/user/test/org/apache/commons/collections/TestList.java
@@ -40,7 +40,6 @@
* @author Paul Jack
* @version $Id: TestList.java,v 1.13.2.1 2004/05/22 12:14:05 scolebourne Exp $
*/
-@SuppressWarnings({"unchecked", "rawtypes"})
public abstract class TestList extends TestCollection {
diff --git a/user/test/org/apache/commons/collections/TestMap.java b/user/test/org/apache/commons/collections/TestMap.java
index 7e1d0a9..16e39ce 100644
--- a/user/test/org/apache/commons/collections/TestMap.java
+++ b/user/test/org/apache/commons/collections/TestMap.java
@@ -106,7 +106,6 @@
* @author Paul Jack
* @version $Id: TestMap.java,v 1.20.2.1 2004/05/22 12:14:05 scolebourne Exp $
*/
-@SuppressWarnings({"unchecked", "rawtypes"})
public abstract class TestMap extends TestObject{
// These instance variables are initialized with the reset method.
diff --git a/user/test/org/apache/commons/collections/TestSet.java b/user/test/org/apache/commons/collections/TestSet.java
index df77884..14f9933 100644
--- a/user/test/org/apache/commons/collections/TestSet.java
+++ b/user/test/org/apache/commons/collections/TestSet.java
@@ -38,7 +38,6 @@
* @author Paul Jack
* @version $Id: TestSet.java,v 1.2.2.1 2004/05/22 12:14:05 scolebourne Exp $
*/
-@SuppressWarnings({"unchecked", "rawtypes"})
public abstract class TestSet extends TestCollection {
diff --git a/user/test/org/hibernate/jsr303/tck/util/TckTestSuiteWrapper.java b/user/test/org/hibernate/jsr303/tck/util/TckTestSuiteWrapper.java
index d0509ed..e58710e 100644
--- a/user/test/org/hibernate/jsr303/tck/util/TckTestSuiteWrapper.java
+++ b/user/test/org/hibernate/jsr303/tck/util/TckTestSuiteWrapper.java
@@ -25,6 +25,7 @@
import com.google.gwt.thirdparty.guava.common.base.Predicate;
import junit.framework.Test;
+import junit.framework.TestCase;
import org.hibernate.jsr303.tck.util.client.Failing;
import org.hibernate.jsr303.tck.util.client.NonTckTest;
@@ -106,8 +107,8 @@
return;
}
- Class<?> superClass = theClass;
- Vector<String> names = new Vector<String>();
+ Class superClass = theClass;
+ Vector names = new Vector();
while (Test.class.isAssignableFrom(superClass)) {
for (Method method : filter(copyOf(superClass.getDeclaredMethods()),
METHOD_FILTER)) {
@@ -119,7 +120,7 @@
addTest(warning("No tests found in " + theClass.getName()));
}
- private void addTestMethod(Method m, Vector<String> names, Class<?> theClass) {
+ private void addTestMethod(Method m, Vector names, Class theClass) {
String name = m.getName();
if (names.contains(name))
return;
@@ -132,6 +133,10 @@
addTest(createTest(theClass, name));
}
+ private boolean ingoreMethod(Method m) {
+ return HAS_FAILING.apply(m);
+ }
+
private boolean isPublicTestMethod(Method m) {
return isTestMethod(m) && Modifier.isPublic(m.getModifiers());
}