Chromium Code Reviews| OLD | NEW |
|---|---|
| 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/ui/views/extensions/extension_install_dialog_view.h" | 5 #include "chrome/browser/ui/views/extensions/extension_install_dialog_view.h" |
| 6 | 6 |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| (...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 189 scoped_refptr<ExtensionInstallPrompt::Prompt> prompt) | 189 scoped_refptr<ExtensionInstallPrompt::Prompt> prompt) |
| 190 : navigator_(navigator), | 190 : navigator_(navigator), |
| 191 delegate_(delegate), | 191 delegate_(delegate), |
| 192 prompt_(prompt), | 192 prompt_(prompt), |
| 193 scroll_view_(NULL), | 193 scroll_view_(NULL), |
| 194 scrollable_(NULL), | 194 scrollable_(NULL), |
| 195 scrollable_header_only_(NULL), | 195 scrollable_header_only_(NULL), |
| 196 show_details_link_(NULL), | 196 show_details_link_(NULL), |
| 197 checkbox_info_label_(NULL), | 197 checkbox_info_label_(NULL), |
| 198 unchecked_boxes_(0) { | 198 unchecked_boxes_(0) { |
| 199 InitView(); | |
| 200 } | |
| 201 | |
| 202 ExtensionInstallDialogView::~ExtensionInstallDialogView() { | |
| 203 } | |
| 204 | |
| 205 void ExtensionInstallDialogView::InitView() { | |
| 199 // Possible grid layouts without ExtensionPermissionDialog experiment: | 206 // Possible grid layouts without ExtensionPermissionDialog experiment: |
| 200 // Inline install | 207 // Inline install |
| 201 // w/ permissions no permissions | 208 // w/ permissions no permissions |
| 202 // +--------------------+------+ +--------------+------+ | 209 // +--------------------+------+ +--------------+------+ |
| 203 // | heading | icon | | heading | icon | | 210 // | heading | icon | | heading | icon | |
| 204 // +--------------------| | +--------------| | | 211 // +--------------------| | +--------------| | |
| 205 // | rating | | | rating | | | 212 // | rating | | | rating | | |
| 206 // +--------------------| | +--------------+ | | 213 // +--------------------| | +--------------+ | |
| 207 // | user_count | | | user_count | | | 214 // | user_count | | | user_count | | |
| 208 // +--------------------| | +--------------| | | 215 // +--------------------| | +--------------| | |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 270 // +--------------------| | | 277 // +--------------------| | |
| 271 // |checkbox|permission1| | | 278 // |checkbox|permission1| | |
| 272 // +--------------------| | | 279 // +--------------------| | |
| 273 // |checkbox|permission2| | | 280 // |checkbox|permission2| | |
| 274 // +--------------------+------+ | 281 // +--------------------+------+ |
| 275 // | 282 // |
| 276 // Additionally, links or informational text is added to non-client areas of | 283 // Additionally, links or informational text is added to non-client areas of |
| 277 // the dialog depending on the experiment group. | 284 // the dialog depending on the experiment group. |
| 278 | 285 |
| 279 int left_column_width = | 286 int left_column_width = |
| 280 (prompt->ShouldShowPermissions() + prompt->GetRetainedFileCount()) > 0 | 287 (prompt_->ShouldShowPermissions() + prompt_->GetRetainedFileCount()) > 0 |
| 281 ? kPermissionsLeftColumnWidth | 288 ? kPermissionsLeftColumnWidth |
| 282 : kNoPermissionsLeftColumnWidth; | 289 : kNoPermissionsLeftColumnWidth; |
| 283 if (is_bundle_install()) | 290 if (is_bundle_install()) |
| 284 left_column_width = kBundleLeftColumnWidth; | 291 left_column_width = kBundleLeftColumnWidth; |
| 285 if (is_external_install()) | 292 if (is_external_install()) |
| 286 left_column_width = kExternalInstallLeftColumnWidth; | 293 left_column_width = kExternalInstallLeftColumnWidth; |
| 287 | 294 |
| 288 scroll_view_ = new views::ScrollView(); | 295 scroll_view_ = new views::ScrollView(); |
| 289 scroll_view_->set_hide_horizontal_scrollbar(true); | 296 scroll_view_->set_hide_horizontal_scrollbar(true); |
| 290 AddChildView(scroll_view_); | 297 AddChildView(scroll_view_); |
| 291 | 298 |
| 292 int column_set_id = 0; | 299 int column_set_id = 0; |
| 293 // Create the full scrollable view which will contain all the information | 300 // Create the full scrollable view which will contain all the information |
| 294 // including the permissions. | 301 // including the permissions. |
| 295 scrollable_ = new CustomScrollableView(); | 302 scrollable_ = new CustomScrollableView(); |
| 296 views::GridLayout* layout = CreateLayout( | 303 views::GridLayout* layout = CreateLayout( |
| 297 scrollable_, left_column_width, column_set_id, false); | 304 scrollable_, left_column_width, column_set_id, false); |
| 298 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); | 305 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); |
| 299 | 306 |
| 300 if (prompt->ShouldShowPermissions() && | 307 if (prompt_->ShouldShowPermissions() && |
| 301 prompt->experiment()->should_show_expandable_permission_list()) { | 308 prompt_->experiment()->should_show_expandable_permission_list()) { |
| 302 // If the experiment should hide the permission list initially, create a | 309 // If the experiment should hide the permission list initially, create a |
| 303 // simple layout that contains only the header, extension name and icon. | 310 // simple layout that contains only the header, extension name and icon. |
| 304 scrollable_header_only_ = new CustomScrollableView(); | 311 scrollable_header_only_ = new CustomScrollableView(); |
| 305 CreateLayout(scrollable_header_only_, left_column_width, | 312 CreateLayout(scrollable_header_only_, left_column_width, |
| 306 column_set_id, true); | 313 column_set_id, true); |
| 307 scroll_view_->SetContents(scrollable_header_only_); | 314 scroll_view_->SetContents(scrollable_header_only_); |
| 308 } else { | 315 } else { |
| 309 scroll_view_->SetContents(scrollable_); | 316 scroll_view_->SetContents(scrollable_); |
| 310 } | 317 } |
| 311 | 318 |
| 312 int dialog_width = left_column_width + 2 * views::kPanelHorizMargin; | 319 int dialog_width = left_column_width + 2 * views::kPanelHorizMargin; |
| 313 if (!is_bundle_install()) | 320 if (!is_bundle_install()) |
| 314 dialog_width += views::kPanelHorizMargin + kIconSize + kIconOffset; | 321 dialog_width += views::kPanelHorizMargin + kIconSize + kIconOffset; |
| 315 | 322 |
| 316 // Widen the dialog for experiment with checkboxes so that the information | 323 // Widen the dialog for experiment with checkboxes so that the information |
| 317 // label fits the area to the left of the buttons. | 324 // label fits the area to the left of the buttons. |
| 318 if (prompt->experiment()->show_checkboxes()) | 325 if (prompt_->experiment()->show_checkboxes()) |
| 319 dialog_width += 4 * views::kPanelHorizMargin; | 326 dialog_width += 4 * views::kPanelHorizMargin; |
| 320 | 327 |
| 321 if (prompt->has_webstore_data()) { | 328 if (prompt_->has_webstore_data()) { |
| 322 layout->StartRow(0, column_set_id); | 329 layout->StartRow(0, column_set_id); |
| 323 views::View* rating = new views::View(); | 330 views::View* rating = new views::View(); |
| 324 rating->SetLayoutManager(new views::BoxLayout( | 331 rating->SetLayoutManager(new views::BoxLayout( |
| 325 views::BoxLayout::kHorizontal, 0, 0, 0)); | 332 views::BoxLayout::kHorizontal, 0, 0, 0)); |
| 326 layout->AddView(rating); | 333 layout->AddView(rating); |
| 327 prompt->AppendRatingStars(AddResourceIcon, rating); | 334 prompt_->AppendRatingStars(AddResourceIcon, rating); |
| 328 | 335 |
| 329 const gfx::FontList& small_font_list = | 336 const gfx::FontList& small_font_list = |
| 330 rb.GetFontList(ui::ResourceBundle::SmallFont); | 337 rb.GetFontList(ui::ResourceBundle::SmallFont); |
| 331 views::Label* rating_count = | 338 views::Label* rating_count = |
| 332 new views::Label(prompt->GetRatingCount(), small_font_list); | 339 new views::Label(prompt_->GetRatingCount(), small_font_list); |
| 333 // Add some space between the stars and the rating count. | 340 // Add some space between the stars and the rating count. |
| 334 rating_count->SetBorder(views::Border::CreateEmptyBorder(0, 2, 0, 0)); | 341 rating_count->SetBorder(views::Border::CreateEmptyBorder(0, 2, 0, 0)); |
| 335 rating->AddChildView(rating_count); | 342 rating->AddChildView(rating_count); |
| 336 | 343 |
| 337 layout->StartRow(0, column_set_id); | 344 layout->StartRow(0, column_set_id); |
| 338 views::Label* user_count = | 345 views::Label* user_count = |
| 339 new views::Label(prompt->GetUserCount(), small_font_list); | 346 new views::Label(prompt_->GetUserCount(), small_font_list); |
| 340 user_count->SetAutoColorReadabilityEnabled(false); | 347 user_count->SetAutoColorReadabilityEnabled(false); |
| 341 user_count->SetEnabledColor(SK_ColorGRAY); | 348 user_count->SetEnabledColor(SK_ColorGRAY); |
| 342 layout->AddView(user_count); | 349 layout->AddView(user_count); |
| 343 | 350 |
| 344 layout->StartRow(0, column_set_id); | 351 layout->StartRow(0, column_set_id); |
| 345 views::Link* store_link = new views::Link( | 352 views::Link* store_link = new views::Link( |
| 346 l10n_util::GetStringUTF16(IDS_EXTENSION_PROMPT_STORE_LINK)); | 353 l10n_util::GetStringUTF16(IDS_EXTENSION_PROMPT_STORE_LINK)); |
| 347 store_link->SetFontList(small_font_list); | 354 store_link->SetFontList(small_font_list); |
| 348 store_link->set_listener(this); | 355 store_link->set_listener(this); |
| 349 layout->AddView(store_link); | 356 layout->AddView(store_link); |
| 350 } | 357 } |
| 351 | 358 |
| 352 if (is_bundle_install()) { | 359 if (is_bundle_install()) { |
| 353 BundleInstaller::ItemList items = prompt->bundle()->GetItemsWithState( | 360 BundleInstaller::ItemList items = prompt_->bundle()->GetItemsWithState( |
| 354 BundleInstaller::Item::STATE_PENDING); | 361 BundleInstaller::Item::STATE_PENDING); |
| 355 for (size_t i = 0; i < items.size(); ++i) { | 362 for (size_t i = 0; i < items.size(); ++i) { |
| 356 base::string16 extension_name = | 363 base::string16 extension_name = |
| 357 base::UTF8ToUTF16(items[i].localized_name); | 364 base::UTF8ToUTF16(items[i].localized_name); |
| 358 base::i18n::AdjustStringForLocaleDirection(&extension_name); | 365 base::i18n::AdjustStringForLocaleDirection(&extension_name); |
| 359 layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); | 366 layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); |
| 360 layout->StartRow(0, column_set_id); | 367 layout->StartRow(0, column_set_id); |
| 361 views::Label* extension_label = new views::Label( | 368 views::Label* extension_label = new views::Label( |
| 362 PrepareForDisplay(extension_name, true)); | 369 PrepareForDisplay(extension_name, true)); |
| 363 extension_label->SetMultiLine(true); | 370 extension_label->SetMultiLine(true); |
| 364 extension_label->SetHorizontalAlignment(gfx::ALIGN_LEFT); | 371 extension_label->SetHorizontalAlignment(gfx::ALIGN_LEFT); |
| 365 extension_label->SizeToFit(left_column_width); | 372 extension_label->SizeToFit(left_column_width); |
| 366 layout->AddView(extension_label); | 373 layout->AddView(extension_label); |
| 367 } | 374 } |
| 368 } | 375 } |
| 369 | 376 |
| 370 if (prompt->ShouldShowPermissions()) { | 377 if (prompt_->ShouldShowPermissions()) { |
| 371 layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); | 378 MaybeAddPermissions( |
| 372 | 379 layout, |
| 373 if (prompt->GetPermissionCount() > 0) { | 380 rb, |
| 374 if (is_inline_install()) { | 381 column_set_id, |
| 375 layout->StartRow(0, column_set_id); | 382 left_column_width, |
| 376 layout->AddView(new views::Separator(views::Separator::HORIZONTAL), | 383 ExtensionInstallPrompt::PermissionsType::REGULAR_PERMISSIONS); |
| 377 3, 1, views::GridLayout::FILL, views::GridLayout::FILL); | 384 MaybeAddPermissions( |
| 378 layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); | 385 layout, |
| 379 } | 386 rb, |
| 380 | 387 column_set_id, |
| 381 layout->StartRow(0, column_set_id); | 388 left_column_width, |
| 382 views::Label* permissions_header = NULL; | 389 ExtensionInstallPrompt::PermissionsType::WITHHELD_PERMISSIONS); |
| 383 if (is_bundle_install()) { | 390 if (prompt_->GetPermissionCount( |
|
Devlin
2014/09/04 22:06:09
Maybe make a bool has_permissions, and then use it
gpdavis
2014/09/05 20:23:02
Done.
| |
| 384 // We need to pass the FontList in the constructor, rather than calling | 391 ExtensionInstallPrompt::PermissionsType::ALL_PERMISSIONS) == 0) { |
| 385 // SetFontList later, because otherwise SizeToFit mis-judges the width | |
| 386 // of the line. | |
| 387 permissions_header = | |
| 388 new views::Label(prompt->GetPermissionsHeading(), | |
| 389 rb.GetFontList(ui::ResourceBundle::MediumFont)); | |
| 390 } else { | |
| 391 permissions_header = new views::Label(prompt->GetPermissionsHeading()); | |
| 392 } | |
| 393 permissions_header->SetMultiLine(true); | |
| 394 permissions_header->SetHorizontalAlignment(gfx::ALIGN_LEFT); | |
| 395 permissions_header->SizeToFit(left_column_width); | |
| 396 layout->AddView(permissions_header); | |
| 397 | |
| 398 for (size_t i = 0; i < prompt->GetPermissionCount(); ++i) { | |
| 399 layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); | |
| 400 layout->StartRow(0, column_set_id); | |
| 401 views::Label* permission_label = | |
| 402 new views::Label(prompt->GetPermission(i)); | |
| 403 | |
| 404 const SkColor kTextHighlight = SK_ColorRED; | |
| 405 const SkColor kBackgroundHighlight = SkColorSetRGB(0xFB, 0xF7, 0xA3); | |
| 406 if (prompt->experiment()->ShouldHighlightText( | |
| 407 prompt->GetPermission(i))) { | |
| 408 permission_label->SetAutoColorReadabilityEnabled(false); | |
| 409 permission_label->SetEnabledColor(kTextHighlight); | |
| 410 } else if (prompt->experiment()->ShouldHighlightBackground( | |
| 411 prompt->GetPermission(i))) { | |
| 412 permission_label->SetLineHeight(18); | |
| 413 permission_label->set_background( | |
| 414 views::Background::CreateSolidBackground(kBackgroundHighlight)); | |
| 415 } | |
| 416 | |
| 417 permission_label->SetMultiLine(true); | |
| 418 permission_label->SetHorizontalAlignment(gfx::ALIGN_LEFT); | |
| 419 | |
| 420 if (prompt->experiment()->show_checkboxes()) { | |
| 421 permission_label->SizeToFit(left_column_width); | |
| 422 layout->AddView(new CheckboxedView(permission_label, this)); | |
| 423 ++unchecked_boxes_; | |
| 424 } else { | |
| 425 permission_label->SizeToFit(left_column_width - kBulletWidth); | |
| 426 layout->AddView(new BulletedView(permission_label)); | |
| 427 } | |
| 428 | |
| 429 // If we have more details to provide, show them in collapsed form. | |
| 430 if (!prompt->GetPermissionsDetails(i).empty()) { | |
| 431 layout->StartRow(0, column_set_id); | |
| 432 PermissionDetails details; | |
| 433 details.push_back( | |
| 434 PrepareForDisplay(prompt->GetPermissionsDetails(i), false)); | |
| 435 ExpandableContainerView* details_container = | |
| 436 new ExpandableContainerView( | |
| 437 this, base::string16(), details, left_column_width, | |
| 438 true, true, false); | |
| 439 layout->AddView(details_container); | |
| 440 } | |
| 441 | |
| 442 if (prompt->experiment()->should_show_inline_explanations()) { | |
| 443 base::string16 explanation = | |
| 444 prompt->experiment()->GetInlineExplanation( | |
| 445 prompt->GetPermission(i)); | |
| 446 if (!explanation.empty()) { | |
| 447 PermissionDetails details; | |
| 448 details.push_back(explanation); | |
| 449 ExpandableContainerView* container = | |
| 450 new ExpandableContainerView(this, base::string16(), details, | |
| 451 left_column_width, | |
| 452 false, false, true); | |
| 453 // Inline explanations are expanded by default if there is | |
| 454 // no "Show details" link. | |
| 455 if (!prompt->experiment()->show_details_link()) | |
| 456 container->ExpandWithoutAnimation(); | |
| 457 layout->StartRow(0, column_set_id); | |
| 458 layout->AddView(container); | |
| 459 inline_explanations_.push_back(container); | |
| 460 } | |
| 461 } | |
| 462 } | |
| 463 } else { | |
| 464 layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); | 392 layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); |
| 465 layout->StartRow(0, column_set_id); | 393 layout->StartRow(0, column_set_id); |
| 466 views::Label* permission_label = new views::Label( | 394 views::Label* permission_label = new views::Label( |
| 467 l10n_util::GetStringUTF16(IDS_EXTENSION_NO_SPECIAL_PERMISSIONS)); | 395 l10n_util::GetStringUTF16(IDS_EXTENSION_NO_SPECIAL_PERMISSIONS)); |
| 468 permission_label->SetMultiLine(true); | 396 permission_label->SetMultiLine(true); |
| 469 permission_label->SetHorizontalAlignment(gfx::ALIGN_LEFT); | 397 permission_label->SetHorizontalAlignment(gfx::ALIGN_LEFT); |
| 470 permission_label->SizeToFit(left_column_width); | 398 permission_label->SizeToFit(left_column_width); |
| 471 layout->AddView(permission_label); | 399 layout->AddView(permission_label); |
| 472 } | 400 } |
| 473 } | 401 } |
| 474 | 402 |
| 475 if (prompt->GetRetainedFileCount()) { | 403 if (prompt_->GetRetainedFileCount()) { |
| 476 // Slide in under the permissions, if there are any. If there are | 404 // Slide in under the permissions, if there are any. If there are |
| 477 // either, the retained files prompt stretches all the way to the | 405 // either, the retained files prompt stretches all the way to the |
| 478 // right of the dialog. If there are no permissions, the retained | 406 // right of the dialog. If there are no permissions, the retained |
| 479 // files prompt just takes up the left column. | 407 // files prompt just takes up the left column. |
| 480 int space_for_files = left_column_width; | 408 int space_for_files = left_column_width; |
| 481 if (prompt->GetPermissionCount()) { | 409 if (prompt_->GetPermissionCount( |
| 410 ExtensionInstallPrompt::PermissionsType::ALL_PERMISSIONS)) { | |
| 482 space_for_files += kIconSize; | 411 space_for_files += kIconSize; |
| 483 views::ColumnSet* column_set = layout->AddColumnSet(++column_set_id); | 412 views::ColumnSet* column_set = layout->AddColumnSet(++column_set_id); |
| 484 column_set->AddColumn(views::GridLayout::FILL, | 413 column_set->AddColumn(views::GridLayout::FILL, |
| 485 views::GridLayout::FILL, | 414 views::GridLayout::FILL, |
| 486 1, | 415 1, |
| 487 views::GridLayout::USE_PREF, | 416 views::GridLayout::USE_PREF, |
| 488 0, // no fixed width | 417 0, // no fixed width |
| 489 space_for_files); | 418 space_for_files); |
| 490 } | 419 } |
| 491 | 420 |
| 492 layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); | 421 layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); |
| 493 | 422 |
| 494 layout->StartRow(0, column_set_id); | 423 layout->StartRow(0, column_set_id); |
| 495 views::Label* retained_files_header = NULL; | 424 views::Label* retained_files_header = NULL; |
| 496 retained_files_header = new views::Label(prompt->GetRetainedFilesHeading()); | 425 retained_files_header = |
| 426 new views::Label(prompt_->GetRetainedFilesHeading()); | |
| 497 retained_files_header->SetMultiLine(true); | 427 retained_files_header->SetMultiLine(true); |
| 498 retained_files_header->SetHorizontalAlignment(gfx::ALIGN_LEFT); | 428 retained_files_header->SetHorizontalAlignment(gfx::ALIGN_LEFT); |
| 499 retained_files_header->SizeToFit(space_for_files); | 429 retained_files_header->SizeToFit(space_for_files); |
| 500 layout->AddView(retained_files_header); | 430 layout->AddView(retained_files_header); |
| 501 | 431 |
| 502 layout->StartRow(0, column_set_id); | 432 layout->StartRow(0, column_set_id); |
| 503 PermissionDetails details; | 433 PermissionDetails details; |
| 504 for (size_t i = 0; i < prompt->GetRetainedFileCount(); ++i) | 434 for (size_t i = 0; i < prompt_->GetRetainedFileCount(); ++i) |
| 505 details.push_back(prompt->GetRetainedFile(i)); | 435 details.push_back(prompt_->GetRetainedFile(i)); |
| 506 ExpandableContainerView* issue_advice_view = | 436 ExpandableContainerView* issue_advice_view = |
| 507 new ExpandableContainerView( | 437 new ExpandableContainerView( |
| 508 this, base::string16(), details, space_for_files, | 438 this, base::string16(), details, space_for_files, |
| 509 false, true, false); | 439 false, true, false); |
| 510 layout->AddView(issue_advice_view); | 440 layout->AddView(issue_advice_view); |
| 511 } | 441 } |
| 512 | 442 |
| 513 DCHECK(prompt->type() >= 0); | 443 DCHECK(prompt_->type() >= 0); |
| 514 UMA_HISTOGRAM_ENUMERATION("Extensions.InstallPrompt.Type", | 444 UMA_HISTOGRAM_ENUMERATION("Extensions.InstallPrompt.Type", |
| 515 prompt->type(), | 445 prompt_->type(), |
| 516 ExtensionInstallPrompt::NUM_PROMPT_TYPES); | 446 ExtensionInstallPrompt::NUM_PROMPT_TYPES); |
| 517 | 447 |
| 518 if (prompt->ShouldShowPermissions()) { | 448 if (prompt_->ShouldShowPermissions()) { |
| 519 if (prompt->ShouldShowExplanationText()) { | 449 if (prompt_->ShouldShowExplanationText()) { |
| 520 views::ColumnSet* column_set = layout->AddColumnSet(++column_set_id); | 450 views::ColumnSet* column_set = layout->AddColumnSet(++column_set_id); |
| 521 column_set->AddColumn(views::GridLayout::LEADING, | 451 column_set->AddColumn(views::GridLayout::LEADING, |
| 522 views::GridLayout::FILL, | 452 views::GridLayout::FILL, |
| 523 1, | 453 1, |
| 524 views::GridLayout::USE_PREF, | 454 views::GridLayout::USE_PREF, |
| 525 0, | 455 0, |
| 526 0); | 456 0); |
| 527 // Add two rows of space so that the text stands out. | 457 // Add two rows of space so that the text stands out. |
| 528 layout->AddPaddingRow(0, 2 * views::kRelatedControlVerticalSpacing); | 458 layout->AddPaddingRow(0, 2 * views::kRelatedControlVerticalSpacing); |
| 529 | 459 |
| 530 layout->StartRow(0, column_set_id); | 460 layout->StartRow(0, column_set_id); |
| 531 views::Label* explanation = | 461 views::Label* explanation = |
| 532 new views::Label(prompt->experiment()->GetExplanationText()); | 462 new views::Label(prompt_->experiment()->GetExplanationText()); |
| 533 explanation->SetMultiLine(true); | 463 explanation->SetMultiLine(true); |
| 534 explanation->SetHorizontalAlignment(gfx::ALIGN_LEFT); | 464 explanation->SetHorizontalAlignment(gfx::ALIGN_LEFT); |
| 535 explanation->SizeToFit(left_column_width + kIconSize); | 465 explanation->SizeToFit(left_column_width + kIconSize); |
| 536 layout->AddView(explanation); | 466 layout->AddView(explanation); |
| 537 } | 467 } |
| 538 | 468 |
| 539 if (prompt->experiment()->should_show_expandable_permission_list() || | 469 if (prompt_->experiment()->should_show_expandable_permission_list() || |
| 540 (prompt->experiment()->show_details_link() && | 470 (prompt_->experiment()->show_details_link() && |
| 541 prompt->experiment()->should_show_inline_explanations() && | 471 prompt_->experiment()->should_show_inline_explanations() && |
| 542 !inline_explanations_.empty())) { | 472 !inline_explanations_.empty())) { |
| 543 // Don't show the "Show details" link if there are retained | 473 // Don't show the "Show details" link if there are retained |
| 544 // files. These have their own "Show details" links and having | 474 // files. These have their own "Show details" links and having |
| 545 // multiple levels of links is confusing. | 475 // multiple levels of links is confusing. |
| 546 if (prompt->GetRetainedFileCount() == 0) { | 476 if (prompt_->GetRetainedFileCount() == 0) { |
| 547 int text_id = | 477 int text_id = |
| 548 prompt->experiment()->should_show_expandable_permission_list() | 478 prompt_->experiment()->should_show_expandable_permission_list() |
| 549 ? IDS_EXTENSION_PROMPT_EXPERIMENT_SHOW_PERMISSIONS | 479 ? IDS_EXTENSION_PROMPT_EXPERIMENT_SHOW_PERMISSIONS |
| 550 : IDS_EXTENSION_PROMPT_EXPERIMENT_SHOW_DETAILS; | 480 : IDS_EXTENSION_PROMPT_EXPERIMENT_SHOW_DETAILS; |
| 551 show_details_link_ = new views::Link( | 481 show_details_link_ = new views::Link( |
| 552 l10n_util::GetStringUTF16(text_id)); | 482 l10n_util::GetStringUTF16(text_id)); |
| 553 show_details_link_->SetHorizontalAlignment(gfx::ALIGN_LEFT); | 483 show_details_link_->SetHorizontalAlignment(gfx::ALIGN_LEFT); |
| 554 show_details_link_->set_listener(this); | 484 show_details_link_->set_listener(this); |
| 555 UpdateLinkActionHistogram(LINK_SHOWN); | 485 UpdateLinkActionHistogram(LINK_SHOWN); |
| 556 } else { | 486 } else { |
| 557 UpdateLinkActionHistogram(LINK_NOT_SHOWN); | 487 UpdateLinkActionHistogram(LINK_NOT_SHOWN); |
| 558 } | 488 } |
| 559 } | 489 } |
| 560 | 490 |
| 561 if (prompt->experiment()->show_checkboxes()) { | 491 if (prompt_->experiment()->show_checkboxes()) { |
| 562 checkbox_info_label_ = new views::Label( | 492 checkbox_info_label_ = new views::Label( |
| 563 l10n_util::GetStringUTF16( | 493 l10n_util::GetStringUTF16( |
| 564 IDS_EXTENSION_PROMPT_EXPERIMENT_CHECKBOX_INFO)); | 494 IDS_EXTENSION_PROMPT_EXPERIMENT_CHECKBOX_INFO)); |
| 565 checkbox_info_label_->SetMultiLine(true); | 495 checkbox_info_label_->SetMultiLine(true); |
| 566 checkbox_info_label_->SetHorizontalAlignment(gfx::ALIGN_LEFT); | 496 checkbox_info_label_->SetHorizontalAlignment(gfx::ALIGN_LEFT); |
| 567 checkbox_info_label_->SetAutoColorReadabilityEnabled(false); | 497 checkbox_info_label_->SetAutoColorReadabilityEnabled(false); |
| 568 checkbox_info_label_->SetEnabledColor(kLighterLabelColor); | 498 checkbox_info_label_->SetEnabledColor(kLighterLabelColor); |
| 569 } | 499 } |
| 570 } | 500 } |
| 571 | 501 |
| 572 gfx::Size scrollable_size = scrollable_->GetPreferredSize(); | 502 gfx::Size scrollable_size = scrollable_->GetPreferredSize(); |
| 573 scrollable_->SetBoundsRect(gfx::Rect(scrollable_size)); | 503 scrollable_->SetBoundsRect(gfx::Rect(scrollable_size)); |
| 574 dialog_size_ = gfx::Size( | 504 dialog_size_ = gfx::Size( |
| 575 dialog_width, | 505 dialog_width, |
| 576 std::min(scrollable_size.height(), kDialogMaxHeight)); | 506 std::min(scrollable_size.height(), kDialogMaxHeight)); |
| 577 | 507 |
| 578 if (scrollable_header_only_) { | 508 if (scrollable_header_only_) { |
| 579 gfx::Size header_only_size = scrollable_header_only_->GetPreferredSize(); | 509 gfx::Size header_only_size = scrollable_header_only_->GetPreferredSize(); |
| 580 scrollable_header_only_->SetBoundsRect(gfx::Rect(header_only_size)); | 510 scrollable_header_only_->SetBoundsRect(gfx::Rect(header_only_size)); |
| 581 dialog_size_ = gfx::Size( | 511 dialog_size_ = gfx::Size( |
| 582 dialog_width, std::min(header_only_size.height(), kDialogMaxHeight)); | 512 dialog_width, std::min(header_only_size.height(), kDialogMaxHeight)); |
| 583 } | 513 } |
| 584 | 514 |
| 585 std::string event_name = ExperienceSamplingEvent::kExtensionInstallDialog; | 515 std::string event_name = ExperienceSamplingEvent::kExtensionInstallDialog; |
| 586 event_name.append( | 516 event_name.append( |
| 587 ExtensionInstallPrompt::PromptTypeToString(prompt_->type())); | 517 ExtensionInstallPrompt::PromptTypeToString(prompt_->type())); |
| 588 sampling_event_ = ExperienceSamplingEvent::Create(event_name); | 518 sampling_event_ = ExperienceSamplingEvent::Create(event_name); |
| 589 } | 519 } |
| 590 | 520 |
| 591 ExtensionInstallDialogView::~ExtensionInstallDialogView() {} | 521 bool ExtensionInstallDialogView::MaybeAddPermissions( |
| 522 views::GridLayout* layout, | |
| 523 ui::ResourceBundle& rb, | |
| 524 int column_set_id, | |
| 525 int left_column_width, | |
| 526 ExtensionInstallPrompt::PermissionsType perm_type) { | |
| 527 if (prompt_->GetPermissionCount(perm_type) == 0) | |
| 528 return false; | |
| 529 | |
| 530 layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); | |
| 531 if (is_inline_install()) { | |
| 532 layout->StartRow(0, column_set_id); | |
| 533 layout->AddView(new views::Separator(views::Separator::HORIZONTAL), | |
| 534 3, | |
| 535 1, | |
| 536 views::GridLayout::FILL, | |
| 537 views::GridLayout::FILL); | |
| 538 layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); | |
| 539 } | |
| 540 | |
| 541 layout->StartRow(0, column_set_id); | |
| 542 views::Label* permissions_header = NULL; | |
| 543 if (is_bundle_install()) { | |
| 544 // We need to pass the FontList in the constructor, rather than calling | |
| 545 // SetFontList later, because otherwise SizeToFit mis-judges the width | |
| 546 // of the line. | |
| 547 permissions_header = | |
| 548 new views::Label(prompt_->GetPermissionsHeading(perm_type), | |
| 549 rb.GetFontList(ui::ResourceBundle::MediumFont)); | |
| 550 } else { | |
| 551 permissions_header = | |
| 552 new views::Label(prompt_->GetPermissionsHeading(perm_type)); | |
| 553 } | |
| 554 permissions_header->SetMultiLine(true); | |
| 555 permissions_header->SetHorizontalAlignment(gfx::ALIGN_LEFT); | |
| 556 permissions_header->SizeToFit(left_column_width); | |
| 557 layout->AddView(permissions_header); | |
| 558 | |
| 559 for (size_t i = 0; i < prompt_->GetPermissionCount(perm_type); ++i) { | |
| 560 layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); | |
| 561 layout->StartRow(0, column_set_id); | |
| 562 views::Label* permission_label = | |
| 563 new views::Label(prompt_->GetPermission(i, perm_type)); | |
| 564 | |
| 565 const SkColor kTextHighlight = SK_ColorRED; | |
| 566 const SkColor kBackgroundHighlight = SkColorSetRGB(0xFB, 0xF7, 0xA3); | |
| 567 if (prompt_->experiment()->ShouldHighlightText( | |
| 568 prompt_->GetPermission(i, perm_type))) { | |
| 569 permission_label->SetAutoColorReadabilityEnabled(false); | |
| 570 permission_label->SetEnabledColor(kTextHighlight); | |
| 571 } else if (prompt_->experiment()->ShouldHighlightBackground( | |
| 572 prompt_->GetPermission(i, perm_type))) { | |
| 573 permission_label->SetLineHeight(18); | |
| 574 permission_label->set_background( | |
| 575 views::Background::CreateSolidBackground(kBackgroundHighlight)); | |
| 576 } | |
| 577 | |
| 578 permission_label->SetMultiLine(true); | |
| 579 permission_label->SetHorizontalAlignment(gfx::ALIGN_LEFT); | |
| 580 | |
| 581 if (prompt_->experiment()->show_checkboxes()) { | |
| 582 permission_label->SizeToFit(left_column_width); | |
| 583 layout->AddView(new CheckboxedView(permission_label, this)); | |
| 584 ++unchecked_boxes_; | |
| 585 } else { | |
| 586 permission_label->SizeToFit(left_column_width - kBulletWidth); | |
| 587 layout->AddView(new BulletedView(permission_label)); | |
| 588 } | |
| 589 | |
| 590 // If we have more details to provide, show them in collapsed form. | |
| 591 if (!prompt_->GetPermissionsDetails(i, perm_type).empty()) { | |
| 592 layout->StartRow(0, column_set_id); | |
| 593 PermissionDetails details; | |
| 594 details.push_back(PrepareForDisplay( | |
| 595 prompt_->GetPermissionsDetails(i, perm_type), false)); | |
| 596 ExpandableContainerView* details_container = | |
| 597 new ExpandableContainerView(this, | |
| 598 base::string16(), | |
| 599 details, | |
| 600 left_column_width, | |
| 601 true, | |
| 602 true, | |
| 603 false); | |
| 604 layout->AddView(details_container); | |
| 605 } | |
| 606 | |
| 607 if (prompt_->experiment()->should_show_inline_explanations()) { | |
| 608 base::string16 explanation = prompt_->experiment()->GetInlineExplanation( | |
| 609 prompt_->GetPermission(i, perm_type)); | |
| 610 if (!explanation.empty()) { | |
| 611 PermissionDetails details; | |
| 612 details.push_back(explanation); | |
| 613 ExpandableContainerView* container = | |
| 614 new ExpandableContainerView(this, | |
| 615 base::string16(), | |
| 616 details, | |
| 617 left_column_width, | |
| 618 false, | |
| 619 false, | |
| 620 true); | |
| 621 // Inline explanations are expanded by default if there is | |
| 622 // no "Show details" link. | |
| 623 if (!prompt_->experiment()->show_details_link()) | |
| 624 container->ExpandWithoutAnimation(); | |
| 625 layout->StartRow(0, column_set_id); | |
| 626 layout->AddView(container); | |
| 627 inline_explanations_.push_back(container); | |
| 628 } | |
| 629 } | |
| 630 } | |
| 631 return true; | |
| 632 } | |
| 592 | 633 |
| 593 views::GridLayout* ExtensionInstallDialogView::CreateLayout( | 634 views::GridLayout* ExtensionInstallDialogView::CreateLayout( |
| 594 views::View* parent, | 635 views::View* parent, |
| 595 int left_column_width, | 636 int left_column_width, |
| 596 int column_set_id, | 637 int column_set_id, |
| 597 bool single_detail_row) const { | 638 bool single_detail_row) const { |
| 598 views::GridLayout* layout = views::GridLayout::CreatePanel(parent); | 639 views::GridLayout* layout = views::GridLayout::CreatePanel(parent); |
| 599 parent->SetLayoutManager(layout); | 640 parent->SetLayoutManager(layout); |
| 600 | 641 |
| 601 views::ColumnSet* column_set = layout->AddColumnSet(column_set_id); | 642 views::ColumnSet* column_set = layout->AddColumnSet(column_set_id); |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 638 icon->SetHorizontalAlignment(views::ImageView::CENTER); | 679 icon->SetHorizontalAlignment(views::ImageView::CENTER); |
| 639 icon->SetVerticalAlignment(views::ImageView::CENTER); | 680 icon->SetVerticalAlignment(views::ImageView::CENTER); |
| 640 if (single_detail_row) { | 681 if (single_detail_row) { |
| 641 layout->AddView(icon); | 682 layout->AddView(icon); |
| 642 } else { | 683 } else { |
| 643 int icon_row_span = 1; | 684 int icon_row_span = 1; |
| 644 if (is_inline_install()) { | 685 if (is_inline_install()) { |
| 645 // Also span the rating, user_count and store_link rows. | 686 // Also span the rating, user_count and store_link rows. |
| 646 icon_row_span = 4; | 687 icon_row_span = 4; |
| 647 } else if (prompt_->ShouldShowPermissions()) { | 688 } else if (prompt_->ShouldShowPermissions()) { |
| 648 size_t permission_count = prompt_->GetPermissionCount(); | 689 size_t permission_count = prompt_->GetPermissionCount( |
| 690 ExtensionInstallPrompt::PermissionsType::ALL_PERMISSIONS); | |
| 649 // Also span the permission header and each of the permission rows (all | 691 // Also span the permission header and each of the permission rows (all |
| 650 // have a padding row above it). This also works for the 'no special | 692 // have a padding row above it). This also works for the 'no special |
| 651 // permissions' case. | 693 // permissions' case. |
| 652 icon_row_span = 3 + permission_count * 2; | 694 icon_row_span = 3 + permission_count * 2; |
| 653 } else if (prompt_->GetRetainedFileCount()) { | 695 } else if (prompt_->GetRetainedFileCount()) { |
| 654 // Also span the permission header and the retained files container. | 696 // Also span the permission header and the retained files container. |
| 655 icon_row_span = 4; | 697 icon_row_span = 4; |
| 656 } | 698 } |
| 657 layout->AddView(icon, 1, icon_row_span); | 699 layout->AddView(icon, 1, icon_row_span); |
| 658 } | 700 } |
| (...skipping 408 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1067 void ExpandableContainerView::ExpandWithoutAnimation() { | 1109 void ExpandableContainerView::ExpandWithoutAnimation() { |
| 1068 expanded_ = true; | 1110 expanded_ = true; |
| 1069 details_view_->AnimateToState(1.0); | 1111 details_view_->AnimateToState(1.0); |
| 1070 } | 1112 } |
| 1071 | 1113 |
| 1072 // static | 1114 // static |
| 1073 ExtensionInstallPrompt::ShowDialogCallback | 1115 ExtensionInstallPrompt::ShowDialogCallback |
| 1074 ExtensionInstallPrompt::GetDefaultShowDialogCallback() { | 1116 ExtensionInstallPrompt::GetDefaultShowDialogCallback() { |
| 1075 return base::Bind(&ShowExtensionInstallDialogImpl); | 1117 return base::Bind(&ShowExtensionInstallDialogImpl); |
| 1076 } | 1118 } |
| OLD | NEW |