Commit c10e2b60 authored by Filip Gorski's avatar Filip Gorski Committed by Commit Bot

[SRO][Clipboard] Prevent SecurityException on SRO

Prevents exceptions when setting URL in clipboard.

Bug: 1115825
Change-Id: If64623659d042f1949f22ad759fbf26aaf55531c
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2355012
Commit-Queue: Filip Gorski <fgorski@chromium.org>
Commit-Queue: Ted Choc <tedchoc@chromium.org>
Auto-Submit: Filip Gorski <fgorski@chromium.org>
Reviewed-by: default avatarTed Choc <tedchoc@chromium.org>
Cr-Commit-Position: refs/heads/master@{#798229}
parent b1445cb6
...@@ -327,12 +327,14 @@ public class Clipboard implements ClipboardManager.OnPrimaryClipChangedListener ...@@ -327,12 +327,14 @@ public class Clipboard implements ClipboardManager.OnPrimaryClipChangedListener
setPrimaryClipNoException(ClipData.newPlainText(null, null)); setPrimaryClipNoException(ClipData.newPlainText(null, null));
} }
public void setPrimaryClipNoException(ClipData clip) { private boolean setPrimaryClipNoException(ClipData clip) {
try { try {
mClipboardManager.setPrimaryClip(clip); mClipboardManager.setPrimaryClip(clip);
return true;
} catch (Exception ex) { } catch (Exception ex) {
// Ignore any exceptions here as certain devices have bugs and will fail. // Ignore any exceptions here as certain devices have bugs and will fail.
showCopyToClipboardFailureMessage(); showCopyToClipboardFailureMessage();
return false;
} }
} }
...@@ -374,8 +376,9 @@ public class Clipboard implements ClipboardManager.OnPrimaryClipChangedListener ...@@ -374,8 +376,9 @@ public class Clipboard implements ClipboardManager.OnPrimaryClipChangedListener
*/ */
public void copyUrlToClipboard(String url) { public void copyUrlToClipboard(String url) {
ClipData clip = ClipData.newPlainText("url", url); ClipData clip = ClipData.newPlainText("url", url);
mClipboardManager.setPrimaryClip(clip); if (setPrimaryClipNoException(clip)) {
Toast.makeText(mContext, R.string.link_copied, Toast.LENGTH_SHORT).show(); Toast.makeText(mContext, R.string.link_copied, Toast.LENGTH_SHORT).show();
}
} }
/** /**
......
...@@ -7,8 +7,12 @@ package org.chromium.ui.base; ...@@ -7,8 +7,12 @@ package org.chromium.ui.base;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull; import static org.junit.Assert.assertNull;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.verify;
import android.content.ClipData; import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Intent; import android.content.Intent;
import android.net.Uri; import android.net.Uri;
import android.text.SpannableString; import android.text.SpannableString;
...@@ -16,6 +20,8 @@ import android.text.style.RelativeSizeSpan; ...@@ -16,6 +20,8 @@ import android.text.style.RelativeSizeSpan;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mockito;
import org.robolectric.annotation.Config; import org.robolectric.annotation.Config;
import org.chromium.base.ContentUriUtils; import org.chromium.base.ContentUriUtils;
...@@ -98,4 +104,35 @@ public class ClipboardTest { ...@@ -98,4 +104,35 @@ public class ClipboardTest {
assertEquals(imageUri, clipboard.getImageUri()); assertEquals(imageUri, clipboard.getImageUri());
} }
@Test
public void testClipboardCopyUrlToClipboard() {
Clipboard clipboard = Clipboard.getInstance();
ClipboardManager clipboardManager = Mockito.mock(ClipboardManager.class);
clipboard.overrideClipboardManagerForTesting(clipboardManager);
String url = "https://google.com";
clipboard.copyUrlToClipboard(url);
ArgumentCaptor<ClipData> clipCaptor = ArgumentCaptor.forClass(ClipData.class);
verify(clipboardManager).setPrimaryClip(clipCaptor.capture());
assertEquals("url", clipCaptor.getValue().getDescription().getLabel());
assertEquals(url, clipCaptor.getValue().getItemAt(0).getText());
}
@Test
public void testClipboardCopyUrlToClipboardNoException() {
Clipboard clipboard = Clipboard.getInstance();
ClipboardManager clipboardManager = Mockito.mock(ClipboardManager.class);
clipboard.overrideClipboardManagerForTesting(clipboardManager);
doThrow(SecurityException.class).when(clipboardManager).setPrimaryClip(any(ClipData.class));
String url = "https://google.com";
clipboard.copyUrlToClipboard(url);
ArgumentCaptor<ClipData> clipCaptor = ArgumentCaptor.forClass(ClipData.class);
verify(clipboardManager).setPrimaryClip(clipCaptor.capture());
assertEquals("url", clipCaptor.getValue().getDescription().getLabel());
assertEquals(url, clipCaptor.getValue().getItemAt(0).getText());
}
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment