The JUCE cross-platform C++ framework, with DISTRHO/KXStudio specific changes
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

732 lines
36KB

  1. /*
  2. ==============================================================================
  3. This file is part of the JUCE library.
  4. Copyright (c) 2017 - ROLI Ltd.
  5. JUCE is an open source library subject to commercial or open-source
  6. licensing.
  7. By using JUCE, you agree to the terms of both the JUCE 5 End-User License
  8. Agreement and JUCE 5 Privacy Policy (both updated and effective as of the
  9. 27th April 2017).
  10. End User License Agreement: www.juce.com/juce-5-licence
  11. Privacy Policy: www.juce.com/juce-5-privacy-policy
  12. Or: You may also use this code under the terms of the GPL v3 (see
  13. www.gnu.org/licenses).
  14. JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
  15. EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
  16. DISCLAIMED.
  17. ==============================================================================
  18. */
  19. namespace juce
  20. {
  21. //==============================================================================
  22. // This byte-code is generated from native/java/com/roli/juce/JuceWebView.java with min sdk version 16
  23. // See juce_core/native/java/README.txt on how to generate this byte-code.
  24. static const unsigned char JuceWebView16ByteCode[] =
  25. {31,139,8,8,167,106,229,91,0,3,74,117,99,101,87,101,98,86,105,101,119,49,54,46,100,101,120,0,125,150,93,108,84,69,20,199,
  26. 207,253,216,189,187,183,237,178,109,161,31,20,74,91,177,84,164,44,88,145,210,5,172,124,83,22,63,186,80,100,53,145,219,
  27. 221,177,189,101,123,239,114,239,221,182,38,68,81,155,168,4,19,99,225,141,23,19,36,38,248,136,9,15,62,16,35,209,24,141,47,
  28. 70,125,224,193,23,141,15,62,136,49,132,104,31,252,207,157,217,101,129,98,55,191,61,103,206,57,51,115,102,230,116,118,10,
  29. 108,206,220,52,176,133,222,95,60,244,253,183,71,91,94,92,240,223,75,222,186,115,227,231,111,110,221,252,44,186,176,245,
  30. 181,235,117,68,37,34,154,27,123,178,137,228,223,162,73,52,76,194,190,156,75,133,168,1,242,58,164,14,249,178,74,212,12,
  31. 121,26,82,227,49,248,202,196,136,2,200,250,40,218,160,7,172,7,253,224,105,176,7,188,2,78,131,15,193,85,240,35,88,4,45,6,
  32. 209,83,224,4,152,7,31,129,27,224,87,16,195,184,107,192,0,216,15,70,192,179,32,11,142,131,19,160,0,108,224,2,15,204,129,
  33. 55,192,57,176,0,46,130,143,193,21,112,13,124,1,190,3,63,129,223,192,31,224,95,80,23,39,234,0,235,193,78,112,16,88,96,26,
  34. 204,129,215,193,219,224,44,248,0,92,1,95,129,95,192,29,208,104,138,253,192,146,8,169,19,134,36,152,9,102,194,54,83,61,
  35. 137,125,76,128,101,32,9,26,1,223,248,102,185,215,43,64,11,104,5,107,64,68,142,119,41,34,108,149,67,106,147,250,167,176,
  36. 183,75,253,42,244,14,169,127,14,125,165,212,191,134,190,74,234,63,64,239,148,250,77,232,171,165,126,169,198,254,123,141,
  37. 254,55,244,46,153,31,31,167,91,234,60,41,190,182,222,112,141,73,234,147,235,236,13,165,104,71,72,33,17,106,134,50,38,219,
  38. 113,82,165,140,82,127,40,235,105,99,40,53,26,146,50,29,142,35,226,76,244,91,23,202,24,165,66,25,167,77,161,52,104,179,
  39. 156,119,32,148,17,218,30,202,58,218,17,74,157,118,134,123,47,230,77,86,231,167,80,139,200,189,228,53,29,160,113,89,164,
  40. 25,142,167,200,243,171,248,231,225,255,82,250,235,164,63,89,227,63,15,255,95,210,207,179,158,135,126,214,188,171,47,152,
  41. 162,207,69,147,199,107,161,222,110,138,122,40,37,185,175,7,227,149,146,124,207,95,74,42,148,107,18,117,162,99,4,62,126,
  42. 175,41,234,32,139,195,40,13,71,73,221,156,192,234,35,161,175,223,20,245,38,124,6,124,77,97,125,85,230,217,90,157,71,189,
  43. 111,30,13,243,168,225,60,226,172,20,218,99,138,58,61,242,140,70,171,149,22,164,159,219,165,82,167,146,192,8,157,202,58,
  44. 89,143,10,62,113,204,169,133,237,195,166,168,231,236,176,74,188,7,206,68,221,6,95,34,180,148,198,18,164,191,208,247,15,
  45. 223,79,61,140,31,51,197,218,106,227,7,49,154,136,94,134,232,4,246,88,15,215,123,194,20,245,150,45,61,48,182,167,146,113,
  46. 202,152,55,46,24,151,103,162,252,108,251,110,243,179,225,57,169,52,133,126,143,240,26,86,142,188,133,149,168,217,121,244,
  47. 199,128,155,53,61,58,168,213,19,111,151,114,203,232,192,5,147,6,49,87,167,218,168,116,170,61,106,148,86,106,91,176,139,
  48. 10,61,209,104,116,247,221,110,128,117,157,188,247,154,49,71,119,184,75,252,211,37,37,238,26,83,248,197,174,38,194,123,
  49. 176,246,239,204,125,237,115,247,181,121,141,24,184,9,148,154,54,183,232,85,169,146,38,245,70,89,123,252,188,181,170,183,
  50. 162,139,49,184,222,136,207,50,89,155,6,50,111,134,53,186,221,118,236,96,39,213,239,158,244,220,105,182,187,104,51,39,160,
  51. 168,148,202,8,37,71,202,121,118,140,141,143,217,108,118,227,148,53,99,145,150,201,100,168,61,99,57,5,207,181,11,169,9,
  52. 207,42,77,218,121,63,181,203,14,166,173,82,154,58,170,46,135,5,169,201,32,40,165,178,126,113,175,231,185,94,154,150,87,
  53. 157,174,159,58,204,124,223,154,96,105,234,170,90,103,217,248,73,59,168,118,56,0,123,145,121,75,68,32,165,218,148,211,180,
  54. 118,137,136,81,230,187,101,47,207,32,75,174,227,99,166,182,37,162,248,210,210,212,249,16,79,101,252,190,76,222,157,78,
  55. 121,110,209,78,77,97,75,82,53,251,178,246,222,76,122,254,47,82,198,116,60,60,134,15,80,176,138,51,246,201,148,229,56,110,
  56. 96,5,182,235,164,246,58,249,162,235,219,206,196,238,162,229,251,60,221,7,99,14,58,14,243,164,191,123,9,255,97,54,61,46,3,
  57. 24,66,86,100,248,121,166,108,23,29,75,229,32,27,120,204,154,78,83,147,48,23,45,103,34,245,220,248,20,203,7,247,218,16,
  58. 135,52,210,164,140,145,58,54,66,218,216,72,134,116,124,101,40,194,191,51,176,102,96,205,112,43,111,42,57,210,115,161,59,
  59. 151,201,229,50,84,103,229,243,56,248,125,69,107,194,167,8,227,199,76,198,171,214,140,157,119,29,50,38,197,137,147,62,233,
  60. 250,1,213,241,239,61,172,200,2,86,160,24,111,100,220,252,73,138,115,237,136,123,212,103,20,179,253,61,182,85,116,39,168,
  61. 193,246,97,240,246,51,63,40,123,140,116,199,154,102,212,224,58,187,177,111,236,152,237,20,220,89,74,160,137,85,6,53,237,
  62. 231,81,129,251,240,79,224,79,98,138,6,209,206,6,150,199,103,108,114,157,81,150,103,246,12,43,84,42,146,226,30,243,203,
  63. 197,224,176,63,65,45,254,164,91,46,22,14,58,1,67,145,149,130,81,118,170,140,217,201,20,246,140,107,21,40,30,176,57,254,
  64. 95,48,93,36,61,152,180,125,210,202,94,145,34,51,86,177,140,28,103,112,222,212,62,91,169,180,106,162,149,145,86,86,92,53,
  65. 73,87,124,173,210,199,19,230,83,85,23,209,114,159,163,178,154,74,135,7,150,20,157,21,187,49,170,172,55,18,106,107,90,157,
  66. 154,237,167,227,202,176,145,200,209,9,125,232,241,13,3,92,107,14,189,219,210,234,1,120,219,201,72,236,56,212,185,138,186,
  67. 213,161,65,35,113,118,21,110,209,161,193,71,141,196,59,57,122,76,27,234,93,27,218,182,114,231,234,29,239,78,105,180,101,
  68. 121,127,119,132,58,214,44,224,50,52,18,164,214,43,131,109,117,106,131,218,163,199,55,180,42,21,69,85,19,202,224,42,181,
  69. 45,222,134,31,122,77,37,85,105,210,222,60,163,159,55,180,183,240,59,5,116,229,186,161,40,55,241,131,166,71,84,120,99,240,
  70. 46,26,81,233,229,196,149,79,98,136,0,231,226,138,114,13,252,25,231,247,99,35,34,111,154,149,223,103,165,70,14,147,120,
  71. 215,242,59,179,242,182,229,247,101,237,251,182,242,198,141,208,221,119,110,148,238,190,117,181,164,208,249,61,175,116,
  72. 137,247,194,121,232,209,46,105,71,71,37,41,236,252,93,165,118,137,121,249,219,88,147,241,252,183,95,239,146,111,11,110,
  73. 144,125,195,55,72,82,228,202,223,225,255,1,121,75,63,47,192,11,0,0};
  74. //==============================================================================
  75. // This byte-code is generated from native/javacore/app/com/roli/juce/JuceWebView21.java with min sdk version 21
  76. // See juce_core/native/java/README.txt on how to generate this byte-code.
  77. static const unsigned char JuceWebView21ByteCode[] =
  78. {31,139,8,8,20,250,226,91,0,3,74,117,99,101,87,101,98,86,105,101,119,50,49,46,100,101,120,0,149,151,93,108,28,87,21,199,
  79. 207,124,236,206,174,119,118,179,222,117,28,219,113,236,181,235,54,78,147,116,227,36,37,78,54,169,204,58,113,237,48,81,
  80. 193,78,220,104,145,144,198,187,131,61,206,122,102,51,51,187,142,196,3,161,141,0,209,10,169,130,190,81,41,15,41,170,10,21,
  81. 66,66,34,60,240,134,74,16,47,149,120,160,128,84,1,2,169,15,17,42,15,84,81,37,36,254,247,99,54,27,199,68,176,171,223,158,
  82. 115,207,57,115,239,61,247,158,153,189,211,112,110,244,29,59,241,60,93,89,253,237,71,111,149,22,172,113,253,199,127,126,
  83. 238,195,175,252,238,212,236,173,175,189,250,151,87,111,127,146,37,106,17,209,141,213,147,5,146,159,35,176,45,145,176,15,
  84. 130,239,43,68,204,121,31,82,135,252,149,74,52,4,249,55,72,13,242,14,126,238,167,225,131,179,101,160,47,240,77,240,93,240,
  85. 6,120,27,188,3,222,3,247,192,159,192,3,144,75,17,29,3,203,96,27,188,5,126,14,126,15,52,244,119,8,44,130,38,120,29,252,4,
  86. 188,15,254,8,254,1,254,9,254,5,62,3,212,71,100,128,12,200,131,65,48,12,198,193,51,224,4,56,3,150,192,50,168,129,58,112,
  87. 65,7,220,4,175,129,55,193,29,240,46,248,5,248,13,248,3,248,24,252,27,244,103,136,70,192,211,224,28,88,2,151,65,13,52,128,
  88. 11,90,160,3,222,0,239,129,247,193,71,224,1,232,55,197,154,33,125,66,154,36,167,78,112,17,92,132,165,167,28,216,3,242,160,
  89. 159,196,218,23,193,0,216,43,247,100,31,137,61,24,6,35,96,18,36,128,42,247,48,41,251,255,56,249,80,255,36,41,98,138,50,
  90. 102,68,246,201,62,251,165,254,0,49,163,177,29,147,28,147,122,170,71,31,128,126,64,234,37,232,227,82,63,2,125,66,234,39,
  91. 123,244,57,232,37,169,179,57,196,118,171,39,230,42,244,167,100,126,172,207,41,169,55,12,177,54,135,249,26,21,232,168,92,
  92. 167,195,92,138,182,138,21,125,129,231,172,147,156,54,29,226,57,239,225,237,62,105,207,240,236,153,236,163,227,92,246,211,
  93. 9,46,147,84,149,114,158,247,43,226,76,92,119,132,203,44,157,228,50,71,207,115,105,210,231,184,204,208,41,46,21,58,195,
  94. 165,42,101,154,206,115,153,167,11,92,166,104,129,75,131,94,228,123,44,230,83,232,206,139,208,131,216,39,246,97,214,187,
  95. 104,252,218,36,57,15,225,239,235,241,223,131,255,239,210,159,149,254,66,143,255,67,248,199,179,162,205,106,226,109,196,
  96. 254,200,124,168,255,204,20,215,252,210,100,241,26,215,135,77,209,87,43,175,160,61,137,254,90,121,86,103,95,70,187,86,16,
  97. 117,169,163,7,214,255,51,166,152,239,10,54,182,53,151,34,117,38,135,236,18,220,119,212,20,123,32,124,105,248,10,124,39,
  98. 226,113,78,117,199,209,119,140,163,97,28,149,143,147,224,145,10,45,152,34,255,203,159,215,232,128,50,136,233,215,170,42,
  99. 141,41,57,244,48,166,28,228,59,149,36,54,223,52,198,212,120,251,37,83,220,63,43,115,42,177,43,102,144,246,105,248,114,
  100. 220,210,90,197,186,127,105,250,51,86,31,58,143,191,106,138,220,122,227,103,209,155,136,46,34,58,135,61,210,121,190,107,
  101. 166,184,127,86,90,143,245,29,168,100,92,55,110,25,111,26,63,236,36,7,48,163,233,79,169,123,93,243,127,188,110,111,247,58,
  102. 150,139,74,29,83,212,122,65,185,252,10,86,64,93,185,133,235,209,225,140,166,39,103,181,1,98,237,32,175,162,54,76,205,203,
  103. 179,103,139,169,181,86,138,180,136,7,217,44,198,30,83,251,149,49,117,82,77,209,136,118,22,187,161,209,241,126,99,98,250,
  104. 211,44,172,7,229,243,124,63,198,60,196,87,155,125,167,187,99,191,102,138,123,114,247,177,77,62,118,171,246,255,141,85,
  105. 196,8,19,221,177,74,82,18,221,54,133,95,84,66,142,255,151,244,126,242,59,218,163,59,218,172,174,89,5,8,89,228,125,198,
  106. 118,102,209,165,76,32,183,88,55,80,1,154,212,139,242,30,98,207,99,173,27,25,235,6,127,126,106,61,125,107,60,151,34,127,
  107. 62,235,220,190,23,95,236,245,89,215,115,163,23,200,156,223,8,252,45,103,190,233,58,94,68,73,41,149,139,84,184,216,174,59,
  108. 47,59,107,171,174,179,125,124,230,185,77,187,99,147,98,145,102,89,22,13,91,182,215,8,124,183,81,94,15,236,214,134,91,15,
  109. 203,85,55,218,178,91,21,234,239,186,60,39,42,95,9,220,10,237,127,196,180,17,69,173,242,74,216,188,16,4,126,80,161,129,
  110. 174,211,15,203,151,156,48,180,215,157,10,149,186,214,109,103,237,154,27,117,47,88,132,189,233,4,187,68,96,170,189,169,84,
  111. 232,169,93,34,150,157,208,111,7,117,103,217,185,222,118,66,4,77,61,49,40,108,249,94,136,233,12,237,18,197,214,165,66,99,
  112. 255,197,19,79,226,89,171,238,111,149,3,191,233,150,55,177,158,229,71,22,117,234,209,9,79,61,57,86,70,29,120,82,84,133,38,
  113. 173,134,221,236,184,215,202,182,231,249,145,29,185,190,87,190,224,213,155,126,232,122,235,243,77,59,12,217,164,31,143,89,
  114. 242,60,39,144,254,137,93,252,151,156,173,53,25,224,32,100,175,197,10,162,236,250,184,176,213,142,86,162,192,177,183,42,
  115. 84,16,230,166,237,173,151,95,90,219,116,234,209,163,54,196,97,26,21,82,86,73,93,189,72,218,234,69,139,116,252,88,148,96,
  116. 191,22,172,40,177,85,139,89,89,83,169,145,94,227,238,154,85,171,89,148,177,235,117,212,200,66,211,94,15,41,225,176,138,
  117. 160,44,23,241,102,145,241,85,187,227,214,125,143,146,235,78,116,37,104,146,177,33,106,134,244,13,63,140,40,195,126,207,
  118. 59,77,39,114,26,148,98,13,203,175,95,163,52,211,46,251,87,208,67,202,13,207,187,118,211,95,167,172,27,194,16,188,136,82,
  119. 105,7,14,233,158,189,229,80,214,247,230,177,156,206,203,174,215,240,183,41,135,38,146,143,122,218,95,68,13,47,224,246,10,
  120. 55,48,68,86,180,87,34,59,96,35,22,125,111,217,169,59,110,199,105,44,226,78,224,69,77,133,135,198,184,208,201,8,68,141,82,
  121. 58,112,194,118,51,186,20,174,211,96,184,225,183,155,141,37,47,114,80,159,173,72,150,49,245,9,187,229,219,13,74,71,206,13,
  122. 118,151,109,53,73,143,54,220,144,82,145,47,150,157,180,54,150,35,209,177,155,109,228,210,65,193,208,240,118,92,174,221,
  123. 132,226,62,71,98,87,79,114,177,111,159,244,177,196,216,160,221,100,7,119,56,226,172,135,164,253,241,212,247,237,240,116,
  124. 243,79,110,139,245,220,84,202,70,78,29,172,168,215,182,143,210,117,101,201,200,213,232,134,94,61,54,115,134,105,3,220,
  125. 251,1,85,212,159,126,29,254,17,50,114,231,190,48,54,74,147,106,117,206,200,125,103,148,142,107,213,185,67,70,238,91,53,
  126. 186,170,85,79,79,115,219,179,90,245,240,65,174,45,170,213,211,198,129,115,223,254,171,70,103,7,143,78,36,104,255,248,247,
  127. 104,150,93,11,227,102,175,113,15,122,38,53,167,204,13,101,213,61,234,211,122,122,102,159,18,43,170,154,87,230,70,213,161,
  128. 204,16,78,86,154,74,170,82,72,124,227,166,126,39,165,189,162,146,2,146,202,7,41,69,185,143,211,71,194,80,225,237,131,247,
  129. 245,116,74,122,99,50,202,221,52,162,192,15,250,20,229,30,184,153,81,148,187,64,28,130,6,113,213,109,118,30,201,203,255,
  130. 12,165,71,198,239,65,236,127,36,126,23,98,207,254,222,247,161,248,157,136,157,37,226,247,162,36,61,124,55,210,242,66,103,
  131. 255,105,74,73,156,103,166,160,39,75,194,206,206,122,74,94,156,137,216,121,93,45,201,113,113,136,210,100,60,59,155,233,37,
  132. 49,22,59,191,145,188,150,159,17,243,98,174,236,189,237,63,5,143,187,196,240,13,0,0};
  133. #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \
  134. METHOD (constructor, "<init>", "(Landroid/content/Context;)V") \
  135. METHOD (getSettings, "getSettings", "()Landroid/webkit/WebSettings;") \
  136. METHOD (canGoBack, "canGoBack", "()Z") \
  137. METHOD (goBack, "goBack", "()V") \
  138. METHOD (goForward, "goForward", "()V") \
  139. METHOD (loadDataWithBaseURL, "loadDataWithBaseURL", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V") \
  140. METHOD (loadUrl, "loadUrl", "(Ljava/lang/String;Ljava/util/Map;)V") \
  141. METHOD (postUrl, "postUrl", "(Ljava/lang/String;[B)V") \
  142. METHOD (reload, "reload", "()V") \
  143. METHOD (setWebChromeClient, "setWebChromeClient", "(Landroid/webkit/WebChromeClient;)V") \
  144. METHOD (setWebViewClient, "setWebViewClient", "(Landroid/webkit/WebViewClient;)V") \
  145. METHOD (stopLoading, "stopLoading", "()V")
  146. DECLARE_JNI_CLASS (AndroidWebView, "android/webkit/WebView")
  147. #undef JNI_CLASS_MEMBERS
  148. #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \
  149. METHOD (constructor, "<init>", "()V")
  150. DECLARE_JNI_CLASS (AndroidWebChromeClient, "android/webkit/WebChromeClient")
  151. #undef JNI_CLASS_MEMBERS
  152. #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \
  153. METHOD (constructor, "<init>", "()V")
  154. DECLARE_JNI_CLASS (AndroidWebViewClient, "android/webkit/WebViewClient")
  155. #undef JNI_CLASS_MEMBERS
  156. #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \
  157. STATICMETHOD (getInstance, "getInstance", "()Landroid/webkit/CookieManager;")
  158. DECLARE_JNI_CLASS (AndroidCookieManager, "android/webkit/CookieManager")
  159. #undef JNI_CLASS_MEMBERS
  160. #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \
  161. METHOD (setBuiltInZoomControls, "setBuiltInZoomControls", "(Z)V") \
  162. METHOD (setDisplayZoomControls, "setDisplayZoomControls", "(Z)V") \
  163. METHOD (setJavaScriptEnabled, "setJavaScriptEnabled", "(Z)V") \
  164. METHOD (setSupportMultipleWindows, "setSupportMultipleWindows", "(Z)V")
  165. DECLARE_JNI_CLASS (WebSettings, "android/webkit/WebSettings")
  166. #undef JNI_CLASS_MEMBERS
  167. #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \
  168. METHOD (toString, "toString", "()Ljava/lang/String;")
  169. DECLARE_JNI_CLASS (SslError, "android/net/http/SslError")
  170. #undef JNI_CLASS_MEMBERS
  171. #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \
  172. STATICMETHOD (encode, "encode", "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;")
  173. DECLARE_JNI_CLASS (URLEncoder, "java/net/URLEncoder")
  174. #undef JNI_CLASS_MEMBERS
  175. //==============================================================================
  176. class WebBrowserComponent::Pimpl : public AndroidViewComponent,
  177. public AsyncUpdater
  178. {
  179. public:
  180. Pimpl (WebBrowserComponent& o)
  181. : owner (o)
  182. {
  183. auto* env = getEnv();
  184. setView (env->NewObject (AndroidWebView, AndroidWebView.constructor, getMainActivity().get()));
  185. auto settings = LocalRef<jobject> (env->CallObjectMethod ((jobject) getView(), AndroidWebView.getSettings));
  186. env->CallVoidMethod (settings, WebSettings.setJavaScriptEnabled, true);
  187. env->CallVoidMethod (settings, WebSettings.setBuiltInZoomControls, true);
  188. env->CallVoidMethod (settings, WebSettings.setDisplayZoomControls, false);
  189. env->CallVoidMethod (settings, WebSettings.setSupportMultipleWindows, true);
  190. juceWebChromeClient = GlobalRef (LocalRef<jobject> (env->NewObject (JuceWebChromeClient, JuceWebChromeClient.constructor,
  191. reinterpret_cast<jlong> (this))));
  192. env->CallVoidMethod ((jobject) getView(), AndroidWebView.setWebChromeClient, juceWebChromeClient.get());
  193. auto sdkVersion = getAndroidSDKVersion();
  194. if (sdkVersion >= 21)
  195. juceWebViewClient = GlobalRef (LocalRef<jobject> (env->NewObject (JuceWebViewClient21, JuceWebViewClient21.constructor,
  196. reinterpret_cast<jlong> (this))));
  197. else
  198. juceWebViewClient = GlobalRef (LocalRef<jobject> (env->NewObject (JuceWebViewClient16, JuceWebViewClient16.constructor,
  199. reinterpret_cast<jlong> (this))));
  200. env->CallVoidMethod ((jobject) getView(), AndroidWebView.setWebViewClient, juceWebViewClient.get());
  201. }
  202. ~Pimpl()
  203. {
  204. auto* env = getEnv();
  205. env->CallVoidMethod ((jobject) getView(), AndroidWebView.stopLoading);
  206. auto defaultChromeClient = LocalRef<jobject> (env->NewObject (AndroidWebChromeClient, AndroidWebChromeClient.constructor));
  207. auto defaultViewClient = LocalRef<jobject> (env->NewObject (AndroidWebViewClient, AndroidWebViewClient .constructor));
  208. env->CallVoidMethod ((jobject) getView(), AndroidWebView.setWebChromeClient, defaultChromeClient.get());
  209. env->CallVoidMethod ((jobject) getView(), AndroidWebView.setWebViewClient, defaultViewClient .get());
  210. masterReference.clear();
  211. // if other Java thread is waiting for us to respond to page load request
  212. // wake it up immediately (false answer will be sent), so that it releases
  213. // the lock we need when calling hostDeleted.
  214. responseReadyEvent.signal();
  215. env->CallVoidMethod (juceWebViewClient, getAndroidSDKVersion() >= 21 ? JuceWebViewClient21.hostDeleted
  216. : JuceWebViewClient16.hostDeleted);
  217. }
  218. void goToURL (const String& url,
  219. const StringArray* headers,
  220. const MemoryBlock* postData)
  221. {
  222. auto* env = getEnv();
  223. if (headers == nullptr && postData == nullptr)
  224. {
  225. env->CallVoidMethod ((jobject) getView(), AndroidWebView.loadUrl, javaString (url).get(), 0);
  226. }
  227. else if (headers != nullptr && postData == nullptr)
  228. {
  229. auto headersMap = LocalRef<jobject> (env->NewObject (JavaHashMap,
  230. JavaHashMap.constructorWithCapacity,
  231. headers->size()));
  232. for (const auto& header : *headers)
  233. {
  234. auto name = header.upToFirstOccurrenceOf (":", false, false).trim();
  235. auto value = header.fromFirstOccurrenceOf (":", false, false).trim();
  236. env->CallObjectMethod (headersMap, JavaMap.put,
  237. javaString (name).get(),
  238. javaString (value).get());
  239. }
  240. env->CallVoidMethod ((jobject) getView(), AndroidWebView.loadUrl,
  241. javaString (url).get(), headersMap.get());
  242. }
  243. else if (headers == nullptr && postData != nullptr)
  244. {
  245. auto dataStringJuce = postData->toString();
  246. auto dataStringJava = javaString (dataStringJuce);
  247. auto encodingString = LocalRef<jobject> (env->CallStaticObjectMethod (URLEncoder, URLEncoder.encode,
  248. dataStringJava.get(), javaString ("utf-8").get()));
  249. auto bytes = LocalRef<jbyteArray> ((jbyteArray) env->CallObjectMethod (encodingString, JavaString.getBytes));
  250. env->CallVoidMethod ((jobject) getView(), AndroidWebView.postUrl,
  251. javaString (url).get(), bytes.get());
  252. }
  253. else if (headers != nullptr && postData != nullptr)
  254. {
  255. // There is no support for both extra headers and post data in Android WebView, so
  256. // we need to open URL manually.
  257. URL urlToUse = URL (url).withPOSTData (*postData);
  258. connectionThread.reset (new ConnectionThread (*this, urlToUse, *headers));
  259. }
  260. }
  261. void stop()
  262. {
  263. connectionThread = nullptr;
  264. getEnv()->CallVoidMethod ((jobject) getView(), AndroidWebView.stopLoading);
  265. }
  266. void goBack()
  267. {
  268. connectionThread = nullptr;
  269. auto* env = getEnv();
  270. auto view = (jobject) getView();
  271. if (env->CallBooleanMethod (view, AndroidWebView.canGoBack))
  272. env->CallVoidMethod (view, AndroidWebView.goBack);
  273. else
  274. owner.reloadLastURL();
  275. }
  276. void goForward()
  277. {
  278. connectionThread = nullptr;
  279. getEnv()->CallVoidMethod ((jobject) getView(), AndroidWebView.goForward);
  280. }
  281. void refresh()
  282. {
  283. connectionThread = nullptr;
  284. getEnv()->CallVoidMethod ((jobject) getView(), AndroidWebView.reload);
  285. }
  286. void handleAsyncUpdate()
  287. {
  288. jassert (connectionThread != nullptr);
  289. if (connectionThread == nullptr)
  290. return;
  291. auto& result = connectionThread->getResult();
  292. if (result.statusCode >= 200 && result.statusCode < 300)
  293. {
  294. auto url = javaString (result.url);
  295. auto data = javaString (result.data);
  296. auto mimeType = javaString ("text/html");
  297. auto encoding = javaString ("utf-8");
  298. getEnv()->CallVoidMethod ((jobject) getView(), AndroidWebView.loadDataWithBaseURL,
  299. url.get(), data.get(), mimeType.get(),
  300. encoding.get(), 0);
  301. }
  302. else
  303. {
  304. owner.pageLoadHadNetworkError (result.description);
  305. }
  306. }
  307. bool handlePageAboutToLoad (const String& url)
  308. {
  309. if (MessageManager::getInstance()->isThisTheMessageThread())
  310. return owner.pageAboutToLoad (url);
  311. WeakReference<Pimpl> weakRef (this);
  312. if (weakRef == nullptr)
  313. return false;
  314. responseReadyEvent.reset();
  315. bool shouldLoad = false;
  316. MessageManager::callAsync ([weakRef, url, &shouldLoad]
  317. {
  318. if (weakRef == nullptr)
  319. return;
  320. shouldLoad = weakRef->owner.pageAboutToLoad (url);
  321. weakRef->responseReadyEvent.signal();
  322. });
  323. responseReadyEvent.wait (-1);
  324. return shouldLoad;
  325. }
  326. WebBrowserComponent& owner;
  327. private:
  328. class ConnectionThread : private Thread
  329. {
  330. public:
  331. struct Result
  332. {
  333. String url;
  334. int statusCode = 0;
  335. String description;
  336. String data;
  337. };
  338. ConnectionThread (Pimpl& ownerToUse,
  339. URL& url,
  340. const StringArray& headers)
  341. : Thread ("WebBrowserComponent::Pimpl::ConnectionThread"),
  342. owner (ownerToUse),
  343. webInputStream (new WebInputStream (url, true))
  344. {
  345. webInputStream->withExtraHeaders (headers.joinIntoString ("\n"));
  346. webInputStream->withConnectionTimeout (10000);
  347. result.url = url.toString (true);
  348. startThread();
  349. }
  350. ~ConnectionThread() override
  351. {
  352. webInputStream->cancel();
  353. signalThreadShouldExit();
  354. waitForThreadToExit (10000);
  355. webInputStream = nullptr;
  356. }
  357. void run() override
  358. {
  359. if (! webInputStream->connect (nullptr))
  360. {
  361. result.description = "Could not establish connection";
  362. owner.triggerAsyncUpdate();
  363. return;
  364. }
  365. result.statusCode = webInputStream->getStatusCode();
  366. result.description = "Status code: " + String (result.statusCode);
  367. readFromInputStream();
  368. owner.triggerAsyncUpdate();
  369. }
  370. const Result& getResult() { return result; }
  371. private:
  372. void readFromInputStream()
  373. {
  374. MemoryOutputStream ostream;
  375. for (;;)
  376. {
  377. if (threadShouldExit())
  378. return;
  379. char buffer [8192];
  380. auto num = webInputStream->read (buffer, sizeof (buffer));
  381. if (num <= 0)
  382. break;
  383. ostream.write (buffer, (size_t) num);
  384. }
  385. result.data = ostream.toUTF8();
  386. }
  387. Pimpl& owner;
  388. std::unique_ptr<WebInputStream> webInputStream;
  389. Result result;
  390. };
  391. //==============================================================================
  392. #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \
  393. METHOD (constructor, "<init>", "(J)V") \
  394. METHOD (hostDeleted, "hostDeleted", "()V") \
  395. CALLBACK (webViewReceivedHttpError, "webViewReceivedHttpError", "(JLandroid/webkit/WebView;Landroid/webkit/WebResourceRequest;Landroid/webkit/WebResourceResponse;)V") \
  396. CALLBACK (webViewPageLoadStarted, "webViewPageLoadStarted", "(JLandroid/webkit/WebView;Ljava/lang/String;)Z") \
  397. CALLBACK (webViewPageLoadFinished, "webViewPageLoadFinished", "(JLandroid/webkit/WebView;Ljava/lang/String;)V") \
  398. CALLBACK (webViewReceivedSslError, "webViewReceivedSslError", "(JLandroid/webkit/WebView;Landroid/webkit/SslErrorHandler;Landroid/net/http/SslError;)V") \
  399. DECLARE_JNI_CLASS_WITH_BYTECODE (JuceWebViewClient21, "com/roli/juce/JuceWebView21$Client", 21, JuceWebView21ByteCode, sizeof (JuceWebView21ByteCode))
  400. #undef JNI_CLASS_MEMBERS
  401. #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \
  402. METHOD (constructor, "<init>", "(J)V") \
  403. METHOD (hostDeleted, "hostDeleted", "()V") \
  404. CALLBACK (webViewPageLoadStarted, "webViewPageLoadStarted", "(JLandroid/webkit/WebView;Ljava/lang/String;)Z") \
  405. CALLBACK (webViewPageLoadFinished, "webViewPageLoadFinished", "(JLandroid/webkit/WebView;Ljava/lang/String;)V") \
  406. CALLBACK (webViewReceivedSslError, "webViewReceivedSslError", "(JLandroid/webkit/WebView;Landroid/webkit/SslErrorHandler;Landroid/net/http/SslError;)V") \
  407. DECLARE_JNI_CLASS_WITH_BYTECODE (JuceWebViewClient16, "com/roli/juce/JuceWebView$Client", 16, JuceWebView16ByteCode, sizeof (JuceWebView16ByteCode))
  408. #undef JNI_CLASS_MEMBERS
  409. static jboolean JNICALL webViewPageLoadStarted (JNIEnv*, jobject /*activity*/, jlong host, jobject /*webView*/, jstring url)
  410. {
  411. if (auto* myself = reinterpret_cast<WebBrowserComponent::Pimpl*> (host))
  412. return myself->handlePageAboutToLoad (juceString (url));
  413. return 0;
  414. }
  415. static void JNICALL webViewPageLoadFinished (JNIEnv*, jobject /*activity*/, jlong host, jobject /*webView*/, jstring url)
  416. {
  417. if (auto* myself = reinterpret_cast<WebBrowserComponent::Pimpl*> (host))
  418. myself->owner.pageFinishedLoading (juceString (url));
  419. }
  420. static void JNICALL webViewReceivedHttpError (JNIEnv*, jobject /*activity*/, jlong host, jobject /*webView*/, jobject /*request*/, jobject errorResponse)
  421. {
  422. if (auto* myself = reinterpret_cast<WebBrowserComponent::Pimpl*> (host))
  423. myself->webReceivedHttpError (errorResponse);
  424. }
  425. static void JNICALL webViewReceivedSslError (JNIEnv*, jobject /*activity*/, jlong host, jobject /*webView*/, jobject /*sslErrorHandler*/, jobject sslError)
  426. {
  427. auto* env = getEnv();
  428. if (auto* myself = reinterpret_cast<WebBrowserComponent::Pimpl*> (host))
  429. {
  430. auto errorString = LocalRef<jstring> ((jstring) env->CallObjectMethod (sslError, SslError.toString));
  431. myself->owner.pageLoadHadNetworkError (juceString (errorString));
  432. }
  433. }
  434. //==============================================================================
  435. #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \
  436. METHOD (constructor, "<init>", "(J)V") \
  437. CALLBACK (webViewCloseWindowRequest, "webViewCloseWindowRequest", "(JLandroid/webkit/WebView;)V") \
  438. CALLBACK (webViewCreateWindowRequest, "webViewCreateWindowRequest", "(JLandroid/webkit/WebView;)V") \
  439. DECLARE_JNI_CLASS (JuceWebChromeClient, "com/roli/juce/JuceWebView$ChromeClient")
  440. #undef JNI_CLASS_MEMBERS
  441. static void JNICALL webViewCloseWindowRequest (JNIEnv*, jobject /*activity*/, jlong host, jobject /*webView*/)
  442. {
  443. if (auto* myself = reinterpret_cast<WebBrowserComponent::Pimpl*> (host))
  444. myself->owner.windowCloseRequest();
  445. }
  446. static void JNICALL webViewCreateWindowRequest (JNIEnv*, jobject /*activity*/, jlong host, jobject /*webView*/)
  447. {
  448. if (auto* myself = reinterpret_cast<WebBrowserComponent::Pimpl*> (host))
  449. myself->owner.newWindowAttemptingToLoad ({});
  450. }
  451. //==============================================================================
  452. void webReceivedHttpError (jobject errorResponse)
  453. {
  454. auto* env = getEnv();
  455. LocalRef<jclass> responseClass (env->FindClass ("android/webkit/WebResourceResponse"));
  456. if (responseClass != nullptr)
  457. {
  458. jmethodID method = env->GetMethodID (responseClass, "getReasonPhrase", "()Ljava/lang/String;");
  459. if (method != nullptr)
  460. {
  461. auto errorString = LocalRef<jstring> ((jstring) env->CallObjectMethod (errorResponse, method));
  462. owner.pageLoadHadNetworkError (juceString (errorString));
  463. return;
  464. }
  465. }
  466. // Should never get here!
  467. jassertfalse;
  468. owner.pageLoadHadNetworkError ({});
  469. }
  470. //==============================================================================
  471. GlobalRef juceWebChromeClient;
  472. GlobalRef juceWebViewClient;
  473. std::unique_ptr<ConnectionThread> connectionThread;
  474. WaitableEvent responseReadyEvent;
  475. WeakReference<Pimpl>::Master masterReference;
  476. friend class WeakReference<Pimpl>;
  477. };
  478. //==============================================================================
  479. WebBrowserComponent::WebBrowserComponent (const bool unloadWhenHidden)
  480. : blankPageShown (false),
  481. unloadPageWhenBrowserIsHidden (unloadWhenHidden)
  482. {
  483. setOpaque (true);
  484. browser.reset (new Pimpl (*this));
  485. addAndMakeVisible (browser.get());
  486. }
  487. WebBrowserComponent::~WebBrowserComponent()
  488. {
  489. }
  490. //==============================================================================
  491. void WebBrowserComponent::goToURL (const String& url,
  492. const StringArray* headers,
  493. const MemoryBlock* postData)
  494. {
  495. lastURL = url;
  496. if (headers != nullptr)
  497. lastHeaders = *headers;
  498. else
  499. lastHeaders.clear();
  500. if (postData != nullptr)
  501. lastPostData = *postData;
  502. else
  503. lastPostData.reset();
  504. blankPageShown = false;
  505. browser->goToURL (url, headers, postData);
  506. }
  507. void WebBrowserComponent::stop()
  508. {
  509. browser->stop();
  510. }
  511. void WebBrowserComponent::goBack()
  512. {
  513. browser->goBack();
  514. lastURL.clear();
  515. blankPageShown = false;
  516. }
  517. void WebBrowserComponent::goForward()
  518. {
  519. lastURL.clear();
  520. browser->goForward();
  521. }
  522. void WebBrowserComponent::refresh()
  523. {
  524. browser->refresh();
  525. }
  526. //==============================================================================
  527. void WebBrowserComponent::paint (Graphics& g)
  528. {
  529. g.fillAll (Colours::white);
  530. }
  531. void WebBrowserComponent::checkWindowAssociation()
  532. {
  533. if (isShowing())
  534. {
  535. if (blankPageShown)
  536. goBack();
  537. }
  538. else
  539. {
  540. if (unloadPageWhenBrowserIsHidden && ! blankPageShown)
  541. {
  542. // when the component becomes invisible, some stuff like flash
  543. // carries on playing audio, so we need to force it onto a blank
  544. // page to avoid this, (and send it back when it's made visible again).
  545. blankPageShown = true;
  546. browser->goToURL ("about:blank", nullptr, nullptr);
  547. }
  548. }
  549. }
  550. void WebBrowserComponent::reloadLastURL()
  551. {
  552. if (lastURL.isNotEmpty())
  553. {
  554. goToURL (lastURL, &lastHeaders, lastPostData.getSize() == 0 ? nullptr : &lastPostData);
  555. lastURL.clear();
  556. }
  557. }
  558. void WebBrowserComponent::parentHierarchyChanged()
  559. {
  560. checkWindowAssociation();
  561. }
  562. void WebBrowserComponent::resized()
  563. {
  564. browser->setSize (getWidth(), getHeight());
  565. }
  566. void WebBrowserComponent::visibilityChanged()
  567. {
  568. checkWindowAssociation();
  569. }
  570. void WebBrowserComponent::focusGained (FocusChangeType)
  571. {
  572. }
  573. void WebBrowserComponent::clearCookies()
  574. {
  575. auto* env = getEnv();
  576. auto cookieManager = LocalRef<jobject> (env->CallStaticObjectMethod (AndroidCookieManager,
  577. AndroidCookieManager.getInstance));
  578. jmethodID clearCookiesMethod = nullptr;
  579. if (getAndroidSDKVersion() >= 21)
  580. {
  581. clearCookiesMethod = env->GetMethodID (AndroidCookieManager, "removeAllCookies", "(Landroid/webkit/ValueCallback;)V");
  582. env->CallVoidMethod (cookieManager, clearCookiesMethod, 0);
  583. }
  584. else
  585. {
  586. clearCookiesMethod = env->GetMethodID (AndroidCookieManager, "removeAllCookie", "()V");
  587. env->CallVoidMethod (cookieManager, clearCookiesMethod);
  588. }
  589. }
  590. WebBrowserComponent::Pimpl::JuceWebViewClient16_Class WebBrowserComponent::Pimpl::JuceWebViewClient16;
  591. WebBrowserComponent::Pimpl::JuceWebViewClient21_Class WebBrowserComponent::Pimpl::JuceWebViewClient21;
  592. WebBrowserComponent::Pimpl::JuceWebChromeClient_Class WebBrowserComponent::Pimpl::JuceWebChromeClient;
  593. } // namespace juce