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

Side by Side Diff: chrome/browser/shell_integration_win.cc

Issue 1586143002: Cleanup dual_mode handling in ShellIntegrationWin after Metro removal. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@a1_cleanup_scottmg
Patch Set: nits Created 4 years, 11 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/shell_integration.h ('k') | chrome/browser/shell_integration_win_unittest.cc » ('j') | 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 "chrome/browser/shell_integration.h" 5 #include "chrome/browser/shell_integration.h"
6 6
7 #include <windows.h> 7 #include <windows.h>
8 #include <shlwapi.h> 8 #include <shlwapi.h>
9 #include <shobjidl.h> 9 #include <shobjidl.h>
10 #include <propkey.h> // Needs to come after shobjidl.h. 10 #include <propkey.h> // Needs to come after shobjidl.h.
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
186 for (size_t i = 0; i < arraysize(kLocations); ++i) { 186 for (size_t i = 0; i < arraysize(kLocations); ++i) {
187 base::FilePath path; 187 base::FilePath path;
188 if (!PathService::Get(kLocations[i].location_id, &path)) { 188 if (!PathService::Get(kLocations[i].location_id, &path)) {
189 NOTREACHED(); 189 NOTREACHED();
190 continue; 190 continue;
191 } 191 }
192 192
193 if (kLocations[i].sub_dir) 193 if (kLocations[i].sub_dir)
194 path = path.Append(kLocations[i].sub_dir); 194 path = path.Append(kLocations[i].sub_dir);
195 195
196 bool check_dual_mode = kLocations[i].location_id == base::DIR_START_MENU || 196 // Clear |dual_mode| property from taskbar pins as those are user-level
197 kLocations[i].location_id == base::DIR_TASKBAR_PINS; 197 // shortcuts which aren't handled by the installer.
198 bool clear_dual_mode = kLocations[i].location_id == base::DIR_TASKBAR_PINS;
198 ShellIntegration::MigrateShortcutsInPathInternal(chrome_exe, path, 199 ShellIntegration::MigrateShortcutsInPathInternal(chrome_exe, path,
199 check_dual_mode); 200 clear_dual_mode);
200 } 201 }
201 } 202 }
202 203
203 // Windows 8 introduced a new protocol->executable binding system which cannot 204 // Windows 8 introduced a new protocol->executable binding system which cannot
204 // be retrieved in the HKCR registry subkey method implemented below. We call 205 // be retrieved in the HKCR registry subkey method implemented below. We call
205 // AssocQueryString with the new Win8-only flag ASSOCF_IS_PROTOCOL instead. 206 // AssocQueryString with the new Win8-only flag ASSOCF_IS_PROTOCOL instead.
206 base::string16 GetAppForProtocolUsingAssocQuery(const GURL& url) { 207 base::string16 GetAppForProtocolUsingAssocQuery(const GURL& url) {
207 base::string16 url_scheme = base::ASCIIToUTF16(url.scheme()); 208 base::string16 url_scheme = base::ASCIIToUTF16(url.scheme());
208 // Don't attempt to query protocol association on an empty string. 209 // Don't attempt to query protocol association on an empty string.
209 if (url_scheme.empty()) 210 if (url_scheme.empty())
(...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after
518 static const int64_t kMigrateChromiumShortcutsDelaySeconds = 15; 519 static const int64_t kMigrateChromiumShortcutsDelaySeconds = 15;
519 BrowserThread::PostDelayedTask( 520 BrowserThread::PostDelayedTask(
520 BrowserThread::FILE, FROM_HERE, 521 BrowserThread::FILE, FROM_HERE,
521 base::Bind(&MigrateChromiumShortcutsCallback), 522 base::Bind(&MigrateChromiumShortcutsCallback),
522 base::TimeDelta::FromSeconds(kMigrateChromiumShortcutsDelaySeconds)); 523 base::TimeDelta::FromSeconds(kMigrateChromiumShortcutsDelaySeconds));
523 } 524 }
524 525
525 int ShellIntegration::MigrateShortcutsInPathInternal( 526 int ShellIntegration::MigrateShortcutsInPathInternal(
526 const base::FilePath& chrome_exe, 527 const base::FilePath& chrome_exe,
527 const base::FilePath& path, 528 const base::FilePath& path,
528 bool check_dual_mode) { 529 bool clear_dual_mode) {
529 DCHECK(base::win::GetVersion() >= base::win::VERSION_WIN7); 530 DCHECK(base::win::GetVersion() >= base::win::VERSION_WIN7);
530 531
531 // Enumerate all pinned shortcuts in the given path directly. 532 // Enumerate all pinned shortcuts in the given path directly.
532 base::FileEnumerator shortcuts_enum( 533 base::FileEnumerator shortcuts_enum(
533 path, false, // not recursive 534 path, false, // not recursive
534 base::FileEnumerator::FILES, FILE_PATH_LITERAL("*.lnk")); 535 base::FileEnumerator::FILES, FILE_PATH_LITERAL("*.lnk"));
535 536
536 bool is_per_user_install = InstallUtil::IsPerUserInstall(chrome_exe); 537 bool is_per_user_install = InstallUtil::IsPerUserInstall(chrome_exe);
537 538
538 int shortcuts_migrated = 0; 539 int shortcuts_migrated = 0;
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
591 case VT_LPWSTR: 592 case VT_LPWSTR:
592 if (expected_app_id != base::string16(propvariant.get().pwszVal)) 593 if (expected_app_id != base::string16(propvariant.get().pwszVal))
593 updated_properties.set_app_id(expected_app_id); 594 updated_properties.set_app_id(expected_app_id);
594 break; 595 break;
595 default: 596 default:
596 NOTREACHED(); 597 NOTREACHED();
597 continue; 598 continue;
598 } 599 }
599 } 600 }
600 601
601 // Only set dual mode if the expected app id is the default app id. 602 // Clear |dual_mode| property from any shortcuts that previously had it (as
603 // requested by caller).
602 BrowserDistribution* dist = BrowserDistribution::GetDistribution(); 604 BrowserDistribution* dist = BrowserDistribution::GetDistribution();
603 base::string16 default_chromium_model_id( 605 base::string16 default_chromium_model_id(
604 ShellUtil::GetBrowserModelId(dist, is_per_user_install)); 606 ShellUtil::GetBrowserModelId(dist, is_per_user_install));
605 if (check_dual_mode && expected_app_id == default_chromium_model_id) { 607 if (clear_dual_mode && expected_app_id == default_chromium_model_id) {
606 // TODO(scottmg): Simplify with no Metro: http://crbug.com/558054.
607 const bool dual_mode_desired = false;
608 propvariant.Reset(); 608 propvariant.Reset();
609 if (property_store->GetValue(PKEY_AppUserModel_IsDualMode, 609 if (property_store->GetValue(PKEY_AppUserModel_IsDualMode,
610 propvariant.Receive()) != S_OK) { 610 propvariant.Receive()) != S_OK) {
611 // When in doubt, prefer to not update the shortcut. 611 // When in doubt, prefer to not update the shortcut.
612 NOTREACHED(); 612 NOTREACHED();
613 continue; 613 continue;
614 } else { 614 }
615 switch (propvariant.get().vt) { 615 if (propvariant.get().vt == VT_BOOL &&
616 case VT_EMPTY: 616 !!propvariant.get().boolVal) {
617 // If dual_mode is not set at all, make sure it gets set to true if 617 updated_properties.set_dual_mode(false);
618 // desired.
619 if (dual_mode_desired)
620 updated_properties.set_dual_mode(true);
621 break;
622 case VT_BOOL:
623 // Make sure dual_mode is set as desired.
624 if ((!!propvariant.get().boolVal) != dual_mode_desired)
625 updated_properties.set_dual_mode(dual_mode_desired);
626 break;
627 default:
628 NOTREACHED();
629 continue;
630 }
631 } 618 }
632 } 619 }
633 620
634 persist_file.Release(); 621 persist_file.Release();
635 shell_link.Release(); 622 shell_link.Release();
636 623
637 // Update the shortcut if some of its properties need to be updated. 624 // Update the shortcut if some of its properties need to be updated.
638 if (updated_properties.options && 625 if (updated_properties.options &&
639 base::win::CreateOrUpdateShortcutLink( 626 base::win::CreateOrUpdateShortcutLink(
640 shortcut, updated_properties, 627 shortcut, updated_properties,
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
740 if (!RegisterBrowser()) 727 if (!RegisterBrowser())
741 return false; 728 return false;
742 729
743 if (ShouldResetDefaultBrowser()) 730 if (ShouldResetDefaultBrowser())
744 ResetDefaultBrowser(); 731 ResetDefaultBrowser();
745 732
746 base::CommandLine cmdline(base::FilePath(L"openwith.exe")); 733 base::CommandLine cmdline(base::FilePath(L"openwith.exe"));
747 cmdline.AppendArgNative(StartupBrowserCreator::GetDefaultBrowserUrl()); 734 cmdline.AppendArgNative(StartupBrowserCreator::GetDefaultBrowserUrl());
748 return base::LaunchProcess(cmdline, base::LaunchOptions()).IsValid(); 735 return base::LaunchProcess(cmdline, base::LaunchOptions()).IsValid();
749 } 736 }
OLDNEW
« no previous file with comments | « chrome/browser/shell_integration.h ('k') | chrome/browser/shell_integration_win_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698