split patch + fix

This commit is contained in:
Carmelo Messina 2022-04-13 13:22:18 +02:00
parent a9fff26487
commit 8b9bc0f071
No known key found for this signature in database
GPG key ID: 968894BE688289FD
3 changed files with 123 additions and 147 deletions

View file

@ -5,10 +5,9 @@ Subject: Add bookmark import/export actions
Add bookmark import/export actions in bookmarks activity and page
Reduce permissions needed for bookmarks import/export
Completely remove contacts picker permission from the file dialog
Need: Adds-support-for-writing-URIs.patch
---
base/android/content_uri_utils.cc | 10 +
base/android/content_uri_utils.h | 4 +
.../org/chromium/base/ContentUriUtils.java | 33 ++
chrome/android/java/AndroidManifest.xml | 1 -
.../res/menu/bookmark_action_bar_menu.xml | 14 +
.../browser/TabbedModeTabDelegateFactory.java | 5 +-
@ -44,92 +43,8 @@ Completely remove contacts picker permission from the file dialog
ui/shell_dialogs/select_file_dialog.h | 2 +
.../select_file_dialog_android.cc | 6 +
ui/shell_dialogs/select_file_dialog_android.h | 2 +
38 files changed, 893 insertions(+), 29 deletions(-)
35 files changed, 846 insertions(+), 29 deletions(-)
diff --git a/base/android/content_uri_utils.cc b/base/android/content_uri_utils.cc
--- a/base/android/content_uri_utils.cc
+++ b/base/android/content_uri_utils.cc
@@ -30,6 +30,16 @@ File OpenContentUriForRead(const FilePath& content_uri) {
return File(fd);
}
+File OpenContentUriForWrite(const FilePath& content_uri) {
+ JNIEnv* env = base::android::AttachCurrentThread();
+ ScopedJavaLocalRef<jstring> j_uri =
+ ConvertUTF8ToJavaString(env, content_uri.value());
+ jint fd = Java_ContentUriUtils_openContentUriForWrite(env, j_uri);
+ if (fd < 0)
+ return File();
+ return File(fd);
+}
+
std::string GetContentUriMimeType(const FilePath& content_uri) {
JNIEnv* env = base::android::AttachCurrentThread();
ScopedJavaLocalRef<jstring> j_uri =
diff --git a/base/android/content_uri_utils.h b/base/android/content_uri_utils.h
--- a/base/android/content_uri_utils.h
+++ b/base/android/content_uri_utils.h
@@ -18,6 +18,10 @@ namespace base {
// Returns -1 if the URI is invalid.
BASE_EXPORT File OpenContentUriForRead(const FilePath& content_uri);
+// Opens a content URI for write and returns the file descriptor to the caller.
+// Returns -1 if the URI is invalid.
+BASE_EXPORT File OpenContentUriForWrite(const FilePath& content_uri);
+
// Check whether a content URI exists.
BASE_EXPORT bool ContentUriExists(const FilePath& content_uri);
diff --git a/base/android/java/src/org/chromium/base/ContentUriUtils.java b/base/android/java/src/org/chromium/base/ContentUriUtils.java
--- a/base/android/java/src/org/chromium/base/ContentUriUtils.java
+++ b/base/android/java/src/org/chromium/base/ContentUriUtils.java
@@ -23,6 +23,9 @@ import org.chromium.base.annotations.CalledByNative;
import java.io.File;
import java.io.IOException;
+import android.system.Os;
+import android.content.ContentProviderClient;
+
/**
* This class provides methods to access content URI schemes.
*/
@@ -89,6 +92,36 @@ public abstract class ContentUriUtils {
return -1;
}
+ @CalledByNative
+ public static int openContentUriForWrite(String uriString) {
+ try {
+ Uri uri = Uri.parse(uriString);
+ ContentResolver resolver = ContextUtils.getApplicationContext().getContentResolver();
+ ContentProviderClient client = resolver.acquireContentProviderClient(
+ uri.getAuthority());
+ ParcelFileDescriptor pfd = client.openFile(uri, "rw");
+ int fd = pfd.detachFd();
+ client.close();
+ return fd;
+ } catch (Exception e) {
+ Log.e(TAG, "Cannot open intermediate URI", e);
+ }
+ return -1;
+ }
+
+ public static String getFilePathFromContentUri(Uri uri) {
+ String path = null;
+ try {
+ ContentResolver resolver = ContextUtils.getApplicationContext().getContentResolver();
+ ParcelFileDescriptor pfd = resolver.openFileDescriptor(uri, "r");
+ path = Os.readlink("/proc/self/fd/" + pfd.getFd());
+ pfd.close();
+ } catch (Exception e) {
+ Log.w(TAG, "Cannot get file path from content URI", e);
+ }
+ return path;
+ }
+
/**
* Check whether a content URI exists.
*
diff --git a/chrome/android/java/AndroidManifest.xml b/chrome/android/java/AndroidManifest.xml
--- a/chrome/android/java/AndroidManifest.xml
+++ b/chrome/android/java/AndroidManifest.xml

View file

@ -0,0 +1,97 @@
From: uazo <uazo@users.noreply.github.com>
Date: Tue, 12 Apr 2022 15:58:01 +0000
Subject: Adds support for writing URIs
Allows native side URI file writing
---
base/android/content_uri_utils.cc | 10 ++++++
base/android/content_uri_utils.h | 4 +++
.../org/chromium/base/ContentUriUtils.java | 33 +++++++++++++++++++
3 files changed, 47 insertions(+)
diff --git a/base/android/content_uri_utils.cc b/base/android/content_uri_utils.cc
--- a/base/android/content_uri_utils.cc
+++ b/base/android/content_uri_utils.cc
@@ -30,6 +30,16 @@ File OpenContentUriForRead(const FilePath& content_uri) {
return File(fd);
}
+File OpenContentUriForWrite(const FilePath& content_uri) {
+ JNIEnv* env = base::android::AttachCurrentThread();
+ ScopedJavaLocalRef<jstring> j_uri =
+ ConvertUTF8ToJavaString(env, content_uri.value());
+ jint fd = Java_ContentUriUtils_openContentUriForWrite(env, j_uri);
+ if (fd < 0)
+ return File();
+ return File(fd);
+}
+
std::string GetContentUriMimeType(const FilePath& content_uri) {
JNIEnv* env = base::android::AttachCurrentThread();
ScopedJavaLocalRef<jstring> j_uri =
diff --git a/base/android/content_uri_utils.h b/base/android/content_uri_utils.h
--- a/base/android/content_uri_utils.h
+++ b/base/android/content_uri_utils.h
@@ -18,6 +18,10 @@ namespace base {
// Returns -1 if the URI is invalid.
BASE_EXPORT File OpenContentUriForRead(const FilePath& content_uri);
+// Opens a content URI for write and returns the file descriptor to the caller.
+// Returns -1 if the URI is invalid.
+BASE_EXPORT File OpenContentUriForWrite(const FilePath& content_uri);
+
// Check whether a content URI exists.
BASE_EXPORT bool ContentUriExists(const FilePath& content_uri);
diff --git a/base/android/java/src/org/chromium/base/ContentUriUtils.java b/base/android/java/src/org/chromium/base/ContentUriUtils.java
--- a/base/android/java/src/org/chromium/base/ContentUriUtils.java
+++ b/base/android/java/src/org/chromium/base/ContentUriUtils.java
@@ -23,6 +23,9 @@ import org.chromium.base.annotations.CalledByNative;
import java.io.File;
import java.io.IOException;
+import android.system.Os;
+import android.content.ContentProviderClient;
+
/**
* This class provides methods to access content URI schemes.
*/
@@ -89,6 +92,36 @@ public abstract class ContentUriUtils {
return -1;
}
+ @CalledByNative
+ public static int openContentUriForWrite(String uriString) {
+ try {
+ Uri uri = Uri.parse(uriString);
+ ContentResolver resolver = ContextUtils.getApplicationContext().getContentResolver();
+ ContentProviderClient client = resolver.acquireContentProviderClient(
+ uri.getAuthority());
+ ParcelFileDescriptor pfd = client.openFile(uri, "rw");
+ int fd = pfd.detachFd();
+ client.close();
+ return fd;
+ } catch (Exception e) {
+ Log.e(TAG, "Cannot open intermediate URI", e);
+ }
+ return -1;
+ }
+
+ public static String getFilePathFromContentUri(Uri uri) {
+ String path = null;
+ try {
+ ContentResolver resolver = ContextUtils.getApplicationContext().getContentResolver();
+ ParcelFileDescriptor pfd = resolver.openFileDescriptor(uri, "r");
+ path = Os.readlink("/proc/self/fd/" + pfd.getFd());
+ pfd.close();
+ } catch (Exception e) {
+ Log.w(TAG, "Cannot get file path from content URI", e);
+ }
+ return path;
+ }
+
/**
* Check whether a content URI exists.
*
--
2.25.1

View file

@ -21,6 +21,8 @@ document-idle), homepage, url_source
The UI also allows you to see the source of the script.
See also: components/user_scripts/README.md
Need: Adds-support-for-writing-URIs.patch
---
chrome/android/BUILD.gn | 5 +
.../android/java/res/xml/main_preferences.xml | 5 +
@ -58,7 +60,7 @@ See also: components/user_scripts/README.md
.../components/user_scripts/ScriptInfo.java | 37 +
.../user_scripts/ScriptListBaseAdapter.java | 163 ++++
.../user_scripts/ScriptListPreference.java | 171 ++++
.../user_scripts/UserScriptsBridge.java | 208 +++++
.../user_scripts/UserScriptsBridge.java | 212 +++++
.../user_scripts/UserScriptsPreferences.java | 116 +++
.../user_scripts/android/java_sources.gni | 18 +
.../android/user_scripts_bridge.cc | 173 ++++
@ -72,7 +74,7 @@ See also: components/user_scripts/README.md
.../user-script-ui/user-scripts-ui.js | 9 +
.../browser/ui/user_scripts_ui.cc | 147 ++++
.../user_scripts/browser/ui/user_scripts_ui.h | 37 +
.../browser/user_script_loader.cc | 759 +++++++++++++++++
.../browser/user_script_loader.cc | 716 ++++++++++++++++
.../user_scripts/browser/user_script_loader.h | 169 ++++
.../browser/user_script_pref_info.cc | 34 +
.../browser/user_script_pref_info.h | 72 ++
@ -131,9 +133,9 @@ See also: components/user_scripts/README.md
.../renderer/user_scripts_renderer_client.h | 37 +
.../renderer/web_ui_injection_host.cc | 40 +
.../renderer/web_ui_injection_host.h | 27 +
.../strings/userscripts_strings.grdp | 55 ++
.../strings/userscripts_strings.grdp | 57 ++
tools/gritsettings/resource_ids.spec | 6 +
111 files changed, 9632 insertions(+), 2 deletions(-)
111 files changed, 9595 insertions(+), 2 deletions(-)
create mode 100644 components/user_scripts/README.md
create mode 100755 components/user_scripts/android/BUILD.gn
create mode 100644 components/user_scripts/android/java/res/layout/accept_script_item.xml
@ -1828,7 +1830,7 @@ diff --git a/components/user_scripts/android/java/src/org/chromium/components/us
new file mode 100644
--- /dev/null
+++ b/components/user_scripts/android/java/src/org/chromium/components/user_scripts/UserScriptsBridge.java
@@ -0,0 +1,208 @@
@@ -0,0 +1,212 @@
+/*
+ This file is part of Bromite.
+
@ -1948,8 +1950,12 @@ new file mode 100644
+
+ String scriptName = ScriptFullPath;
+ if (ContentUriUtils.isContentUri(scriptName)) {
+ scriptName = ContentUriUtils.getDisplayName(Uri.parse(scriptName), context,
+ MediaStore.MediaColumns.DISPLAY_NAME);
+ scriptName = ContentUriUtils.getFilePathFromContentUri(Uri.parse(scriptName));
+ if (scriptName == null) {
+ // fallback to content uri name if fail
+ scriptName = ContentUriUtils.getDisplayName(Uri.parse(ScriptFullPath), context,
+ MediaStore.MediaColumns.DISPLAY_NAME);
+ }
+ }
+
+ String message = context.getString(R.string.ask_to_install, scriptName);
@ -2838,7 +2844,7 @@ diff --git a/components/user_scripts/browser/user_script_loader.cc b/components/
new file mode 100755
--- /dev/null
+++ b/components/user_scripts/browser/user_script_loader.cc
@@ -0,0 +1,759 @@
@@ -0,0 +1,716 @@
+/*
+ This file is part of Bromite.
+
@ -2948,49 +2954,6 @@ new file mode 100755
+ return true;
+}
+
+const std::u16string FileErrorString(base::File::Error error) {
+ switch (error) {
+ case base::File::FILE_ERROR_FAILED:
+ return u"No further details.";
+ case base::File::FILE_ERROR_IN_USE:
+ return u"File currently in use.";
+ case base::File::FILE_ERROR_EXISTS:
+ return u"File already exists.";
+ case base::File::FILE_ERROR_NOT_FOUND:
+ return u"File not found.";
+ case base::File::FILE_ERROR_ACCESS_DENIED:
+ return u"Access denied.";
+ case base::File::FILE_ERROR_TOO_MANY_OPENED:
+ return u"Too many files open.";
+ case base::File::FILE_ERROR_NO_MEMORY:
+ return u"Out of memory.";
+ case base::File::FILE_ERROR_NO_SPACE:
+ return u"No space left on drive.";
+ case base::File::FILE_ERROR_NOT_A_DIRECTORY:
+ return u"Not a directory.";
+ case base::File::FILE_ERROR_INVALID_OPERATION:
+ return u"Invalid operation.";
+ case base::File::FILE_ERROR_SECURITY:
+ return u"Security error.";
+ case base::File::FILE_ERROR_ABORT:
+ return u"File operation aborted.";
+ case base::File::FILE_ERROR_NOT_A_FILE:
+ return u"The supplied path was not a file.";
+ case base::File::FILE_ERROR_NOT_EMPTY:
+ return u"The file was not empty.";
+ case base::File::FILE_ERROR_INVALID_URL:
+ return u"Invalid URL.";
+ case base::File::FILE_ERROR_IO:
+ return u"OS or hardware error.";
+ case base::File::FILE_OK:
+ return u"OK.";
+ case base::File::FILE_ERROR_MAX:
+ NOTREACHED();
+ }
+ NOTIMPLEMENTED();
+ return u"Unknown error.";
+}
+
+} // namespace
+
+// static
@ -3109,7 +3072,7 @@ new file mode 100755
+ if (!infile.IsValid()) {
+ base::File::Error out_error = infile.error_details();
+ *error = u"Cannot open script source. Error: " +
+ FileErrorString(out_error);
+ base::ASCIIToUTF16(base::File::ErrorToString(out_error));
+ return false;
+ }
+
@ -3146,8 +3109,6 @@ new file mode 100755
+
+ std::unique_ptr<UserScript::File> file(new UserScript::File());
+ file->set_content(content);
+ file->set_url(GURL(base::StrCat({"https://userscripts/file/",
+ user_script_path.BaseName().value(), ".js"})));
+
+ // create SHA256 of file
+ char raw[crypto::kSHA256Length] = {0};
@ -3156,6 +3117,8 @@ new file mode 100755
+ base::Base64Encode(base::StringPiece(raw, crypto::kSHA256Length), &key);
+ file->set_key(key);
+
+ file->set_url(GURL(base::StrCat({"https://userscripts/file/", key, ".js"})));
+
+ script->js_scripts().push_back(std::move(file));
+
+ // add into key the filename
@ -9939,7 +9902,7 @@ new file mode 100755
+ bool is_subframe = web_frame->Parent();
+ if (!script->MatchesDocument(effective_document_url, is_subframe)) {
+ if (base::FeatureList::IsEnabled(features::kEnableLoggingUserScripts))
+ LOG(INFO) << "UserScripts: Match name=" << script->name() <<
+ LOG(INFO) << "UserScripts: No Match name=" << script->name() <<
+ " id=" << script->host_id().id() <<
+ " url=" << effective_document_url.spec();
+ return injection;
@ -10604,7 +10567,7 @@ diff --git a/components/user_scripts/strings/userscripts_strings.grdp b/componen
new file mode 100755
--- /dev/null
+++ b/components/user_scripts/strings/userscripts_strings.grdp
@@ -0,0 +1,55 @@
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+
@ -10648,9 +10611,11 @@ new file mode 100755
+ </message>
+
+ <message name="IDS_ASK_TO_INSTALL" desc=". [CHAR-LIMIT=32]" formatter_data="android_java">
+ Only install user scripts that you have verified are secure, user scripts can steal your credentials and data.
+ Do you want to install this user script from following location?
+
+Do you want to install <ph name="FILE">%s</ph>?
+<ph name="FILE">%s</ph>
+
+NOTE: only install user scripts that you have verified are secure, user scripts can steal your credentials and data.
+ </message>
+ <message name="IDS_YES" desc=". [CHAR-LIMIT=32]" formatter_data="android_java">
+ Yes
@ -10660,7 +10625,6 @@ new file mode 100755
+ </message>
+
+</grit-part>
\ No newline at end of file
diff --git a/tools/gritsettings/resource_ids.spec b/tools/gritsettings/resource_ids.spec
--- a/tools/gritsettings/resource_ids.spec
+++ b/tools/gritsettings/resource_ids.spec