diff --git a/mozilla/js/rhino/src/org/mozilla/javascript/JavaMembers.java b/mozilla/js/rhino/src/org/mozilla/javascript/JavaMembers.java index 5a0ed07bb9e..b013a6ea905 100644 --- a/mozilla/js/rhino/src/org/mozilla/javascript/JavaMembers.java +++ b/mozilla/js/rhino/src/org/mozilla/javascript/JavaMembers.java @@ -598,9 +598,16 @@ class JavaMembers // If we already have a member by this name, don't do this // property. - if (ht.containsKey(beanPropertyName) - || toAdd.containsKey(beanPropertyName)) { + if (toAdd.containsKey(beanPropertyName)) continue; + Object v = ht.get(beanPropertyName); + if (v != null) { + // A private field shouldn't mask a public getter/setter + if (!includePrivate || + !Modifier.isPrivate(((Member)v).getModifiers())) + { + continue; + } } // Find the getter method, or if there is none, the is- diff --git a/mozilla/js/rhino/testsrc/org/mozilla/javascript/tests/JavaAcessibilityTest.java b/mozilla/js/rhino/testsrc/org/mozilla/javascript/tests/JavaAcessibilityTest.java index 0b83e8828d2..e9b4a8d4371 100644 --- a/mozilla/js/rhino/testsrc/org/mozilla/javascript/tests/JavaAcessibilityTest.java +++ b/mozilla/js/rhino/testsrc/org/mozilla/javascript/tests/JavaAcessibilityTest.java @@ -88,7 +88,17 @@ public class JavaAcessibilityTest extends TestCase { runScript(importClass + "new PrivateAccessClass(5)"); runScript(importClass + "new PrivateAccessClass(5, \"foo\")"); } - + + public void testAccessingJavaBeanProperty() { + Object result = runScript(importClass + + "var x = new PrivateAccessClass(); x.javaBeanProperty + ' ' + x.getterCalled;"); + assertEquals("6 true", result); + + result = runScript(importClass + + "var x = new PrivateAccessClass(); x.javaBeanProperty = 4; x.javaBeanProperty + ' ' + x.setterCalled;"); + assertEquals("4 true", result); + } + private Object runScript(final String scriptSourceText) { return this.contextFactory.call(new ContextAction() { public Object run(Context context) { diff --git a/mozilla/js/rhino/testsrc/org/mozilla/javascript/tests/PrivateAccessClass.java b/mozilla/js/rhino/testsrc/org/mozilla/javascript/tests/PrivateAccessClass.java index 3f075ff90ed..816bd425f9a 100644 --- a/mozilla/js/rhino/testsrc/org/mozilla/javascript/tests/PrivateAccessClass.java +++ b/mozilla/js/rhino/testsrc/org/mozilla/javascript/tests/PrivateAccessClass.java @@ -74,8 +74,20 @@ public class PrivateAccessClass int packagePrivateMethod() { return 3; } private int privateMethod() { return 4; } protected int protectedMethod() { return 5; } - - /* + + private int javaBeanProperty = 6; + public boolean getterCalled = false; + public boolean setterCalled = false; + public int getJavaBeanProperty() { + getterCalled = true; + return javaBeanProperty; + } + public void setJavaBeanProperty(int i) { + setterCalled = true; + javaBeanProperty = i; + } + + /* * Suppress warnings about unused private members. */ public int referenceToPrivateMembers() { @@ -85,6 +97,6 @@ public class PrivateAccessClass System.out.println(privateString); pac2.privateMethod(); // to silence warning return pnc.privateInt + staticPrivateInt + staticPrivateMethod() + - pac.privateMethod(); + pac.privateMethod() + javaBeanProperty; } }