OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "extensions/browser/api/printer_provider/printer_provider_api.h" | 5 #include "extensions/browser/api/printer_provider/printer_provider_api.h" |
6 | 6 |
7 #include <map> | 7 #include <map> |
8 #include <set> | 8 #include <set> |
9 #include <utility> | 9 #include <utility> |
10 #include <vector> | 10 #include <vector> |
(...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
259 | 259 |
260 // PrinterProviderInternalAPIObserver implementation: | 260 // PrinterProviderInternalAPIObserver implementation: |
261 void OnGetPrintersResult( | 261 void OnGetPrintersResult( |
262 const Extension* extension, | 262 const Extension* extension, |
263 int request_id, | 263 int request_id, |
264 const PrinterProviderInternalAPIObserver::PrinterInfoVector& result) | 264 const PrinterProviderInternalAPIObserver::PrinterInfoVector& result) |
265 override; | 265 override; |
266 void OnGetCapabilityResult(const Extension* extension, | 266 void OnGetCapabilityResult(const Extension* extension, |
267 int request_id, | 267 int request_id, |
268 const base::DictionaryValue& result) override; | 268 const base::DictionaryValue& result) override; |
269 void OnPrintResult( | 269 void OnPrintResult(const Extension* extension, |
270 const Extension* extension, | 270 int request_id, |
271 int request_id, | 271 api::printer_provider_internal::PrintError error) override; |
272 core_api::printer_provider_internal::PrintError error) override; | |
273 void OnGetUsbPrinterInfoResult( | 272 void OnGetUsbPrinterInfoResult( |
274 const Extension* extension, | 273 const Extension* extension, |
275 int request_id, | 274 int request_id, |
276 const core_api::printer_provider::PrinterInfo* printer_info) override; | 275 const api::printer_provider::PrinterInfo* printer_info) override; |
277 | 276 |
278 // ExtensionRegistryObserver implementation: | 277 // ExtensionRegistryObserver implementation: |
279 void OnExtensionUnloaded(content::BrowserContext* browser_context, | 278 void OnExtensionUnloaded(content::BrowserContext* browser_context, |
280 const Extension* extension, | 279 const Extension* extension, |
281 UnloadedExtensionInfo::Reason reason) override; | 280 UnloadedExtensionInfo::Reason reason) override; |
282 | 281 |
283 // Called before chrome.printerProvider.onGetPrintersRequested event is | 282 // Called before chrome.printerProvider.onGetPrintersRequested event is |
284 // dispatched to an extension. It returns whether the extension is interested | 283 // dispatched to an extension. It returns whether the extension is interested |
285 // in the event. If the extension listens to the event, it's added to the set | 284 // in the event. If the extension listens to the event, it's added to the set |
286 // of |request| sources. |request| is |GetPrintersRequest| object associated | 285 // of |request| sources. |request| is |GetPrintersRequest| object associated |
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
504 extension_registry_observer_.Add(ExtensionRegistry::Get(browser_context)); | 503 extension_registry_observer_.Add(ExtensionRegistry::Get(browser_context)); |
505 } | 504 } |
506 | 505 |
507 PrinterProviderAPIImpl::~PrinterProviderAPIImpl() { | 506 PrinterProviderAPIImpl::~PrinterProviderAPIImpl() { |
508 } | 507 } |
509 | 508 |
510 void PrinterProviderAPIImpl::DispatchGetPrintersRequested( | 509 void PrinterProviderAPIImpl::DispatchGetPrintersRequested( |
511 const GetPrintersCallback& callback) { | 510 const GetPrintersCallback& callback) { |
512 EventRouter* event_router = EventRouter::Get(browser_context_); | 511 EventRouter* event_router = EventRouter::Get(browser_context_); |
513 if (!event_router->HasEventListener( | 512 if (!event_router->HasEventListener( |
514 core_api::printer_provider::OnGetPrintersRequested::kEventName)) { | 513 api::printer_provider::OnGetPrintersRequested::kEventName)) { |
515 callback.Run(base::ListValue(), true /* done */); | 514 callback.Run(base::ListValue(), true /* done */); |
516 return; | 515 return; |
517 } | 516 } |
518 | 517 |
519 // |pending_get_printers_requests_| take ownership of |request| which gets | 518 // |pending_get_printers_requests_| take ownership of |request| which gets |
520 // NULLed out. Save the pointer before passing it to the requests, as it will | 519 // NULLed out. Save the pointer before passing it to the requests, as it will |
521 // be needed later on. | 520 // be needed later on. |
522 int request_id = pending_get_printers_requests_.Add(callback); | 521 int request_id = pending_get_printers_requests_.Add(callback); |
523 | 522 |
524 scoped_ptr<base::ListValue> internal_args(new base::ListValue); | 523 scoped_ptr<base::ListValue> internal_args(new base::ListValue); |
525 // Request id is not part of the public API, but it will be massaged out in | 524 // Request id is not part of the public API, but it will be massaged out in |
526 // custom bindings. | 525 // custom bindings. |
527 internal_args->AppendInteger(request_id); | 526 internal_args->AppendInteger(request_id); |
528 | 527 |
529 scoped_ptr<Event> event( | 528 scoped_ptr<Event> event( |
530 new Event(events::UNKNOWN, | 529 new Event(events::UNKNOWN, |
531 core_api::printer_provider::OnGetPrintersRequested::kEventName, | 530 api::printer_provider::OnGetPrintersRequested::kEventName, |
532 internal_args.Pass())); | 531 internal_args.Pass())); |
533 // This callback is called synchronously during |BroadcastEvent|, so | 532 // This callback is called synchronously during |BroadcastEvent|, so |
534 // Unretained is safe. | 533 // Unretained is safe. |
535 event->will_dispatch_callback = | 534 event->will_dispatch_callback = |
536 base::Bind(&PrinterProviderAPIImpl::WillRequestPrinters, | 535 base::Bind(&PrinterProviderAPIImpl::WillRequestPrinters, |
537 base::Unretained(this), request_id); | 536 base::Unretained(this), request_id); |
538 | 537 |
539 event_router->BroadcastEvent(event.Pass()); | 538 event_router->BroadcastEvent(event.Pass()); |
540 } | 539 } |
541 | 540 |
542 void PrinterProviderAPIImpl::DispatchGetCapabilityRequested( | 541 void PrinterProviderAPIImpl::DispatchGetCapabilityRequested( |
543 const std::string& printer_id, | 542 const std::string& printer_id, |
544 const PrinterProviderAPI::GetCapabilityCallback& callback) { | 543 const PrinterProviderAPI::GetCapabilityCallback& callback) { |
545 std::string extension_id; | 544 std::string extension_id; |
546 std::string internal_printer_id; | 545 std::string internal_printer_id; |
547 if (!ParsePrinterId(printer_id, &extension_id, &internal_printer_id)) { | 546 if (!ParsePrinterId(printer_id, &extension_id, &internal_printer_id)) { |
548 callback.Run(base::DictionaryValue()); | 547 callback.Run(base::DictionaryValue()); |
549 return; | 548 return; |
550 } | 549 } |
551 | 550 |
552 EventRouter* event_router = EventRouter::Get(browser_context_); | 551 EventRouter* event_router = EventRouter::Get(browser_context_); |
553 if (!event_router->ExtensionHasEventListener( | 552 if (!event_router->ExtensionHasEventListener( |
554 extension_id, | 553 extension_id, |
555 core_api::printer_provider::OnGetCapabilityRequested::kEventName)) { | 554 api::printer_provider::OnGetCapabilityRequested::kEventName)) { |
556 callback.Run(base::DictionaryValue()); | 555 callback.Run(base::DictionaryValue()); |
557 return; | 556 return; |
558 } | 557 } |
559 | 558 |
560 int request_id = pending_capability_requests_[extension_id].Add(callback); | 559 int request_id = pending_capability_requests_[extension_id].Add(callback); |
561 | 560 |
562 scoped_ptr<base::ListValue> internal_args(new base::ListValue); | 561 scoped_ptr<base::ListValue> internal_args(new base::ListValue); |
563 // Request id is not part of the public API, but it will be massaged out in | 562 // Request id is not part of the public API, but it will be massaged out in |
564 // custom bindings. | 563 // custom bindings. |
565 internal_args->AppendInteger(request_id); | 564 internal_args->AppendInteger(request_id); |
566 internal_args->AppendString(internal_printer_id); | 565 internal_args->AppendString(internal_printer_id); |
567 | 566 |
568 scoped_ptr<Event> event(new Event( | 567 scoped_ptr<Event> event( |
569 events::UNKNOWN, | 568 new Event(events::UNKNOWN, |
570 core_api::printer_provider::OnGetCapabilityRequested::kEventName, | 569 api::printer_provider::OnGetCapabilityRequested::kEventName, |
571 internal_args.Pass())); | 570 internal_args.Pass())); |
572 | 571 |
573 event_router->DispatchEventToExtension(extension_id, event.Pass()); | 572 event_router->DispatchEventToExtension(extension_id, event.Pass()); |
574 } | 573 } |
575 | 574 |
576 void PrinterProviderAPIImpl::DispatchPrintRequested( | 575 void PrinterProviderAPIImpl::DispatchPrintRequested( |
577 const PrinterProviderPrintJob& job, | 576 const PrinterProviderPrintJob& job, |
578 const PrinterProviderAPI::PrintCallback& callback) { | 577 const PrinterProviderAPI::PrintCallback& callback) { |
579 std::string extension_id; | 578 std::string extension_id; |
580 std::string internal_printer_id; | 579 std::string internal_printer_id; |
581 if (!ParsePrinterId(job.printer_id, &extension_id, &internal_printer_id)) { | 580 if (!ParsePrinterId(job.printer_id, &extension_id, &internal_printer_id)) { |
582 callback.Run(false, PrinterProviderAPI::GetDefaultPrintError()); | 581 callback.Run(false, PrinterProviderAPI::GetDefaultPrintError()); |
583 return; | 582 return; |
584 } | 583 } |
585 | 584 |
586 EventRouter* event_router = EventRouter::Get(browser_context_); | 585 EventRouter* event_router = EventRouter::Get(browser_context_); |
587 if (!event_router->ExtensionHasEventListener( | 586 if (!event_router->ExtensionHasEventListener( |
588 extension_id, | 587 extension_id, api::printer_provider::OnPrintRequested::kEventName)) { |
589 core_api::printer_provider::OnPrintRequested::kEventName)) { | |
590 callback.Run(false, PrinterProviderAPI::GetDefaultPrintError()); | 588 callback.Run(false, PrinterProviderAPI::GetDefaultPrintError()); |
591 return; | 589 return; |
592 } | 590 } |
593 | 591 |
594 core_api::printer_provider::PrintJob print_job; | 592 api::printer_provider::PrintJob print_job; |
595 print_job.printer_id = internal_printer_id; | 593 print_job.printer_id = internal_printer_id; |
596 | 594 |
597 JSONStringValueDeserializer deserializer(job.ticket_json); | 595 JSONStringValueDeserializer deserializer(job.ticket_json); |
598 scoped_ptr<base::Value> ticket_value(deserializer.Deserialize(NULL, NULL)); | 596 scoped_ptr<base::Value> ticket_value(deserializer.Deserialize(NULL, NULL)); |
599 if (!ticket_value || | 597 if (!ticket_value || |
600 !core_api::printer_provider::PrintJob::Ticket::Populate( | 598 !api::printer_provider::PrintJob::Ticket::Populate(*ticket_value, |
601 *ticket_value, &print_job.ticket)) { | 599 &print_job.ticket)) { |
602 callback.Run(false, | 600 callback.Run(false, api::printer_provider::ToString( |
603 core_api::printer_provider::ToString( | 601 api::printer_provider::PRINT_ERROR_INVALID_TICKET)); |
604 core_api::printer_provider::PRINT_ERROR_INVALID_TICKET)); | |
605 return; | 602 return; |
606 } | 603 } |
607 | 604 |
608 print_job.content_type = job.content_type; | 605 print_job.content_type = job.content_type; |
609 print_job.title = base::UTF16ToUTF8(job.job_title); | 606 print_job.title = base::UTF16ToUTF8(job.job_title); |
610 int request_id = pending_print_requests_[extension_id].Add(job, callback); | 607 int request_id = pending_print_requests_[extension_id].Add(job, callback); |
611 | 608 |
612 scoped_ptr<base::ListValue> internal_args(new base::ListValue); | 609 scoped_ptr<base::ListValue> internal_args(new base::ListValue); |
613 // Request id is not part of the public API and it will be massaged out in | 610 // Request id is not part of the public API and it will be massaged out in |
614 // custom bindings. | 611 // custom bindings. |
615 internal_args->AppendInteger(request_id); | 612 internal_args->AppendInteger(request_id); |
616 internal_args->Append(print_job.ToValue().release()); | 613 internal_args->Append(print_job.ToValue().release()); |
617 scoped_ptr<Event> event(new Event( | 614 scoped_ptr<Event> event(new Event( |
618 events::UNKNOWN, core_api::printer_provider::OnPrintRequested::kEventName, | 615 events::UNKNOWN, api::printer_provider::OnPrintRequested::kEventName, |
619 internal_args.Pass())); | 616 internal_args.Pass())); |
620 event_router->DispatchEventToExtension(extension_id, event.Pass()); | 617 event_router->DispatchEventToExtension(extension_id, event.Pass()); |
621 } | 618 } |
622 | 619 |
623 const PrinterProviderPrintJob* PrinterProviderAPIImpl::GetPrintJob( | 620 const PrinterProviderPrintJob* PrinterProviderAPIImpl::GetPrintJob( |
624 const Extension* extension, | 621 const Extension* extension, |
625 int request_id) const { | 622 int request_id) const { |
626 auto it = pending_print_requests_.find(extension->id()); | 623 auto it = pending_print_requests_.find(extension->id()); |
627 if (it == pending_print_requests_.end()) | 624 if (it == pending_print_requests_.end()) |
628 return nullptr; | 625 return nullptr; |
629 return it->second.GetPrintJob(request_id); | 626 return it->second.GetPrintJob(request_id); |
630 } | 627 } |
631 | 628 |
632 void PrinterProviderAPIImpl::DispatchGetUsbPrinterInfoRequested( | 629 void PrinterProviderAPIImpl::DispatchGetUsbPrinterInfoRequested( |
633 const std::string& extension_id, | 630 const std::string& extension_id, |
634 scoped_refptr<UsbDevice> device, | 631 scoped_refptr<UsbDevice> device, |
635 const PrinterProviderAPI::GetPrinterInfoCallback& callback) { | 632 const PrinterProviderAPI::GetPrinterInfoCallback& callback) { |
636 EventRouter* event_router = EventRouter::Get(browser_context_); | 633 EventRouter* event_router = EventRouter::Get(browser_context_); |
637 if (!event_router->ExtensionHasEventListener( | 634 if (!event_router->ExtensionHasEventListener( |
638 extension_id, core_api::printer_provider:: | 635 extension_id, |
639 OnGetUsbPrinterInfoRequested::kEventName)) { | 636 api::printer_provider::OnGetUsbPrinterInfoRequested::kEventName)) { |
640 callback.Run(base::DictionaryValue()); | 637 callback.Run(base::DictionaryValue()); |
641 return; | 638 return; |
642 } | 639 } |
643 | 640 |
644 int request_id = | 641 int request_id = |
645 pending_usb_printer_info_requests_[extension_id].Add(callback); | 642 pending_usb_printer_info_requests_[extension_id].Add(callback); |
646 core_api::usb::Device usb_device; | 643 api::usb::Device usb_device; |
647 usb_device.device = | 644 usb_device.device = |
648 UsbGuidMap::Get(browser_context_)->GetIdFromGuid(device->guid()); | 645 UsbGuidMap::Get(browser_context_)->GetIdFromGuid(device->guid()); |
649 usb_device.vendor_id = device->vendor_id(); | 646 usb_device.vendor_id = device->vendor_id(); |
650 usb_device.product_id = device->product_id(); | 647 usb_device.product_id = device->product_id(); |
651 | 648 |
652 scoped_ptr<base::ListValue> internal_args(new base::ListValue); | 649 scoped_ptr<base::ListValue> internal_args(new base::ListValue); |
653 // Request id is not part of the public API and it will be massaged out in | 650 // Request id is not part of the public API and it will be massaged out in |
654 // custom bindings. | 651 // custom bindings. |
655 internal_args->AppendInteger(request_id); | 652 internal_args->AppendInteger(request_id); |
656 internal_args->Append(usb_device.ToValue().release()); | 653 internal_args->Append(usb_device.ToValue().release()); |
657 scoped_ptr<Event> event(new Event( | 654 scoped_ptr<Event> event( |
658 events::UNKNOWN, | 655 new Event(events::UNKNOWN, |
659 core_api::printer_provider::OnGetUsbPrinterInfoRequested::kEventName, | 656 api::printer_provider::OnGetUsbPrinterInfoRequested::kEventName, |
660 internal_args.Pass())); | 657 internal_args.Pass())); |
661 event_router->DispatchEventToExtension(extension_id, event.Pass()); | 658 event_router->DispatchEventToExtension(extension_id, event.Pass()); |
662 } | 659 } |
663 | 660 |
664 void PrinterProviderAPIImpl::OnGetPrintersResult( | 661 void PrinterProviderAPIImpl::OnGetPrintersResult( |
665 const Extension* extension, | 662 const Extension* extension, |
666 int request_id, | 663 int request_id, |
667 const PrinterProviderInternalAPIObserver::PrinterInfoVector& result) { | 664 const PrinterProviderInternalAPIObserver::PrinterInfoVector& result) { |
668 base::ListValue printer_list; | 665 base::ListValue printer_list; |
669 | 666 |
670 // Update some printer description properties to better identify the extension | 667 // Update some printer description properties to better identify the extension |
(...skipping 11 matching lines...) Expand all Loading... |
682 void PrinterProviderAPIImpl::OnGetCapabilityResult( | 679 void PrinterProviderAPIImpl::OnGetCapabilityResult( |
683 const Extension* extension, | 680 const Extension* extension, |
684 int request_id, | 681 int request_id, |
685 const base::DictionaryValue& result) { | 682 const base::DictionaryValue& result) { |
686 pending_capability_requests_[extension->id()].Complete(request_id, result); | 683 pending_capability_requests_[extension->id()].Complete(request_id, result); |
687 } | 684 } |
688 | 685 |
689 void PrinterProviderAPIImpl::OnPrintResult( | 686 void PrinterProviderAPIImpl::OnPrintResult( |
690 const Extension* extension, | 687 const Extension* extension, |
691 int request_id, | 688 int request_id, |
692 core_api::printer_provider_internal::PrintError error) { | 689 api::printer_provider_internal::PrintError error) { |
693 const std::string error_str = | 690 const std::string error_str = |
694 error == core_api::printer_provider_internal::PRINT_ERROR_NONE | 691 error == api::printer_provider_internal::PRINT_ERROR_NONE |
695 ? PrinterProviderAPI::GetDefaultPrintError() | 692 ? PrinterProviderAPI::GetDefaultPrintError() |
696 : core_api::printer_provider_internal::ToString(error); | 693 : api::printer_provider_internal::ToString(error); |
697 pending_print_requests_[extension->id()].Complete( | 694 pending_print_requests_[extension->id()].Complete( |
698 request_id, error == core_api::printer_provider_internal::PRINT_ERROR_OK, | 695 request_id, error == api::printer_provider_internal::PRINT_ERROR_OK, |
699 error_str); | 696 error_str); |
700 } | 697 } |
701 | 698 |
702 void PrinterProviderAPIImpl::OnGetUsbPrinterInfoResult( | 699 void PrinterProviderAPIImpl::OnGetUsbPrinterInfoResult( |
703 const Extension* extension, | 700 const Extension* extension, |
704 int request_id, | 701 int request_id, |
705 const core_api::printer_provider::PrinterInfo* result) { | 702 const api::printer_provider::PrinterInfo* result) { |
706 if (result) { | 703 if (result) { |
707 scoped_ptr<base::DictionaryValue> printer(result->ToValue()); | 704 scoped_ptr<base::DictionaryValue> printer(result->ToValue()); |
708 UpdatePrinterWithExtensionInfo(printer.get(), extension); | 705 UpdatePrinterWithExtensionInfo(printer.get(), extension); |
709 pending_usb_printer_info_requests_[extension->id()].Complete(request_id, | 706 pending_usb_printer_info_requests_[extension->id()].Complete(request_id, |
710 *printer); | 707 *printer); |
711 } else { | 708 } else { |
712 pending_usb_printer_info_requests_[extension->id()].Complete( | 709 pending_usb_printer_info_requests_[extension->id()].Complete( |
713 request_id, base::DictionaryValue()); | 710 request_id, base::DictionaryValue()); |
714 } | 711 } |
715 } | 712 } |
(...skipping 26 matching lines...) Expand all Loading... |
742 bool PrinterProviderAPIImpl::WillRequestPrinters( | 739 bool PrinterProviderAPIImpl::WillRequestPrinters( |
743 int request_id, | 740 int request_id, |
744 content::BrowserContext* browser_context, | 741 content::BrowserContext* browser_context, |
745 const Extension* extension, | 742 const Extension* extension, |
746 base::ListValue* args) { | 743 base::ListValue* args) { |
747 if (!extension) | 744 if (!extension) |
748 return false; | 745 return false; |
749 EventRouter* event_router = EventRouter::Get(browser_context_); | 746 EventRouter* event_router = EventRouter::Get(browser_context_); |
750 if (!event_router->ExtensionHasEventListener( | 747 if (!event_router->ExtensionHasEventListener( |
751 extension->id(), | 748 extension->id(), |
752 core_api::printer_provider::OnGetPrintersRequested::kEventName)) { | 749 api::printer_provider::OnGetPrintersRequested::kEventName)) { |
753 return false; | 750 return false; |
754 } | 751 } |
755 | 752 |
756 return pending_get_printers_requests_.AddSource(request_id, extension->id()); | 753 return pending_get_printers_requests_.AddSource(request_id, extension->id()); |
757 } | 754 } |
758 | 755 |
759 } // namespace | 756 } // namespace |
760 | 757 |
761 // static | 758 // static |
762 PrinterProviderAPI* PrinterProviderAPI::Create( | 759 PrinterProviderAPI* PrinterProviderAPI::Create( |
763 content::BrowserContext* context) { | 760 content::BrowserContext* context) { |
764 return new PrinterProviderAPIImpl(context); | 761 return new PrinterProviderAPIImpl(context); |
765 } | 762 } |
766 | 763 |
767 // static | 764 // static |
768 std::string PrinterProviderAPI::GetDefaultPrintError() { | 765 std::string PrinterProviderAPI::GetDefaultPrintError() { |
769 return core_api::printer_provider_internal::ToString( | 766 return api::printer_provider_internal::ToString( |
770 core_api::printer_provider_internal::PRINT_ERROR_FAILED); | 767 api::printer_provider_internal::PRINT_ERROR_FAILED); |
771 } | 768 } |
772 | 769 |
773 } // namespace extensions | 770 } // namespace extensions |
OLD | NEW |