Closed Bug 1322579 Opened 8 years ago Closed 6 years ago

[geckoview] Add loadData and loadDataWithBaseUri

Categories

(GeckoView :: General, defect, P1)

defect

Tracking

(firefox60 wontfix, firefox61 fixed)

RESOLVED FIXED
mozilla61
Tracking Status
firefox60 --- wontfix
firefox61 --- fixed

People

(Reporter: snorp, Assigned: snorp)

References

(Blocks 1 open bug)

Details

(Whiteboard: [geckoview:klar])

Attachments

(2 files)

Android WebView has this, and it's pretty useful for loading a generated page.
Component: Embedding: APIs → GeckoView
Product: Core → Firefox for Android
Version: unspecified → Trunk
In Focus, focus:about and focus:rights (and in the future focus:debug) are generated with WebView with loadDataWithBaseUri. I have a GeckoView workaround working, but this method would be nice to have. 

Github issue: https://github.com/mozilla-mobile/focus-android/issues/2109
This is a nice-to-have for Klar+GeckoView.
Priority: -- → P3
Whiteboard: [geckoview:klar]
Assignee: nobody → snorp
Klar wants to use this for error pages, so moving up to a P1
Priority: P3 → P1
See Also: → 1437547
Comment on attachment 8960233 [details]
Bug 1322579 - Add GeckoSession.loadData() and loadString()

https://reviewboard.mozilla.org/r/228994/#review234730
Attachment #8960233 - Flags: review?(rbarker) → review+
Comment on attachment 8960232 [details]
Bug 1322579 - Add flags to GeckoSession.loadUri()

https://reviewboard.mozilla.org/r/228992/#review234872

r=me with issued addressed.

::: mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoSession.java:799
(Diff revision 1)
> +
> +    // These flags follow similarly named ones in Gecko's nsIWebNavigation.idl
> +    // https://searchfox.org/mozilla-central/source/docshell/base/nsIWebNavigation.idl
> +    //
> +    // We do not use the same values directly in order to insulate ourselves from
> +    // changes in Gecko. Instead, the flags are converted in GeckoViewNavigation.jsm.

This is a good comment for devs, but shouldn't be in public docs, can we exclude stuff?

::: mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoSession.java:862
(Diff revision 1)
> +        }
>          mEventDispatcher.dispatch("GeckoView:LoadUri", msg);
>      }
>  
>      /**
> -    * Load the given URI.
> +     * Load the given Uri.

The Uri is the type name, it's still a URI.

::: mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoSession.java:872
(Diff revision 1)
> +    }
> +
> +    /**
> +     * Load the given Uri with the specified referrer and load type.
> +     * @param uri the Uri to load
> +     * @param flags the load flags to use, an ORed value of {@link #LOAD_FLAGS_NONE LOAD_FLAGS_*}

OR-ed maybe, this looks weird.

::: mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoSession.java:885
(Diff revision 1)
> +     * @param uri the Uri to load
> +     * @param referrer the Uri to use as the referrer
> +     * @param flags the load flags to use, an ORed value of {@link #LOAD_FLAGS_NONE LOAD_FLAGS_*}
> -    */
> +     */
> -    public void loadUri(Uri uri) {
> -        loadUri(uri.toString());
> +    public void loadUri(@NonNull Uri uri, @Nullable Uri referrer, @LoadFlags int flags) {
> +        loadUri(uri.toString(), referrer.toString(), flags);

With referrer == null, we'll pass "null" as a non-null referrer.

::: mobile/android/modules/geckoview/GeckoViewNavigation.jsm:59
(Diff revision 1)
>          break;
>        case "GeckoView:GoForward":
>          this.browser.goForward();
>          break;
>        case "GeckoView:LoadUri":
> -        this.browser.loadURI(aData.uri, null, null, null);
> +        const { uri, referrer, flags } = aData;

Null-referrers are not added to the message.
Attachment #8960232 - Flags: review?(esawin) → review+
Comment on attachment 8960233 [details]
Bug 1322579 - Add GeckoSession.loadData() and loadString()

https://reviewboard.mozilla.org/r/228994/#review234884

::: mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoSession.java:907
(Diff revision 1)
> +     *
> +     * @param data a String representing the data
> +     * @param mimeType the mime type of the data, e.g. "text/plain". Maybe be null, in
> +     *                 which case the type is guessed.
> +     */
> +    public void loadString(String data, String mimeType) {

@NonNull, final?

::: mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoSession.java:950
(Diff revision 1)
> +     * @param mimeType optional mime type, e.g. text/plain
> +     * @return a URI String
> +     */
> +    public static String createDataUri(@NonNull byte[] bytes, @Nullable String mimeType) {
> +        return String.format("data:%s,%s", mimeType != null ? mimeType : "",
> +                             Base64.encodeToString(bytes, Base64.URL_SAFE | Base64.NO_WRAP));

I assume we don't need to call into encodeURIComponent with this?

::: mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoSession.java:962
(Diff revision 1)
> +     * @return a URI String
> +     */
> +    public static String createDataUri(@NonNull String data, @Nullable String mimeType) {
> +        return String.format("data:%s,%s", mimeType != null ? mimeType : "",
> +                Base64.encodeToString(data.getBytes(Charset.forName("utf-8")),
> +                                 Base64.URL_SAFE | Base64.NO_WRAP));

Can't we just call into the byte[] version?
Attachment #8960233 - Flags: review?(esawin) → review+
Comment on attachment 8960232 [details]
Bug 1322579 - Add flags to GeckoSession.loadUri()

https://reviewboard.mozilla.org/r/228992/#review234932

::: mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoSession.java:791
(Diff revision 1)
>          // May be called on any thread.
>          return mTextInput;
>      }
>  
> +    @IntDef(flag=true,
> +            value = { LOAD_FLAGS_NONE, LOAD_FLAGS_BYPASS_CACHE, LOAD_FLAGS_BYPASS_PROXY,

Is it necessary/correct to include LOAD_FLAGS_NONE (which is, properly speaking, a combination of flags) in the set of values here? I can't really tell for sure from IntDef documentation, but I would expect 0 to always be a valid value to pass when flag=true. If that's the case I think it's better to remove it from the set of values (but leave the constant defined below).
Attachment #8960232 - Flags: review?(droeh) → review+
Comment on attachment 8960232 [details]
Bug 1322579 - Add flags to GeckoSession.loadUri()

https://reviewboard.mozilla.org/r/228992/#review234872

> This is a good comment for devs, but shouldn't be in public docs, can we exclude stuff?

It's not formatted as a javadoc, so it doesn't show up in the docs.

> Null-referrers are not added to the message.

That's fine, it will be undefined in that case, and it gets normalized to null in the loadURIWithFlags() call.
Comment on attachment 8960233 [details]
Bug 1322579 - Add GeckoSession.loadData() and loadString()

https://reviewboard.mozilla.org/r/228994/#review234938

::: mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoSession.java:950
(Diff revision 1)
> +     * @param mimeType optional mime type, e.g. text/plain
> +     * @return a URI String
> +     */
> +    public static String createDataUri(@NonNull byte[] bytes, @Nullable String mimeType) {
> +        return String.format("data:%s,%s", mimeType != null ? mimeType : "",
> +                             Base64.encodeToString(bytes, Base64.URL_SAFE | Base64.NO_WRAP));

Right, the URL_SAFE variation takes care of that for base64. I guess the mime type might not be URL encoded, but nothing we do there is going to really help, since AFAIK all valid mime types are URL safe.

::: mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoSession.java:962
(Diff revision 1)
> +     * @return a URI String
> +     */
> +    public static String createDataUri(@NonNull String data, @Nullable String mimeType) {
> +        return String.format("data:%s,%s", mimeType != null ? mimeType : "",
> +                Base64.encodeToString(data.getBytes(Charset.forName("utf-8")),
> +                                 Base64.URL_SAFE | Base64.NO_WRAP));

Yup, for sure. Whoops.
Pushed by jwillcox@mozilla.com:
https://hg.mozilla.org/integration/mozilla-inbound/rev/504dcbc210b9
Add flags to GeckoSession.loadUri() r=esawin,droeh
https://hg.mozilla.org/integration/mozilla-inbound/rev/b8761cfdec93
Add GeckoSession.loadData() and loadString() r=esawin,rbarker
https://hg.mozilla.org/mozilla-central/rev/504dcbc210b9
https://hg.mozilla.org/mozilla-central/rev/b8761cfdec93
Status: NEW → RESOLVED
Closed: 6 years ago
Resolution: --- → FIXED
Target Milestone: --- → Firefox 61
(In reply to Dylan Roeh (:droeh) from comment #9)
> Comment on attachment 8960232 [details]
> Bug 1322579 - Add flags to GeckoSession.loadUri()
> 
> https://reviewboard.mozilla.org/r/228992/#review234932
> 
> :::
> mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoSession.
> java:791
> (Diff revision 1)
> >          // May be called on any thread.
> >          return mTextInput;
> >      }
> >  
> > +    @IntDef(flag=true,
> > +            value = { LOAD_FLAGS_NONE, LOAD_FLAGS_BYPASS_CACHE, LOAD_FLAGS_BYPASS_PROXY,
> 
> Is it necessary/correct to include LOAD_FLAGS_NONE (which is, properly
> speaking, a combination of flags) in the set of values here? I can't really
> tell for sure from IntDef documentation, but I would expect 0 to always be a
> valid value to pass when flag=true. If that's the case I think it's better
> to remove it from the set of values (but leave the constant defined below).

Whoops, I missed this comment. AFAICT, people typically put all of the flags into the @IntDef, but I see your point.
Product: Firefox for Android → GeckoView
Target Milestone: Firefox 61 → mozilla61
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Created:
Updated:
Size: