Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(647)

Side by Side Diff: chrome/browser/download/download_target_determiner_unittest.cc

Issue 2394303003: Don't prompt for download location on Android (Closed)
Patch Set: disable "save as" tests on android Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « chrome/browser/download/download_target_determiner.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <stddef.h> 5 #include <stddef.h>
6 #include <stdint.h> 6 #include <stdint.h>
7 7
8 #include "base/at_exit.h" 8 #include "base/at_exit.h"
9 #include "base/files/file_path.h" 9 #include "base/files/file_path.h"
10 #include "base/files/scoped_temp_dir.h" 10 #include "base/files/scoped_temp_dir.h"
(...skipping 501 matching lines...) Expand 10 before | Expand all | Expand 10 after
512 const DownloadTestCase kBasicTestCases[] = { 512 const DownloadTestCase kBasicTestCases[] = {
513 {// 0: Automatic Safe 513 {// 0: Automatic Safe
514 AUTOMATIC, content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, 514 AUTOMATIC, content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
515 DownloadFileType::NOT_DANGEROUS, "http://example.com/foo.txt", 515 DownloadFileType::NOT_DANGEROUS, "http://example.com/foo.txt",
516 "text/plain", FILE_PATH_LITERAL(""), 516 "text/plain", FILE_PATH_LITERAL(""),
517 517
518 FILE_PATH_LITERAL("foo.txt"), DownloadItem::TARGET_DISPOSITION_OVERWRITE, 518 FILE_PATH_LITERAL("foo.txt"), DownloadItem::TARGET_DISPOSITION_OVERWRITE,
519 519
520 EXPECT_CRDOWNLOAD}, 520 EXPECT_CRDOWNLOAD},
521 521
522 #if !BUILDFLAG(ANDROID_JAVA_UI)
522 {// 1: Save_As Safe 523 {// 1: Save_As Safe
523 SAVE_AS, content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, 524 SAVE_AS, content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
524 DownloadFileType::NOT_DANGEROUS, "http://example.com/foo.txt", 525 DownloadFileType::NOT_DANGEROUS, "http://example.com/foo.txt",
525 "text/plain", FILE_PATH_LITERAL(""), 526 "text/plain", FILE_PATH_LITERAL(""),
526 527
527 FILE_PATH_LITERAL("foo.txt"), DownloadItem::TARGET_DISPOSITION_PROMPT, 528 FILE_PATH_LITERAL("foo.txt"), DownloadItem::TARGET_DISPOSITION_PROMPT,
528 529
529 EXPECT_CRDOWNLOAD}, 530 EXPECT_CRDOWNLOAD},
531 #endif // !BUILDFLAG(ANDROID_JAVA_UI)
530 532
531 {// 2: Automatic Dangerous 533 {// 2: Automatic Dangerous
532 AUTOMATIC, content::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE, 534 AUTOMATIC, content::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE,
533 DownloadFileType::ALLOW_ON_USER_GESTURE, "http://example.com/foo.crx", 535 DownloadFileType::ALLOW_ON_USER_GESTURE, "http://example.com/foo.crx",
534 "", FILE_PATH_LITERAL(""), 536 "", FILE_PATH_LITERAL(""),
535 537
536 FILE_PATH_LITERAL("foo.crx"), DownloadItem::TARGET_DISPOSITION_OVERWRITE, 538 FILE_PATH_LITERAL("foo.crx"), DownloadItem::TARGET_DISPOSITION_OVERWRITE,
537 539
538 EXPECT_UNCONFIRMED}, 540 EXPECT_UNCONFIRMED},
539 541
540 {// 3: Forced Safe 542 {// 3: Forced Safe
541 FORCED, content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, 543 FORCED, content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
542 DownloadFileType::NOT_DANGEROUS, "http://example.com/foo.txt", "", 544 DownloadFileType::NOT_DANGEROUS, "http://example.com/foo.txt", "",
543 FILE_PATH_LITERAL("forced-foo.txt"), 545 FILE_PATH_LITERAL("forced-foo.txt"),
544 546
545 FILE_PATH_LITERAL("forced-foo.txt"), 547 FILE_PATH_LITERAL("forced-foo.txt"),
546 DownloadItem::TARGET_DISPOSITION_OVERWRITE, 548 DownloadItem::TARGET_DISPOSITION_OVERWRITE,
547 549
548 EXPECT_LOCAL_PATH}, 550 EXPECT_LOCAL_PATH},
549 }; 551 };
550 552
551 // The test assumes that .crx files have a danger level of 553 // The test assumes that .crx files have a danger level of
552 // ALLOW_ON_USER_GESTURE. 554 // ALLOW_ON_USER_GESTURE.
553 ASSERT_EQ(DownloadFileType::ALLOW_ON_USER_GESTURE, 555 ASSERT_EQ(DownloadFileType::ALLOW_ON_USER_GESTURE,
554 Policies()->GetFileDangerLevel( 556 Policies()->GetFileDangerLevel(
555 base::FilePath(FILE_PATH_LITERAL("foo.crx")))); 557 base::FilePath(FILE_PATH_LITERAL("foo.crx"))));
556 RunTestCasesWithActiveItem(kBasicTestCases, arraysize(kBasicTestCases)); 558 RunTestCasesWithActiveItem(kBasicTestCases, arraysize(kBasicTestCases));
557 } 559 }
558 560
561 #if !BUILDFLAG(ANDROID_JAVA_UI)
559 TEST_F(DownloadTargetDeterminerTest, TargetDeterminer_CancelSaveAs) { 562 TEST_F(DownloadTargetDeterminerTest, TargetDeterminer_CancelSaveAs) {
560 const DownloadTestCase kCancelSaveAsTestCases[] = { 563 const DownloadTestCase kCancelSaveAsTestCases[] = {
561 {// 0: Save_As Safe, Cancelled. 564 {// 0: Save_As Safe, Cancelled.
562 SAVE_AS, content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, 565 SAVE_AS, content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
563 DownloadFileType::NOT_DANGEROUS, "http://example.com/foo.txt", 566 DownloadFileType::NOT_DANGEROUS, "http://example.com/foo.txt",
564 "text/plain", FILE_PATH_LITERAL(""), 567 "text/plain", FILE_PATH_LITERAL(""),
565 568
566 FILE_PATH_LITERAL(""), DownloadItem::TARGET_DISPOSITION_PROMPT, 569 FILE_PATH_LITERAL(""), DownloadItem::TARGET_DISPOSITION_PROMPT,
567 570
568 EXPECT_LOCAL_PATH}}; 571 EXPECT_LOCAL_PATH}};
569 ON_CALL(*delegate(), PromptUserForDownloadPath(_, _, _)) 572 ON_CALL(*delegate(), PromptUserForDownloadPath(_, _, _))
570 .WillByDefault(WithArg<2>(ScheduleCallback(base::FilePath()))); 573 .WillByDefault(WithArg<2>(ScheduleCallback(base::FilePath())));
571 RunTestCasesWithActiveItem(kCancelSaveAsTestCases, 574 RunTestCasesWithActiveItem(kCancelSaveAsTestCases,
572 arraysize(kCancelSaveAsTestCases)); 575 arraysize(kCancelSaveAsTestCases));
573 } 576 }
577 #endif // !BUILDFLAG(ANDROID_JAVA_UI)
574 578
575 // The SafeBrowsing check is performed early. Make sure that a download item 579 // The SafeBrowsing check is performed early. Make sure that a download item
576 // that has been marked as DANGEROUS_URL behaves correctly. 580 // that has been marked as DANGEROUS_URL behaves correctly.
577 TEST_F(DownloadTargetDeterminerTest, TargetDeterminer_DangerousUrl) { 581 TEST_F(DownloadTargetDeterminerTest, TargetDeterminer_DangerousUrl) {
578 const DownloadTestCase kSafeBrowsingTestCases[] = { 582 const DownloadTestCase kSafeBrowsingTestCases[] = {
579 {// 0: Automatic Dangerous URL 583 {// 0: Automatic Dangerous URL
580 AUTOMATIC, content::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL, 584 AUTOMATIC, content::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL,
581 DownloadFileType::NOT_DANGEROUS, "http://phishing.example.com/foo.txt", 585 DownloadFileType::NOT_DANGEROUS, "http://phishing.example.com/foo.txt",
582 "", FILE_PATH_LITERAL(""), 586 "", FILE_PATH_LITERAL(""),
583 587
584 FILE_PATH_LITERAL("foo.txt"), DownloadItem::TARGET_DISPOSITION_OVERWRITE, 588 FILE_PATH_LITERAL("foo.txt"), DownloadItem::TARGET_DISPOSITION_OVERWRITE,
585 589
586 EXPECT_UNCONFIRMED}, 590 EXPECT_UNCONFIRMED},
587 591
592 #if !BUILDFLAG(ANDROID_JAVA_UI)
588 {// 1: Save As Dangerous URL 593 {// 1: Save As Dangerous URL
589 SAVE_AS, content::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL, 594 SAVE_AS, content::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL,
590 DownloadFileType::NOT_DANGEROUS, "http://phishing.example.com/foo.txt", 595 DownloadFileType::NOT_DANGEROUS, "http://phishing.example.com/foo.txt",
591 "", FILE_PATH_LITERAL(""), 596 "", FILE_PATH_LITERAL(""),
592 597
593 FILE_PATH_LITERAL("foo.txt"), DownloadItem::TARGET_DISPOSITION_PROMPT, 598 FILE_PATH_LITERAL("foo.txt"), DownloadItem::TARGET_DISPOSITION_PROMPT,
594 599
595 EXPECT_UNCONFIRMED}, 600 EXPECT_UNCONFIRMED},
601 #endif // !BUILDFLAG(ANDROID_JAVA_UI)
596 602
597 {// 2: Forced Dangerous URL 603 {// 2: Forced Dangerous URL
598 FORCED, content::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL, 604 FORCED, content::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL,
599 DownloadFileType::NOT_DANGEROUS, "http://phishing.example.com/foo.txt", 605 DownloadFileType::NOT_DANGEROUS, "http://phishing.example.com/foo.txt",
600 "", FILE_PATH_LITERAL("forced-foo.txt"), 606 "", FILE_PATH_LITERAL("forced-foo.txt"),
601 607
602 FILE_PATH_LITERAL("forced-foo.txt"), 608 FILE_PATH_LITERAL("forced-foo.txt"),
603 DownloadItem::TARGET_DISPOSITION_OVERWRITE, 609 DownloadItem::TARGET_DISPOSITION_OVERWRITE,
604 610
605 EXPECT_UNCONFIRMED}, 611 EXPECT_UNCONFIRMED},
606 612
607 {// 3: Automatic Dangerous URL + Dangerous file. Dangerous URL takes 613 {// 3: Automatic Dangerous URL + Dangerous file. Dangerous URL takes
608 // precedence. 614 // precedence.
609 AUTOMATIC, content::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL, 615 AUTOMATIC, content::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL,
610 DownloadFileType::NOT_DANGEROUS, "http://phishing.example.com/foo.html", 616 DownloadFileType::NOT_DANGEROUS, "http://phishing.example.com/foo.html",
611 "", FILE_PATH_LITERAL(""), 617 "", FILE_PATH_LITERAL(""),
612 618
613 FILE_PATH_LITERAL("foo.html"), 619 FILE_PATH_LITERAL("foo.html"),
614 DownloadItem::TARGET_DISPOSITION_OVERWRITE, 620 DownloadItem::TARGET_DISPOSITION_OVERWRITE,
615 621
616 EXPECT_UNCONFIRMED}, 622 EXPECT_UNCONFIRMED},
617 623
624 #if !BUILDFLAG(ANDROID_JAVA_UI)
618 {// 4: Save As Dangerous URL + Dangerous file 625 {// 4: Save As Dangerous URL + Dangerous file
619 SAVE_AS, content::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL, 626 SAVE_AS, content::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL,
620 DownloadFileType::NOT_DANGEROUS, "http://phishing.example.com/foo.html", 627 DownloadFileType::NOT_DANGEROUS, "http://phishing.example.com/foo.html",
621 "", FILE_PATH_LITERAL(""), 628 "", FILE_PATH_LITERAL(""),
622 629
623 FILE_PATH_LITERAL("foo.html"), DownloadItem::TARGET_DISPOSITION_PROMPT, 630 FILE_PATH_LITERAL("foo.html"), DownloadItem::TARGET_DISPOSITION_PROMPT,
624 631
625 EXPECT_UNCONFIRMED}, 632 EXPECT_UNCONFIRMED},
633 #endif // !BUILDFLAG(ANDROID_JAVA_UI)
626 634
627 {// 5: Forced Dangerous URL + Dangerous file 635 {// 5: Forced Dangerous URL + Dangerous file
628 FORCED, content::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL, 636 FORCED, content::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL,
629 DownloadFileType::NOT_DANGEROUS, "http://phishing.example.com/foo.html", 637 DownloadFileType::NOT_DANGEROUS, "http://phishing.example.com/foo.html",
630 "", FILE_PATH_LITERAL("forced-foo.html"), 638 "", FILE_PATH_LITERAL("forced-foo.html"),
631 639
632 FILE_PATH_LITERAL("forced-foo.html"), 640 FILE_PATH_LITERAL("forced-foo.html"),
633 DownloadItem::TARGET_DISPOSITION_OVERWRITE, 641 DownloadItem::TARGET_DISPOSITION_OVERWRITE,
634 642
635 EXPECT_UNCONFIRMED}, 643 EXPECT_UNCONFIRMED},
(...skipping 21 matching lines...) Expand all
657 665
658 {// 1: Automatic Maybe dangerous content with DANGEROUS type. 666 {// 1: Automatic Maybe dangerous content with DANGEROUS type.
659 AUTOMATIC, content::DOWNLOAD_DANGER_TYPE_MAYBE_DANGEROUS_CONTENT, 667 AUTOMATIC, content::DOWNLOAD_DANGER_TYPE_MAYBE_DANGEROUS_CONTENT,
660 DownloadFileType::DANGEROUS, "http://phishing.example.com/foo.swf", "", 668 DownloadFileType::DANGEROUS, "http://phishing.example.com/foo.swf", "",
661 FILE_PATH_LITERAL(""), 669 FILE_PATH_LITERAL(""),
662 670
663 FILE_PATH_LITERAL("foo.swf"), DownloadItem::TARGET_DISPOSITION_OVERWRITE, 671 FILE_PATH_LITERAL("foo.swf"), DownloadItem::TARGET_DISPOSITION_OVERWRITE,
664 672
665 EXPECT_UNCONFIRMED}, 673 EXPECT_UNCONFIRMED},
666 674
675
676 #if !BUILDFLAG(ANDROID_JAVA_UI)
667 {// 2: Save As Maybe dangerous content 677 {// 2: Save As Maybe dangerous content
668 SAVE_AS, content::DOWNLOAD_DANGER_TYPE_MAYBE_DANGEROUS_CONTENT, 678 SAVE_AS, content::DOWNLOAD_DANGER_TYPE_MAYBE_DANGEROUS_CONTENT,
669 DownloadFileType::NOT_DANGEROUS, "http://phishing.example.com/foo.crx", 679 DownloadFileType::NOT_DANGEROUS, "http://phishing.example.com/foo.crx",
670 "", FILE_PATH_LITERAL(""), 680 "", FILE_PATH_LITERAL(""),
671 681
672 FILE_PATH_LITERAL("foo.crx"), DownloadItem::TARGET_DISPOSITION_PROMPT, 682 FILE_PATH_LITERAL("foo.crx"), DownloadItem::TARGET_DISPOSITION_PROMPT,
673 683
674 EXPECT_UNCONFIRMED}, 684 EXPECT_UNCONFIRMED},
685 #endif // !BUILDFLAG(ANDROID_JAVA_UI)
675 686
676 {// 3: Forced Maybe dangerous content 687 {// 3: Forced Maybe dangerous content
677 FORCED, content::DOWNLOAD_DANGER_TYPE_MAYBE_DANGEROUS_CONTENT, 688 FORCED, content::DOWNLOAD_DANGER_TYPE_MAYBE_DANGEROUS_CONTENT,
678 DownloadFileType::NOT_DANGEROUS, "http://phishing.example.com/foo.crx", 689 DownloadFileType::NOT_DANGEROUS, "http://phishing.example.com/foo.crx",
679 "", FILE_PATH_LITERAL("forced-foo.crx"), 690 "", FILE_PATH_LITERAL("forced-foo.crx"),
680 691
681 FILE_PATH_LITERAL("forced-foo.crx"), 692 FILE_PATH_LITERAL("forced-foo.crx"),
682 DownloadItem::TARGET_DISPOSITION_OVERWRITE, 693 DownloadItem::TARGET_DISPOSITION_OVERWRITE,
683 694
684 EXPECT_UNCONFIRMED}, 695 EXPECT_UNCONFIRMED},
685 }; 696 };
686 697
687 // Test assumptions: 698 // Test assumptions:
688 ASSERT_EQ(DownloadFileType::ALLOW_ON_USER_GESTURE, 699 ASSERT_EQ(DownloadFileType::ALLOW_ON_USER_GESTURE,
689 Policies()->GetFileDangerLevel( 700 Policies()->GetFileDangerLevel(
690 base::FilePath(FILE_PATH_LITERAL("foo.crx")))); 701 base::FilePath(FILE_PATH_LITERAL("foo.crx"))));
691 ASSERT_EQ(DownloadFileType::DANGEROUS, 702 ASSERT_EQ(DownloadFileType::DANGEROUS,
692 Policies()->GetFileDangerLevel( 703 Policies()->GetFileDangerLevel(
693 base::FilePath(FILE_PATH_LITERAL("foo.swf")))); 704 base::FilePath(FILE_PATH_LITERAL("foo.swf"))));
694 705
695 ON_CALL(*delegate(), CheckDownloadUrl(_, _, _)) 706 ON_CALL(*delegate(), CheckDownloadUrl(_, _, _))
696 .WillByDefault(WithArg<2>(ScheduleCallback( 707 .WillByDefault(WithArg<2>(ScheduleCallback(
697 content::DOWNLOAD_DANGER_TYPE_MAYBE_DANGEROUS_CONTENT))); 708 content::DOWNLOAD_DANGER_TYPE_MAYBE_DANGEROUS_CONTENT)));
698 RunTestCasesWithActiveItem(kSafeBrowsingTestCases, 709 RunTestCasesWithActiveItem(kSafeBrowsingTestCases,
699 arraysize(kSafeBrowsingTestCases)); 710 arraysize(kSafeBrowsingTestCases));
700 } 711 }
701 712
713 #if !BUILDFLAG(ANDROID_JAVA_UI)
702 // Test whether the last saved directory is used for 'Save As' downloads. 714 // Test whether the last saved directory is used for 'Save As' downloads.
703 TEST_F(DownloadTargetDeterminerTest, TargetDeterminer_LastSavePath) { 715 TEST_F(DownloadTargetDeterminerTest, TargetDeterminer_LastSavePath) {
704 const DownloadTestCase kLastSavePathTestCasesPre[] = { 716 const DownloadTestCase kLastSavePathTestCasesPre[] = {
705 {// 0: If the last save path is empty, then the default download directory 717 {// 0: If the last save path is empty, then the default download directory
706 // should be used. 718 // should be used.
707 SAVE_AS, content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, 719 SAVE_AS, content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
708 DownloadFileType::NOT_DANGEROUS, "http://example.com/foo.txt", 720 DownloadFileType::NOT_DANGEROUS, "http://example.com/foo.txt",
709 "text/plain", FILE_PATH_LITERAL(""), 721 "text/plain", FILE_PATH_LITERAL(""),
710 722
711 FILE_PATH_LITERAL("foo.txt"), DownloadItem::TARGET_DISPOSITION_PROMPT, 723 FILE_PATH_LITERAL("foo.txt"), DownloadItem::TARGET_DISPOSITION_PROMPT,
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
780 download_prefs()->SetSaveFilePath(last_selected_dir); 792 download_prefs()->SetSaveFilePath(last_selected_dir);
781 EXPECT_CALL(*delegate(), PromptUserForDownloadPath( 793 EXPECT_CALL(*delegate(), PromptUserForDownloadPath(
782 _, last_selected_dir.AppendASCII("foo.txt"), _)); 794 _, last_selected_dir.AppendASCII("foo.txt"), _));
783 EXPECT_CALL(*delegate(), DetermineLocalPath(_, virtual_path, _)) 795 EXPECT_CALL(*delegate(), DetermineLocalPath(_, virtual_path, _))
784 .WillOnce(WithArg<2>(ScheduleCallback( 796 .WillOnce(WithArg<2>(ScheduleCallback(
785 GetPathInDownloadDir(FILE_PATH_LITERAL("bar.txt"))))); 797 GetPathInDownloadDir(FILE_PATH_LITERAL("bar.txt")))));
786 RunTestCasesWithActiveItem(kLastSavePathTestCasesVirtual, 798 RunTestCasesWithActiveItem(kLastSavePathTestCasesVirtual,
787 arraysize(kLastSavePathTestCasesVirtual)); 799 arraysize(kLastSavePathTestCasesVirtual));
788 } 800 }
789 } 801 }
802 #endif // !BUILDFLAG(ANDROID_JAVA_UI)
790 803
791 // These tests are run with the default downloads folder set to a virtual 804 // These tests are run with the default downloads folder set to a virtual
792 // directory. 805 // directory.
793 TEST_F(DownloadTargetDeterminerTest, TargetDeterminer_DefaultVirtual) { 806 TEST_F(DownloadTargetDeterminerTest, TargetDeterminer_DefaultVirtual) {
794 // The default download directory is the virutal path. 807 // The default download directory is the virutal path.
795 download_prefs()->SetDownloadPath(test_virtual_dir()); 808 download_prefs()->SetDownloadPath(test_virtual_dir());
796 809
797 { 810 {
798 SCOPED_TRACE(testing::Message() << "Automatic Safe Download"); 811 SCOPED_TRACE(testing::Message() << "Automatic Safe Download");
799 const DownloadTestCase kAutomaticDownloadToVirtualDir = { 812 const DownloadTestCase kAutomaticDownloadToVirtualDir = {
800 AUTOMATIC, 813 AUTOMATIC,
801 content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, 814 content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
802 DownloadFileType::NOT_DANGEROUS, 815 DownloadFileType::NOT_DANGEROUS,
803 "http://example.com/foo.txt", 816 "http://example.com/foo.txt",
804 "text/plain", 817 "text/plain",
805 FILE_PATH_LITERAL(""), 818 FILE_PATH_LITERAL(""),
806 819
807 FILE_PATH_LITERAL("foo-local.txt"), 820 FILE_PATH_LITERAL("foo-local.txt"),
808 DownloadItem::TARGET_DISPOSITION_OVERWRITE, 821 DownloadItem::TARGET_DISPOSITION_OVERWRITE,
809 822
810 EXPECT_LOCAL_PATH}; 823 EXPECT_LOCAL_PATH};
811 EXPECT_CALL(*delegate(), DetermineLocalPath(_, _, _)) 824 EXPECT_CALL(*delegate(), DetermineLocalPath(_, _, _))
812 .WillOnce(WithArg<2>(ScheduleCallback( 825 .WillOnce(WithArg<2>(ScheduleCallback(
813 GetPathInDownloadDir(FILE_PATH_LITERAL("foo-local.txt"))))); 826 GetPathInDownloadDir(FILE_PATH_LITERAL("foo-local.txt")))));
814 RunTestCasesWithActiveItem(&kAutomaticDownloadToVirtualDir, 1); 827 RunTestCasesWithActiveItem(&kAutomaticDownloadToVirtualDir, 1);
815 } 828 }
816 829
830 #if !BUILDFLAG(ANDROID_JAVA_UI)
817 { 831 {
818 SCOPED_TRACE(testing::Message() << "Save As to virtual directory"); 832 SCOPED_TRACE(testing::Message() << "Save As to virtual directory");
819 const DownloadTestCase kSaveAsToVirtualDir = { 833 const DownloadTestCase kSaveAsToVirtualDir = {
820 SAVE_AS, 834 SAVE_AS,
821 content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, 835 content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
822 DownloadFileType::NOT_DANGEROUS, 836 DownloadFileType::NOT_DANGEROUS,
823 "http://example.com/bar.txt", 837 "http://example.com/bar.txt",
824 "text/plain", 838 "text/plain",
825 FILE_PATH_LITERAL(""), 839 FILE_PATH_LITERAL(""),
826 840
(...skipping 24 matching lines...) Expand all
851 FILE_PATH_LITERAL("foo-x.txt"), 865 FILE_PATH_LITERAL("foo-x.txt"),
852 DownloadItem::TARGET_DISPOSITION_PROMPT, 866 DownloadItem::TARGET_DISPOSITION_PROMPT,
853 867
854 EXPECT_CRDOWNLOAD}; 868 EXPECT_CRDOWNLOAD};
855 EXPECT_CALL(*delegate(), PromptUserForDownloadPath( 869 EXPECT_CALL(*delegate(), PromptUserForDownloadPath(
856 _, test_virtual_dir().AppendASCII("bar.txt"), _)) 870 _, test_virtual_dir().AppendASCII("bar.txt"), _))
857 .WillOnce(WithArg<2>(ScheduleCallback( 871 .WillOnce(WithArg<2>(ScheduleCallback(
858 GetPathInDownloadDir(FILE_PATH_LITERAL("foo-x.txt"))))); 872 GetPathInDownloadDir(FILE_PATH_LITERAL("foo-x.txt")))));
859 RunTestCasesWithActiveItem(&kSaveAsToLocalDir, 1); 873 RunTestCasesWithActiveItem(&kSaveAsToLocalDir, 1);
860 } 874 }
875 #endif // !BUILDFLAG(ANDROID_JAVA_UI)
861 876
862 { 877 {
863 SCOPED_TRACE(testing::Message() << "Forced safe download"); 878 SCOPED_TRACE(testing::Message() << "Forced safe download");
864 const DownloadTestCase kForcedSafe = { 879 const DownloadTestCase kForcedSafe = {
865 FORCED, 880 FORCED,
866 content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, 881 content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
867 DownloadFileType::NOT_DANGEROUS, 882 DownloadFileType::NOT_DANGEROUS,
868 "http://example.com/foo.txt", 883 "http://example.com/foo.txt",
869 "", 884 "",
870 FILE_PATH_LITERAL("forced-foo.txt"), 885 FILE_PATH_LITERAL("forced-foo.txt"),
(...skipping 11 matching lines...) Expand all
882 TEST_F(DownloadTargetDeterminerTest, TargetDeterminer_InactiveDownload) { 897 TEST_F(DownloadTargetDeterminerTest, TargetDeterminer_InactiveDownload) {
883 const DownloadTestCase kInactiveTestCases[] = { 898 const DownloadTestCase kInactiveTestCases[] = {
884 {AUTOMATIC, content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, 899 {AUTOMATIC, content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
885 DownloadFileType::NOT_DANGEROUS, "http://example.com/foo.txt", 900 DownloadFileType::NOT_DANGEROUS, "http://example.com/foo.txt",
886 "text/plain", FILE_PATH_LITERAL(""), 901 "text/plain", FILE_PATH_LITERAL(""),
887 902
888 FILE_PATH_LITERAL("foo.txt"), DownloadItem::TARGET_DISPOSITION_OVERWRITE, 903 FILE_PATH_LITERAL("foo.txt"), DownloadItem::TARGET_DISPOSITION_OVERWRITE,
889 904
890 EXPECT_CRDOWNLOAD}, 905 EXPECT_CRDOWNLOAD},
891 906
907 #if !BUILDFLAG(ANDROID_JAVA_UI)
892 {SAVE_AS, content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, 908 {SAVE_AS, content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
893 DownloadFileType::NOT_DANGEROUS, "http://example.com/foo.txt", 909 DownloadFileType::NOT_DANGEROUS, "http://example.com/foo.txt",
894 "text/plain", FILE_PATH_LITERAL(""), 910 "text/plain", FILE_PATH_LITERAL(""),
895 911
896 FILE_PATH_LITERAL("foo.txt"), DownloadItem::TARGET_DISPOSITION_PROMPT, 912 FILE_PATH_LITERAL("foo.txt"), DownloadItem::TARGET_DISPOSITION_PROMPT,
897 913
898 EXPECT_CRDOWNLOAD}}; 914 EXPECT_CRDOWNLOAD}
915 #endif // !BUILDFLAG(ANDROID_JAVA_UI)
916 };
899 917
900 for (size_t i = 0; i < arraysize(kInactiveTestCases); ++i) { 918 for (size_t i = 0; i < arraysize(kInactiveTestCases); ++i) {
901 SCOPED_TRACE(testing::Message() << "Running test case " << i); 919 SCOPED_TRACE(testing::Message() << "Running test case " << i);
902 const DownloadTestCase& test_case = kInactiveTestCases[i]; 920 const DownloadTestCase& test_case = kInactiveTestCases[i];
903 std::unique_ptr<content::MockDownloadItem> item( 921 std::unique_ptr<content::MockDownloadItem> item(
904 CreateActiveDownloadItem(i, test_case)); 922 CreateActiveDownloadItem(i, test_case));
905 EXPECT_CALL(*item.get(), GetState()) 923 EXPECT_CALL(*item.get(), GetState())
906 .WillRepeatedly(Return(content::DownloadItem::CANCELLED)); 924 .WillRepeatedly(Return(content::DownloadItem::CANCELLED));
907 925
908 EXPECT_CALL(*delegate(), PromptUserForDownloadPath(_, _, _)).Times(0); 926 EXPECT_CALL(*delegate(), PromptUserForDownloadPath(_, _, _)).Times(0);
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
978 {// 1: Dangerous due to not having visited referrer before. 996 {// 1: Dangerous due to not having visited referrer before.
979 AUTOMATIC, content::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE, 997 AUTOMATIC, content::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE,
980 DownloadFileType::ALLOW_ON_USER_GESTURE, 998 DownloadFileType::ALLOW_ON_USER_GESTURE,
981 "http://not-visited.example.com/foo.crx", "application/xml", 999 "http://not-visited.example.com/foo.crx", "application/xml",
982 FILE_PATH_LITERAL(""), 1000 FILE_PATH_LITERAL(""),
983 1001
984 FILE_PATH_LITERAL("foo.crx"), DownloadItem::TARGET_DISPOSITION_OVERWRITE, 1002 FILE_PATH_LITERAL("foo.crx"), DownloadItem::TARGET_DISPOSITION_OVERWRITE,
985 1003
986 EXPECT_UNCONFIRMED}, 1004 EXPECT_UNCONFIRMED},
987 1005
1006 #if !BUILDFLAG(ANDROID_JAVA_UI)
988 {// 2: Safe because the user is being prompted. 1007 {// 2: Safe because the user is being prompted.
989 SAVE_AS, content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, 1008 SAVE_AS, content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
990 DownloadFileType::NOT_DANGEROUS, 1009 DownloadFileType::NOT_DANGEROUS,
991 "http://not-visited.example.com/foo.crx", "application/xml", 1010 "http://not-visited.example.com/foo.crx", "application/xml",
992 FILE_PATH_LITERAL(""), 1011 FILE_PATH_LITERAL(""),
993 1012
994 FILE_PATH_LITERAL("foo.crx"), DownloadItem::TARGET_DISPOSITION_PROMPT, 1013 FILE_PATH_LITERAL("foo.crx"), DownloadItem::TARGET_DISPOSITION_PROMPT,
995 1014
996 EXPECT_CRDOWNLOAD}, 1015 EXPECT_CRDOWNLOAD},
1016 #endif // !BUILDFLAG(ANDROID_JAVA_UI)
997 1017
998 {// 3: Safe because of forced path. 1018 {// 3: Safe because of forced path.
999 FORCED, content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, 1019 FORCED, content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
1000 DownloadFileType::NOT_DANGEROUS, 1020 DownloadFileType::NOT_DANGEROUS,
1001 "http://not-visited.example.com/foo.crx", "application/xml", 1021 "http://not-visited.example.com/foo.crx", "application/xml",
1002 FILE_PATH_LITERAL("foo.crx"), 1022 FILE_PATH_LITERAL("foo.crx"),
1003 1023
1004 FILE_PATH_LITERAL("foo.crx"), DownloadItem::TARGET_DISPOSITION_OVERWRITE, 1024 FILE_PATH_LITERAL("foo.crx"), DownloadItem::TARGET_DISPOSITION_OVERWRITE,
1005 1025
1006 EXPECT_LOCAL_PATH}, 1026 EXPECT_LOCAL_PATH},
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
1142 } 1162 }
1143 1163
1144 std::unique_ptr<content::MockDownloadItem> item( 1164 std::unique_ptr<content::MockDownloadItem> item(
1145 CreateActiveDownloadItem(1, download_test_case)); 1165 CreateActiveDownloadItem(1, download_test_case));
1146 EXPECT_CALL(*item, GetTransitionType()) 1166 EXPECT_CALL(*item, GetTransitionType())
1147 .WillRepeatedly(Return(test_case.page_transition)); 1167 .WillRepeatedly(Return(test_case.page_transition));
1148 RunTestCase(download_test_case, base::FilePath(), item.get()); 1168 RunTestCase(download_test_case, base::FilePath(), item.get());
1149 } 1169 }
1150 } 1170 }
1151 1171
1172 #if !BUILDFLAG(ANDROID_JAVA_UI)
1152 // These test cases are run with "Prompt for download" user preference set to 1173 // These test cases are run with "Prompt for download" user preference set to
1153 // true. 1174 // true.
1154 TEST_F(DownloadTargetDeterminerTest, TargetDeterminer_PromptAlways) { 1175 TEST_F(DownloadTargetDeterminerTest, TargetDeterminer_PromptAlways) {
1155 const DownloadTestCase kPromptingTestCases[] = { 1176 const DownloadTestCase kPromptingTestCases[] = {
1156 {// 0: Safe Automatic - Should prompt because of "Prompt for download" 1177 {// 0: Safe Automatic - Should prompt because of "Prompt for download"
1157 // preference setting. 1178 // preference setting.
1158 AUTOMATIC, content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, 1179 AUTOMATIC, content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
1159 DownloadFileType::NOT_DANGEROUS, "http://example.com/foo.txt", 1180 DownloadFileType::NOT_DANGEROUS, "http://example.com/foo.txt",
1160 "text/plain", FILE_PATH_LITERAL(""), 1181 "text/plain", FILE_PATH_LITERAL(""),
1161 1182
(...skipping 21 matching lines...) Expand all
1183 1204
1184 EXPECT_CRDOWNLOAD}, 1205 EXPECT_CRDOWNLOAD},
1185 }; 1206 };
1186 1207
1187 SetPromptForDownload(true); 1208 SetPromptForDownload(true);
1188 EnableAutoOpenBasedOnExtension( 1209 EnableAutoOpenBasedOnExtension(
1189 base::FilePath(FILE_PATH_LITERAL("dummy.dummy"))); 1210 base::FilePath(FILE_PATH_LITERAL("dummy.dummy")));
1190 RunTestCasesWithActiveItem(kPromptingTestCases, 1211 RunTestCasesWithActiveItem(kPromptingTestCases,
1191 arraysize(kPromptingTestCases)); 1212 arraysize(kPromptingTestCases));
1192 } 1213 }
1214 #endif // !BUILDFLAG(ANDROID_JAVA_UI)
1193 1215
1194 #if defined(ENABLE_EXTENSIONS) 1216 #if defined(ENABLE_EXTENSIONS)
1195 // These test cases are run with "Prompt for download" user preference set to 1217 // These test cases are run with "Prompt for download" user preference set to
1196 // true. Automatic extension downloads shouldn't cause prompting. 1218 // true. Automatic extension downloads shouldn't cause prompting.
1197 // Android doesn't support extensions. 1219 // Android doesn't support extensions.
1198 TEST_F(DownloadTargetDeterminerTest, TargetDeterminer_PromptAlways_Extension) { 1220 TEST_F(DownloadTargetDeterminerTest, TargetDeterminer_PromptAlways_Extension) {
1199 const DownloadTestCase kPromptingTestCases[] = { 1221 const DownloadTestCase kPromptingTestCases[] = {
1200 {// 0: Automatic Browser Extension download. - Shouldn't prompt for browser 1222 {// 0: Automatic Browser Extension download. - Shouldn't prompt for browser
1201 // extension downloads even if "Prompt for download" preference is set. 1223 // extension downloads even if "Prompt for download" preference is set.
1202 AUTOMATIC, content::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE, 1224 AUTOMATIC, content::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE,
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
1275 {// 0: Automatic Safe 1297 {// 0: Automatic Safe
1276 AUTOMATIC, content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, 1298 AUTOMATIC, content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
1277 DownloadFileType::NOT_DANGEROUS, "http://example.com/foo.txt", 1299 DownloadFileType::NOT_DANGEROUS, "http://example.com/foo.txt",
1278 "text/plain", FILE_PATH_LITERAL(""), 1300 "text/plain", FILE_PATH_LITERAL(""),
1279 1301
1280 FILE_PATH_LITERAL("overridden/foo.txt"), 1302 FILE_PATH_LITERAL("overridden/foo.txt"),
1281 DownloadItem::TARGET_DISPOSITION_OVERWRITE, 1303 DownloadItem::TARGET_DISPOSITION_OVERWRITE,
1282 1304
1283 EXPECT_CRDOWNLOAD}, 1305 EXPECT_CRDOWNLOAD},
1284 1306
1307 #if !BUILDFLAG(ANDROID_JAVA_UI)
1285 {// 1: Save_As Safe 1308 {// 1: Save_As Safe
1286 SAVE_AS, content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, 1309 SAVE_AS, content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
1287 DownloadFileType::NOT_DANGEROUS, "http://example.com/foo.txt", 1310 DownloadFileType::NOT_DANGEROUS, "http://example.com/foo.txt",
1288 "text/plain", FILE_PATH_LITERAL(""), 1311 "text/plain", FILE_PATH_LITERAL(""),
1289 1312
1290 FILE_PATH_LITERAL("overridden/foo.txt"), 1313 FILE_PATH_LITERAL("overridden/foo.txt"),
1291 DownloadItem::TARGET_DISPOSITION_PROMPT, 1314 DownloadItem::TARGET_DISPOSITION_PROMPT,
1292 1315
1293 EXPECT_CRDOWNLOAD}, 1316 EXPECT_CRDOWNLOAD},
1317 #endif // !BUILDFLAG(ANDROID_JAVA_UI)
1294 1318
1295 {// 2: Automatic Dangerous 1319 {// 2: Automatic Dangerous
1296 AUTOMATIC, content::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE, 1320 AUTOMATIC, content::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE,
1297 DownloadFileType::ALLOW_ON_USER_GESTURE, "http://example.com/foo.crx", 1321 DownloadFileType::ALLOW_ON_USER_GESTURE, "http://example.com/foo.crx",
1298 "", FILE_PATH_LITERAL(""), 1322 "", FILE_PATH_LITERAL(""),
1299 1323
1300 FILE_PATH_LITERAL("overridden/foo.crx"), 1324 FILE_PATH_LITERAL("overridden/foo.crx"),
1301 DownloadItem::TARGET_DISPOSITION_OVERWRITE, 1325 DownloadItem::TARGET_DISPOSITION_OVERWRITE,
1302 1326
1303 EXPECT_UNCONFIRMED}, 1327 EXPECT_UNCONFIRMED},
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
1399 .WillOnce(WithArg<2>( 1423 .WillOnce(WithArg<2>(
1400 ScheduleCallback2(overridden_path, 1424 ScheduleCallback2(overridden_path,
1401 DownloadPathReservationTracker::PROMPT))); 1425 DownloadPathReservationTracker::PROMPT)));
1402 EXPECT_CALL(*delegate(), ReserveVirtualPath( 1426 EXPECT_CALL(*delegate(), ReserveVirtualPath(
1403 _, full_overridden_path, true, DownloadPathReservationTracker::PROMPT, _)) 1427 _, full_overridden_path, true, DownloadPathReservationTracker::PROMPT, _))
1404 .WillOnce(WithArg<4>( 1428 .WillOnce(WithArg<4>(
1405 ScheduleCallback2(full_overridden_path, true))); 1429 ScheduleCallback2(full_overridden_path, true)));
1406 RunTestCase(test_case, base::FilePath(), item.get()); 1430 RunTestCase(test_case, base::FilePath(), item.get());
1407 } 1431 }
1408 1432
1433 #if !BUILDFLAG(ANDROID_JAVA_UI)
1409 // Test that relative paths returned by extensions are always relative to the 1434 // Test that relative paths returned by extensions are always relative to the
1410 // default downloads path. 1435 // default downloads path.
1411 TEST_F(DownloadTargetDeterminerTest, 1436 TEST_F(DownloadTargetDeterminerTest,
1412 TargetDeterminer_NotifyExtensionsDefaultPath) { 1437 TargetDeterminer_NotifyExtensionsDefaultPath) {
1413 const DownloadTestCase kNotifyExtensionsTestCase = { 1438 const DownloadTestCase kNotifyExtensionsTestCase = {
1414 SAVE_AS, 1439 SAVE_AS,
1415 content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, 1440 content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
1416 DownloadFileType::NOT_DANGEROUS, 1441 DownloadFileType::NOT_DANGEROUS,
1417 "http://example.com/foo.txt", 1442 "http://example.com/foo.txt",
1418 "text/plain", 1443 "text/plain",
(...skipping 17 matching lines...) Expand all
1436 EXPECT_CALL(*delegate(), NotifyExtensions(_, _, _)) 1461 EXPECT_CALL(*delegate(), NotifyExtensions(_, _, _))
1437 .WillOnce(WithArg<2>( 1462 .WillOnce(WithArg<2>(
1438 ScheduleCallback2(overridden_path, 1463 ScheduleCallback2(overridden_path,
1439 DownloadPathReservationTracker::UNIQUIFY))); 1464 DownloadPathReservationTracker::UNIQUIFY)));
1440 EXPECT_CALL(*delegate(), 1465 EXPECT_CALL(*delegate(),
1441 PromptUserForDownloadPath(_, full_overridden_path, _)) 1466 PromptUserForDownloadPath(_, full_overridden_path, _))
1442 .WillOnce(WithArg<2>( 1467 .WillOnce(WithArg<2>(
1443 ScheduleCallback(full_overridden_path))); 1468 ScheduleCallback(full_overridden_path)));
1444 RunTestCase(test_case, base::FilePath(), item.get()); 1469 RunTestCase(test_case, base::FilePath(), item.get());
1445 } 1470 }
1471 #endif // !BUILDFLAG(ANDROID_JAVA_UI)
1446 1472
1447 TEST_F(DownloadTargetDeterminerTest, 1473 TEST_F(DownloadTargetDeterminerTest,
1448 TargetDeterminer_InitialVirtualPathUnsafe) { 1474 TargetDeterminer_InitialVirtualPathUnsafe) {
1449 const base::FilePath::CharType* kInitialPath = 1475 const base::FilePath::CharType* kInitialPath =
1450 FILE_PATH_LITERAL("some_path/bar.html"); 1476 FILE_PATH_LITERAL("some_path/bar.html");
1451 1477
1452 const DownloadTestCase kInitialPathTestCase = { 1478 const DownloadTestCase kInitialPathTestCase = {
1453 // 0: Save As Save. The path generated based on the DownloadItem is safe, 1479 // 0: Save As Save. The path generated based on the DownloadItem is safe,
1454 // but the initial path is unsafe. However, the download is not considered 1480 // but the initial path is unsafe. However, the download is not considered
1455 // dangerous since the user has been prompted. 1481 // dangerous since the user has been prompted.
(...skipping 682 matching lines...) Expand 10 before | Expand all | Expand 10 after
2138 EXPECT_CALL(mock_plugin_filter_, MockPluginAvailable(browser_plugin.path())) 2164 EXPECT_CALL(mock_plugin_filter_, MockPluginAvailable(browser_plugin.path()))
2139 .WillRepeatedly(Return(false)); 2165 .WillRepeatedly(Return(false));
2140 target_info = RunDownloadTargetDeterminer( 2166 target_info = RunDownloadTargetDeterminer(
2141 GetPathInDownloadDir(kInitialPath), item.get()); 2167 GetPathInDownloadDir(kInitialPath), item.get());
2142 EXPECT_FALSE(target_info->is_filetype_handled_safely); 2168 EXPECT_FALSE(target_info->is_filetype_handled_safely);
2143 } 2169 }
2144 2170
2145 #endif // defined(ENABLE_PLUGINS) 2171 #endif // defined(ENABLE_PLUGINS)
2146 2172
2147 } // namespace 2173 } // namespace
OLDNEW
« no previous file with comments | « chrome/browser/download/download_target_determiner.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698